系统里面需要发邮件的场景还是比较多的,比如发个通知,发个预警信息等等。
好了,用Java写个发邮件的功能麻烦吗,不麻烦。
主要两大步:配置认证信息,组装邮件体
配置信息有比如邮件服务器、端口,使用的协议,用户名密码等。
使用这些配置信息,生成一个session实例。根据这个session,生成一个邮件体。
给邮件体设置发件人地址、收件人地址(抄送、密送),邮件正文,附件。其中邮件正文可以设置html格式或者纯文本格式。
show the code:
public class JavaEmailUtils {
private static final Logger log = Logger.getLogger(JavaEmailUtils.class);
private static final String PROPERTIES_PATH = "key/email";
private static final String KEY_FROM = "email.From";
private static final String KEY_NAME = "email.UserName";
private static final String KEY_PWD = "email.UserPwd";
private static final String SMTP_HOST = "smtp.***.com";
public static boolean send(String to, String emailcontent, String documentNames, String subject) {
try {
log.info("begin send email");
Message msg = getMessage(to, emailcontent, documentNames, subject);
log.info("get email msg");
// 触发发送。系统环境要能连接访问邮件服务器
Transport.send(msg);
log.info("end send email");
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 配置信息
*/
private static Session getSession() {
Properties props = System.getProperties();
props.setProperty("mail.smtp.host", SMTP_HOST);
props.setProperty("mail.smtp.port", "25");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.transport.protocol", "smtp");
props.put("mail.smtp.ssl.trust", SMTP_HOST);
props.put("mail.smtp.auth", "true");
// ConfigUtils 是个工具类,从配置文件properties中获取配置信息
String name = ConfigUtils.getByKey(PROPERTIES_PATH, KEY_NAME);
log.info("email from: " + name);
String pwd = ConfigUtils.getByKey(PROPERTIES_PATH, KEY_PWD);
return Session.getDefaultInstance(props, new PasswordAuthenticator(name, pwd));
}
/**
* 装配邮件体
*/
private static Message getMessage(String to, String emailcontent, String documentNames, String subject)
throws Exception {
Message msg = new MimeMessage(getSession());
// 从哪里来
msg.setFrom(new InternetAddress(ConfigUtils.getByKey(PROPERTIES_PATH, KEY_FROM)));
String[] toadd = to.split(",");
Address[] addArr = new Address[toadd.length];
for (int i = 0; i < toadd.length; i++) {
log.info("email to address: "+ toadd[i]);
addArr[i] = new InternetAddress(toadd[i]);
}
// 到哪里去
msg.setRecipients(Message.RecipientType.TO, addArr);
// 防止中文乱码
msg.setSubject(MimeUtility.encodeText(subject, "gb2312", "B"));
Multipart mp = new MimeMultipart();
MimeBodyPart contentPart = new MimeBodyPart();
emailcontent = emailcontent.replace("\r\n", "<br>");
emailcontent = emailcontent.replace("\t", " ");
// 设置为HTML格式,默认是纯文本
contentPart.setContent(emailcontent, "text/html;charset=GB2312");
mp.addBodyPart(contentPart);
if (!TextUtil.isEmpty(documentNames)) {
String[] documentNameArray = documentNames.split("&&&&");
for (String docName:documentNameArray) {
MimeBodyPart filePart = new MimeBodyPart();
DataSource dataSource = new FileDataSource(new File(docName));
filePart.setDataHandler(new DataHandler(dataSource));
filePart.setFileName(MimeUtility.encodeText(dataSource.getName()));
// 每加一个附件,就加一个MimeBodyPart
mp.addBodyPart(filePart);
}
}
msg.setContent(mp);
msg.saveChanges();
return msg;
}
}
测试验证通过
备注:QQ、163等邮件服务器的调用,可能需要在邮件系统去开通外部收发邮件的限制。
建议:如果是平台性的系统,建议将此工具封装成接口、插件式的。开发者配置自己的邮件账号、密码,调用接口或插件达到发送邮件的功能。
网友评论