使用JavaMail发送邮件
电子邮件的应用非常广泛,例如在某网站注册了一个账户,自动发送一封欢迎邮件,通过邮件找回密码,自动批量发送活动信息等。但这些应用不可能和我们自己平时发邮件一样,先打开浏览器,登录邮箱,创建邮件再发送。本文将简单介绍如果通过 Java 代码来创建电子邮件,并连接邮件服务器发送邮件。
1. 电子邮件协议
电子邮件的在网络中传输和网页一样需要遵从特定的协议,常用的电子邮件协议包括 SMTP,POP3,IMAP。其中邮件的创建和发送只需要用到 SMTP协议,所有本文也只会涉及到SMTP协议。SMTP 是 Simple Mail Transfer Protocol 的简称,即简单邮件传输协议。
2. JavaMail
我们平时通过 Java 代码打开一个 http 网页链接时,通常可以使用已经对 http 协议封装好的 HttpURLConnection 类来快速地实现。Java 官方也提供了对电子邮件协议封装的 Java 类库,就是JavaMail,但并没有包含到标准的 JDK 中,需要我们自己去 Java 或 Oracle 官网下载。
下载完毕后,解压下载文件,在根目录下找到mail.jar
现在打开Java编辑软件(Eclipse或者MyEclipse),首先建立一个Java项目,把刚才下载好的mail.jar包导入到工程,最好建立一个lib文件夹,然后把jar包Build Path-->Add to Build Path加入环境变量中。
3. 创建一封一个简单的电子邮件
邮件创建步骤:
- 创建一个邮件对象(Mimemessage);
- 设置发件人,收件人,可选增加多个收件人,抄送人,密送人;
- 设置邮件的主题(标题);
- 设置邮件的正文(内容);
- 设置显示的发送时间;
- 保存到本地。
代码实现:
import javax.mail.Session; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.io.FileOutputStream; import java.io.OutputStream; import java.util.Date; import java.util.Properties; public class SimpleSendEmail { public static void main(String[] args) throws Exception { // 1. 创建一封邮件 Properties props = new Properties();//用于连接邮件服务器的参数配置(发送邮件时才需要用到) Session session = Session.getDefaultInstance(props);//根据参数配置,创建会话对象(为了发送邮件准备的) MimeMessage message = new MimeMessage(session);//创建邮件对象 /* * 也可以根据已有的eml邮件文件创建 MimeMessage 对象 * MimeMessage message = new MimeMessage(session, new FileInputStream("MyEmail.eml")); */ // 2. From: 发件人 // 其中 InternetAddress 的三个参数分别为: 邮箱, 显示的昵称(只用于显示, 没有特别的要求), 昵称的字符集编码 // 真正要发送时, 邮箱必须是真实有效的邮箱。 message.setFrom(new InternetAddress("aa@send.com", "USER_AA", "UTF-8")); // 3. To: 收件人 message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress("cc@receive.com", "USER_CC", "UTF-8")); // To: 增加收件人(可选) message.addRecipient(MimeMessage.RecipientType.TO, new InternetAddress("dd@receive.com", "USER_DD", "UTF-8")); // Cc: 抄送(可选) message.setRecipient(MimeMessage.RecipientType.CC, new InternetAddress("ee@receive.com", "USER_EE", "UTF-8")); // Bcc: 密送(可选) message.setRecipient(MimeMessage.RecipientType.BCC, new InternetAddress("ff@receive.com", "USER_FF", "UTF-8")); // 4. Subject: 邮件标题 message.setSubject("邮件标题", "UTF-8"); // 5. Content: 邮件正文(可以使用html标签) message.setContent("这是邮件正文。。。", "text/html;charset=UTF-8"); // 6. 设置显示的发件时间 message.setSentDate(new Date()); // 7. 保存前面的设置 message.saveChanges(); // 8. 将该邮件保存到本地 OutputStream out = new FileOutputStream("MyEmail.eml"); message.writeTo(out); out.flush(); out.close(); } }
然后在你的项目路径下,产生了一个MyEmail.eml文件,打开文件如图显示:
4. 使用QQ发送电子邮件
发送邮件首先需要有一个邮箱账号和密码,本文以腾讯QQ邮箱为例,邮箱账号必须要开启 SMTP 服务,在浏览器网页登录邮箱后一般在邮箱的“设置”选项中可以开启,并记下邮箱的 SMTP 服务器地址,如下所示(其他邮箱大同小异):
点击邮箱首页设置
代码实现:
import javax.mail.Authenticator; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.security.GeneralSecurityException; import java.util.Date; import java.util.Properties; /** * 实现QQ邮箱发送的Demo */ public class SendMail { public static void main(String[] args) throws GeneralSecurityException { final String from = "xxxxxxx@qq.com";//发送方邮箱,填写自己的真实邮箱 final String password = "这里填写刚才QQ邮箱拿到的授权码"; String host = "smtp.qq.com";//邮件服务器地址 Properties properties = new Properties();//参数键值对实例对象 properties.setProperty("mail.debug", "true");//设置开启debug模式 properties.setProperty("mail.smtp.host", host);//设置邮件服务器 properties.put("mail.smtp.ssl.enable", "true");//设置激活SSL验证 properties.put("mail.smtp.auth", true);//设置用户身份验证 properties.put("mail.transport.protocol", "smtp");//设置邮件协议 //得到默认的Session对象 Session session = Session.getDefaultInstance(properties, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { //通过发送方邮箱号和邮箱授权码创建用户登录验证 return new PasswordAuthentication(from, password); } }); // session.setDebug(true);//设置开启dubug模式,和上面设置一样,会覆盖上面设置 MimeMessage mimeMessage = new MimeMessage(session); try { //InternetAddress 的三个参数分别为: 邮箱, 显示的昵称(只用于显示, 没有特别的要求), 昵称的字符集编码 mimeMessage.setFrom(new InternetAddress(from, "张三", "UTF-8"));//设置发送方邮件地址,必须真实有效 //设置收件人邮箱号,必须真实有效,不然报错 mimeMessage.addRecipient(MimeMessage.RecipientType.TO, new InternetAddress("xxxxx@outlook.com", "收件人", "UTF-8")); //设置收件人,必须真实有效,不然报错 mimeMessage.addRecipient(MimeMessage.RecipientType.TO, new InternetAddress("xxxxx@139.com", "收件人1", "UTF-8")); //增加设置收件人,必须真实有效,不然报错 mimeMessage.addRecipient(MimeMessage.RecipientType.TO, new InternetAddress("xxxxxx@qq.com", "收件人2", "UTF-8")); //设置抄送人,必须真实有效,不然报错 mimeMessage.addRecipient(MimeMessage.RecipientType.CC, new InternetAddress("xxxxxx@163.com", "抄送人", "UTF-8")); //设置密送人,必须真实有效,不然报错 mimeMessage.addRecipient(MimeMessage.RecipientType.BCC, new InternetAddress("xxxxxx@foxmail.com", "密送人", "UTF-8")); mimeMessage.setSentDate(new Date());//设置发送邮件时间 mimeMessage.setSubject("邮件标题", "UTF-8");//设置邮件标题和编码集 mimeMessage.setContent("邮件正文内容", "text/html;charset=UTF-8");//设置邮件正文内容和内容类型 Transport.send(mimeMessage); System.out.println("邮件发送成功..."); } catch (Exception e) { e.printStackTrace(); System.out.println("邮件发送失败..."); } } }
现在查看收件人的邮箱,发现收到了邮件内容啦,恭喜你成功完成邮箱发送的功能。