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静态方法发送邮件。


评论关闭
评论 还能输入200
评论关闭
评论 还能输入200
  • 全部评论(0)
资料加载中...
已关注 , 取消