/*
* host 发送服务器qq邮箱为smtp.qq.com
* from 发件人邮箱
* fromNick 发件人昵称
* tos 收件人集合,多个用,间隔
* ccs 抄送人集合,多个用,间隔
* bccs 密送人集合,多个用,间隔
* subject 邮件主题
* content 正文,支持html
* password 密码或授权码(修改密码后,授权码需要重新获取)
* files 附件集合
*/
public static void sendMail(String subject, String contentHtml, List<File> files, String host, String from,
String password, String fromNick, String tos, String ccs, String bccs)
throws UnsupportedEncodingException, MessagingException {
// 1. 创建参数配置, 用于连接邮件服务器的参数配置
Properties props = new Properties(); // 参数配置
props.setProperty("mail.transport.protocol", "smtp"); // 使用的协议(JavaMail规范要求)
props.setProperty("mail.smtp.host", host); // 发件人的邮箱的 SMTP 服务器地址
props.setProperty("mail.smtp.auth", "true"); // 需要请求认证
props.setProperty("mail.smtp.port", "465");// 端口
props.setProperty("mail.smtp.socketFactory.fallback", "false");
props.setProperty("mail.smtp.socketFactory.port", "465");
props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
// 2. 根据配置创建会话对象, 用于和邮件服务器交互
Session session = Session.getInstance(props);
// 设置为debug模式, 可以查看详细的发送 log
// session.setDebug(true);
// 3. 创建一封邮件
MimeMessage message = new MimeMessage(session);
// 4. From: 发件人
message.setFrom(new InternetAddress(from, fromNick, "UTF-8"));
// 5. To: 收件人(可以增加多个收件人、CC抄送、BCC密送)
InternetAddress[] address = null;
StringBuilder sb = new StringBuilder();
if (!ValidateUtil.isNull(tos)) {
address = InternetAddress.parse(tos);// 多个收件人用逗号间隔
message.setRecipients(MimeMessage.RecipientType.TO, address);
sb.append(tos);
}
// Cc: 抄送(可选)
if (!ValidateUtil.isNull(ccs)) {
address = InternetAddress.parse(ccs);
message.setRecipients(MimeMessage.RecipientType.CC, address);
sb.append("," + tos);
}
// Bcc: 密送(可选)
if (!ValidateUtil.isNull(bccs)) {
address = InternetAddress.parse(bccs);
message.setRecipients(MimeMessage.RecipientType.BCC, address);
sb.append("," + tos);
}
// 回复人
address = InternetAddress.parse(sb.toString());
message.setReplyTo(address);
// 6. 邮件主题
message.setSubject(subject, "UTF-8");
// 整封邮件的MINE消息体
MimeMultipart msgMultipart = new MimeMultipart("mixed");// 混合的组合关系
// 设置邮件的MINE消息体
message.setContent(msgMultipart);
// 附件内容
for (int i = 0; i < files.size(); i++) {
MimeBodyPart attch1 = new MimeBodyPart();
// 把内容,附件1,附件2加入到 MINE消息体中
msgMultipart.addBodyPart(attch1);
// 把文件,添加到附件
// 数据源
DataSource ds1 = new FileDataSource(files.get(i));
// 数据处理器
DataHandler dh1 = new DataHandler(ds1);
// 设置第一个附件的数据
attch1.setDataHandler(dh1);
// 设置第一个附件的文件名
attch1.setFileName(MimeUtility.encodeText(files.get(i).getName()));
//
// // 把文件,添加到附件2中
// DataSource ds2 = new FileDataSource(file1);
// DataHandler dh2 = new DataHandler(ds2);
// attch2.setDataHandler(dh2);
// attch2.setFileName(MimeUtility.encodeText("文件"));
}
// 正文内容
if (!ValidateUtil.isNull(contentHtml)) {
MimeBodyPart content = new MimeBodyPart();
msgMultipart.addBodyPart(content);
// 正文(图片和文字部分)
MimeMultipart bodyMultipart = new MimeMultipart("related");
// 设置内容为正文
content.setContent(bodyMultipart);
// html代码部分
MimeBodyPart htmlPart = new MimeBodyPart();
// html中嵌套的图片部分
// MimeBodyPart imgPart = new MimeBodyPart();
// 正文添加图片和html代码
bodyMultipart.addBodyPart(htmlPart);
// bodyMultipart.addBodyPart(imgPart);
// 把文件,添加到图片中
// DataSource imgds = new FileDataSource(file2);
// DataHandler imgdh = new DataHandler(imgds);
// imgPart.setDataHandler(imgdh);
// 说明html中的img标签的src,引用的是此图片
// imgPart.setHeader("Content-Location", "http://sunteam.cc/logo1.jsg");
// html代码
// htmlPart.setContent("<span style='color:red'>中文呵呵</span><img src=\"http://sunteam.cc/logo1.jsg\">",
// "text/html;charset=utf-8");
// imgPart.setContentID("my");
// html代码
// htmlPart.setContent("<span style='color:red'>中文呵呵</span><img src=\"cid:my\">",
// "text/html;charset=utf-8");
// html代码
htmlPart.setContent(contentHtml, "text/html;charset=utf-8");
}
// 6. 设置发件时间
message.setSentDate(new Date());
// 7. 保存设置
message.saveChanges();
// 4. 根据 Session 获取邮件传输对象
Transport transport = session.getTransport();
// 5. 使用 邮箱账号 和 密码 连接邮件服务器, 这里认证的邮箱必须与 message 中的发件人邮箱一致, 否则报错
transport.connect(from, password);
// 6. 发送邮件, 发到所有的收件地址, message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
transport.sendMessage(message, message.getAllRecipients());
// 7. 关闭连接
transport.close();
}
版权声明:本文为qq_44872773原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。