一、导入相关依赖

<!--邮件发送-->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.5</version>
</dependency>

在springboot中配置MultipartResolver

注:使用了Spring的MultipartFile来接受文件上传才要配置的

//配置文件上传
@Bean(name = "multipartResolver")
public MultipartResolver multipartResolver() {
CommonsMultipartResolver resolver = new CommonsMultipartResolver();
resolver.setDefaultEncoding("UTF-8");
// resolveLazily属性启用是为了推迟文件解析,以在在UploadAction中捕获文件大小异常
resolver.setResolveLazily(true);
resolver.setMaxInMemorySize(40960);
// 上传文件大小 5G
resolver.setMaxUploadSize(5 * 1024 * 1024 * 1024);
return resolver;
}

二、controller(service)

这里的接口接收的字符串格式为[xxxxx@qq.com;xxxxx@163.com]这样的,入参的形式随意,最后调用工具类传入数组即可

import com.sanyu.tender.util.mailSend.MailSend;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile; import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map; /**
* @Author:huang
* @Date:2019-09-18 18:55
* @Description:邮件发送接口
*/
@Controller
public class sendMailController { @Autowired
private MailSend mailSend; @RequestMapping("/mail_send_show")
public String showSendMail(){
return "mail-send";
} //接受文件上传
@RequestMapping("/mail_send")
@ResponseBody
public Map sendMail(String title,String content,String email,MultipartFile file){
Map<String,Object> map = new HashMap<>(16); //获取地址字符串并截取放入集合
ArrayList<String> list = new ArrayList<>();
String[] emailArr = email.split(";");
for (int i = 1;i<emailArr.length;i++){
list.add(emailArr[i]);
} map.put("status","success");
try {
//调用javaMail邮件发送工具类
mailSend.send(list,title,content,file);
}catch (Exception e){
e.getStackTrace();
map.put("status","false");
}
return map;
} }

三、javaMail邮件发送工具类代码

