本文介绍使用 Java Mail 进行邮件发送。 邮件内容为HTML文本,包括嵌入的图片。以及邮件附件的使用。 由于使用的API位于 javax.mail.*
包下,需要在 pom.xml
引入下面的库:
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.5.6</version>
</dependency>
下面是具体的邮件发送示例:
import java.io.File;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.Message.RecipientType;
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;
import javax.mail.internet.MimeUtility;
public class Test {
// 发送者
private static final String FROM = "***@163.com";
// 邮箱密码或授权码
private static final String PWD = "******";
// 接收者
private static final String TO = "***@163.com";
// 抄送者
private static final String CC = "***@qq.com";
public static void main(String[] args) throws Exception {
// 设置参数
Properties props = new Properties();
props.put("mail.transport.protocol", "smtp");
props.put("mail.smtp.host", "smtp.163.com");
props.put("mail.smtp.port", 465);
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.ssl.enable", "true");
props.put("mail.debug", "true");
// 根据参数创建邮件会话
Session session = Session.getInstance(props);
// 根据会话创建邮件对象
Message message = new MimeMessage(session);
// 设置发送者
message.setFrom(new InternetAddress(FROM));
// 设置接收者
message.setRecipient(RecipientType.TO, new InternetAddress(TO));
// 设置抄送者
message.setRecipients(RecipientType.CC, new InternetAddress[] { new InternetAddress(CC) });
// 设置标题
message.setSubject("这是邮件标题");
// 图片部分
MimeBodyPart imgPart = new MimeBodyPart();
File imgFile = new File("C:\\Users\\***\\Desktop\\***.png");
imgPart.setDataHandler(new DataHandler(new FileDataSource(imgFile)));
imgPart.setContentID("img0");
// 文本部分(HTML)
MimeBodyPart htmlPart = new MimeBodyPart();
String content = "<p>这是一封测试邮件,邮件正文为HTML内容。</p><p><img src=\"cid:img0\" /></p>";
htmlPart.setContent(content, "text/html; charset=utf-8");
// 组合图片部分与文本部分,并设置为“关联”关系
MimeMultipart multipart = new MimeMultipart();
multipart.addBodyPart(htmlPart);
multipart.addBodyPart(imgPart);
multipart.setSubType("related"); // 关联
// 将图片部分与文本部分封装为一个部分
MimeBodyPart bodyPart = new MimeBodyPart();
bodyPart.setContent(multipart);
// 附件部分
MimeBodyPart attachmentPart = new MimeBodyPart();
File docFile = new File("C:\\Users\\***\\Desktop\\***.docx");
attachmentPart.setDataHandler(new DataHandler(new FileDataSource(docFile)));
// 附件名称
attachmentPart.setFileName(MimeUtility.encodeText("测试附件.docx"));
// 组合所有部分,并设置为“混合”关系
MimeMultipart allParts = new MimeMultipart();
allParts.addBodyPart(bodyPart);
allParts.addBodyPart(attachmentPart);
allParts.setSubType("mixed"); // 混合
// 将内容设置到邮件对象
message.setContent(allParts);
// 获得邮件传输对象
Transport transport = session.getTransport();
// 用指定的帐号、密码进行连接
transport.connect(FROM, PWD);
// 发送邮件
transport.sendMessage(message, message.getAllRecipients());
// 关闭传输对象
transport.close();
}
}
下面是邮件内容的原始代码:
Received: from 192.168.1.2 (unknown [123.*.*.*])
by smtp3 (Coremail) with SMTP id DdGowAC3ru8uyH5cH7NMAA--.176S2;
Wed, 06 Mar 2019 03:04:22 +0800 (CST)
From: ***@163.com
To: ***@163.com
Cc: ***@qq.com
Message-ID: <1899073220.2.1551812665139@[192.168.1.2]>
Subject: =?UTF-8?B?6L+Z5piv6YKu5Lu25qCH6aKY?=
MIME-Version: 1.0
Content-Type: multipart/mixed;
boundary="----=_Part_1_122883338.1551812657192"
Date: Wed, 6 Mar 2019 03:04:22 +0800 (CST)
此处省略其他邮件头...
------=_Part_1_122883338.1551812657192
Content-Type: multipart/related;
boundary="----=_Part_0_1072408673.1551812657187"
------=_Part_0_1072408673.1551812657187
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: base64
此处省略HTML正文的BASE64编码...
------=_Part_0_1072408673.1551812657187
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-ID: img0
此处省略图片的BASE64编码...
------=_Part_0_1072408673.1551812657187--
------=_Part_1_122883338.1551812657192
Content-Type: application/octet-stream;
name="=?UTF-8?Q?=E6=B5=8B=E8=AF=95=E9=99=84=E4=BB=B6.docx?="
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="=?UTF-8?Q?=E6=B5=8B=E8=AF=95=E9=99=84=E4=BB=B6.docx?="
此处省略附件的BASE64编码...
------=_Part_1_122883338.1551812657192--