邮件概述
一共三种协议:
- SMTP:简单邮件传输协议,用于发送电子邮件的传输协议;
- POP3:用于接收电子邮件的标准协议;
- IMAP:互联网消息协议,是 POP3 的替代协议。
首先打开下面这两个服务

导入依赖
<!-- Java Mail -->
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>javax.mail-api</artifactId>
<version>1.6.2</version>
</dependency>
针对不同的的邮件协议,JavaMail 规定了服务提供者必须支持一系列属性,下表是针对 SMTP 协议的一些常见属性(属性值都以 String 类型进行设置,属性类型栏仅表示属性是如何被解析的):
| mail.smtp.host | String | SMTP 服务器地址,如smtp.sina.com.cn |
|---|---|---|
| mail.smtp.port | int | SMTP 服务器端口号,默认为 25 |
| mail.smtp.auth | boolean | SMTP 服务器是否需要用户认证,默认为 false |
| mail.smtp.user | String | SMTP 默认的登陆用户名 |
| mail.smtp.from | String | 默认的邮件发送源地址 |
| mail.smtp.socketFactory.class | String | socket 工厂类类名 通过设置该属性可以覆盖提供者默认的实现,必须实现javax.NET.SocketFactory接口 |
| mail.smtp.socketFactory.port | int | 指定 socket 工厂类所用的端口号 如果没有规定,则使用默认的端口号 |
| mail.smtp.socketFactory.fallback | boolean | 设置为 true 时,当使用指定的socket 类创建 socket 失败后,将使用 Java.net.Socket 创建socket,默认为 true |
| mail.smtp.timeout | int | I/O 连接超时时间,单位为毫秒,默认为永不超时 |
javaMail 测试(qq邮箱)
package com.example.demo;
import org.springframework.boot.test.context.SpringBootTest;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.security.GeneralSecurityException;
import java.util.Date;
import java.util.Properties;
@SpringBootTest
class Demo1ApplicationTests {
public static void main(String[] args) throws MessagingException, GeneralSecurityException {
// 首先配置邮箱信息
Properties properties = new Properties();
// 设置邮箱服务器主机名,qq邮箱就设置qq,163,换成 163
properties.put("mail.smtp.host", "smtp.qq.com");
// 设置邮箱服务器的端口号
properties.put("mail.smtp.port", 465);
// 设置是否需要身份认证,设置true
properties.put("mail.smtp.auth", "true");
// properties.put("mail.smtp.starttls.enable", "false");
properties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
// 1. session对象,加载properties对象
//import javax.mail.Session;
Session session = Session.getInstance(properties);
// 开启调试模式,可以看到状态
session.setDebug(true);
// 2. 通过session对象得到transport对象
Transport transport = session.getTransport();
// 3. 使用邮箱的用户名和密码连接邮件服务器,参数1:主机地址,参数2,用户名,参数3, 授权码
transport.connect("smtp.qq.com", "3109405015", "bsjudvffhletdhci");
// 4. 设置message邮件对象,javax Email下
Message message = createSimpleMail(session);
// 5. 发送邮件,参数2,所有接收者
transport.sendMessage(message, message.getAllRecipients());
transport.close();
}
// 创建普通文本的内容
private static Message createSimpleMail(Session session) throws MessagingException {
// 创建邮件对象
MimeMessage message = new MimeMessage(session);
// 设置邮件发送人
message.setFrom("3109405015@qq.com");
// 设置接收人
message.setRecipient(Message.RecipientType.TO, new InternetAddress("819302342@qq.com"));
// 设置邮件主题
message.setSubject("测试文本");
// 设置发送日期
message.setSentDate(new Date());
// 设置文本内容
message.setText("哈哈,我想你哦,可是你不知道吖");
return message;
}
}
发送Html页面
基础发送一样,只是修改了发送方式
// 发送Html内容邮件
private static Message createHtmlMail(Session session) throws MessagingException {
MimeMessage message = new MimeMessage(session);
// 发件人
message.setFrom("3109405015@qq.com");
// 收件人
message.setRecipient(Message.RecipientType.TO, new InternetAddress("819302342@qq.com"));
// 主题
message.setSubject("测试HTML内容!");
// 发达时间
message.setSentDate(new Date());
// 创建多媒体容器
MimeMultipart multipart = new MimeMultipart();
// 设置邮件体对象
MimeBodyPart bodyPart = new MimeBodyPart();
// 设置到邮件体对象中
bodyPart.setContent("<html><body><a href=\"https://www.baidu.com\">百度一下</a></body></html>"
, "text/html;charset=UTF-8");
// 将邮件体对象设置到多媒体对象中
multipart.addBodyPart(bodyPart);
// 将多媒体容器设置到message邮件中
message.setContent(multipart);
return message;
}
发送带附件的邮件
// 发送Html内容邮件
private static Message createAttachMail(Session session) throws MessagingException {
MimeMessage message = new MimeMessage(session);
message.setFrom("3109405015@qq.com");
message.setRecipient(Message.RecipientType.TO, new InternetAddress("819302342@qq.com"));
message.setSubject("测试附件文本");
message.setSentDate(new Date());
// 邮件正文
MimeBodyPart bodyPart = new MimeBodyPart();
bodyPart.setContent("<h2>这是一个包含附件的邮箱!</h2>", "text/html;charset=UTF-8");
// 创建附件对象
MimeBodyPart part = new MimeBodyPart();
// 本地文件
DataHandler df = new DataHandler(new FileDataSource("C:\\Users\\坤\\Desktop\\高智坤 -Java 分布式开发工程师.pdf"));
// 设置到附件对象中
part.setDataHandler(df);
// 设置附件文件名
part.setFileName(df.getName());
// 创建多媒体对象
MimeMultipart mimeMultipart = new MimeMultipart();
// 添加正文
mimeMultipart.addBodyPart(bodyPart);
// 添加附件
mimeMultipart.addBodyPart(part);
// 设置附件类型
mimeMultipart.setSubType("mixed");
//设置到容器中
message.setContent(mimeMultipart);
return message;
}
封装发送邮箱
邮箱发送类
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.*;
import java.io.File;
import java.util.Date;
import java.util.List;
import java.util.Properties;
/**
* 邮件发送器
*/
public class MailSender {
/**
* 发送邮件
*
* @param mailSendInfo 邮件信息
*/
public void sendMail(MailSendInfo mailSendInfo) {
try {
// 首先配置邮箱信息
Properties properties = new Properties();
properties.put("mail.smtp.host", mailSendInfo.getServeHost());
properties.put("mail.smtp.port", mailSendInfo.getServerPost());
properties.put("mail.smtp.auth", mailSendInfo.isFlag());
properties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
// 身份认证
MyAuthenticator authenticator = new MyAuthenticator(mailSendInfo.getUserName(), mailSendInfo.getUserPwd());
// 发送邮件
Session session = Session.getDefaultInstance(properties, authenticator);
session.setDebug(true);
// 创建message对象
MimeMessage mimeMessage = new MimeMessage(session);
mimeMessage.setFrom(mailSendInfo.getFromAddress());
mimeMessage.setSubject(mailSendInfo.getSubject());
mimeMessage.setSentDate(new Date());
List<String> address = mailSendInfo.getToAddress();
if (address != null && address.size() > 0) {
Address[] addresses = new Address[address.size()];
for (int i = 0; i < address.size(); i++) {
Address address1 = new InternetAddress(address.get(i));
// 将地址设置到数组中
addresses[i] = address1;
}
// 将接收的邮箱地址设置到message对象中
mimeMessage.setRecipients(Message.RecipientType.TO, addresses);
}
// 创建多媒体正文容器
MimeMultipart multipart = new MimeMultipart();
// 创建正文内容
MimeBodyPart part = new MimeBodyPart();
part.setContent(mailSendInfo.getContent(), "text/html;charset=UTF-8");
multipart.addBodyPart(part);
// 获取所有附件文件名
List<String> fileNames = mailSendInfo.getAttachFileNames();
if (fileNames != null && fileNames.size() > 0) {
for (String fileName : fileNames) {
File file = new File(fileName);
if (file.exists()) {
// 如果附件存在
MimeBodyPart part1 = new MimeBodyPart();
DataHandler handler = new DataHandler(new FileDataSource(file));
part1.setDataHandler(handler);
// 设置附件名称解决乱码
part1.setFileName(MimeUtility.encodeText(handler.getName()));
multipart.addBodyPart(part1);
}
}
}
// 设置到message对象中
mimeMessage.setContent(multipart);
Transport.send(mimeMessage);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
认证类
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
/**
* 认证类
*/
public class MyAuthenticator extends Authenticator {
private String userName;
private String userPwd;
public MyAuthenticator(String userName, String userPwd) {
this.userName = userName;
this.userPwd = userPwd;
}
/**
* 邮件服务器发送邮件时进行身份认证。
*/
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(userName, userPwd);
}
}
测试
@SpringBootTest
public class DemoTest {
@Test
public void text() {
// 发给谁
ArrayList<String> list = new ArrayList<>();
list.add("819302342@qq.com");
// 附件
ArrayList<String> files = new ArrayList<>();
files.add("C:\\Users\\坤\\Documents\\OneNote 笔记本\\30天\\项目资料(新传)\\006_document\\images\\1579338922007.png");
files.add("C:\\Users\\坤\\Documents\\OneNote 笔记本\\30天\\项目资料(新传)\\006_document\\images\\1579341520148.png");
MailSendInfo info = new MailSendInfo("smtp.qq.com", "465", "3109405015@qq.com", list,
"3109405015@qq.com", "bsjudvffhletdhci",
"重新开始", "<h2>封装测试</h2>", "true", files);
MailSender sender = new MailSender();
sender.sendMail(info);
}
}
Spring 发送邮箱
普通文本
<!-- Java Mail -->
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
配置类或者配置文件
@Configuration
public class MailConfig {
@Bean
public JavaMailSenderImpl mailSender() {
JavaMailSenderImpl sender = new JavaMailSenderImpl();
sender.setHost("smtp.qq.com");
sender.setUsername("3109405015@qq.com");
sender.setPassword("bsjudvffhletdhci");
return sender;
}
@Bean
public SimpleMailMessage simpleMailMessage() {
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom("3109405015@qq.com");
return message;
}
}
但是带附件的特性还是需要自己配置
spring:
mail:
host: smtp.qq.com
username: 3109405015@qq.com
password: bsjudvffhletdhci
业务层
@Service
public class SimpleOrderManager implements OrderManager {
@Resource
private MailSender mailSender;
@Resource
private SimpleMailMessage simpleMailMessage;
@Override
public void placeOrder() {
SimpleMailMessage message = new SimpleMailMessage(this.simpleMailMessage);
message.setTo("819302342@qq.com");
message.setText("嘿嘿我试试!");
message.setSubject("究竟是那个主题呢!");
this.mailSender.send(message);
}
}
附件文本
@Service
public class SimpleOrderManager implements OrderManager {
@Resource
private JavaMailSender javaMailSender;
@Override
public void sendAnnex() {
// 创建邮件对象
MimeMessage message= javaMailSender.createMimeMessage();
// 创建主题
try {
message.setSubject("测试主题");
// 创建带有附件的信息帮助类
MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");
helper.setTo("819302342@qq.com");
helper.setFrom("3109405015@qq.com");
helper.setText("邮件测试!");
File file = new File("C:\\Users\\坤\\Documents\\OneNote 笔记本\\30天\\项目资料(新传)\\006_document\\Spring 邮件发送.md");
// 添加附件
helper.addAttachment(file.getName(), file);
javaMailSender.send(message);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}

9454

被折叠的 条评论
为什么被折叠?



