基于简单邮件传送协议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);
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值