邮件发送功能-带附件

在这里插入图片描述
JAVA邮件发送的大致过程是这样的的:
1、构建一个properties文件,该文件中存放SMTP服务器地址等参数。
2、通过构建的properties文件和javax.mail.Authenticator具体类来创建一个javax.mail.Session。Session的创建,就相当于登录邮箱一样。剩下的自然就是新建邮件。
3、构建邮件内容,一般是javax.mail.internet.MimeMessage对象,并指定发送人,收信人,主题,内容等等。
4、使用javax.mail.Transport工具类发送邮件。

以163邮箱为例,获取邮箱授权码步骤:

  1. 点击上方设置按钮,再点击POP3/SMTP/IMAP。
  2. 开启对应服务授权码,需要发送短信开启,只显示一次
  3. 下面有对应的服务器地址、授权码管理,如果不用可以删除。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

SMTP服务器地址:一般是 smtp.xxx.com,比如163邮箱是smtp.163.com,qq邮箱是smtp.qq.com。

SMTP协议:通常把处理用户smtp请求(邮件发送请求)的服务器称之为SMTP服务器(邮件发送服务器)。

POP3协议:通常把处理用户pop3请求(邮件接收请求)的服务器称之为POP3服务器(邮件接收服务器)。

代码实现:

 //文件暂存地址
@Value("D:/file/tmp")
private String fileTmp;//发送人邮箱
@Value("xxxxxxxx@163.com")
private String senderEmail;//发送人邮箱授权码
@Value("ACJGFOSNF9866GFF")
private String senderCode;//服务器地址
@Value("smtp.163.com")
private String emailSMTPHost;//端口 只有使用内部邮箱时才会使用端口
//@Value("465")
//private Integer emailSMTPPort;//收件人邮箱
@Value("xxxxxxx@163.com")
private String receiveMailAccount;//抄送人邮箱
@Value("xxxxxxx@163.com")
private String ccMailAccount;
@Value("xxxxxxx@qq.com")
private String ccMailAccount1;
@Value("xxxxxxx@qq.com")
private String ccMailAccount2;/*** 发送邮件内容** @param file 邮件内容*/
@PostMapping("sendMessage")
public Result sendMessage(@RequestParam("file") MultipartFile file) {log.info("开始发送邮件! 文件名称:{}",file.getOriginalFilename());//抄送人Vector<String> toList = new Vector<>() ;toList.addElement(ccMailAccount);toList.addElement(ccMailAccount1);toList.addElement(ccMailAccount2);String res = EmailUtils.sendMail(file, fileTmp, senderEmail, senderCode, emailSMTPHost,receiveMailAccount, toList,emailSMTPPort);if (!res.equals("success")){return Result.create("邮件发送失败!",ResultCode.NFC_FAILURE);}return Result.create("邮件发送成功!",ResultCode.SUCCESS);
}

MIME(多用途互联网邮件扩展类型)

MimeBodyPart类

javax.mail.internet.MimeBodyPart类
表示的是一个MIME消息,它和MimeMessage类一样都是从Part接口继承过来。

MimeMultipart类

javax.mail.internet.MimeMultipart是抽象类
Multipart的实现子类,它用来组合多个MIME消息。一个MimeMultipart对象可以包含多个代表MIME消息的MimeBodyPart对象

