前言
邮件发送是很多网站在注册的时候会使用的一个功能,可以用于用户验证,或者发送用户的一些总结数据。今天就来看一下Java是如何实现邮件发送的。
今天通过两种方式实现,一是普通的Java工程发送邮件,二是在Spring工程中实现发送邮件。
如果你只想了解SpringBoot中的邮件发送,可直接通过目录跳转到SpringBoot邮件发送处 |
邮件发送作为很多网站都在用功能,其也是想当重要但没有必要进行详细研究。本文代码可直接在项目中使用。
普通Java工程实现邮件发送
Java发送Email十分的简单,但是首先你应该准备JavaMail API和Java Activation Framework。
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;
public class EasyEmail {
public static void main(String[] args) throws Exception {
Properties properties = new Properties();
properties.setProperty("mail.host","smtp.qq.com");
properties.setProperty("mail.transport.protocol","smtp");
properties.setProperty("mail.smtp.auth","true");
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
properties.put("mail.smtp.ssl.enable","true");
properties.put("mail.smtp.ssl.socketFactory",sf);
Session session = Session.getDefaultInstance(properties, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("1360970604@qq.com", "qfivbyiwuwcvgefh");
}
});
session.setDebug(true);
Transport ts = session.getTransport();
ts.connect("smtp.qq.com","1360970604@qq.com","qfivbyiwuwcvgefh");
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");
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;
public class ComplexEmail {
public static void main(String[] args) throws Exception{
Properties properties = new Properties();
properties.setProperty("mail.host","smtp.qq.com");
properties.setProperty("mail.transport.protocol","smtp");
properties.setProperty("mail.smtp.auth","true");
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
properties.put("mail.smtp.ssl.enable","true");
properties.put("mail.smtp.ssl.socketFactory",sf);
Session session = Session.getDefaultInstance(properties, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("1360970604@qq.com", "qfivbyiwuwcvgefh");
}
});
session.setDebug(true);
Transport ts = session.getTransport();
ts.connect("smtp.qq.com","1360970604@qq.com","qfivbyiwuwcvgefh");
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 = new DataHandler(new FileDataSource("EmailWeb/src/main/resources/b.jpg"));
image.setDataHandler(dataHandler);
image.setContentID("b.jpg");
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();
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("数据正在处理....");
}
这样即使邮件发送还未完成也不会影响后续程序的运行,也就是程序不会因为邮件发送过慢而发送阻塞。
注意事项
我们在测试的时候一定不要频繁发送邮件,可能会出现警告或者封号的问题!!!!
|