package com.demo.mail;
import org.junit.Test;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.Multipart;
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 java.io.File;
import java.util.Date;
import java.util.Properties;
/**
* 发送邮件:
*/
public class SendMailDemo {
/**
* 发送普通邮件(普通文本内容)
*/
@Test
public void test1() throws Exception {
// 1、设置邮件参数
Properties prop = new Properties();
prop.put("mail.transport.protocol", "smtp"); // 指定邮件协议
prop.put("mail.smtp.host", "smtp.qq.com"); // QQ邮箱主机
prop.put("mail.smtp.port", 465); // 端口
prop.put("mail.smtp.auth", "true"); // 用户密码认证(需要验证发件人用户名和授权码)
prop.put("mail.debug", "true"); // 调试模式(输出日志信息)
prop.put("mail.smtp.ssl.enable", "true"); // QQ 邮箱的 SSL 加密
// 2、创建一个邮件的会话
Session session = Session.getDefaultInstance(prop);
// 3、创建邮件体对象(创建了一个空邮件)
MimeMessage message = new MimeMessage(session);
// 4、设置邮件体参数:标题、发送时间、发件人、收件人、邮件内容
message.setSubject("我的第一封邮件"); // 设置邮件标题
message.setSentDate(new Date()); // 设置发送时间
message.setFrom(new InternetAddress("1058108962@qq.com")); // 发件人
message.setRecipients(Message.RecipientType.TO, new InternetAddress[]{ new InternetAddress("3320222873@qq.com") }); // 收件人
// 设置邮件内容。注意:setText() 和 setContent() 只有一个有效,后设置的会覆盖先设置的。
message.setText("邮件正文"); // 发送普通文本内容
message.setContent("<a href='https://www.baidu.com'>百度</a><hr/>文本内容", "text/html;charset=UTF-8"); // 发送超链接
// 保存邮件(邮件体参数设置结束,可以不写)
message.saveChanges();
// 5、验证发件人用户名和授权码(注意:授权码不是邮箱密码)
Transport transport = session.getTransport();
transport.connect("1058108962@qq.com", "djiznulrlqqibfid");
// 6、发送邮件
transport.sendMessage(message, message.getAllRecipients());
transport.close();
}
/**
* 发送多功能邮件(带图片资源 和 文本内容)
*/
@Test
public void test2() throws Exception {
// 1、设置邮件参数
Properties prop = new Properties();
prop.put("mail.transport.protocol", "smtp"); // 指定邮件协议
prop.put("mail.smtp.host", "smtp.qq.com"); // QQ邮箱主机
prop.put("mail.smtp.port", 465); // 端口
prop.put("mail.smtp.auth", "true"); // 用户密码认证(需要验证发件人用户名和授权码)
prop.put("mail.debug", "true"); // 调试模式(输出日志信息)
prop.put("mail.smtp.ssl.enable", "true"); // QQ 邮箱的 SSL 加密
// 2、创建一个邮件的会话
Session session = Session.getDefaultInstance(prop);
// 3、创建邮件体对象(创建了一个空邮件)
MimeMessage message = new MimeMessage(session);
// 4、设置邮件体参数:标题、发送时间、发件人、收件人、邮件内容
message.setSubject("带图片的邮件"); // 设置邮件标题
message.setSentDate(new Date()); // 设置发送时间
message.setFrom(new InternetAddress("1058108962@qq.com")); // 发件人
message.setRecipients(Message.RecipientType.TO, new InternetAddress[]{ new InternetAddress("3320222873@qq.com") }); // 收件人
/**
* 设置邮件内容:多功能用户邮件(related)
* RFC822:电子邮件的标准格式,用来发送普通的文本内容。
* MIME 协议:英文全称为 Multipurpose Internet Mail Extensions,即 多用途互联网邮件扩展协议;是目前互联网电子邮件
* 普通遵循的邮件技术规范。在 MIME 出现之前,互联网电子邮件主要遵循由 RFC822 所指定的标准,电子邮件一般只用来传递
* 基本的 ASCII 码文本信息;MIME 在 RFC822 的基础上对电子邮件规范做了大量的扩展,引入了新的格式规范和编码方式;
* 在 MIME 的支持下,图像、声音、动画等二进制文件都可以方便的通过电子邮件来进行传递,极大地丰富了电子邮件的功能。
*/
// 构建一个多功能邮件块对象
MimeMultipart related = new MimeMultipart("related");
// 构建多功能邮件块内容:左侧图片资源 + 右侧文本内容
MimeBodyPart resource = new MimeBodyPart(); // 图片资源
MimeBodyPart content = new MimeBodyPart(); // 文本内容
// 设置图片资源的具体内容:把图片资源作为数据源,设置到数据的句柄当中
String filePath = "D://photos//11.jpg";
DataSource dataSource = new FileDataSource(new File(filePath));
DataHandler handler = new DataHandler(dataSource);
resource.setDataHandler(handler);
resource.setContentID("photo"); // 设置资源名称,给外键引用
// 设置文本具体内容:在 <img> 标签中引用 上面定义的图片资源
content.setContent("<img src='cid:photo' /> 哈哈哈", "text/html;charset=UTF-8");
// 将 多功能邮件块内容 添加到 多功能邮件块对象中
related.addBodyPart(resource);
related.addBodyPart(content);
// 把构建好的 多功能邮件块对象 添加到邮件中
message.setContent(related);
// 保存邮件(邮件体参数设置结束,可以不写)
message.saveChanges();
// 5、验证发件人用户名和授权码(注意:授权码不是邮箱密码)
Transport transport = session.getTransport();
transport.connect("1058108962@qq.com", "djiznulrlqqibfid");
// 6、发送邮件
transport.sendMessage(message, message.getAllRecipients());
transport.close();
}
/**
* 发送 既带图片资源和文本内容,也带附件 的邮件
*/
@Test
public void test3() throws Exception {
// 1、设置邮件参数
Properties prop = new Properties();
prop.put("mail.transport.protocol", "smtp"); // 指定邮件协议
prop.put("mail.smtp.host", "smtp.qq.com"); // QQ邮箱主机
prop.put("mail.smtp.port", 465); // 端口
prop.put("mail.smtp.auth", "true"); // 用户密码认证(需要验证发件人用户名和授权码)
prop.put("mail.debug", "true"); // 调试模式(输出日志信息)
prop.put("mail.smtp.ssl.enable", "true"); // QQ 邮箱的 SSL 加密
// 2、创建一个邮件的会话
Session session = Session.getDefaultInstance(prop);
// 3、创建邮件体对象(创建了一个空邮件)
MimeMessage message = new MimeMessage(session);
// 4、设置邮件体参数:标题、发送时间、发件人、收件人、邮件内容
message.setSubject("带图片的邮件"); // 设置邮件标题
message.setSentDate(new Date()); // 设置发送时间
message.setFrom(new InternetAddress("1058108962@qq.com")); // 发件人
message.setRecipients(Message.RecipientType.TO, new InternetAddress[]{ new InternetAddress("3320222873@qq.com") }); // 收件人
/**
* 设置邮件内容:带 多功能邮件块(图片资源+文本内容) 和 附件 的邮件(mixed)
*/
// 构建一个总的邮件块对象
MimeMultipart mixed = new MimeMultipart("mixed");
// 构建总邮件块内容:多功能邮件块 + 附件
MimeBodyPart relatedBody = new MimeBodyPart(); // 多功能邮件块
MimeBodyPart attachmentBody = new MimeBodyPart(); // 附件
/******************* 多功能邮件块 *********************/
// 构建一个 多功能邮件块对象
MimeMultipart related = new MimeMultipart("related");
// 构建多功能邮件块内容:左侧图片资源 + 右侧文本内容
MimeBodyPart resource = new MimeBodyPart(); // 图片资源
MimeBodyPart content = new MimeBodyPart(); // 文本内容
// 设置图片资源的具体内容:把图片资源作为数据源,设置到数据的句柄当中
String filePath = "D://photos//11.jpg";
DataSource dataSource = new FileDataSource(new File(filePath));
DataHandler handler = new DataHandler(dataSource);
resource.setDataHandler(handler);
resource.setContentID("photo"); // 设置资源名称,给外键引用
// 设置文本具体内容:在 <img> 标签中引用 上面定义的图片资源
content.setContent("<img src='cid:photo' /> 哈哈哈", "text/html;charset=UTF-8");
// 将 多功能邮件块内容 添加到 多功能邮件块对象中
related.addBodyPart(resource);
related.addBodyPart(content);
// 将 多功能邮件块对象 添加到 总邮件块内容中
relatedBody.setContent(related);
/******************* 附件 *********************/
// 将附件资源添加到 总邮件块内容 中
String attaPath = "D://test.zip";
DataSource source = new FileDataSource(new File(attaPath));
DataHandler dataHandler = new DataHandler(source);
attachmentBody.setDataHandler(dataHandler);
attachmentBody.setFileName("test.zip"); // 设置附件名称
/*********************************************/
// 将 总邮件块内容 添加到 总邮件块中
mixed.addBodyPart(relatedBody);
mixed.addBodyPart(attachmentBody);
// 把 总邮件块 添加到 邮件中
message.setContent(mixed);
// 保存邮件(邮件体参数设置结束,可以不写)
message.saveChanges();
// 5、验证发件人用户名和授权码(注意:授权码不是邮箱密码)
Transport transport = session.getTransport();
transport.connect("1058108962@qq.com", "djiznulrlqqibfid");
// 6、发送邮件
transport.sendMessage(message, message.getAllRecipients());
transport.close();
}
}
使用 QQ 邮箱发送邮件 需要开启 POP3/SMTP 服务,然后获取授权码: