引言:
JavaMail 是一种可选的、能用于读取、编写和发送电子消息的包
JavaMail jar包下载地址:http://java.sun.com/products/javamail/downloads/index.html
JavaMail API中包含了多种邮件传输协议: SMTP POP(最新为pop3) IMAP MIME 四大类 (本章主要讲解常用的 SMTP)
该API的几大核心类:会话(session)、消息(message)、地址(address)、验证程序(Authentication)、传输(Transport),存储和文件夹
废话不多说,跟着例子一步步解释每个类的主要功能 —.—
实例代码演示:
**********************此例可直接复制粘帖至编译器进行测试哦**********************
package com.cplatform.movie.back.test;import java.io.UnsupportedEncodingException;import java.util.Properties;import javax.mail.Address;import javax.mail.Authenticator;import javax.mail.Message;import javax.mail.MessagingException;import javax.mail.PasswordAuthentication;import javax.mail.Session;import javax.mail.Transport;import javax.mail.internet.AddressException;import javax.mail.internet.InternetAddress;import javax.mail.internet.MimeMessage;/** * javaMail API 模拟邮箱发送电子邮件 */public class EmailFunction { /** * 发送邮件的props文件 (可使用自建priperty文件) * 用于初始化一个session实例,配置了一个session会话的一些基本信息 */ private final transient Properties props = new Properties(); /** * 邮件发送者的用户名和密码 */ private transient String username = "123456789@163.com"; private transient String password = "邮箱密码"; /** * session为一个基本的邮件会话,通过该会话可执行其他邮件工作 * 如:之后的初始化一个MimeMessage实例 */ private transient Session session; /** * MIME类型邮件MimeMessage类(抽象消息类Message的一个子类) * 可以通过将Session对象传递给MimeMessage构造器的方法来创建 */ private transient MimeMessage message; /** * 邮件内容类型 (这里演示一个html格式的消息格式) */ private final static String CONTENT_TYPE_HTML = "text/html;charset=utf-8"; /** * 端口号 */ private final static int MAIL_PORT = 25; /** * 邮件内容 */ private String content = "点击进入» <a href=''>测试邮件</a>"; /** * 继承Authenticator子类用于用户认证 (这里指邮件服务器对用户的认证) * 也可外部创建一个单独的邮件实体类(包涵用户名/密码即可),继承Authenticator类来重写PasswordAuthentication方法 */ static class MyAuthenricator extends Authenticator{ private String user=null; private String pass=""; public MyAuthenricator(String user,String pass){ this.user=user; this.pass=pass; } @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(user,pass); } } /** * 初始化 session 实例方法 * @param username 发送邮件的用户名(地址) * @param password 密码 * @param smtpHostName SMTP邮件服务器地址 */ private void initSession(String username, String password, String smtpHostName) { // 初始化props文件 props.setProperty("mail.transport.protocol", "smtp");//发送邮件协议 props.put("mail.smtp.auth", "true"); //需要验证 props.put("mail.smtp.host", smtpHostName); //服务器地址 // 根据property文件创建session,并传入Authenticator进行验证 session = Session.getInstance(props, new MyAuthenricator(username, password)); // 是否控制台打印消息列表 (可选) session.setDebug(true); } /** * 初始化邮箱message(消息实例)方法 * @param subject 邮件主题 * @param content 邮件内容 * @throws MessagingException * @throws AddressException * @throws UnsupportedEncodingException */ private void initMessage(String subject, Object content) throws AddressException, MessagingException, UnsupportedEncodingException { // 根据session创建一个消息对象 message = new MimeMessage(session); // 设置发件人地址 (第二个参数为显示发件人名称,目前还没有测试成功) message.setFrom(new InternetAddress(username, "要显示的发件人名称")); // 设置邮件的主题 message.setSubject("主题:javamail测试邮件"); // 设置邮件的发送内容和内容的content-type(这里采用text/html格式) message.setContent(content.toString(),EmailFunction.CONTENT_TYPE_HTML); // 设置邮件的接收人地址--方法一 (选其一即可) // Address[] address = new Address[]{new InternetAddress("418874847@qq.com"),"...更多列表..."}; // message.setReplyTo(addresses); // 设置邮件的接收人地址--方法二 (选其一即可) // 如果群发邮件,收件人较多,可另写一个方法用于专门循环遍历并设置接收人 message.addRecipient(Message.RecipientType.TO, new InternetAddress("418874847@qq.com")); message.addRecipient(Message.RecipientType.TO, new InternetAddress("12450374@qq.com")); } /** * 初始化邮件发送器方法 * @param username 发送邮件的用户名(地址),并以此解析SMTP服务器地址 * @param password 发送邮件的密码 * @throws MessagingException * @throws UnsupportedEncodingException * @throws AddressException * @return */ public void SimpleMailSender(final String username, final String password) throws AddressException, UnsupportedEncodingException, MessagingException { // 通过邮箱地址解析出smtp服务器,对大多数邮箱都管用 (还有IMAP和POP3) final String smtpHostName = "smtp." + username.split("@")[1]; // 调用初始化session方法 initSession(username, password, smtpHostName); // 调用初始化MimeMessage方法 (在初始化session完毕后) initMessage("邮件主题:测试邮件", content); } /** * 邮件发送 * @throws MessagingException * @throws UnsupportedEncodingException */ private void send() throws MessagingException, UnsupportedEncodingException { // 调用初始化邮件方法 SimpleMailSender(username, password); // 根据session来获得一个Transport抽象类对象 Transport tran = session.getTransport(); // 打开链接 ,此时会去校验用户名和密码 (参数列表:【 邮箱服务器地址】【端口号】【 发件箱用户名】【发件箱密码】) tran.connect(props.getProperty("mail.smtp.host"), EmailFunction.MAIL_PORT, username, password); // 发送邮件 (第二个参数null指收件人地址,因为在初始化message时已经设置好了收件人地址,此处便省略) tran.sendMessage(message, new Address[]{new InternetAddress("418874847@qq.com"),new InternetAddress("418874847@qq.com")}); // 关闭通道 tran.close(); } /** * main方法测试 * @param args * @throws AddressException * @throws MessagingException * @throws UnsupportedEncodingException */ public static void main(String[] args) throws AddressException, MessagingException, UnsupportedEncodingException { //直接调用发送方法 new EmailFunction().send(); } }
小结简单流程:
根据实例代码,来总结下用javamail来发送一封简单邮件的流程
- 下载javamail API jar包,并path到项目中去。(jar包下载地址请看本章开头)
- 创建一个java bean,设置必要私有属性,提高代码的复用性和可读性
- 创建内部类并继承Authenticator (验证机制)类,提供必要属性用户名和密码,重写getPasswordAuthentication方法
- 根据java.util.property文件初始化一个邮件的Session会话实例
- 根据步骤四得来的Session实例来初始化一个Message(消息)实例,并设置各个参数(收、发件人、主题、内容等)
- 根据Session创建一个Transport(传输)实例 --> 打开链接(connect) --> 发送(sendMessage) --> 关闭(close)
上述流程是依据本章的实例代码来罗列的,只是让大家对流程有个简单的认识,代码本身可能并不精简,还请多多指正。