一、导入相关依赖

<!--邮件发送-->
<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. mysql 查看当前正在执行的语句

    查看当前正在执行的语句 show processlist:show processlist; 结束正在执行的语句进程 kill 进程id

  2. vue 循环Redio

    标准用法,做个笔记.(图示是elementUI,其他框架大同小异) <el-radio-group @change="changePayHandler" v-model=&q ...

  3. ELK(ElasticSearch, Logstash, Kibana) 实现 Java 分布式系统日志分析架构

    一.首先理解为啥要使用ELK 日志主要分为三类:系统日志.应用程序日志和安全日志.系统运维和开发人员可以通过日志了解服务器软硬件信息.检查配置过程中的错误及错误发生的原因.通过分析日志可以了解服务器的 ...

  4. OUC_Summer Training_ DIV2_#12(DP1) 723

    这一次是做练习,主要了解了两个算法,最大子矩阵和,最长上升子序列. 先看题好啦. A - To The Max Time Limit:1000MS     Memory Limit:32768KB   ...

  5. 第十四周课程总结&实验报告(简单记事本的实现)

    1.JDBC概述 JDBC提供了一种与平台无关的用于执行SQL语句的标准JavaAPI,可以方便的实现多种关系型数据库的统一操作,它由一组用Java语言编写的类和接口组成 主要常用操作类与接口: ja ...

  6. [MyBatis] 如何让MyBatis支持代码级事务处理

    MyBatis提供的sqlSession对象是可以用来帮助我们实现事务处理的,方式和JDBC的类似,具体请见代码: import java.sql.Connection; import java.sq ...

  7. 处理输入为非对角阵的Clustering by fast search and find of density peak代码

    Clustering by fast search and find of density peak. Alex Rodriguez, Alessandro Laio 是发表在Science上的一篇很 ...

  8. Maven exclusions(排除依赖)

    在写pom的时候,我们写的一个依赖往往会依赖于其他的包,而这些包可能是过时的不安全的,因此需要排除并重新引用安全的版本,先在依赖这个项目的pom中去除想排除的依赖,再添加指定版本的依赖. pom的依赖 ...

  9. 一百一十二:CMS系统之前台用户模型

    安装shortuuid用于前台用户的主键:pip install shortuuid 创建模型 from datetime import datetimeimport enumfrom werkzeu ...

  10. Requests API

    Requests API http://docs.python-requests.org/en/latest/ requests的具体安装过程请看: http://docs.python-reques ...