整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

(实用干货) - Spring Boot集成发送邮件Mail完整示例代码

作中经常会遇到发邮件的功能,如邮件预警,注册时发一个邮件确认等,这里给出在Spring Boot中发送邮件的完整集成示例

邮件发送支持的内容类型如下:

  1. 发送简单邮件。
  2. 发送html格式的邮件
  3. 发送带附件简单邮件
  4. 发送模板邮件

1. pom.xml

发送模板邮件需要用到spring-boot-starter-thymeleaf,其他其他邮件内容不需要该依赖

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

2. application.properties

spring.mail.host=smtp.163.com
spring.mail.username=xxx@163.com
# 注意这里的密码不是邮箱的登录密码
spring.mail.password=邮箱客户端授权码
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true

注意:如果密码不对在发送邮件中会报异常javax.mail.AuthenticationFailedException: 535 Error, 如果设置了也开启了还是不行再重新设置一下

3. MailUtil

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.MailException;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;
@Component
public class MailUtil {
 private final Logger logger = LoggerFactory.getLogger(getClass());
 @Autowired
 JavaMailSender mailSender;
 @Autowired
 TemplateEngine templateEngine;
 /**
 * 发送简单邮件
 * @param from 发送人
 * @param to 接收人
 * @param carbonCopy 抄送人
 * @param subject 主题
 * @param content 内容
 */
 public void sendSimpleEmail(String from, String[] to, String[] carbonCopy, String subject, String content) {
 long startTimestamp = System.currentTimeMillis();
 logger.info("Start send mail ... ");
 try {
 SimpleMailMessage message = new SimpleMailMessage();
 message.setFrom(from);
 message.setTo(to);
 message.setCc(carbonCopy);
 message.setSubject(subject);
 message.setText(content);
 mailSender.send(message);
 logger.info("Send mail success, cost {} million seconds", System.currentTimeMillis() - startTimestamp);
 } catch (MailException e) {
 logger.error("Send mail failed, error message is : {} \n", e.getMessage());
 }
 }
 /**
 * 发送html邮件
 */
 public void sendHtmlEmail(String deliver, String[] receiver, String[] carbonCopy, String subject, String content, boolean isHtml) {
 long startTimestamp = System.currentTimeMillis();
 logger.info("Start send email ...");
 try {
 MimeMessage message = mailSender.createMimeMessage();
 MimeMessageHelper messageHelper = new MimeMessageHelper(message);
 messageHelper.setFrom(deliver);
 messageHelper.setTo(receiver);
 messageHelper.setCc(carbonCopy);
 messageHelper.setSubject(subject);
 messageHelper.setText(content, isHtml);
 mailSender.send(message);
 logger.info("Send email success, cost {} million seconds", System.currentTimeMillis() - startTimestamp);
 } catch (MessagingException e) {
 logger.error("Send email failed, error message is {} \n", e.getMessage());
 e.printStackTrace();
 }
 }
 /**
 * 发送带附件的邮件
 */
 public void sendAttachmentFileEmail(String deliver, String[] receiver, String[] carbonCopy, String subject, String content, boolean isHtml, String fileName, File file) {
 long startTimestamp = System.currentTimeMillis();
 logger.info("Start send mail ...");
 try {
 MimeMessage message = mailSender.createMimeMessage();
 MimeMessageHelper messageHelper = new MimeMessageHelper(message, true);
 messageHelper.setFrom(deliver);
 messageHelper.setTo(receiver);
 messageHelper.setCc(carbonCopy);
 messageHelper.setSubject(subject);
 messageHelper.setText(content, isHtml);
 messageHelper.addAttachment(fileName, file);
 mailSender.send(message);
 logger.info("Send mail success, cost {} million seconds", System.currentTimeMillis() - startTimestamp);
 } catch (MessagingException e) {
 logger.error("Send mail failed, error message is {}\n", e.getMessage());
 e.printStackTrace();
 }
 }
 /**
 * 发送模板邮件
 */
 public void sendTemplateEmail(String deliver, String[] receiver, String[] carbonCopy, String subject, String template, Context context) {
 long startTimestamp = System.currentTimeMillis();
 logger.info("Start send mail ...");
 try {
 MimeMessage message = mailSender.createMimeMessage();
 MimeMessageHelper messageHelper = new MimeMessageHelper(message);
 String content = templateEngine.process(template, context);
 messageHelper.setFrom(deliver);
 messageHelper.setTo(receiver);
 messageHelper.setCc(carbonCopy);
 messageHelper.setSubject(subject);
 messageHelper.setText(content, true);
 mailSender.send(message);
 logger.info("Send mail success, cost {} million seconds", System.currentTimeMillis() - startTimestamp);
 } catch (MessagingException e) {
 logger.error("Send mail failed, error message is {} \n", e.getMessage());
 e.printStackTrace();
 }
 }
}

