基于简单邮件传送协议SMTP发送电子邮件
SMTP协议概述
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,尽管邮件服务器可以用SMTP发送、接收邮件,但是邮件客户端只能用SMTP发送邮件,接收邮件一般用IMAP 或者 POP3 。邮件客户端使用TCP的25号端口与服务器通信。
SMTP协议下的邮件发送步骤
1、定义JavaMailUtils为工具类
public final class JavaMailUtils {
private JavaMailUtils() {
}
public static Session createSession() {
// SMTP服务器连接信息
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.163.com"); // SMTP主机名
props.put("mail.smtp.port", "25"); // 主机端口号
props.put("mail.smtp.auth", "true"); // 是否需要用户认证
props.put("mail.smtp.starttls.enable", "true"); // 启用TLS加密
// 创建Session会话
// 参数1:smtp服务器连接参数
// 参数2:账号和密码的授权认证对象
Session session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
// 邮箱账号信息
String userName = "xxxxxxxxxx@163.com"; // 邮箱发送账号
String password = "AJUKHUUVLKRFPUHD"; // 账号授权密码
return new PasswordAuthentication(userName, password);
}
});
// 设置为开发模式
session.setDebug(true);
return session;
}
}
注:
- 需要在自己的邮箱设置中打开POP3/SMTP协议,开启后需将授权码作为自己的账号密码写入
String password = “ ”
中。 - 每个邮箱的主机端口号不同,例如:163邮箱的端口号为465,126邮箱的端口号为25。
2、创建session会话
Session session = JavaMailUtils.createSession();
3、创建MimeMessage邮件对象(发送邮件信封)
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress("xxxxxxxxxx@126.com")); // 发件人
message.setRecipient(RecipientType.TO, new InternetAddress("111111111@qq.com")); // 收件人
message.setRecipients(RecipientType.CC, new InternetAddress[] {new InternetAddress("000000000@qq.com"),new InternetAddress("222222222@qq.com")}); // 群发(抄送多人)
message.setSubject("一封邮件"); // 邮件标题
注:
收件人包含三种类型:
(1)主送人:TO
(2)抄送人:CC
(3)密送人:BCC
4、发送邮件内容
- 邮件仅包含正文
message.setText("用脑子干事算是工作,不用脑子的只能算是动作!");
- 邮件包含正文+附件
// 正文
BodyPart textPart = new MimeBodyPart();
textPart.setContent("用<b>脑子</b>干事算是工作,不用<b>脑子</b>的只能算是动作!", "text/html;charset=utf-8");
// 附件
BodyPart filePart = new MimeBodyPart();
filePart.setFileName("李云龙阁下"); // 附件文件显示名称
// 上传附件文件
filePart.setDataHandler(
new DataHandler(
new ByteArrayDataSource(
Files.readAllBytes(Paths.get("C:\\Users\\Pictures\\douban\\p900419027.jpg")),
"application/octet-stream")));
// 将正文+附件组装成Multipart对象
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(textPart);
multipart.addBodyPart(filePart);
// 将Multipart对象放入邮件
message.setContent(multipart);
- 邮件正文嵌套图片
// 邮件正文
BodyPart textPart = new MimeBodyPart();
StringBuilder contentText = new StringBuilder();
contentText.append("<h3>图片</h3>");
contentText.append("<p>这是一张图片</p>");
contentText.append("<img src=\"cid:cbkj\"/>");
textPart.setContent(contentText.toString(),"text/html;charset=utf-8");
// 邮件附件
BodyPart imagePart = new MimeBodyPart();
imagePart.setDataHandler(
new DataHandler(
new ByteArrayDataSource(
Files.readAllBytes(Paths.get("C:\\Users\\Pictures\\douban\\图片.webp")),
"application/octet-stream"
)));
imagePart.setHeader("Content-ID", "cbkj"); // 图片的内容ID
// 邮件正文+附件
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(textPart);
multipart.addBodyPart(imagePart);
message.setContent(multipart);
注:
- 在邮件正文中嵌套图片时,需要为图片定义ID,即上述代码片段中的
imagePart.setHeader("Content-ID", "cbkj");
并在正文中引用ID,即contentText.append("<img src=\"cid:cbkj\"/>");
最终才可以在正文中显示图片。
5、发送邮件
Transport.send(message);