Springboot邮件发送思路分析
毕业设计里需要邮件发送,所以学习,总的来讲,我考虑以下几点,
- 代码量少,代码简单.配置少,一看就懂,使用 JavaMail 太麻烦了.
- 异步执行,添加员工之后会发送入职邮件,
- 多线程处理,设计里有一个公告推送的功能,就是发布一个公告会给所以员工发一份公告内容的邮件.
方法一:之前电脑里装了Python环境,所以最开始用Python脚本的方式实现,主要是觉得Python太精干了,在Service里调用执行Python脚本.需要的参数以命令行的方式传参,线程池使用
ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.MILLISECONDS, new SynchronousQueue<Runnable>();
- 这样的考虑是因为Runtime.getRuntime().exec()来调用脚本,他会生成一个新的进程去运行调用的程序。不在当前进程中,是异步执行,不调用waitFor()方法.
- 脚本的话,后来修改好修改,不会影响生产部署.
- 这样做了一下,单邮件发送确实OK,方便,简单.但是多线程处理的话,cup就爆了,而且不同的系统编码格式,路径表示不同,在开发环境OK(Win10),在生产环境(Linux)不行,
- 后来查发现,在java中,调用runtime线程执行脚本是非常消耗资源的,不建议频繁使用!,而且需要考虑阻塞问题.如果发送多条的话很麻烦.所以这种方法放弃.
python脚本格式:
import smtplib
from email.mime.text import MIMEText
from email.header import Header # 第三方 SMTP 服务
mail_host = "smtp.163.com" # 设置服务器
mail_user = "AAAAAA@163.com" # 发邮件的账户名
mail_pass = "******" # 授权码 sender = 'AAAAAA@163.com'
receivers = ['BBBBBB@qq.com'] # 接收邮件,可设置为你的QQ邮箱或者其他邮箱 # 三个参数:第一个为文本内容,第二个设置格式,plain:文本,html:HTML格式,第三个 utf-8 设置编码
message = MIMEText('本次邮件的内容', 'plain', 'utf-8')
message['From'] = Header("AAAAAA@163.com") # 邮件中的发件人
message['To'] = Header("BBBBBB@qq.com") # 邮件中的收件人 subject = '邮件主题'
message['Subject'] = Header(subject, 'utf-8')
try:
smtpObj = smtplib.SMTP()
smtpObj.connect(mail_host, 25) # 25 为 SMTP 端口号
smtpObj.login(mail_user, mail_pass)
# 发件人邮箱账号、收件人邮箱账号、发送邮件
smtpObj.sendmail(sender, receivers, message.as_string())
print("邮件发送成功") except smtplib.SMTPException:
print("Error: 无法发送邮件")
以命令行的方式发送,类比在cmd里执行 Python 文件地址 要传递的参数的格式 ,这里要注意参数有大小有限制.
Java代码
final static Logger logger = LoggerFactory.getLogger(EmailUtils.class);
final static String PATH = "src\\main\\java\\com\\liruilong\\hros\\script\\"; public static void sendEmail(EmailModel emailModel) { String emailTo = emailModel.getEmployee().getEmail();
String username = emailModel.getEmployee().getName();
String titles = emailModel.getTitle();
String pathPy = PATH + emailModel.getPath();
//命令行输入的字符串, [python, src\main\java\com\liruilong\hros\script\sendemailpy.py, 1224973008@qq.com, 测试, 12312, <p>123123</p>]
String[] args = new String[]{"python", pathPy, emailTo, username, titles};
logger.info(Arrays.toString(args));
try {
Process process = Runtime.getRuntime().exec(args);
} catch (IOException e) {
e.printStackTrace();
}
}
Python代码:使用sys模块的 sys.argv[]传递参数,
格式为: 文件地址 参数1 参数2 ....
命令行参数:[ src\main\java\com\liruilong\hros\script\sendemailpy.py, 1224973008@qq.com, 测试, 12312, <p>123123</p>]
# smtplib 用于邮件的发信动作
import smtplib
import sys
from email.mime.text import MIMEText
# email 用于构建邮件内容
from email.header import Header # 用于构建邮件头 # 发信方的信息:发信邮箱,QQ 邮箱授权码
from_addr = 'liruilong108@foxmail.com'
password = 'xznjnyvgnvmuicji' # 收信方邮箱,
to_addr = sys.argv[1]
#to_addr ='1224965096@qq.com'
# 发信服务器
smtp_server = 'smtp.qq.com' # 邮箱正文内容,第一个参数为内容,第二个参数为格式(plain 为纯文本),第三个参数为编码
msg = MIMEText(
'<p class="ql-align-justify"><strong>尊敬的<u> '+ sys.argv[2]+' </u>女士/先生:</strong></p><p class="ql-align-justify"> 感谢并欢迎您加入XXXX有限公司这支优秀的团队,成为我们亲密的工作伙伴!</p>' , 'HTML', 'utf-8') # 邮件头信息
msg['From'] = Header(from_addr)
msg['To'] = Header(to_addr)
#邮件titl
msg['Subject'] = Header(sys.argv[3]) # 开启发信服务,这里使用的是加密传输
server = smtplib.SMTP_SSL()
server.connect(smtp_server, 465)
# 登录发信邮箱
server.login(from_addr, password)
# 发送邮件
server.sendmail(from_addr, to_addr, msg.as_string())
# 关闭服务器
server.quit()
方法二,使用springboot集成的邮件发送依赖,spring-boot-starter-mail, 使用MailSenderAutoConfiguration 和自带线程池注解的方法:
- 后来发现直接使用spring-boot-starter-mail,的依赖包也挺方便,需要配置的不是太多.
这个有时间整理
RunTime.getRuntime().exec()运行脚本命令介绍和阻塞:
用法: public Process exec(String command)-----在单独的进程中执行指定的字符串命令。
在windows下相当于直接调用 /开始/搜索程序和文件 的指令,比如
Springboot邮件发送思路分析的更多相关文章
- SpringBoot邮件发送
这篇文章介绍springboot的邮件发送. 由于很简单就没有分出server和imp之类,只是在controller简单写个方法进行测试. 首先pom文件加入spring-boot-starter- ...
- springboot邮件发送与接收读取
发送邮件 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>sp ...
- SpringBoot邮件发送功能
快速入门 在Spring Boot的工程中的pom.xml中引入spring-boot-starter-mail依赖: <dependency> <groupId>org.sp ...
- SpringBoot项目实现文件上传和邮件发送
前言 本篇文章主要介绍的是SpringBoot项目实现文件上传和邮件发送的功能. SpringBoot 文件上传 说明:如果想直接获取工程那么可以直接跳到底部,通过链接下载工程代码. 开发准备 环境要 ...
- JavaMail邮件发送不成功的那些坑人情况及分析说明
[我的Segmentfault原文]https://segmentfault.com/a/1190000008030346 前言 JavaMail的使用本身并不难,网上有不少案例,简单易懂,而且有 ...
- 你有没有觉得邮件发送人固定配置在yml文件中是不妥当的呢?SpringBoot 动态设置邮件发送人
明月当天,不知道你有没有思念的人 前言 之前其实已经写过SpringBoot异步发送邮件,但是今天在一个小项目中要用到发送邮件时,我突然觉得邮件发送人只有一个,并且固定写在yml文件中,就是非常的不妥 ...
- 补习系列(12)-springboot 与邮件发送
目录 一.邮件协议 关于数据传输 二.SpringBoot 与邮件 A. 添加依赖 B. 配置文件 C. 发送文本邮件 D.发送附件 E. 发送Html邮件 三.CID与图片 参考文档 一.邮件协议 ...
- springboot添加邮件发送及压缩功能
springboot添加邮件发送及文件压缩功能 转载请注明出处:https://www.cnblogs.com/funnyzpc/p/9190233.html 先来一段诗 ``` 就这样吧 忍受折磨 ...
- IntelliJ IDEA 2017版 spring-boot 2.0.5 邮件发送简单实例 (三)
一.搭建SpringBoot项目 详见此文:https://www.cnblogs.com/liuyangfirst/p/8298588.html 注意: 需要添加mail依赖的包,同时还添加了lom ...
随机推荐
- stand up meeting 12/28/2015
part 组员 今日工作 工作耗时/h 明日计划 工作耗时/h UI 冯晓云 解决生词本显示[阅读页面]的滑动条和PDF的滑动条冲突 ...
- B - Fadi and LCM CodeForces - 1285C 质因子
题目大意很简单,给你一个整数X,让你求a和b,使得max(a,b)尽可能的小,然后打印a,b 题解:想到了质因子分解,也考虑到了暴力,但是觉得暴力的话会TLE,所以打算用贪心做,然后就一直Wa.... ...
- LCA Nearest Common Ancestors (很典型的例题)
A rooted tree is a well-known data structure in computer science and engineering. An example is show ...
- get 获取方式练习题及dom基础
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- testNG 下载安装
testNG的安装方法: 一.在线安装 打开eclipse 选择-->help-->Install New Software选项 ,弹出下面的弹框,Work with框输入 http:// ...
- tensorflow1.0 构建神经网络做图片分类
import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data mnist = input_dat ...
- js上传文件前判断获取文件大小并且加以判断
描述:要求浏览器单个上传文件大小不超过10M. 解决方案: var fileSize = $("#fileId")[0].files[0].size/(1024*1024);if( ...
- C#多线程(13):任务基础①
目录 多线程编程 多线程编程模式 探究优点 任务操作 两者创建任务的方式 Task.Run() 创建任务 取消任务和控制任务的创建 任务返回结果以及异步获取返回结果 捕获任务异常 全局捕获任务异常 多 ...
- Nagios基本搭建
Nagios简述: 1.一款用来监视系统和网络的开源软件 2.利用其从多的插件实现对本机和远端服务的监控 3.当被监控对象异常时,回及时向管理员警告 4.提供一批预设好的监控插件,用户可以直接调用 5 ...
- QtConcurrent::run 运行类的成员函数
https://stackoverflow.com/questions/2152355/is-it-possible-to-use-qtconcurrentrun-with-a-function-me ...