/**
* @Author:huang
* @Date:2019-09-17 20:29
* @Description:邮件发送工具类
*/
@Component
public final class MailSend { //发件人账号和授权码
private static final String MY_EMAIL_ACCOUNT = "xxxx@163.com";
private static final String MY_EMAIL_PASSWORD = "xxxx"; //SMTP服务器(这里用的163 SMTP服务器)
private static final String MEAIL_163_SMTP_HOST = "smtp.163.com"; //端口号
private static final String SMTP_163_PORT = "25"; //message对象
private MimeMessage message; {
//创建发件邮箱对象
Properties properties = new Properties();
properties.setProperty("mail.smtp.host", MEAIL_163_SMTP_HOST);
properties.setProperty("mail.smtp.port", SMTP_163_PORT);
properties.setProperty("mail.smtp.socketFactory.port", SMTP_163_PORT);
properties.setProperty("mail.smtp.auth", "true");
properties.setProperty("mail.smtp.socketFactory.class", "SSL_FACTORY");
//登录
Session session = Session.getInstance(properties, new Authenticator() {
// 设置认证账户信息
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(MY_EMAIL_ACCOUNT, MY_EMAIL_PASSWORD);
}
});
session.setDebug(false); //创建邮件对象
System.out.println("创建发件人邮箱");
message = new MimeMessage(session);
} /**
* 发送邮件
* @param to 收件人邮箱的集合
* @param title 邮件标题
* @param content 邮件内容
* @param file 通过表单上传的MultipartFile文件
* @return 根据方法执行情况返回一个Boolean类型的值
*/
public boolean send(ArrayList<String> to, String title, String content,MultipartFile file){
File tempFile = null; try {
//发件人
message.setFrom(new InternetAddress(MY_EMAIL_ACCOUNT));
//收件人
setAccepter(to);
//标题
message.setSubject(title); //当存在附件的情况下,内容将和附件一起上传
if (file != null){
//添加附件和内容
tempFile = getFile(file);
setMultipartAndContent(tempFile,content);
}else {
//内容
message.setContent(content, "text/html;charset=UTF-8");
} //发送时间
message.setSentDate(new Date());
message.saveChanges();
} catch (MessagingException e) {
e.printStackTrace();
return false;
} //发送邮件
System.out.println("准备发送");
try {
Transport.send(message); //当存在附件的情况下发送完邮件以后删除上传到服务器的文件
if (file != null){
deleteServerFile(tempFile);
} } catch (MessagingException e) {
e.printStackTrace();
System.out.println("发送失败");
return false;
}
System.out.println("发送完成");
return true;
} /**
* 添加收件人
* @param list 存放收件人邮箱的集合
*/
private void setAccepter(ArrayList<String> list){
//创建收件人地址数组
InternetAddress[] sendTo = new InternetAddress[list.size()];
//把list中的数据转至数组
for (int i = 0; i < list.size(); i++) {
//System.out.println("发送到:" + list.get(i));
try {
sendTo[i] = new InternetAddress(list.get(i));
} catch (AddressException e) {
e.printStackTrace();
return;
}
}
//填入message对象
try {
message.setRecipients(MimeMessage.RecipientType.TO,sendTo);
} catch (MessagingException e) {
e.printStackTrace();
}
} /**
* 设置附件和内容(当存在附件的情况下,必须通过此方法以发送内容,否则只显示附件而不显示内容)
* @param file 要添加到message对象的文件
* @param content 要添加到message对象的内容
*/
private void setMultipartAndContent(File file,String content) {
// 一个Multipart对象包含一个或多个BodyPart对象,来组成邮件的正文部分(包括附件)。
MimeMultipart multiPart = new MimeMultipart(); //内容模块
MimeBodyPart partText = new MimeBodyPart();
// 文件模块
MimeBodyPart partFile = new MimeBodyPart();
try {
//添加内容
partText.setContent(content,"text/html;charset=UTF-8");
//添加文件
partFile.attachFile(file);
// 设置在收件箱中和附件名 并进行编码以防止中文乱码
partFile.setFileName(MimeUtility.encodeText(file.getName())); multiPart.addBodyPart(partText);
multiPart.addBodyPart(partFile);
message.setContent(multiPart); } catch (IOException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
} } /**
* 将通过表单上传的MultipartFile文件上传到服务器并转换为File
* @param file 通过表单上传的MultipartFile文件
* @return 返回上传到服务器并转换完成的文件
*/
private File getFile(MultipartFile file){
//得到MultipartFile文件
MultipartFile multipartFile = file;
File f = null; //创建文件
System.out.println("上传文件:"+multipartFile.getOriginalFilename());
f = new File(multipartFile.getOriginalFilename()); //得到文件流。以文件流的方式输出到新文件
try (InputStream in = multipartFile.getInputStream(); OutputStream os = new FileOutputStream(f)){
// 可以使用byte[] ss = multipartFile.getBytes();代替while
int n;
byte[] buffer = new byte[4096];
while ((n = in.read(buffer,0,4096)) != -1){
os.write(buffer,0,n);
}
BufferedReader bufferedReader = new BufferedReader(new FileReader(f));
bufferedReader.close();
}catch (IOException e){
e.printStackTrace();
} //输出file的URL
try {
System.out.println(f.toURI().toURL().toString());
} catch (MalformedURLException e) {
e.printStackTrace();
}
//输出文件的绝对路径
System.out.println(f.getAbsolutePath()); return new File(f.toURI());
} /**
* 删除文件
* @param file 要删除的文件
* @return 根据方法执行情况返回一个Boolean类型的值
*/
private boolean deleteServerFile(File file){
return file.delete();
} }

