Java工具类:批量发送邮件(带附件)

不好用请移至评论区揍我
原创代码,请勿转载,谢谢!

一、介绍

  1. 用于给用户发送特定的邮件内容,支持附件、批量发送
  2. 邮箱账号必须要开启 SMTP 服务(具体见下文教程)
  3. 本文邮箱设置示例以”网易邮箱“为例,其他如qq邮箱或企业邮箱均可,只要在设置中对应开启SMTP及授权码等操作即可使用
  4. 完整代码见文末

二、邮箱设置

开启 SMTP 服务
​​

设置授权码


三、完整代码

maven

<dependency><groupId>com.sun.mail</groupId><artifactId>javax.mail</artifactId><version>1.4.7</version>
</dependency>

java

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Properties;/*** @Author 954* @create 2024/1/27 13:46*/
public class EmailUtil {// 发送者别名private static final String SENDER_NAME = "XXX" ;// 发送邮箱地址private static final String SENDER_ADDRESS = "XXX@163.com" ;// 发送邮箱的授权码private static final String SENDER_PWD = "XXX" ;// 密送的邮箱地址private static final String PRIVATE_ADDRESS = "XXX@163.com" ;/*** 发送邮件的环境对象*/private static final Session EMAIL_SESSION = getEmailSession();/*** 批量发送电子邮件* @param emailAddressList  邮箱地址* @param content           邮件内容* @param title             邮件标题* @param fileList          附件* @throws Exception*/public synchronized void sendEmail(List<String> emailAddressList, String title, String content, List<File> fileList) throws Exception {MimeMessage mimeMessage = getMimeMessage(emailAddressList, title, content);if (!CollectionUtils.isEmpty(fileList)){// 处理附件Multipart multipart = getMultipart(fileList);mimeMessage.setContent(multipart);//  添加邮件内容BodyPart contentPart = new MimeBodyPart();contentPart.setContent(content, "text/html;charset=UTF-8");// 将multipart对象放入message中multipart.addBodyPart(contentPart);}Transport.send(mimeMessage);}private MimeMessage getMimeMessage(List<String> emailAddressList, String title, String content) throws Exception {// 创建邮件消息MimeMessage message = new MimeMessage(EMAIL_SESSION);// 设置发件人message.setFrom(new InternetAddress(SENDER_ADDRESS, SENDER_NAME));// 设置收件人InternetAddress[] address = new InternetAddress[emailAddressList.size()] ;for (int i = 0; i < emailAddressList.size(); i++){address[i] = new InternetAddress(emailAddressList.get(i)) ;}message.setRecipients(Message.RecipientType.TO, address);// 设置密送message.setRecipient(Message.RecipientType.BCC, new InternetAddress(PRIVATE_ADDRESS));// 设置邮件标题message.setSubject(title, "UTF-8");// 设置邮件的内容体message.setContent(content, "text/html;charset=UTF-8");// 设置发送时间message.setSentDate(new Date());return message;}private Multipart getMultipart(List<File> fileList) {if (CollectionUtils.isEmpty(fileList)) return null;Multipart multipart = new MimeMultipart();// 添加附件的内容fileList.stream().parallel().forEach(file -> {try {BodyPart attachmentBodyPart = new MimeBodyPart();DataSource source = new FileDataSource(file);attachmentBodyPart.setDataHandler(new DataHandler(source));// MimeUtility.encodeWord可以避免文件名乱码attachmentBodyPart.setFileName(MimeUtility.encodeWord(file.getName()));multipart.addBodyPart(attachmentBodyPart);} catch (Exception e) {e.printStackTrace();}});return multipart ;}private static Session getEmailSession(){// 配置发送邮件的环境属性Properties props = new Properties();//设置用户的认证方式props.setProperty("mail.smtp.auth", "true");//设置传输协议props.setProperty("mail.transport.protocol", "smtp");//设置发件人的SMTP服务器地址props.setProperty("mail.smtp.host", "smtp.163.com");// 构建授权信息,用于进行SMTP进行身份验证Authenticator authenticator = new Authenticator() {@Overrideprotected PasswordAuthentication getPasswordAuthentication() {// 用户名、密码return new PasswordAuthentication(SENDER_ADDRESS, SENDER_PWD);}};return Session.getInstance(props, authenticator);}public static void main(String[] args) throws Exception {sendEmail(Arrays.asList("XXX@qq.com", "XXX@163.com"), "我是标题", "我是内容", null);}}

​​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/304668.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Springcloud可视化项目:智慧工地可视化大数据云平台源码

目录 技术架构 智慧工地系统在实际推行过程中遇到的问题 智慧工地接纳程度较低 基础设施条件有待完善 智慧工地整体生态尚未完善 智慧工地平台各功能模块 施工过程工信程息信管息理管模理块 人员管理模块 生产管理模块 技术管理模块 质量管理模块 安全管理模块 绿…

从零开始学Spring Boot系列-SpringApplication

SpringApplication类提供了一种从main()方法启动Spring应用的便捷方式。在很多情况下&#xff0c; 你只需委托给 SpringApplication.run这个静态方法 &#xff1a; SpringBootApplicationpublic class SpringbootLearningApplication {public static void main(String[] args) …

ACL实验

要求&#xff1a;1、PC1可以telnet登录R1&#xff0c;不能ping通R1 2、PC1可以ping通R2&#xff0c;但不能登录R2。 3、PC2的所有规则与pc1相反。 第一步、如图配置IP地址 第二步、运行静态路由协议&#xff0c;使全网可达 [R2]ip route-static 192.168.2.0 24 192.168.1.1…

Python学习之-pyechart详解

前言&#xff1a; 什么是pyechart&#xff1f; Pyecharts 是一个用于生成 Echarts 图表的 Python 库。Echarts 是一个由百度开源的数据可视化工具&#xff0c;它提供的图表种类丰富&#xff0c;交互性强&#xff0c;兼容性好&#xff0c;非常适合用于数据分析结果的展示。Pyec…

深入K8S实战

K8S: 深入K8S实战进阶篇 1、搭建 Kubernetes 集群 1.1、搭建方案 1.1.1、minikube minikube 是一个工具&#xff0c; 能让你在本地运行 Kubernetes。 minikube 在你的个人计算机&#xff08;包括 Windows、macOS 和 Linux PC&#xff09;上运行一个一体化&#xff08;all-i…

「C1N短网址教程」短链接之网上生成的短链接可以用多久

网上生成的短链接可以用多久?很多人发现自己生成的短链接一会儿就失效了&#xff0c;今天我们就站在业内人士的角度说说网上生成的短链接可以用多久。 因为短链接生成之后是固定的&#xff0c;它就像我们网站的链接一样&#xff0c;只是披了层外衣&#xff0c;所以从理论上来说…

盘点MySQL热门话题(200条)

1、使用MySQL管理软件进行数据库备份&#xff0c;关键词&#xff1a;数据库备份&#xff0c;MySQL管理软件 2、优化MySQL查询性能的方法&#xff0c;关键词&#xff1a;MySQL查询优化&#xff0c;性能调优 3、如何使用MySQL进行分页查询&#xff0c;关键词&#xff1a;分页查…

透视 Insilico 英矽智能:AI 制药明星企业的飞跃、困境与破局

衰老&#xff0c;从古至今困扰了无数仁人志士。无论是千古一帝秦始皇&#xff0c;还是雄才大略汉武帝&#xff0c;亦或者挥斥方遒唐太宗&#xff0c;这些伟大的帝王无一例外的都留下了许多追求长生的故事。当时光的指针落在了 21 世纪的第二个十年&#xff0c;随着全球老龄化问…

四大生成式模型的比较——GAN、VAE、归一化流和扩散模型

比较四大模型的本质 four modern deep generative models: generative adversarial networks, variational autoencoders, normalizing flows, and diffusion models 待写

盘点最新十大热门靠谱一手接单平台,都说好用!

夸克网盘、头条网盘、迅雷网盘等网盘类项目可以说是比较炙手可热的项目&#xff0c;它因为操作简单&#xff0c;可复制强伸手拉新人士的喜欢&#xff0c;但是从哪里能对接到一手项目&#xff0c;官网渠道&#xff0c;今天小推给大家罗列了十个比较不错的拉新项目分发平台。 一…

VIM支持C/C++/Verilog/SystemVerilog配置并支持Win/Linux环境的配置

作为一个芯片公司打杂人口&#xff0c;往往需要一个皮实耐打上天入地的编辑器… 一、先附上github路径&#xff0c;方便取走 git clone gitgithub.com:qqqw4549/vim_config_c_verilog.git 二、效果展示 支持ctrl]函数/模块跳转&#xff0c;支持cscope字串全局代码搜索 依赖&am…

栈|逆波兰表达式求值

逆波兰表达式求值 题目算法原理代码实现补充 stoi的实现 题目 逆波兰表达式求值 逆波兰表达式就是后缀表达式&#xff0c;我们平时写的带括号的是中缀表达式。区分中缀表达式和后缀表达式 就是 操作数 和 操作符 的先后关系。 操作符在后 就是后缀表达式 后缀表达式 的用途就…

2024年Rust魅力:谷歌重写C++系统6大心得

讲动人的故事,写懂人的代码 2024年3月26日,谷歌安卓部门的编译器和运行时团队负责人Lars Bergstorm在英国伦敦的Rust Nation UK技术大会上,跟大家分享了他们的团队几百名工程师在几年内用Rust重写了几十个C++和Go系统的六点心得哦。 1 用Rust后生产力更高 自从我们用Rust重…

有道词典网页版接口分析与爬虫研究

说明&#xff1a;仅供学习使用&#xff0c;请勿用于非法用途&#xff0c;若有侵权&#xff0c;请联系博主删除 作者&#xff1a;zhu6201976 一、目标站点 有道词典网页版&#xff1a;网易有道 二、目标接口 url&#xff1a;https://dict.youdao.com/jsonapi_s?doctypejson&…

1.微服务

一、微服务是什么 微服务是一种架构风格&#xff0c;即&#xff0c;一个应用应该是一组小型服务&#xff0c;每个服务器只负责一种服务&#xff0c;服务之间可以通过 HTTP 的方式进行互通。每一个功能元素最终都是一个可独立替换和独立升级的软件单元。 可以说&#xff0c;微…

全国项目管理标准化技术委员会副秘书长肖杨先生受邀为第十三届中国PMO大会演讲嘉宾

全国PMO专业人士年度盛会 全国项目管理标准化技术委员会副秘书长、微薄之力&#xff08;北京&#xff09;管理咨询有限公司董事长肖杨先生受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾&#xff0c;演讲议题为“数字化时代下&#xff0c;由职能型组织向高度适应性组织转…

五款高性能开放式耳机推荐,户外畅听无拘束!

在追求运动乐趣的同时&#xff0c;我们也需要关注自身的安全。开放式蓝牙耳机作为一种新型的耳机类型&#xff0c;正逐渐受到运动爱好者的青睐。它的独特之处在于能够在佩戴时保持对周围环境的警觉性&#xff0c;让你在享受音乐的同时不忘安全。那么&#xff0c;如何选购一款适…

JavaWeb | 5 监听器与FreeMarker

JavaWeb | 5 监听器与FreeMarker 监听器 Listener开发监听器三要素六种常用监听接口内置对象监听接口属性监听接口 项目中监听器的应用场景 FreeMarker模板引擎FreeMarkerJSP与FreeMarkerFreeMarker快速上手FTL取值if分支判断switch分支判断list迭代内建函数 监听器 Listener 对…

推荐学习什么编程语言?

选择编程语言学习时&#xff0c;除了就业因素外&#xff0c;还可以考虑以下几个方面来决定学习哪些编程语言&#xff1a; 个人兴趣与目标&#xff1a;如果你对某个特定领域感兴趣&#xff0c;比如游戏开发、数据分析、人工智能等&#xff0c;可以选择与该领域紧密相关的编程语言…