src/main/resource/templates/mailTemplate.html

<!DOCTYPE html>
<html xmlns:th="http://www.w3.org/1999/xhtml">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
</head>
<body>
[[${content}]] <br/>
[[${content}]] <br/>
[[${content}]] <br/>
</body>
</html>

4. Test

@RunWith(SpringRunner.class)
@SpringBootTest
public class MailApplicationTests {
 @Autowired
 private MailUtil mailUtil;
 @Test
 public void sendSimpleEmail() {
 String deliver = "xxx@163.com";
 String[] receiver = {"xxx@gmail.com"};
 String[] carbonCopy = {"xxx@qq.com"};
 String subject = "This is a simple email";
 String content = "This is a simple content";
 try {
 mailUtil.sendSimpleEmail(deliver, receiver, carbonCopy, subject, content);
 } catch (Exception e) {
 assertFalse("Send simple email failed", true);
 e.printStackTrace();
 }
 }
 @Test
 public void sendHtmlMail(){
 String deliver = "xxx@163.com";
 String[] receiver = {"xxx@gmail.com"};
 String[] carbonCopy = {"xxx@qq.com"};
 String subject = "退信代码说明";
 String content = "<h1>org.springframework.mail.MailSendException: Failed messages: " +
 "com.sun.mail.smtp.SMTPSendFailedException: 554 DT:SPM 163 smtp9,DcCowAAXf2r4c8da2cPWBQ--." +
 "33626S3 1523020853,please see " +
 "http://mail.163.com/help/help_spam_16.htm?ip=43.243.148.212&hostid=smtp9&time=1523020853</h1>";
 boolean isHtml = true;
 mailUtil.sendHtmlEmail(deliver, receiver, carbonCopy, subject, content, isHtml);
 }
 @Test
 public void sendAttachmentFileEmail() {
 String FILE_PATH = "/Users/mengday/Desktop/02.png";
 String deliver = "xxx@163.com";
 String[] receiver = {"xxx@gmail.com"};
 String[] carbonCopy = {"xxx@qq.com"};
 String subject = "退信代码说明";
 String content = "<h1>org.springframework.mail.MailSendException: Failed messages: " +
 "com.sun.mail.smtp.SMTPSendFailedException: 554 DT:SPM 163 smtp9,DcCowAAXf2r4c8da2cPWBQ--." +
 "33626S3 1523020853,please see " +
 "http://mail.163.com/help/help_spam_16.htm?ip=43.243.148.212&hostid=smtp9&time=1523020853</h1>";
 boolean isHtml = true;
 File file = new File(FILE_PATH);
 String fileName = FILE_PATH.substring(FILE_PATH.lastIndexOf(File.separator));
 try {
 mailUtil.sendAttachmentFileEmail(deliver, receiver, carbonCopy, subject, content, isHtml, fileName, file);
 } catch (Exception e) {
 e.printStackTrace();
 assertFalse("Send attachment file email failed", true);
 }
 }
 @Test
 public void sendTemplateEmail() {
 String deliver = "xxx@163.com";
 String[] receiver = {"xxx@gmail.com"};
 String[] carbonCopy = {"xxx@qq.com"};
 String subject = "DT:SPM 发送的邮件内容包含了未被许可的信息,或被系统识别为垃圾邮件。请检查是否有用户发送病毒或者垃圾邮件";
 String template = "mailTemplate";
 String content = "554 DT:SPM 发送的邮件内容包含了未被许可的信息,或被系统识别为垃圾邮件。请检查是否有用户发送病毒或者垃圾邮件";
 Context context = new Context();
 context.setVariable("content", content);
 try {
 mailUtil.sendTemplateEmail(deliver, receiver, carbonCopy, subject, template, context);
 } catch (Exception e) {
 e.printStackTrace();
 assertFalse("Send template email failed", true);
 }
 }
}

注意:如果标题和内容过于简单,或者包含test之类的内容,163会认为这是垃圾邮件,会造成发送失败,报以下异常,解决办法就是将发送的表体和内容写的比较真实点

Python中,可以使用smtplib库和email库来发送邮件。以下是一个基本的示例,展示如何使用这些库来发送一封简单的邮件。

步骤 1: 安装必要的库

smtplib和email是Python的标准库,通常不需要单独安装。但是,如果你使用的是一个精简的Python环境,可能需要确保这些库是可用的。

步骤 2: 编写邮件发送脚本

