Java 发送邮件

博客来源: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静态方法发送邮件。


    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值