首页 > WEB开发 > 后台开发 > Java邮件开发(JavaMail)
2014
09-04

Java邮件开发(JavaMail)

3、Java邮件开发(JavaMail)

本文主要利用JavaMail创建(☆)、发送邮件,不讲邮件接收。

1)核心API

  • Message抽象类:代表一封邮件。创建邮件时可使用其子类MimeMessage
  • MimeBodyPart类:邮件体中的一个Mime消息。
  • MimeMultiPart类:由多个Mime消息组合而成的组合Mime消息。

下图示例了如何将多个不同的Mime消息(文本、图片、附件)封装到邮件中:

17. Java邮件开发(JavaMail)2454

2)创建、发送邮件

为了减少后面代码的篇幅,首先抽取公共部分(固定发件人和接收人):

public class MailUtil {
	private static Properties props = new Properties();
	private static Session session = Session.getInstance(props);
	static{
		//Props中配置的参数同发送邮件有关(仅创建邮件时可以不设置)
		props.setProperty("mail.transport.protocol", "smtp");
		props.setProperty("mail.host", "smtp.163.com");
		props.setProperty("mail.smtp.auth", "true");//请求认证
	}
	public static MimeMessage createMessage(String subject){
		//创建MimeMessage对象:代表一封邮件
		MimeMessage message = new MimeMessage(session);
		//设置邮件头
		try {
			message.setFrom(new InternetAddress("flyne123@163.com"));
			message.setRecipients(Message.RecipientType.TO, "flyne123@163.com");
			message.setSubject(subject);
			return message;
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	public static void sendMail(Message message){
		try {
			Transport ts = session.getTransport();
			ts.connect("flyne123@163.com","www.flyne.org");
			ts.sendMessage(message, message.getAllRecipients());
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
}

① 只有文本的邮件

public static void main(String[] args) throws Exception {
	//创建message对象(已设置好邮件头)
	MimeMessage message = MailUtil.createMessage("a mail just contains text.");
	//设置正文(邮件体)
	message.setContent("<h1>just contains text</h1>", "text/html");

	//保存并生成最终的邮件内容
	message.saveChanges();
	//发送邮件
	MailUtil.sendMail(message);
	//顺便将邮件写到本地磁盘(只是看看效果,非必须)
	message.writeTo(new FileOutputStream("C:/Users/flyne/Desktop/1.eml"));
}

② 文本中内嵌图片的邮件

public static void main(String[] args) throws Exception{
	MimeMessage message = MailUtil.createMessage("a mail contains text&image");

	//设置正文①:文本部分
	MimeBodyPart textPart = new MimeBodyPart();
	textPart.setContent("美女图片 <img src='cid:mm'/> text", "text/html;charset=UTF-8");

	//设置正文②:图片部分
	MimeBodyPart imagePart = new MimeBodyPart();
	imagePart.setContentID("mm");
		//DataHandler是在JAF包中定义的(已集成到JDK1.6+中)
	DataHandler dh = new DataHandler(new FileDataSource("src/0.jpg"));
	imagePart.setDataHandler(dh);

	//设置正文③:关联文本和图片到MimeMultipart
	MimeMultipart mp = new MimeMultipart();
	mp.addBodyPart(textPart);
	mp.addBodyPart(imagePart);
	mp.setSubType("related");//multipart/related

	//设置正文④
	message.setContent(mp);

	message.saveChanges();
	//发送邮件
	MailUtil.sendMail(message);
	message.writeTo(new FileOutputStream("C:/Users/flyne/Desktop/2.eml"));
}

③ 文本中内嵌图片和附件的邮件(最复杂,可参考核心API的图)

public static void main(String[] args) throws Exception{
	MimeMessage message = MailUtil.createMessage("a mail contains text&image&file");

	//设置正文①:文本部分
	MimeBodyPart textPart = new MimeBodyPart();
	textPart.setContent("美女图片 <img src='cid:mm'/> text", "text/html;charset=UTF-8");

	//设置正文②:图片部分
	MimeBodyPart imagePart = new MimeBodyPart();
	imagePart.setContentID("mm");
	DataHandler dh = new DataHandler(new FileDataSource("src/0.jpg"));
	imagePart.setDataHandler(dh);

	//设置正文③:关联文本和图片
	MimeMultipart mp = new MimeMultipart();
	mp.addBodyPart(textPart);
	mp.addBodyPart(imagePart);
	mp.setSubType("related");//数据之间的关系:multipart/related

	//设置正文④:封装到BodyPart
	MimeBodyPart textImagePart = new MimeBodyPart();
	textImagePart.setContent(mp);

	//设置正文⑤:附件部分
	MimeBodyPart attachmentPart = new MimeBodyPart();
	dh = new DataHandler(new FileDataSource("src/Account.zip"));
	attachmentPart.setDataHandler(dh);
	attachmentPart.setFileName(MimeUtility.encodeText("账户表.zip"));//设置附件名

	//设置正文⑥:创建最终的邮件版本
	MimeMultipart finalMp = new MimeMultipart();
	finalMp.addBodyPart(textImagePart);
	finalMp.addBodyPart(attachmentPart);
	finalMp.setSubType("mixed");

	//设置正文⑦
	message.setContent(finalMp);

	message.saveChanges();
	//发送邮件
	MailUtil.sendMail(message);
	message.writeTo(new FileOutputStream("C:/Users/flyne/Desktop/3.eml"));
}

4、使用JNDI管理JavaMail的session

Session对象包含同邮件服务器的网络连接信息,在创建Message、Transport对象时均需要。可以在JNDI中配置同邮件服务器连接的Session。关于JNDI的概念参考《数据库连接池(DataSource)》一文。

配置步骤如下:

① 拷贝mail.jar到tomcat\lib目录中。【需删除web应用下的mail.jar,一定要注意】

② 在应用的META-INF目录下建立context.xml的配置文件

17. Java邮件开发(JavaMail)6479

③ 用JNDI的API从JNDI容器查找session对象:

17. Java邮件开发(JavaMail)6512

上面的配置过程也可在Tomcat documentation — JNDI Resources — JavaMail Sessions中找到。
【http://localhost:8080/docs/jndi-resources-howto.html#JavaMail_Sessions】


Java邮件开发(JavaMail)》有 1 条评论

  1. 总结的很好 说:

    总结的真好 ,

留下一个回复

你的email不会被公开。