package .xxxx.util;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;
import java.util.Vector;@Slf4j
public class EmailUtils {/*** 发送邮件* @param file 邮件内容**/public static String sendMail(MultipartFile file, String fileTmp, String senderEmail, String senderCode,String emailSMTPHost, String receiveMailAccount, Vector<String> toList,Integer emailSMTPPort) {try {Properties props = new Properties();props.setProperty("mail.transport.protocol", "smtp");// 使用的协议props.setProperty("mail.smtp.host", emailSMTPHost);// 发件人的邮箱的SMTP服务器地址//props.setProperty("mail.smtp.port", String.valueOf(emailSMTPPort));//只有内部邮箱才会使用端口,默认为25,加密为465 不建议使用默认props.setProperty("mail.smtp.auth", "true");// 需要请求认证//props.setProperty("mail.smtp.ssl.enable", "true");//开启ssl加密,不使用内部邮箱不用端口时,可以不打开sslSession session = Session.getInstance(props);//得到会话对象实例session.setDebug(false);//是否打印详细日志MimeMessage message = createMimeMessage(session, file,senderEmail,receiveMailAccount,fileTmp, toList);//获取邮件对象(封装了一个方法)Transport transport = session.getTransport();transport.connect(senderEmail, senderCode);//连接发送人的邮箱账户// 6. 发送邮件, 发到所有的收件地址, message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人transport.sendMessage(message, message.getAllRecipients());// 7. 关闭连接transport.close();//删除临时存放文件FileUtils.deleteFolder(fileTmp);log.info("邮件发送成功");return "success";} catch (Exception e) {log.error("发送邮件失败");}return "";}/*** 创建发送邮件内容* @param session session* @param mainFile    邮件附件*/private static MimeMessage createMimeMessage(Session session, MultipartFile mainFile,String senderEmail, String receiveMailAccount,String fileTmp,Vector<String> toList) {MimeMessage message = null;try {// 1. 创建一封邮件message = new MimeMessage(session);// 2. From: 发件人message.setFrom(new InternetAddress(senderEmail, "发件人", "UTF-8"));// 3. 设置收件人、抄送人、密送人//MimeMessage.RecipientType.TO:收件类型;MimeMessage.RecipientType.CC:抄送类型;MimeMessage.RecipientType.BCC:密送类型message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMailAccount, "收件人", "UTF-8"));InternetAddress[] addArr = null;// 设置抄送人地址if ((toList != null) && (toList.size() != 0)) {addArr = new InternetAddress[toList.size()];for (int i = 0; i < toList.size(); i++) {String ccMailStr =  toList.get(i);addArr[i] = new InternetAddress(ccMailStr);}message.setRecipients(Message.RecipientType.CC, addArr); // 设置抄送人地址}
//            message.setRecipient(MimeMessage.RecipientType.CC, new InternetAddress(ccMailAccount, "抄送人", "UTF-8"));
//            message.setRecipient(MimeMessage.RecipientType.BCC, new InternetAddress(bccmailAccount, "密送人", "UTF-8"));// 4. Subject: 邮件主题message.setSubject("这是邮件主题!", "UTF-8");// 5. Content: 邮件正文(可以使用html标签)//一个Multipart对象包含一个或多个bodypart对象,组成邮件正文MimeMultipart multipart = new MimeMultipart();MimeBodyPart contentPart = new MimeBodyPart();contentPart.setText("这是邮件正文","UTF-8");contentPart.setHeader("Content-Type", "text/html; charset=UTF-8");multipart.addBodyPart(contentPart);MimeBodyPart filePart = new MimeBodyPart();File file = MultipartFileToFile(mainFile,fileTmp);if (!ObjectUtils.isEmpty(file)){DataHandler handler = new DataHandler(new FileDataSource(file));filePart.setDataHandler(handler);SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");String formatDate = sdf.format(new Date());String name = file.getName();String suffix = name.substring(name.lastIndexOf("."));//对文件名进行编码,防止出现乱码String fileName = "这是附件名称"+formatDate+suffix;filePart.setFileName(fileName);multipart.addBodyPart(filePart);message.setContent(multipart);// 6. 设置发件时间message.setSentDate(new Date());// 7. 保存设置message.saveChanges();}} catch (Exception e) {e.printStackTrace();log.error("创建发送邮件内容失败!", e);}return message;}/*** 将MultipartFile转换为File* @param multiFile multiFile* @return file*/public static File MultipartFileToFile(MultipartFile multiFile,String fileTmp) {File directory = new File(fileTmp);if (!directory.exists()) {directory.mkdirs();}// 获取文件名String fileName = multiFile.getOriginalFilename();// 获取文件后缀if(!StringUtils.isEmpty(fileName)){String prefix = fileName.substring(fileName.lastIndexOf("."));// 若须要防止生成的临时文件重复,能够在文件名后添加随机码try {File file = File.createTempFile(String.valueOf(System.currentTimeMillis()), prefix, new File(fileTmp));multiFile.transferTo(file);return file;} catch (Exception e) {e.printStackTrace();}}return null;}}

pom文件依赖:

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

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

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

相关文章

Edge浏览器打不开任何网页!!!

错误代码: STATUS_INVALID_IMAGE_HASH 1、电脑搜索注册表 win键&#xff0c;然后输入“注册表” 2、增加项 找到路径&#xff1a;“计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Edge” 没有Edge的&#xff0c;直接在Microsoft下新建一个Edge文件夹 在Edge下&#…

未安装360系列应用情况下,Edge浏览器主页被360篡改,一直显示360导航

文章目录 修改浏览器设置系统扫描修复 修改浏览器设置 进入Edge浏览器进行以下操作&#xff1a; 右上角...图标&#xff0c;找到【设置】菜单&#xff0c;进入浏览器设置&#xff1b;左边菜单栏&#xff0c;找到【开始、主页和新建标签页】选项&#xff0c;进行操作&#xff…

vscode Live Server插件无法启动edge浏览器

平台 系统&#xff1a;mac os 10.14.6 默认浏览器 mircosoft edge vscode 相关参数 Version: 1.68.0 (Universal) Commit: 4af164ea3a06f701fe3e89a2bcbb421d2026b68f Date: 2022-06-08T11:44:00.250Z (1 mo ago) Electron: 17.4.7 Chromium: 98.0.4758.141 Node.js: …

Microsoft Edge 浏览器如何打开Axure RP文件

1.安装Microsoft Edge 浏览器 2.右上角如图点击进入扩展页面&#xff0c;搜索“Axure RP”-获取-安装 3.再次打开“扩展”查看已扩展的程序&#xff0c;启用&#xff0c;并点击“详细信息” 4.勾选“允许访问文件url” 5.选中本地文件夹中的index.html文件-选择打开方式&#…

edge浏览器ie模式设置方法介绍

1、打开edge浏览器&#xff0c;点击右上角的三个点&#xff0c;进入设置 2、选择默认浏览器 3、开启允许在internet explorer模式下重新加载网站 4、重启浏览器后&#xff0c;点击edge浏览器右上角的三个点&#xff0c;在更多工具中&#xff0c;可选择在internet explorer模式下…

Microsoft Edge浏览器只能在地址栏输入地址进入,不能进行搜索

Micrisoft Edge不能用搜索栏搜索 问题解决 问题 Microsoft Edge浏览器只能在web栏搜索网站&#xff0c;而不能用搜索栏搜索。 而且有一个很奇怪的现象&#xff0c;当我在搜索栏中搜索的时候&#xff0c;搜索内容自动填充进了web栏中&#xff0c;而搜索栏没有任何东西&#xff…

Edge 安装 CSDN 浏览器助手

################################################## 目录 Edge 安装 CSDN 浏览器助手 为什么一定要用谷歌或者微软浏览器&#xff1f; 获取 CSDN 浏览器助手插件包 手动 Edge 浏览器安装 CSDN 助手插件 ################################################## Edge 安装 …

浏览器发器POST请求

浏览器按F12或打开开发者工具&#xff0c;在console(控制台)标签页下输入 fetch(new Request(http://localhost:8080/power/font/getToken,{method:POST, headers: {Content-Type: application/x-www-form-urlencoded},body:"userName000&password123456" })).t…

新版Windows Edge浏览器关闭浏览器后出现自动重启问题

把启动增强和关闭Microsoft Edge后继续运行后台应用&#xff0c; 这两个开关关闭

【Edge】解决Edge游览器龟速下载问题

Edge游览器输入 edge://flags/#enable-parallel-downloadings 第一项Default改为改为Enabled 重启游览器即可

联想小新Win11系统如何将新建标签页设置为Edge浏览器首页

首先我们先打开Edge浏览器&#xff0c;点击右上角 选择 设置 然后选择 开始、主页和新建标签页 在 Microsoft Edge启动时 选择 打开新建标签页 这是我们再打开 Microsoft Edge浏览器&#xff0c;但是界面依然没有改变&#xff0c;这如何修改呢&#xff1f; 打开联想小…

Edge浏览器被306导航页面劫持篡改

Edge浏览器被360页面劫持 一、解决方案 1、右键edge浏览器图标----》属性 2、查看属性–》快捷方式 可以看到目标里后面跟随了一个网址。 http://511zdqdkj.yc.anhuang.net/ 我们将这个网址粘贴到浏览器里&#xff0c;可以看到打开的就是360主页。 3、删除后面的网址 4、…

edge和google浏览器打不开!记录一个解决方法!

2023年5月28日早上 使用小黑盒加速器加速EPIC后&#xff0c;edge和谷歌的浏览器就打不开了&#xff0c;国内的浏览器能打开&#xff1a;如小智浏览器。 网络上的解决方法没有用 这是我找到的解决链接&#xff1a;Bing搜索没法用的解决办法&#xff08;附Google和edge的详细解…

通过改变浏览器Cookie切换当前网站马甲

浏览器可以随时保存Cookie&#xff0c;以及随时更换Cookie&#xff1b;通过切换Cookie就可以切换当前登录用户。下面详细详细说明浏览器中Cookie应用步骤&#xff1a; 一、登录第一个测试用户 1、打开浏览器&#xff0c;打开论坛输入用户apple的帐号密码和验证码&#xff0c;注…

2022-强烈推荐的7款浏览器插件

目录 1.Tampermonkey 2.ADGUARD拦截广告插件 3.csdn插件 4.globalSpeed 5.IDM ​6.wappalyzer 7.Hackbar 1.Tampermonkey 是一款免费的浏览器扩展和最为流行的用户脚本管理器&#xff0c;它适用于 Chrome, Microsoft Edge, Safari, Opera Next, 和 Firefox。 这是我安装的油…

算力时代加速狂奔,移动云将携手千万开发者并肩同行

随着我国“东数西算”工程的推进&#xff0c;算力网络正成为国家、社会、产业发展的战略要求&#xff0c;在数字中国建设进程中发挥着重要引擎作用。中国移动作为我国数字经济发展的“排头兵”&#xff0c;锚定“世界一流信息服务科技创新公司”核心定位&#xff0c;移动云是中…

国产GPU芯片迎来突破,算力全球第一,中文编程也有好消息

苦&#xff0c;芯片久矣&#xff0c;终&#xff0c;迎来突破&#xff0c;实在振奋人心&#xff01; 最近&#xff0c;国产GPU芯片传来了好消息&#xff0c;国产自研首款通用芯片&#xff0c;以每秒千万亿次的计算能力&#xff0c;创全球算力记录&#xff0c;芯片领域实现跨越式…

研究03丨ahr999屯币指数逐行代码深度剖析

今天我们分享关于屯币指数的原理和代码复现两个话题&#xff0c;屯币指数ahr999我简单搜了搜&#xff0c;是某位大神不知道那里来的逻辑点子&#xff0c;创建定义了这么一个震荡指标算法。该指标算法通过这两天的学习和复现&#xff0c;实际上就是一个类似咱们做期货或股票当中…

迈向高算力、跨域融合新拐点,智能座舱各路玩家如何卡位?

当前&#xff0c;中国车联网发展进入平稳增长周期&#xff0c;5G、V2X市场迎来拐点。 借助数字化转型驱动&#xff0c;互联化、数字化、个性化的智能座舱&#xff0c;以及与之强关联的座舱域控制器方案正实现快速发展和落地。 高工智能汽车研究院监测数据显示&#xff0c;202…

云原生融合算力底座 铸造新时代算力网络引擎

新一轮科技革命和产业变革正在重塑全球经济结构&#xff0c;算力作为数字时代的关键底座与核心生产力&#xff0c;成为影响国家综合实力和国际话语权的关键要素&#xff0c;并在通信、交通运输、金融、能源、工业等千行百业中切实影响着国计民生。在当前全国积极探索“双碳”目…