import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import org.springside.modules.utils.PropertiesLoader;
/**
*
* TODO: 创建邮件类 历史记录: Date, Author, Descriptions
* ---------------------------------------------------------
*
* @Date 2018年4月12日
* @author ***
* @since 1.0.0
*/
public class MimeMessageUtil {
/**
*
* TODO: 创建Email
*
* @param session
* 根据参数配置,创建会话对象(为了发送邮件准备的)
* @param sendMail
* 发件人
* @param receiveList
* 收件人集合
* @param ccList
* 抄送人集合
* @param bccList
* 密送人集合
* @param title
* 标题
* @param content
* 内容
* @param sendUserName
* 发件人名称
* @return
*/
public static MimeMessage createMimeMessage(Session session, String sendMail,
List<Map<String, String>> receiveList, List<String> ccList,
List<String> bccList, String title, String content,
String sendUserName) {
// 创建一封邮件
MimeMessage message = new MimeMessage(session);
// 内容
StringBuffer msgsb = new StringBuffer();
msgsb.append(content);
// msgsb.append("<span>尊敬的");
// From: 发件人
try {
message.setFrom(new InternetAddress(sendMail, "瑞华管理系统", "UTF-8"));
// To: 收件人(可以增加多个收件人、抄送、密送)
InternetAddress[] sendTo = new InternetAddress[receiveList.size()];
if (receiveList != null && !receiveList.isEmpty()) {
// Cc: 抄送(可选)
for (int i = 0; i < receiveList.size(); i++) {
sendTo[i] = new InternetAddress(receiveList.get(i).get(
"email"));
/*
* if(i==receiveList.size()-1){
* msgsb.append(receiveList.get(i).get("userName")); }else{
* msgsb.append(receiveList.get(i).get("userName")+"、"); }
*/
}
}
message.setRecipients(MimeMessage.RecipientType.TO, sendTo);
if (ccList != null && !ccList.isEmpty()) {
// Cc: 抄送(可选)
for (int i = 0; i < ccList.size(); i++) {
message.setRecipient(MimeMessage.RecipientType.CC,
new InternetAddress(ccList.get(i), "USER_EE",
"UTF-8"));
}
}
if (bccList != null && !bccList.isEmpty()) {
// Cc: 抄送(可选)
for (int i = 0; i < bccList.size(); i++) {
message.setRecipient(MimeMessage.RecipientType.BCC,
new InternetAddress(bccList.get(i), "USER_EE",
"UTF-8"));
}
}
// msgsb.append("你好:</span><br/>");
// msgsb.append("<span style='margin-left:30px;'>您的生日到了,<strong style='color:red;'>"+content+"</strong>已发送到您的邮箱,请登录XXX收取。</span><br/>");
// msgsb.append("<span style='margin-left:30px;'>系统登录网址:<a href=''>XXXXXX</a></span><br/>");
// Subject: 邮件主题(标题有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改标题)
message.setSubject(title, "UTF-8");
// Content: 邮件正文(可以使用html标签)(内容有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改发送内容)
message.setContent(msgsb.toString(), "text/html;charset=UTF-8");
// 设置发件时间
message.setSentDate(new Date());
// 保存设置
message.saveChanges();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
return message;
}
/**
* TODO 发送邮件
*
* @param receiveList
* 收件人集合
* @param ccList
* 抄送(可为null)
* @param bccList
* 密送(可为null)
* @param title
* 标题
* @param content
* 内容
* @param sendUserName
* 发件人名称
* @return
*/
public static String sendMail(List<Map<String, String>> receiveList,
List<String> ccList, List<String> bccList, String title,
String content, String sendUserName) {
String flag = "0";
String emailSMTPHost = new PropertiesLoader(
"config/base/config.properties").getProperty("mailSMTPHost");
String sendEmail = new PropertiesLoader("config/base/config.properties")
.getProperty("sendEmail");
String sendEmailPwd = new PropertiesLoader(
"config/base/config.properties").getProperty("sendEmailPwd");
// 创建参数配置, 用于连接邮件服务器的参数配置
Properties props = new Properties(); // 参数配置
props.setProperty("mail.transport.protocol", "smtp"); // 使用的协议(JavaMail规范要求)
props.setProperty("mail.smtp.host", emailSMTPHost); // 发件人的邮箱的 SMTP
props.setProperty("mail.smtp.auth", "true"); // 需要请求认证
/**
* PS: 某些邮箱服务器要求 SMTP 连接需要使用 SSL 安全认证 (为了提高安全性, 邮箱支持SSL连接, 也可以自己开启),
* 如果无法连接邮件服务器, 仔细查看控制台打印的 log, 如果有有类似 “连接失败, 要求 SSL 安全连接” 等错误, 打开下面
* 之间的注释代码, 开启 SSL 安全连接。 SMTP 服务器的端口 (非 SSL 连接的端口一般默认为 25, 可以不添加, 如果开启了
* SSL 连接, 需要改为对应邮箱的 SMTP 服务器的端口, 具体可查看对应邮箱服务的帮助,
* 测试邮件发送请看log,好好看log
* QQ邮箱的SMTP(SLL)端口为465或587, 其他邮箱自行去查看)
**/
// 调试时请配置调试邮箱注释以下代码
final String smtpPort = "465";
props.setProperty("mail.smtp.port", smtpPort);
props.setProperty("mail.smtp.socketFactory.class",
"javax.net.ssl.SSLSocketFactory");
props.setProperty("mail.smtp.socketFactory.fallback", "false");
props.setProperty("mail.smtp.socketFactory.port", smtpPort);
// 根据配置创建会话对象, 用于和邮件服务器交互
Session session = Session.getInstance(props);
session.setDebug(true); // 设置为debug模式, 可以查看详细的发送 log
// 创建一封邮件
MimeMessage message;
message = createMimeMessage(session, sendEmail, receiveList, ccList,
bccList, title, content, sendUserName);
try {
// 根据 Session 获取邮件传输对象
Transport transport = session.getTransport();
/**
* 使用 邮箱账号 和 密码 连接邮件服务器, 这里认证的邮箱必须与 message 中的发件人邮箱一致, 否则报错
* 成败的判断关键在此一句, 如果连接服务器失败, 都会在控制台输出相应失败原因的 log, 仔细查看失败原因,
* 有些邮箱服务器会返回错误码或查看错误类型的链接, 根据给出的错误 类型到对应邮件服务器的帮助网站上查看具体失败原因。
* 连接失败的原因通常为以下几点, 仔细检查代码: (1) 邮箱没有开启 SMTP 服务; (2) 邮箱密码错误,
* 例如某些邮箱开启了独立密码;(535错误) (3) 邮箱服务器要求必须要使用 SSL 安全连接; (4) 请求过于频繁或其他原因,
* 被邮件服务器拒绝服务; (5) 如果以上几点都确定无误, 到邮件服务器网站查找帮助。 仔细看log, 认真看log, 看懂log,
* 错误原因都在log已说明。
*/
transport.connect(sendEmail, sendEmailPwd);
// 发送邮件, 发到所有的收件地址, message.getAllRecipients()
// 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
transport.sendMessage(message, message.getAllRecipients());
// 关闭连接
transport.close();
} catch (MessagingException e) {
e.printStackTrace();
flag = "1";
}
return flag;
}
}