博客来源:http://baike.xsoftlab.net/view/130.html
Java 发送邮件
SMTP(Simple Mail Transfer Protocol)协议是目前最流行的发送电子邮件的协议,Java Mail API能以SMTP协议发送电子邮件,虽然Java Mail是Sun的API之一,但它目前还没有被加在标准的Java开发工具包中(JDK),这就意味着你在使用前必须另外下载JavaMail文件。Java Mail文件包括mail.jar和activation.jar,将这两个jar包复制到工程的ClassPath中即可。本实例将演示如何使用Java Mail API发送简单的SMTP协议邮件,如文本邮件、HTML邮件。
| |目录
技术要点
使用Java Mail,以SMTP协议发送电子邮件的技术要点如下:
-
Session类:Session类定义了一个基本的邮件会话。通过该会话可让别的工作顺利执行。可以通过Session类的getDefaultInstance()方法获取Session对象,Session对象利用Java.util.Properties对象获取诸如邮件服务器、用户名、密码等信息,以及其他可在整个应用程序中共享的信息。
-
Message类:由于Message是一个抽象类,所以可以使用javax.mail.internet.MimeMessage这个子类,该类是使用MIME类型、MIME信息头的邮箱信息。信息头只能使用US-ASCII字符,而非ASCII字符将通过编码转换为ASCII的方式使用。为了建立一个MimeMessage对象,必须将Session对象作为MimeMessage构造方法的参数传入:MimeMessage message=new MimeMessage(session);
-
Address类:由于Address类也是一个抽象类,所以只能使用javax.mail.internet.InternetAddress这个子类。创建Address对象的形式如:Address address=new InternetAddress(""),其中需要传入一个代表邮件地址的字符串作为参数。
-
Authenticator类:Java Mail API可以利用Authenticator通过用户名和密码访问邮件服务器。Authenticator是抽象类,所以只能使用继承该抽象类的子类对象,并且必须重写返回类型为PasswordAuthentication的getPasswordAuthentication()方法。子类对象创建后,需要向Session注册Authenticator,使Session能够了解在认证时该使用哪个类。
-
Transport类:此类的主要作用是发送信息,由于Transport类是一个抽象类,所以可以调用Transport的send静态方法发送邮件,参数为一个Message对象,如:Transport.send(message);
准备工作
163邮箱一个。
jar包:activation-1.1.jar 、 mail-1.4.5.jar
代码实现
Send_Mail.java 处理邮件发送信息
package net.xsoftlab.baike;
import java.util.Date;
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
/**
* 简单邮件(不带附件的邮件)发送器
*/
public class Send_Mali {
/**
* 以文本格式发送邮件
*
* @param mailInfo
* 待发送的邮件的信息
*/
public static boolean Mail_Text(Mail_SendProper mailSender) {
MailAttorney attorney = null;
if (mailSender.isIsvalidate()) {// 判断是否需要身份认证
attorney = new MailAttorney(mailSender.getUserName(),// 如果需要身份认证,则创建一个密码验证器
mailSender.getPassword());
}
// 根据邮件会话属性和密码验证器构造一个发送邮件的session
Session sendMailSession = Session.getInstance(
mailSender.getProperties(), attorney);
try {
Message mailMessage = new MimeMessage(sendMailSession);// 根据session创建一个邮件消息
Address from = new InternetAddress(mailSender.getSendAddress());// 创建邮件发送者地址
mailMessage.setFrom(from); // 设置邮件消息的发送者
// 创建邮件的接收者地址,并设置到邮件消息中
Address to = new InternetAddress(mailSender.getReceiveAddress());
mailMessage.setRecipient(Message.RecipientType.TO, to);
mailMessage.setSubject(mailSender.getSubject()); // 设置邮件消息的主题
mailMessage.setSentDate(new Date()); // 设置邮件消息发送的时间
String mailContent = mailSender.getContent();// 获取Mail_SendProper类中封装的内容
mailMessage.setText(mailContent);// 设置邮件消息的主要内容
Transport.send(mailMessage);// 发送邮件
return true;
} catch (MessagingException ex) {
ex.printStackTrace();
}
return false;
}
/**
* 以HTML格式发送邮件
*
* @param mailSender
* 待发送的邮件信息
*/
public static boolean Html_Mail(Mail_SendProper mailSender) {
MailAttorney attorney = null;
if (mailSender.isIsvalidate()) {// 判断是否需要身份认证
attorney = new MailAttorney(mailSender.getUserName(),
mailSender.getPassword());// 如果需要身份认证,则创建一个密码验证器
}
Session sendMailSession = Session.getInstance(
mailSender.getProperties(), attorney);// 根据邮件会话属性和密码验证器构造一个发送邮件的session
try {
Message mailMessage = new MimeMessage(sendMailSession);// 根据session创建一个邮件消息
Address from = new InternetAddress(mailSender.getSendAddress());// 创建邮件发送者地址
mailMessage.setFrom(from); // 设置邮件消息的发送者的地址
Address to = new InternetAddress(mailSender.getReceiveAddress());// 创建邮件的接收者地址,并设置到邮件消息中
mailMessage.setRecipient(Message.RecipientType.TO, to);// Message.RecipientType.TO属性表示接收者的类型为TO
mailMessage.setSubject(mailSender.getSubject()); // 设置邮件消息的主题
mailMessage.setSentDate(new Date()); // 设置邮件消息发送的时间
Multipart mainPart = new MimeMultipart();// MiniMultipart类是一个容器类,包含MimeBodyPart类型的对象
BodyPart html = new MimeBodyPart();// 创建一个包含HTML内容的MimeBodyPart
html.setContent(mailSender.getContent(), "text/html; charset=GBK");// 设置HTML内容
mainPart.addBodyPart(html);
mailMessage.setContent(mainPart); // 将MiniMultipart对象设置为邮件内容
Transport.send(mailMessage); // 发送邮件
return true;
} catch (MessagingException ex) {
ex.printStackTrace();
}
return false;
}
public static void main(String[] args) {
// 创建Mail_SendProper类的对象,用于获取邮件的基本信息
Mail_SendProper mailSender = new Mail_SendProper();
mailSender.setHost("smtp.163.com");
mailSender.setPort("25");
mailSender.setIsvalidate(true);
mailSender.setUserName("xxx@163.com");
mailSender.setPassword("xxx");
mailSender.setSendAddress("xxx@163.com");
mailSender.setReceiveAddress("xxx@163.com");
mailSender.setSubject("我的邮件测试");
mailSender.setContent("我的邮件测试 My First Mail
My test mail
测试成功");
System.out.println("发送邮件中...");
System.out.println("正在发送文本格式邮件...");
// 以文本格式发送邮件
Send_Mali.Mail_Text(mailSender);
System.out.println("文本格式邮件发送完毕.");
System.out.println("正在发送HTML格式邮件...");
// 以HTML格式发送邮件
Send_Mali.Html_Mail(mailSender);
System.out.println("HTML格式邮件发送完毕.");
System.out.println("全部邮件发送完毕.");
}
}
Mail_SendProper.java 是发送邮件需要使用的基本信息
package net.xsoftlab.baike;
import java.util.Properties;
/**
* 发送邮件需要使用的基本信息
*/
public class Mail_SendProper {
// 发送邮件的服务器的IP和端口
private String Host;
private String Port = "25";
private String SendAddress; // 邮件发送者的地址
private String ReceiveAddress; // 邮件接收者的地址
// 登陆邮件发送服务器的用户名和密码
private String userName;
private String password;
private boolean isvalidate = true; // 是否需要身份验证
private String subject; // 邮件主题
private String content; // 邮件的文本内容
private String[] attachFileNames; // 邮件附件的文件名
/** 获得邮件会话属性 */
public Properties getProperties() {
Properties p = new Properties();
p.put("mail.smtp.host", this.Host);
p.put("mail.smtp.port", this.Port);
p.put("mail.smtp.auth", isvalidate ? "true" : "false");
return p;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getHost() {
return Host;
}
public void setHost(String host) {
Host = host;
}
public boolean isIsvalidate() {
return isvalidate;
}
public void setIsvalidate(boolean isvalidate) {
this.isvalidate = isvalidate;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getPort() {
return Port;
}
public void setPort(String port) {
Port = port;
}
public String getReceiveAddress() {
return ReceiveAddress;
}
public void setReceiveAddress(String receiveAddress) {
ReceiveAddress = receiveAddress;
}
public String getSendAddress() {
return SendAddress;
}
public void setSendAddress(String sendAddress) {
SendAddress = sendAddress;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String[] getAttachFileNames() {
return attachFileNames;
}
public void setAttachFileNames(String[] attachFileNames) {
this.attachFileNames = attachFileNames;
}
}
MailAttorney.java 是邮件身份认证器,在发送邮件时使用。
package net.xsoftlab.baike;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
/**
* 邮件身份认证器,在发送邮件时使用
*/
public class MailAttorney extends Authenticator {
// 登陆发送邮件服务器的用户名和密码
private String userName;
private String password;
public MailAttorney(String userName, String password) {
this.userName = userName;
this.password = password;
}
/** 覆盖父类的该方法,获得密码认证器 */
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(userName, password);
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
程序解读
1.Mail_SendProper类
该类定义了发送邮件时需要的信息,包括SMTP邮件发送服务器的IP地址和端口、邮件发送者和接收者的邮件地址、是否需要身份验证、身份验证时的用户名和密码、邮件的主题和文本内容,以及邮件附件的文件名。
getProperties()方法的作用是获得邮件会话属性,将邮件会话属性保存到一个java.util.Properties对象中,mail.smtp.host属性表示SMTP服务器的地址(IP地址或者域名);mail.smtp.port属性表示SMTP服务器的端口;mail.smtp.auth属性表示登录SMTP服务器时是否需要身份认证,true表示需要身份验证反之则不需要。
2.MailAttorney类
定义了邮件身份认证器,继承Authenticator抽象类。
重写了父类的getPasswordAuthentication方法,将登录SMTP服务器的用户名和密码构造成一个PasswordAuthentication对象返回。当发送邮件需要身份认证时,将会调用该方法。
3.Send_Mail类
该类以SMTP协议发送简单邮件,包括文本邮件和HTML邮件。
1) Mail_Text方法发送文本邮件,参数为Mail_SendProper对象。
根据Mail_SendProper的isIsvalidate方法判断是否需要身份认证,如果需要身份认证,则用用户名和密码构造一个MailAttorney对象。调用Session的getInstance方法获得一个邮件会话,例如:Session.getInstance(mailSender.getProperties(),attorney);第一个参数指定了邮件会话属性,第二个参数指定了邮件身份认证器。根据session创建一个邮件消息,用它来存储邮件内容,将邮件发送者的地址封装成InternetAddress对象。
调用MailMessage.setFrom()方法设置邮件发送者,将邮件接收者的地址封装成InternetAddress对象,
调用MailMessage.setRecipient方法设置邮件接收者,Message.RecipientType.TO常量表示该接收者是收件人。
通过MailMessage.setSubject()设置邮件的主题。
通过MailMessage.setSentDate()设置邮件的发送时间。
通过MailMessage.setText()设置邮件的文本内容。
通过Transport.send()发送邮件。
2) Html_Mail()方法发送HTML邮件,参数为Mail_SendProper对象。除了在设置邮件内容时与发送文本邮件不同以外,其他步骤与发送文本邮件一样。
给MimeMessage设置HTML内容时,需要使用MimeMultipart类,一封MIME邮件的内容是一个MimeMultipart对象,而一个MimeMultipart可以包含多个MimeBodyPart,一个MimeBodyPart存放一个子内容,如一段HTML代码、一个文件等。
调用MimeBodyPart的setContent方法设置邮件的子内容,它的第一个参数指定了邮件子内容,第二个参数指定了邮件内容的格式,"text/html;charset=GBK"表示以HTML格式编辑邮件子内容,而且字符编码是GBK,支持中文。调用MimeMultipart的addBodyPart方法把子内容添加到MimeMultipart中,最后调用MimeMessage的setContent方法把MimeMultipart设置为邮件的内容,调用Transport的send静态方法发送邮件。