Python
1import smtplib
2from email.mime.text import MIMEText
3from email.header import Header
4
5# 发件人邮箱
6sender = 'your_email@example.com'
7# 收件人邮箱
8receiver = 'receiver_email@example.com'
9# 发送邮件的SMTP服务器
10smtp_server = 'smtp.example.com'
11# 发件人的邮箱密码或授权码
12password = 'your_password'
13
14# 邮件内容
15mail_content = '这是邮件的正文内容。'
16# 邮件主题
17mail_subject = '邮件的主题'
18
19# 创建一个MIMEText对象
20message = MIMEText(mail_content, 'plain', 'utf-8')
21message['From'] = Header("发件人名称", 'utf-8')
22message['To'] = Header("收件人名称", 'utf-8')
23message['Subject'] = Header(mail_subject, 'utf-8')
24
25try:
26    # 连接SMTP服务器
27    smtpObj = smtplib.SMTP(smtp_server, 587)
28    # 开启TLS加密(某些服务器需要)
29    smtpObj.starttls()
30    # 登录SMTP服务器
31    smtpObj.login(sender, password)
32    # 发送邮件
33    smtpObj.sendmail(sender, receiver, message.as_string())
34    print("邮件发送成功!")
35except smtplib.SMTPException as e:
36    print("Error: 无法发送邮件,错误信息:", e)
37finally:
38    # 关闭连接
39    smtpObj.quit()

注意事项:

  1. SMTP服务器和端口:不同的邮件服务商有不同的SMTP服务器地址和端口号。例如,Gmail的SMTP服务器是smtp.gmail.com,端口号是587。
  2. 授权码:对于某些邮件服务商,如Gmail,你需要使用应用密码(也叫授权码)而不是你的登录密码来发送邮件,因为直接使用登录密码可能会被阻止。
  3. TLS/SSL加密:大多数现代邮件服务都要求使用TLS或SSL加密来保证通信安全。在连接SMTP服务器时,确保使用starttls()或SMTP_SSL类来启用加密。
  4. 邮件格式:上面的例子使用的是纯文本邮件。如果你想发送HTML格式的邮件或包含附件的邮件,可以使用email.mime.multipart.MIMEMultipart和相关的子类来构建邮件。

通过调整上述代码中的SMTP服务器、端口、用户名、密码以及邮件内容和接收者,你可以根据自己的需求发送邮件。

为数据分析师,经常性的会需要到服务器上做一些取数/数据清洗的工作,但往往这些工作会特别耗时,如果我们可以在我们的脚本中加入邮件提醒的功能,提醒我们任务完成,那效率会提升很多

一般发邮件方法

我以前在通过Python实现自动化邮件功能的时候是这样的:

import smtplib
from email.mime.text import MIMEText
from email.header import Header
# 发送邮箱服务器
smtpserver = 'smtp.sina.com'
# 发送邮箱用户/密码
user = 'username@sina.com'
password = '123456'
# 发送邮箱
sender = 'username@sina.com'
# 接收邮箱
receiver = 'receive@126.com'
# 发送邮件主题
subject = 'Python email test'
# 编写HTML类型的邮件正文
msg = MIMEText('<html><h1>你好!</h1></html>','html','utf-8')
msg['Subject'] = Header(subject, 'utf-8')
# 连接发送邮件
smtp = smtplib.SMTP()
smtp.connect(smtpserver)
smtp.login(user, password)
smtp.sendmail(sender, receiver, msg.as_string())
smtp.quit()

其实,这段代码也并不复杂,只要你理解使用过邮箱发送邮件,那么以下问题是你必须要考虑的:

  • 你登录的邮箱帐号/密码
  • 对方的邮箱帐号
  • 邮件内容(标题,正文,附件)
  • 邮箱服务器(SMTP.xxx.com/pop3.xxx.com)

yagmail 实现发邮件

  • yagmail 可以更简单的来实现自动发邮件功能。
github项目地址: https://github.com/kootenpv/yagmail
  • 安装
pip install yagmail 
  • 简单例子
import yagmail
#链接邮箱服务器
yag = yagmail.SMTP( user="user@126.com", password="1234", host='smtp.126.com')
# 邮箱正文
contents = ['This is the body, and here is just text http://somedomain/image.png',
 'You can find an audio file attached.', '/local/path/song.mp3']
# 发送邮件
yag.send('taaa@126.com', 'subject', contents)

总共四行代码搞定,是不是比上面的例子简单太多了。

  • 给多个用户发送邮件,只需要将接收邮箱 变成一个list即可。
yag.send(['aa@126.com','bb@qq.com','cc@gmail.com'], 'subject', contents)
  • 发送带附件的邮件,只需要添加要发送的附件列表即可