JavaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口。它是Sun发布的用来处理email的API。它可以方便地执行一些常用的邮件传输。
一:邮箱协议
常用的邮件协议有SMTP、POP3和IMAP。
1.SMTP协议
SMTP称为简单邮件传输协议,可以向用户提供高效、可靠的邮件传输方式。SMTP的一个重要特点是它能够在传送过程中转发电子邮件,即邮件可以通过不同网络上的邮件服务器转发到其他的邮件服务器。
SMTP协议工作在两种情况下:一是电子邮件从客户机传输到邮件服务器;二是从某一台邮件服务器传输到另一台邮件服务器。SMTP是个请求/响应协议,它监听25号端口,用于接收用户的邮件请求,并与远端邮件服务器建立SMTP连接。
2.POP3协议
POP称为邮局协议,用于电子邮件的接收,它使用TCP的110端口,常用的是第三版,所以简称为POP3。
POP3仍采用C/S工作模式。当客户机需要服务时,客户端的软件(如Outlook Express)将与POP3服务器建立TCP连接,然后要经过POP3协议的3种工作状态:首先是认证过程,确认客户机提供的用户名和密码;在认证通过后便转入处理状态,在此状态下用户可收取自己的邮件,在完成相应操作后,客户机便发出quit命令;此后便进入更新状态,将作删除标记的邮件从服务器端删除掉。到此为止,整个POP过程完成。
3.IMAP协议
IMAP称为Internet信息访问协议,主要提供的是通过Internet获取信息的一种协议。IMAP像POP3那样提供了方便的邮件下载服务,让用户能进行离线阅读,但IMAP能完成的却远远不只这些。IMAP提供的摘要浏览功能可以让你在阅读完所有的邮件到达时间、主题、发件人、大小等信息后再作出是否下载的决定。
二:JavaMail包
JavaMail 包中用于处理电子邮件的核心类是: Properties 、 Session 、 Message 、 Address 、 Authenticator 、 Transport 、 Store 等。
①Properties
//自己的邮箱
public static String myEmailAccount = "[email protected]";
//授权码(使用第三方工具登陆的密码)
public static String myEmailPassword = "XXXXXXXXXXXXX";
// 发件人邮箱的 SMTP 服务器地址,格式为: smtp.xxx.com
public static String myEmailSMTPHost = "smtp.qq.com";
// 收件人邮箱
public String receiveMailAccount = "[email protected]";
Public static String smtpPort = "587";
配置
// 1. 创建参数配置, 用于连接邮件服务器的参数配置
Properties prop = new Properties(); // 参数配置
prop.setProperty("mail.transport.protocol", "smtp"); //
// 使用的协议(JavaMail规范要求)
prop.setProperty("mail.smtp.host", myEmailSMTPHost); // 发件人的邮箱的 SMTP
// 服务器地址
prop.setProperty("mail.smtp.auth", "true"); // 需要请求认证
prop.setProperty("mail.smtp.port", smtpPort);
prop.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
prop.setProperty("mail.smtp.socketFactory.fallback", "true");
prop.setProperty("mail.smtp.socketFactory.port", smtpPort);
②Session
Session 表示一个邮件会话。
Session 的主要作用包括两个方面:
接收各种配置属性信息:通过 Properties 对象设置的属性信息。
初始化 JavaMail 环境:根据 JavaMail 的配置文件,初始化 JavaMail 环境,以便通过 Session 对象创建其他重要类的实例。
Session session = Session.getInstance(prop);
③Message
MimeMessage 类:代表整封邮件。
要创建一个 Message ,需要将 Session 对象传递给 MimeMessage 构造器:
MimeMessage message = new MimeMessage(session);
注意:还存在其它构造器,如用按 RFC822 格式的输入流来创建消息。
setFrom :设置邮件的发件人
setRecipient :设置邮件的发送人、抄送人、密送人
三种预定义的地址类型是:
Message.RecipientType.TO :收件人
Message.RecipientType.CC :抄送人
Message.RecipientType.BCC :密送人
setSubject :设置邮件的主题
setContent :设置邮件内容
setText :如果邮件内容是纯文本,可以使用此接口设置文本内容。
④Address
创建了 Session 和 Message ,并将内容填入消息后,就可以用 Address 确定信件地址了。和 Message 一样, Address 也是个抽象类。你用的是 javax.mail.internet.InternetAddress 类。
若创建的地址只包含电子邮件地址,只要传递电子邮件地址到构造器就行了。
例:
Address address = new InternetAddress("[email protected]");
⑤Transport
邮件操作只有发送或接收两种处理方式。
JavaMail 将这两种不同操作描述为传输( javax.mail.Transport )和存储( javax.mail.Store ),传输对应邮件的发送,而存储对应邮件的接收。
getTransport : Session 类中的 getTransport () 有多个重载方法,可以用来创建 Transport 对象。
connect : 如果设置了认证命令—— mail.smtp.auth ,那么使用 Transport 类的 connect 方法连接服务器时,则必须加上用户名和密码。
sendMessage : Transport 类的 sendMessage 方法用来发送邮件消息。
⑥Store
getStore : Session 类中的 getStore () 有多个重载方法,可以用来创建 Store 对象。
connect : 如果设置了认证命令—— mail.smtp.auth ,那么使用 Store 类的 connect 方法连接服务器时,则必须加上用户名和密码。
getFolder : Store 类的 getFolder 方法可以 获取邮箱内的邮件夹 Folder 对象
close : Store 类的 close 方法用来关闭和邮件服务器的连接。
三:程序操作邮箱发送邮件
· 创建Properties对象配置属性。
· 创建一个 Session 对象。
· Session对象创建一个 Message 对象 ( 也就是邮件内容 ) 。
· Session 对象创建一个 Transport 对象 /Store 对象,用来发送 / 保存邮件。
· Transport 对象发送邮件; Store 对象获取邮箱的邮件。
1:将邮箱的smtp服务开启 (QQ邮箱)
2:
封装发送邮件
package TestJavaEmail;
import java.util.Date;
import java.util.Properties;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
public class MyEmail {
//发件人的邮箱
public static String myEmailAccount = "[email protected]";
//授权码(第三方登陆的密码)
public static String myEmailPassword = "ldejlufrfbsybfbe";
// 发件人邮箱的 SMTP 服务器地址, 一般格式为 smtp.xxx.com
public static String myEmailSMTPHost = "smtp.qq.com";
// 收件人邮箱
public String receiveMailAccount = null;
public static String smtpPort = "587";
public String getReceiveMailAccount() {
return receiveMailAccount;
}
public void setReceiveMailAccount(String receiveMailAccount) {
this.receiveMailAccount = receiveMailAccount;
}
public MyEmail(String receiveMailAccount) {
super();
this.receiveMailAccount = receiveMailAccount;
}
public MyEmail() {
super();
}
/**
* 封装邮件
*
* @param session
* @param sendMail
* @param receiveMail
* @return 邮件对象
* @throws Exception
*/
//创建邮件
public MimeMessage getMimeMessage(Session session, String sendMail, String receiveMail,Object content) throws Exception {
// 1.创建邮件对象
MimeMessage message = new MimeMessage(session);
// 2.from:发件人
// 其中 InternetAddress 的三个参数分别为:
// 邮箱必须是真实有效的邮箱。, 显示的昵称(只用于显示), 昵称的字符集编码
// Address是抽象类->InternetAddress是实现类
message.setFrom(new InternetAddress(sendMail, "小草帽(Maps)", "UTF-8"));
// 3. to收件人。
message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMail, "LJY", "UTF-8"));
// To: 增加收件人(可选)
// message.addRecipient(MimeMessage.RecipientType.TO, new
// InternetAddress("[email protected]", "USER_DD", "UTF-8"));
// Cc: 抄送(可选)
// message.setRecipient(MimeMessage.RecipientType.CC, new
// InternetAddress("[email protected]", "USER_EE", "UTF-8"));
// Bcc: 密送(可选)
// message.setRecipient(MimeMessage.RecipientType.BCC, new
// InternetAddress("[email protected]", "USER_FF", "UTF-8"));
// 4:设置邮件主题
message.setSubject("MyEmail", "UTF-8");
// 5. Content: 邮件正文(可以使用html标签)
message.setContent(content, "text/html;charset=UTF-8");
// 6. 设置显示的发件时间 java.util.Date类型
message.setSentDate(new Date());
// 7. 保存前面的设置
message.saveChanges();
// 8. 将该邮件返回
return message;
}
//将信件内容传递进来
public void sendEmail(Object content) throws Exception {
// 1. 创建参数配置, 用于连接邮件服务器的参数配置
Properties prop = new Properties();
prop.setProperty("mail.transport.protocol", "smtp");
// 使用的协议(JavaMail规范要求)
prop.setProperty("mail.smtp.host", myEmailSMTPHost);
// 发件人的邮箱的 SMTP,服务器地址
prop.setProperty("mail.smtp.auth", "true");
// 需要请求认证
// 某些邮箱服务器要求 SMTP 连接需要使用 SSL 安全认证 (为了提高安全性, 邮箱支持SSL连接, 也可以自己开启)。
// 如果无法连接邮件服务器, 开启 SSL 安全连接。
// SMTP 服务器的端口 (非 SSL 连接的端口一般默认为 25, 可以不添加
// 如果开启了 SSL 连接,需要改为对应邮箱的 SMTP 服务器的端口
// QQ邮箱的SMTP(SLL)端口为465或587。
prop.setProperty("mail.smtp.port", smtpPort);
prop.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
prop.setProperty("mail.smtp.socketFactory.fallback", "true");
prop.setProperty("mail.smtp.socketFactory.port", smtpPort);
// 2. 根据配置创建会话对象, 用于和邮件服务器交互
Session session = Session.getInstance(prop);
session.setDebug(true); // 设置为debug模式, 可以查看详细的发送 log
// 3. 创建一封邮件
MimeMessage message = getMimeMessage(session, myEmailAccount, receiveMailAccount,content);
// 4. 根据 Session 获取邮件传输对象
Transport transport = session.getTransport();
// 5.绑定自己的邮箱和发送目标的邮箱
transport.connect(myEmailAccount, myEmailPassword);
// 6. 发送邮件, 发到所有的收件地址抄送人, 密送人
// message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人
transport.sendMessage(message, message.getAllRecipients());
// 7. 关闭连接
transport.close();
}
}