基于JavaMail的Java邮件发送
Author xiuhong.chen@hand-china.com
Desc 简单邮件发送
Date 2017/12/8
项目中需要根据物料资质的状况实时给用户发送邮件,然后我就简单学习了SMTP.
电子邮件的在网络中传输和网页一样需要遵从特定的协议,常用的电子邮件协议包括 SMTP,POP3,IMAP。其中邮件的创建和发送只需要用到 SMTP协议,所以本文也只会涉及到SMTP协议。SMTP 是 Simple Mail Transfer Protocol 的简称,即简单邮件传输协议。
1.导入jar包javax.mail.jar
特别注意:
本测试用例用的 JavaMail 版本是 1.6.0,如果下载到其他版本的 JavaMail 运行时出现问题,请使用 JavaMail 1.6.0 版本再进行尝试。
使用 JavaMail 1.6.0 要求的 JDK 版本必须是 JDK 1.7 以上(建议使用最新版 JDK)。
不要直接就完完全全复制我的代码,需要 修改一下发送的标题、内容、用户昵称,要不然所有人都直接复制我的代码发送,内容一致,邮箱服务器就可能会检测到这些内容是垃圾广告内容,不让你发送,会返回错误码,查询错误码也能查询到失败原因。
2.创建一封简单的电子邮件
首先创建一个 Java 工程,把下载好的 javax.mail.jar 作为类库加入工程
邮件创建步骤:
配置连接邮件服务器的参数( 邮件服务器SMTP, 是否需要SMTP验证 )
创建一个邮件对象( MimeMessage )
设置发件人,收件人 ( 可增加多个收件人,抄送人,密送人 )
设置邮件标题, 正文 , 附件等
设置显示的发送时间
public void sendMail() throws Exception{
System.out.println("sendMailServlet-----start");
//1.创建邮件对象
Properties properties = new Properties();
properties.put("mail.smtp.host", "mail.hand-china.com"); // 指定SMTP服务器
properties.put("mail.smtp.auth", "true"); // 指定是否需要SMTP验证
Session session = Session.getInstance(properties);
MimeMessage mimeMessage =new MimeMessage(session);
/*2.设置发件人
* 其中 InternetAddress 的三个参数分别为: 邮箱, 显示的昵称(只用于显示, 没有特别的要求), 昵称的字符集编码
* */
mimeMessage.setFrom(new InternetAddress("xiuhong.chen@hand-china.com","xiuhong","UTF-8"));
/*3.设置收件人
To收件人 CC 抄送 BCC密送*/
mimeMessage.setRecipient(MimeMessage.RecipientType.TO,new InternetAddress("17862***@qq.com","xiuhong","UTF-8"));
mimeMessage.addRecipient(MimeMessage.RecipientType.TO,new InternetAddress("178622***@qq.com","xiuhong","UTF-8"));
/*4.设置标题和内容*/
mimeMessage.setSubject("测试邮件","UTF-8");
mimeMessage.setContent("Test Content:这是一封测试邮件...","text/html;charset=UTF-8");
mimeMessage.setSentDate(new Date());
/*5.保存邮件*/
mimeMessage.saveChanges();
Transport transport = session.getTransport("smtp"); //获取邮件传输对象
transport.connect("mail.hand-china.com","xiuhong.chen@hand-china.com","*******");
transport.sendMessage(mimeMessage,mimeMessage.getAllRecipients());
transport.close();
System.out.println("sendMailServlet-----end");
}
查看邮箱客户端,可以接收到邮件
某些邮箱服务器要求 SMTP 连接需要使用 SSL 安全认证 (为了提高安全性, 邮箱支持SSL连接, 也可以自己开启),
如果无法连接邮件服务器, 仔细查看控制台打印的 log, 如果有有类似 “连接失败, 要求 SSL 安全连接” 等错误,需要开启SSL安全连接,如下代码:
/*SMTP 服务器的端口 (非 SSL 连接的端口一般默认为 25, 可以不添加, 如果开启了 SSL 连接,需要改为对应邮箱的 SMTP 服务器的端口, 具体可查看对应邮箱服务的帮助,
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);
3.创建一封包含图片和附件的复杂邮件
一封复杂的邮件内容可以看做是由很多节点(或者可以说是“片段”/“部分”/“零件”)组成,文本、图片、附件等都可以看成是邮件内容中的一个节点。这些节点之间又可以相互关联组合成一个节点。最终组合成一个大节点就是邮件的正文内容。
比如图片和文字是关联关系related,和简单邮件不同之处在于设置图片节点和文本节点
/*创建复杂邮件*/
public void sendMail2()throws Exception{
System.out.println("sendMailServlet-----start2");
//1.创建邮件对象
Properties properties = new Properties();
properties.put("mail.smtp.host", "mail.hand-china.com"); // 指定SMTP服务器
properties.put("mail.smtp.auth", "true"); // 指定是否需要SMTP验证
Session