Springboot使用javaMail进行邮件发送的更多相关文章

  1. Springboot+Javamail实现邮件发送

    Springboot+Javamail实现邮件发送 使用的是spring-context-support-5.2.6.RELEASE.jar里的javamail javamail 官方文档:javam ...

  2. Spring MVC+javamail实现邮件发送

    Spring MVC+javamail实现邮件发送 开启邮箱的POP3/SMTP服务(这里以QQ邮箱举例) 设置 --> 账户 -- > 开启POP3/STMP服务,然后得到一个授权码. ...

  3. IntelliJ IDEA 2017版 spring-boot 2.0.5 邮件发送简单实例 (三)

    一.搭建SpringBoot项目 详见此文:https://www.cnblogs.com/liuyangfirst/p/8298588.html 注意: 需要添加mail依赖的包,同时还添加了lom ...

  4. 基于javaMail的邮件发送--excel作为附件

    基于JavaMail的Java邮件发送 Author xiuhong.chen@hand-china.com Desc 简单邮件发送 Date 2017/12/8 项目中需要根据物料资质的状况实时给用 ...

  5. IntelliJ IDEA 2017版 spring-boot 2.0.3 邮件发送搭建,概念梳理 (二)

    第二部分 邮件发送历史   一.第一封邮件   1.1969年10月,世界上的第一封电子邮件    1969年10月世界上的第一封电子邮件是由计算机科学家Leonard K.教授发给他的同事的一条简短 ...

  6. Java 基于javaMail的邮件发送(支持附件)

    基于JavaMail的Java邮件发送Author xiuhong.chen@hand-china.com Desc 简单邮件发送 Date 2017/12/8 项目中需要根据物料资质的状况实时给用户 ...

  7. Java 基于JavaMail的邮件发送

    http://blog.csdn.net/xietansheng/article/details/51673073 http://blog.csdn.net/xietansheng/article/d ...

  8. 使用Javamail实现邮件发送功能

    目录 相关的包 编写工具类 环境说明 @(使用Javamail实现邮件发送功能) 相关的包 activation.jar javax.mail.jar mail包建议使用高版本写的包,否则可能会发空白 ...

  9. IntelliJ IDEA 2017版 spring-boot 2.0.3 邮件发送搭建,概念梳理 (一)

    邮件发送功能总结        第一部分 背景   一.使用场景 (1)注册验证    注册各大网站,通常需要输入邮件地址,在注册成功后,会发送一封邮箱验证的邮件,点击确认,证明这个邮箱是用户自己的 ...

随机推荐

  1. IntelliJ IDEA利用Maven下载所需的JAR包到项目中

    直接复制JetBrains/../conf/settings.xml后修改镜像出现问题,然后用了这里的settings.xml配置文件.

  2. java什么时候进行垃圾回收,垃圾回收的执行流程

    java的垃圾回收分为 三个区域新生代 老年代 永久代 一个对象实例化时 先去看伊甸园有没有足够的空间如果有 不进行垃圾回收 ,对象直接在伊甸园存储.如果伊甸园内存已满,会进行一次minor gc然后 ...

  3. LVS之ipvsadm命令

    目录: 安装 基本描述 用法 命令选项 示例 [安装] 可使用yum安装或者从官网下载安装包源码安装,两种方式皆可 先检查是否已经安装ipvsadm [root@v_machine1 ~]# yum ...

  4. Vue入门下

    使用npm创建项目,系统会自动生成一些列文件. 以慕课网上的Travel项目来说,在生成的项目文件中存在src文件夹,这个文件夹也是平时在做项目的时候用的比较多的,其他的一些配置信息更改的频率较低. ...

  5. express使用ejs模板引擎渲染html文件

    小场景小知识点. 在使用express过程中,按照官网教程,利用express生成器很容易初始化express项目模板. 那么初始化项目之后应该如何使用ejs作为模板引擎呢?如下 // 注释掉默认生成 ...

  6. babel 实践

    一.@babel/core var babel = require("@babel/core");babel.transform(code, options, function(e ...

  7. 【转载】网页JS获取当前地理位置(省市区)

    眼看2014又要过去了,翻翻今年的文章好像没有写几篇,忙真的或许已经不能成为借口了,在忙时间还是有的,就像海绵里的水挤挤总会有滴.真真的原因是没有学习过什么新的技术,工作过程中遇到的问题也不是非常难并 ...

  8. 005-文件权限解说、授权chmod和chown命令的用法

    一.文件权限说明 1.1.linux 中 drwxr-xr-x权限含义 在 linux drwxr-xr-x意思如下: 第一位表示文件类型.d是目录文件,l是链接文件,-是普通文件,p是管道. 后面的 ...

  9. Selenium 2自动化测试实战33(带unittest的脚本分析)

    带unittest的脚本分析 #test.py #coding:utf-8 from selenium import webdriver from selenium.webdriver.common. ...

  10. 小D课堂 - 新版本微服务springcloud+Docker教程_4-04 高级篇幅之服务间调用之负载均衡策略调整实战

    笔记 4.高级篇幅之服务间调用之负载均衡策略调整实战     简介:实战调整默认负载均衡策略实战 自定义负载均衡策略:http://cloud.spring.io/spring-cloud-stati ...