🤞🤞🤞🤞🤞祝愿所有考研的全部上岸🤞🤞🤞🤞🤞 |
前言
邮件发送是很多网站在注册的时候会使用的一个功能,可以用于用户验证,或者发送用户的一些总结数据。今天就来看一下Java是如何实现邮件发送的。
今天通过两种方式实现,一是普通的Java工程发送邮件,二是在Spring工程中实现发送邮件。
如果你只想了解SpringBoot中的邮件发送,可直接通过目录跳转到SpringBoot邮件发送处 |
邮件发送作为很多网站都在用功能,其也是想当重要但没有必要进行详细研究。本文代码可直接在项目中使用。
普通Java工程实现邮件发送
Java发送Email十分的简单,但是首先你应该准备JavaMail API和Java Activation Framework。
- mail.jar
- activation.jar
JavaMail是Sun公司为方便Java开发人人员方便在应用程序中实现邮件发送接收功能而提供的一套标准的开发包,它支持一些常用的邮件协议,如前面所讲的SMTP/POP3/IMAP还有MME等,我们在使用JavaMail API编写邮件时,无须考虑邮件的底层细节,只要调用JavaMail开发包响应的API类就可以了。
我们在发送邮件前先登录自己的邮箱打开设置,找到账户设置然后开启一下服务。(这里我使用的为qq邮箱,其他邮箱操作类似)
我们先尝试发送一封简单的邮件。
- 创建包含邮件服务器的网络连接信息的Session对象
- 创建代表邮件内容的Message对象
- 创建Transport对象,连接服务器,发送Message,关闭连接
邮箱发送主要又四个核心类,我们在编写程序的时候,记住这四个核心类,就很容易编写处Java的邮件处理程序。
MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
它是一个互联网标准,扩展了电子邮件标准,使其能够支持:
非ASCII字符文本;非文本格式附件(二进制、声音、图像等);由多部分(multiple parts)组成的消息体;包含非ASCII字符的头信息(Header information)
发送简单的邮件
package com.zhao.email;
import com.sun.mail.util.MailSSLSocketFactory;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.security.GeneralSecurityException;
import java.util.Properties;
/**简单邮件:没有附件和图片,纯文本文件
* 复杂邮件:由附件和图片
*
* 要发发送邮件,需要获得协议和支持!开启服务POP3/SMTP协议
* qfivbyiwuwcvgefh
*
* @Author Zhao
* @Date 2021-06-17 19:32
* @Version 1.0
*/
public class EasyEmail {
public static void main(String[] args) throws Exception {
Properties properties = new Properties();
//设置QQ邮箱服务器
properties.setProperty("mail.host","smtp.qq.com");
//邮箱发送协议
properties.setProperty("mail.transport.protocol","smtp");
//需要验证用户名密码
properties.setProperty("mail.smtp.auth","true");
//关于QQ邮箱,还要设置SSL加密,加上以下代码即可,大厂,其他邮箱不需要
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
properties.put("mail.smtp.ssl.enable","true");
properties.put("mail.smtp.ssl.socketFactory",sf);
//使用JavaMail发送邮件的五个步骤
//1、创建定义整个应用程序所需要的环境信息session对象
//QQ邮箱才有,其他邮箱用不到。
Session session = Session.getDefaultInstance(properties, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
//发件人邮箱用户名、授权码
return new PasswordAuthentication("1360970604@qq.com", "qfivbyiwuwcvgefh");
}
});
//开启Session的debug模式,这样可以查看到程序发送Email的运行状态
session.setDebug(true);
//2、通过session得到transport对象
Transport ts = session.getTransport();
//3、使用邮箱的用户名和授权码连上邮箱服务器
ts.connect("smtp.qq.com","1360970604@qq.com","qfivbyiwuwcvgefh");
//4、创建邮件:写邮件
MimeMessage mimeMessage = new MimeMessage(session);
//指明邮件的发件人
mimeMessage.setFrom(new InternetAddress("1360970604@qq.com"));
//指明邮件的收件人,现在发件人和收件人是一样的,那就是自己个自己发
mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress("zhaoshiji2020@163.com"));
mimeMessage.setSubject("这只是含文本的简单邮件");//设置邮件的主题
//邮件文本内容
mimeMessage.setContent("你好啊!","text/html;charset=utf-8");
//5、发送邮件
ts.sendMessage(mimeMessage,mimeMessage.getAllRecipients());
//关闭连接
ts.close();
}
}
注意:发件人这里设置自己的邮箱信息。return new PasswordAuthentication("1360970604@qq.com", "qfivbyiwuwcvgefh");
第一个参数为自己的邮箱,第二个参数为授权码,需要在自己邮箱设置-》账户中获取。就是图中圈起来的地方。
发送复杂的邮件
复杂的邮件就是说邮件内容可以包含,图片和附件。这里我们需要先了解一个名词。
MIME(多用途互联网邮件扩展类型)
然后我们在来了解一下两个类:
-
MimeBodyPart
类
javax.mail.internet.MimebodyPart
类表示的是一个MIME消息,他和MimeMessage
类一样都是从Part接口继承过来的。 -
MimeMultipart
类
Javax.mail.internet.MimeMultipart
是抽象类Multipart
的实现子类,它用来组合多个MIME,一个MimeMultipart
对象可以包含多个代表MIME消息的MimeBodyPart
对象。
package com.zhao.email;
import com.sun.mail.util.MailSSLSocketFactory;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import java.io.FileInputStream;
import java.util.Properties;
/**
* @Author Zhao
* @Date 2021-06-17 20:47
* @Version 1.0
*/
public class ComplexEmail {
public static void main(String[] args) throws Exception{
// System.out.println(Class.class.getResource("/").getPath());
Properties properties = new Properties();
//设置QQ邮箱服务器
properties.setProperty("mail.host","smtp.qq.com");
//邮箱发送协议
properties.setProperty("mail.transport.protocol","smtp");
//需要验证用户名密码
properties.setProperty("mail.smtp.auth","true");
//关于QQ邮箱,还要设置SSL加密,加上以下代码即可,大厂,其他邮箱不需要
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
properties.put("mail.smtp.ssl.enable","true");
properties.put("mail.smtp.ssl.socketFactory",sf);
//使用JavaMail发送邮件的五个步骤
//1、创建定义整个应用程序所需要的环境信息session对象
//QQ邮箱才有,其他邮箱用不到。
Session session = Session.getDefaultInstance(properties, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
//发件人邮箱用户名、授权码
return new PasswordAuthentication("1360970604@qq.com", "qfivbyiwuwcvgefh");
}
});
//开启Session的debug模式,这样可以查看到程序发送Email的运行状态
session.setDebug(true);
//2、通过session得到transport对象
Transport ts = session.getTransport();
//3、使用邮箱的用户名和授权码连上邮箱服务器
ts.connect("smtp.qq.com","1360970604@qq.com","qfivbyiwuwcvgefh");
//4、创建邮件:写邮件
MimeMessage mimeMessage = new MimeMessage(session);
//指明邮件的发件人
mimeMessage.setFrom(new InternetAddress("1360970604@qq.com"));
//指明邮件的收件人,现在发件人和收件人是一样的,那就是自己个自己发
mimeMessage.setRecipients(Message.RecipientType.TO,new Address[]{new InternetAddress("zhaoshiji2020@163.com"),
new InternetAddress("wangzhenleiya@163.com"),
new InternetAddress("2572284725@qq.com"),
new InternetAddress("1732479783@qq.com"),
new InternetAddress("1505874684@qq.com"),
new InternetAddress("1689655897@qq.com"),
});
mimeMessage.setSubject("通知");//设置邮件的主题
//邮件文本内容
//=================================================
//准备图片数据
MimeBodyPart image = new MimeBodyPart();
//图片需要经过数据处理 ,DataHandler数据处理
DataHandler dataHandler = new DataHandler(new FileDataSource("EmailWeb/src/main/resources/b.jpg"));
image.setDataHandler(dataHandler);//在我们的Body中放入这个处理的图片数据
image.setContentID("b.jpg");//给图片设置一个ID,我们在后面可以使用
//准备正文数据
MimeBodyPart text = new MimeBodyPart();
text.setContent("<h1>邮件发送!</h1><br/><img src='cid:b.jpg'/>","text/html;charset=utf-8");
//描述数据关系
MimeMultipart mm = new MimeMultipart();
mm.addBodyPart(text);
mm.addBodyPart(image);
mm.setSubType("related");
//============添加附件的操作
MimeBodyPart context = new MimeBodyPart();
context.setContent(mm);
MimeBodyPart body1 = new MimeBodyPart();
FileDataSource fileDataSource = new FileDataSource("EmailWeb/src/main/resources/302通知.txt");
DataHandler dataHandler1 = new DataHandler(fileDataSource);
body1.setDataHandler(dataHandler1);
String s = MimeUtility.encodeText(fileDataSource.getName());
body1.setFileName(s);//设置附件名称
MimeMultipart mimeMultipart = new MimeMultipart();
mimeMultipart.addBodyPart(context);
mimeMultipart.addBodyPart(body1);
mimeMultipart.setSubType("mixed");
//设置数据关系,保存修改
mimeMessage.setContent(mimeMultipart);//把最后编辑好的邮件放到消息当中。
mimeMessage.saveChanges();//保存修改
//=================================================
//5、发送邮件
ts.sendMessage(mimeMessage,mimeMessage.getAllRecipients());
//关闭连接
ts.close();
}
}
注意:这里也是同理,把邮箱和授权码换成自己的。支持多人发送。
SpringBoot中实现邮件发送
普通的Java工程实现邮件发送,太过于麻烦和繁琐。但是我们目前都是直接使用Springboot进行开发,所以Springboot的邮件发送是我们长使用的。下面我们就聊一聊如何在SpringBoot中实现邮件发送。
先了解一下邮件发送的流程:
SpringBoot发送邮件的流程:
- 邮件发送需要引入spring-boot-starter-mail
- Spring Boot 自动配置MailSenderAutoConfiguration
- 定义MailProperties内容,配置在application.yml中
- 自动装配JavaMailSender
- 测试邮件发送
首先我们先准备依赖:
<!--导入邮件启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
在配置文件中配置信息:
#hijbxlwrerfbfjdi
spring.mail.host=smtp.qq.com
spring.mail.username=1360970604@qq.com
spring.mail.password=hijbxlwrerfbfjdi
#开启加密验证 //只有qq邮箱需要
spring.mail.properties.mail.smtp.ssl.enable=true
代码示例:
@SpringBootTest
class SpringBoot09TextApplicationTests {
@Autowired
JavaMailSenderImpl mailSender;
@Test
void contextLoads() {
SimpleMailMessage mailMessage = new SimpleMailMessage();
mailMessage.setSubject("Hello");
mailMessage.setText("洛必达");
mailMessage.setTo("779351771@qq.com");
mailMessage.setFrom("1360970604@qq.com");
mailSender.send(mailMessage);
}
@Test
void test() throws MessagingException {
//一个复杂邮件
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true,"utf-8");
helper.setSubject("EDG牛逼");
helper.setText("<p style='color:red;'>夹逼定义</p>",true);
//附件
helper.addAttachment("考研秘籍.chw",new File("F:\\桌面\\jQueryAPI_1.7.1_CN.chw"));
//接收方 要发送的邮箱
helper.setTo("1360970604@qq.com");
//发送方
helper.setFrom("1360970604@qq.com");
mailSender.send(mimeMessage);
}
}
这样就完成了在Springboot中邮件的发送。
优化策略
在发送邮件时需要一定的时间去执行,我们可以采用开启异步任务的方式来发送邮件。
我们利用SpringBoot提供的@Async
注解就可以进行异步处理。在使用的时候需要在配置类或启动类上加上@EnableAsync
注解开启异步任务。
使用方法:
@Async
public void Hello(){
//xxxxx我们就可以在这里调用邮件发送的代码
System.out.println("数据正在处理....");
}
这样即使邮件发送还未完成也不会影响后续程序的运行,也就是程序不会因为邮件发送过慢而发送阻塞。
注意事项
我们在测试的时候一定不要频繁发送邮件,可能会出现警告或者封号的问题!!!!
都看到这了,麻烦赏个赞🤞 |