一、简介

1、简介

JavaMail是一种用于编写和阅读电子消息(电子邮件)的API,它为发送和接收邮件提供了独立于协议和平台的框架。

JavaMail API支持以下协议:

  • SMTP

Simple Mail Transfer Protocol:简单邮件传输协议,它提供了一种发送电子邮件的机制。

  • POP3

Post Office Protocol - Version 3:邮局协议第三版,它提供了一种接收电子邮件的机制。它是Internet上大多数人用来获取邮件的机制,定义了对每个用户的单个邮箱的支持。

  • IMAP

Internet Message Access Protocol:Internet消息访问协议,是一种用于接收消息的高级协议。它为每个用户提供多个邮箱的支持,此外,邮箱也可以被多个用户共享。

  • MIME

Multipurpose Internet Mail Extensions:多用途Internet邮件扩展,它不是邮件传输协议,相反,它定义了传输的内容:消息的格式、附件等。

  • NNTP和其他

第三方提供商提供了许多协议,例如:网络新闻传输协议(NNTP)、安全多用途Internet邮件扩展(S/MIME)等。

2、架构

Java应用程序使用JavaMail API来发送和接收电子邮件。JavaMail API使用SPI(服务提供者接口)为Java应用程序提供中介服务来处理不同的协议。

JavaMail API主要分为两个部分:

  • 独立于应用程序的部分

应用程序使用API来发送和接收邮件消息,与使用的底层提供程序或协议无关。

  • 服务相关部分

服务提供者接口(SPI)使用特定于协议的语言,例如:SMTP、POP、IMAP和网络新闻传输协议(NNTP)。

3、下载与安装

JavaMail API不是标准JDK的一部分,可以在官网下载javax.mail.jar并添加到项目的构建路径中。如果是Maven项目,则只需添加以下依赖:

<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>1.6.2</version>
</dependency>

二、Hello World

发送电子邮件的步骤如下:

  • 创建javax.mail.Session对象

  • 创建javax.mail.internet.MimeMessage对象,并设置相关属性,例如:收件人电子邮件地址、电子邮件主题、电子邮件正文、附件等。

  • 使用javax.mail.Transport发送电子邮件

创建Session会话的逻辑因SMTP服务器的类型而异,例如:如果SMTP服务器不需要任何身份验证,则只需要创建具有一些简单属性的Session对象即可。

样例:

public static void main(String[] args) {
	final String fromEmail = "examplefrom@163.com";
	//此处为授权码
	final String password = "ABCDEFGHIJKLMN";
	final String toEmail = "exampleto@126.com";
	
	Properties properties = new Properties();
	properties.put("mail.smtp.host", "smtp.163.com");
	properties.put("mail.smtp.auth", "true");
	
	Authenticator authenticator = new Authenticator() {
		@Override
		protected PasswordAuthentication getPasswordAuthentication() {
			return new PasswordAuthentication(fromEmail, password);
		}
	};
	
	//创建会话
	Session session = Session.getDefaultInstance(properties, authenticator);
	
	try {
		//编写消息
		MimeMessage message = new MimeMessage(session);
		message.setFrom(new InternetAddress(fromEmail));
		message.addRecipient(Message.RecipientType.TO, new InternetAddress(toEmail));
		message.setSubject("Hello World");
		message.setText("Hello, how are you?");
		//发送消息
		Transport.send(message);
	} catch (Exception e) {
		e.printStackTrace();
	}
}

运行结果:

三、发送HTML

public static void main(String[] args) {
	final String fromEmail = "examplefrom@163.com";
	//此处为授权码
	final String password = "ABCDEFGHIJKLMN";
	final String toEmail = "exampleto@126.com";
	
	Properties properties = new Properties();
	properties.put("mail.smtp.host", "smtp.163.com");
	properties.put("mail.smtp.auth", "true");
	
	Authenticator authenticator = new Authenticator() {
		@Override
		protected PasswordAuthentication getPasswordAuthentication() {
			return new PasswordAuthentication(fromEmail, password);
		}
	};
	
	//创建会话
	Session session = Session.getDefaultInstance(properties, authenticator);
	
	try {
		//编写消息
		MimeMessage message = new MimeMessage(session);
		message.setFrom(new InternetAddress(fromEmail));
		message.addRecipient(Message.RecipientType.TO, new InternetAddress(toEmail));
		
		String content = "<h1>你好,很高兴认识你!</h1>";
		message.setSubject("HTML Message");
		message.setContent(content, "text/html;charset=UTF-8");
		
		//发送消息
		Transport.send(message);
	} catch (Exception e) {
		e.printStackTrace();
	}
}

运行结果:

四、发送附件

import java.io.File;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
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 AttachmentEmailTest {

	public static void main(String[] args) {
		final String fromEmail = "examplefrom@163.com";
		//此处为授权码
		final String password = "ABCDEFGHIJKLMN";
		final String toEmail = "exampleto@126.com";
		
		Properties properties = new Properties();
		properties.put("mail.smtp.host", "smtp.163.com");
		properties.put("mail.smtp.auth", "true");
		
		Authenticator authenticator = new Authenticator() {
			@Override
			protected PasswordAuthentication getPasswordAuthentication() {
				return new PasswordAuthentication(fromEmail, password);
			}
		};
		
		//创建会话
		Session session = Session.getDefaultInstance(properties, authenticator);
		
		try {
			//编写消息
			MimeMessage message = new MimeMessage(session);
			message.setFrom(new InternetAddress(fromEmail));
			message.addRecipient(Message.RecipientType.TO, new InternetAddress(toEmail));
			message.setSubject("With Attachment");
			
			//创建MimeBodyPart对象并设置文本消息
			BodyPart textPart = new MimeBodyPart();
			textPart.setText("您有一个附件待查收。");
			
			//创建新的MimeBodyPart对象,并为该对象设置DataHandler
			MimeBodyPart attachmentPart = new MimeBodyPart();
			String filename = "wallpaper.jpg";
			DataSource source = new FileDataSource(new File("G:/" + filename));
			attachmentPart.setDataHandler(new DataHandler(source));
			attachmentPart.setFileName(filename);
			
			//创建 Multipart对象并将MimeBodyPart对象添加到该对象中
			Multipart multipart = new MimeMultipart();
			multipart.addBodyPart(textPart);
			multipart.addBodyPart(attachmentPart);
			
			//将Multiplart对象设置到Message对象中
			message.setContent(multipart);
			
			//发送消息
			Transport.send(message);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
}

运行结果:

参考资料: