【Spring框架06】java邮件发送(163邮箱为例)
思维导图
一、环境准备
1.下载maven依赖,并配置在pom.xml文件中
<dependency>
<groupId>javax.mail</groupId>
<artifactId>javax.mail-api</artifactId>
<version>1.6.2</version>
</dependency>
2.准备邮箱,并且设置授权法
在网易163邮箱中查看,服务器地址
二、JavaMail邮件发送
1.发送普通文本邮件
(1)Authenticator认证
注意这里导入的包
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
public class MyAuthenticator extends Authenticator {
private String username;
private String password;
public MyAuthenticator(String username, String password) {
this.username = username;
this.password = password;
}
@Override
// 重写通过密码校验的这种方式
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username,password);
}
}
(2)发送一个文本文件的java类
public class SendMail {
public void send01() throws MessagingException{
// 定义邮箱服务器配置
Properties props = new Properties();
// 163服务器地址
props.put("mail.smtp.host","smtp.163.com");
// 163服务器端口
props.put("mail.smtp.prot","25");
// 163服务器认证属性
props.put("mail.smtp.auth","true");
// 加载配置用于验证
Session session = Session.getInstance(props,new MyAuthenticator("发件人账户邮箱","授权密码"));
// 创建消息并发送
Message message = new MimeMessage(session);
// 设置发件人
Address from = new InternetAddress("发件人邮箱");
message.setFrom(from);
// 设置收件人
Address to = new InternetAddress("收件人邮箱");
message.setRecipient(Message.RecipientType.TO,to);
// 设置发送日期
message.setSentDate(new Date());
// 设置主题
message.setSubject("我喜欢你");
// 设置文本内容
message.setText("嘿,你知道吗,现在我写的每行代码都与你有关,比如这个有一点想你的代码,它可能已经在这个宇宙中尝试发送了很多次,才侥幸可以被你看到哦,希望你不要不识抬举!!");
// 发送
Transport.send(message);
}
}
(3)编写测试类
public class SendMailTest extends TestCase {
public void testSend01() throws MessagingException{
new SendMail().send01();
System.out.println("发送成功!!!!!!!!!!!!");
}
}
可能会有这一行的报错提示,显示你发送的是垃圾邮件,如果是当天开启ssl(就是上图需要开启的内容)
第二天去测试试试看(网易垃圾,呼呼!)
om.sun.mail.smtp.SMTPSendFailedException: 554 DT:SPM 163 smtp7,C8CowADn2JA6xv9gTTRZow--.7280S2 1627375162,please see
2.发送html邮件和附件
(1)发html邮件就在原来普通文本邮件的基础上加上以下这段代码就好了
// 添加HTML内容
Multipart multipart = new MimeMultipart();
BodyPart bodyPart = new MimeBodyPart();
String html = "<html><body><a href='http://www.binflcy.cn'>嘿嘿,一个自己建的用于记录和男朋友甜甜的网站</a></body></html>";
bodyPart.setContent(html,"text/html;charset=utf-8");
multipart.addBodyPart(bodyPart);
message.setContent(multipart);
(2)发送附件,在原先基础上添加附件资源信息
// 添加附件
BodyPart bodyPart2 = new MimeBodyPart();
FileDataSource fds = new FileDataSource(new File("D:\\ide\\IdeaProjects\\com.lcy\\spring05-mail\\image\\2.png"));
bodyPart2.setDataHandler(new DataHandler(fds));
bodyPart2.setFileName(MimeUtility.encodeText("2.png"));
multipart.addBodyPart(bodyPart2);
message.setContent(multipart);
发送成功
3.发送封装
(1)基本信息封装
public class lcyMailSendInfo {
private String serverHost;//服务器主机
private String serverPort;//服务器端口
private String fromAddress;//发送方邮件地址
private List<String> toAddress;//接收方地址
private String userName;//邮件服务用户名
private String userPwd;//服务器密码
private String subject;//邮件主题
private String content;//邮件内容
private Boolean flag=true;
private List<String> attachFileName;//附件文件名
public String getServerHost() {
return serverHost;
}
public void setServerHost(String serverHost) {
this.serverHost = serverHost;
}
public String getServerPort() {
return serverPort;
}
public void setServerPort(String serverPort) {
this.serverPort = serverPort;
}
public String getFromAddress() {
return fromAddress;
}
public void setFromAddress(String fromAddress) {
this.fromAddress = fromAddress;
}
public List<String> getToAddress() {
return toAddress;
}
public void setToAddress(List<String> toAddress) {
this.toAddress = toAddress;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPwd() {
return userPwd;
}
public void setUserPwd(String userPwd) {
this.userPwd = userPwd;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Boolean getFlag() {
return flag;
}
public void setFlag(Boolean flag) {
this.flag = flag;
}
public List<String> getAttachFileName() {
return attachFileName;
}
public void setAttachFileName(List<String> attachFileName) {
this.attachFileName = attachFileName;
}
}
(2)用户请求处理封装
package com.binflcy.util;
import com.binflcy.MyAuthenticator;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import java.io.File;
import java.util.Date;
import java.util.List;
import java.util.Properties;
public class lcyMailSender {
public void sendMail(lcyMailSendInfo mailSendInfo) throws Exception{
Message message = null;
Session session = null;
try{
MyAuthenticator au = new MyAuthenticator(mailSendInfo.getUserName(),mailSendInfo.getUserPwd());
Properties props = new Properties();
props.put("mail.smtp.host",mailSendInfo.getServerHost());
props.put("mail.smtp.port",mailSendInfo.getServerPort());
props.put("mail.smtp.auth",mailSendInfo.getFlag());
session = Session.getDefaultInstance(props,au);
message = new MimeMessage(session);
Address from = new InternetAddress(mailSendInfo.getFromAddress());
message.setFrom(from);
message.setSentDate(new Date());
if(mailSendInfo.getToAddress()!=null&&mailSendInfo.getToAddress().size()>0){
Address[] addresses=new Address[mailSendInfo.getToAddress().size()];
for(int i=0;i<mailSendInfo.getToAddress().size();i++){
Address address =new InternetAddress(mailSendInfo.getToAddress().get(i));
addresses[i]=address;
}
message.setRecipients(Message.RecipientType.TO,addresses);
message.setSubject(mailSendInfo.getSubject());
Multipart multipart = new MimeMultipart();
BodyPart bodyPart = new MimeBodyPart();
bodyPart.setContent(mailSendInfo.getContent(),"test/html;charset=utf-8");
multipart.addBodyPart(bodyPart);
// 添加附件
List<String> files = mailSendInfo.getAttachFileName();
if(files!=null&&files.size()>0){
for(int i=0;i<files.size();i++){
File tempFile =new File(files.get(i));
if(tempFile.exists()){
BodyPart temp = new MimeBodyPart();
temp.setDataHandler(new DataHandler(new FileDataSource(tempFile)));
temp.setFileName(MimeUtility.encodeText(tempFile.getName()));
multipart.addBodyPart(temp);
}
}
}
message.setContent(multipart);
Transport.send(message);
}
}catch (Exception e){
e.printStackTrace();
}
}
}
(3)添加测试类模拟用户发送邮件
public class lcyMailSenderTest extends TestCase {
public void testSendMail() throws Exception {
lcyMailSendInfo mailSendInfo = new lcyMailSendInfo();
mailSendInfo.setServerHost("smtp.163.com");
mailSendInfo.setServerPort("25");
mailSendInfo.setUserName("");
mailSendInfo.setUserPwd("");
mailSendInfo.setSubject("我超级喜欢你");
mailSendInfo.setFromAddress("");
mailSendInfo.setContent("Hello");
List<String> users =new ArrayList<String>();
users.add("");
mailSendInfo.setToAddress(users);
List<String> files = new ArrayList<String>();
files.add("");
mailSendInfo.setAttachFileName(files);
lcyMailSender mailSender =new lcyMailSender();
mailSender.sendMail(mailSendInfo);
}
}
三、Spring API实现邮件发送
1.添加 java mail坐标依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.lcy</groupId>
<artifactId>spring06</artifactId>
<version>1.0-SNAPSHOT</version>
<name>spring06</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.8</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.3.8</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.3.8</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.mail/javax.mail-api -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
</dependencies>
<build>
</build>
</project>
2.配置bean
<?xml version="1.0" encoding="UTF-8"?>
<!--使用的命名空间-->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host" value="smtp.163.com"></property>
<property name="port" value="25"></property>
<property name="defaultEncoding" value="utf-8"></property>
<property name="username" value="用户邮箱"></property>
<property name="password" value="发送端密码"></property>
<property name="javaMailProperties">
<props>
<prop key="mail.smtp.auth">true</prop>
</props>
</property>
</bean>
<bean id="templateMessage" class="org.springframework.mail.SimpleMailMessage">
<property name="from" value="发件邮箱"/>
<property name="subject" value="主题"/>
</bean>
<bean id="orderManager" class="com.lcy.OrderManagerImpl">
<property name="mailSender" ref="mailSender"/>
<property name="templateMessage" ref="templateMessage"/>
</bean>
</beans>
3.发送接口并实现
(1)编写接口类
public interface OrderManager {
void placeOrder();
}
(2)实现接口类(注意要构造set方法)
public class OrderManagerImpl implements OrderManager {
private MailSender mailSender;
private SimpleMailMessage templateMessage;
@Override
public void placeOrder() {
// 创建邮件基本信息
SimpleMailMessage simpleMailMessage = new SimpleMailMessage(this.templateMessage);
simpleMailMessage.setTo("收件人邮箱");
simpleMailMessage.setText("发送信息");
mailSender.send(simpleMailMessage);
}
public void setMailSender(MailSender mailSender) {
this.mailSender = mailSender;
}
public void setTemplateMessage(SimpleMailMessage templateMessage) {
this.templateMessage = templateMessage;
}
}
(3)测试类模拟用户发送邮件
public class OrderManagerImplTest extends TestCase {
@Test
public void testPlaceOrder() {
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
OrderManager orderManager =(OrderManager) context.getBean("orderManager");
orderManager.placeOrder();
}
}