今天这个是一个非常简单的邮件发送,也是我在网上看到的,我简化了很多,初学者都能看懂
我们先创建一个web项目,导入mail依赖,还有一些后面需要用到的依赖
<!--传输文件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<!--引入模板引擎-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!--webjars中的jquery-->
<dependency>
<groupId>org.webjars</groupId>
<artifactId>jquery</artifactId>
<version>3.3.1</version>
</dependency>
<!--bookstarp-->
<dependency>
<groupId>org.webjars</groupId>
<artifactId>bootstrap</artifactId>
<version>4.0.0</version>
</dependency>
我们先创建一个实例类
package com.jiang.pojo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.web.multipart.MultipartFile;
import java.util.Date;
/**
* @ClassName Mail
* @Description TODO
* @Author ht
* @Date 2020/8/17 9:55
* @Version 1.0
**/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Mail {
private String id;//邮件id
private String from;//邮件发送人
private String to;//邮件接收人(多个邮箱则用逗号","隔开)
private String subject;//邮件主题
private String text;//邮件内容
private String status;//状态
private String error;//报错信息
@JsonIgnore
private MultipartFile[] multipartFiles;//邮件附件 输入流
}
我们写我们的业务,想一想,我们写邮件是不是一开始要创建邮件,邮件创建好后,我们要检查邮件,若邮件没问题,我们就该发送邮件,所有我们的业务有三个
自己写测试的话,就直接写业务实现了
service层
package com.jiang.service;
import com.jiang.pojo.Mail;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.util.Date;
/**
* @ClassName MailService
* @Description TODO
* @Author ht
* @Date 2020/8/17 10:00
* @Version 1.0
**/
//业务层逻辑
@Service
public class MailService {
private Logger logger = LoggerFactory.getLogger(getClass());//提供日志类
@Autowired
JavaMailSenderImpl mailSender;
//构建一个复杂的发送邮件(可以添加附件)
public void buildMail(Mail mail) {
MimeMessage mailMessage = mailSender.createMimeMessage();
//封装
MimeMessageHelper helper = null;//true表示支持复杂类型
try {
helper = new MimeMessageHelper(mailMessage, true);
//配置发送人
helper.setFrom(getMailSendFrom());//获取getMailSendFrom方法中的数据
//发送给谁
helper.setTo(mail.getTo());
//邮件主题
helper.setSubject(mail.getSubject());
//邮件内容
helper.setText(mail.getText());
//邮件附件
if (mail.getMultipartFiles() != null) {//添加邮件附件
for (MultipartFile multipartFile : mail.getMultipartFiles()) {
//addAttachment的两个参数的意思分别是获取邮件中显示的附件的名称,获取附件的资源
helper.addAttachment(multipartFile.getOriginalFilename(), multipartFile);
}
}
mailSender.send(helper.getMimeMessage());
//发送成功后,它的状态变为ok
mail.setStatus("ok");
logger.info("发送邮件成功:{}->{}", mail.getFrom(), mail.getTo());
} catch (Exception e) {
throw new RuntimeException(e);//发送失败
}
}
public void checkMail(Mail mail){
if (StringUtils.isEmpty(mail.getTo())){
throw new RuntimeException("邮件收信人不能为空");
}
if (StringUtils.isEmpty(mail.getSubject())){
throw new RuntimeException("邮件主题不能为空");
}
if (StringUtils.isEmpty(mail.getText())){
throw new RuntimeException("邮件内容不能为空");
}
}
//发送邮件
public Mail sendMail(Mail mail) throws MessagingException {
checkMail(mail);
buildMail(mail);
return mail;
}
//获取邮件发信人,在yaml配置中获取
public String getMailSendFrom() {
return mailSender.getJavaMailProperties().getProperty("from");
}
}
这些没什么好说的,我都注释好了,主要的是我们的最后一个,通过代码在yaml中获取我们配置的静态资源
//获取邮件发信人,在yaml配置中获取
public String getMailSendFrom() {
return mailSender.getJavaMailProperties().getProperty("from");
}
我们的配置文件是这样的
spring:
mail:
host: smtp.qq.com #SMTP服务器地址
username: 1661259340@qq.com #登陆账号
password: thgbslbtlznechfh #登陆密码(或授权码)
properties:
from: 1661259340@qq.com #邮件发信人(即真实邮箱)
#开启加密验证 qq有
#自定义配置 是否自动开启安全验证
mail:
smtp:
ssl:
enable: true;
thymeleaf:
cache: false
prefix: classpath:/views/
servlet:
multipart:
max-file-size: 10MB #限制单个文件大小
max-request-size: 50MB #限制请求总量
我们获取的就是spring.properties.from中的数据
获取到过后,我们就需要些Controller层了
我们要先进入发送邮件的界面,然后在界面中输入数据
package com.jiang.controller;
import com.jiang.pojo.Mail;
import com.jiang.service.MailService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
import javax.mail.MessagingException;
/**
* @ClassName MailController
* @Description TODO
* @Author ht
* @Date 2020/8/24 17:24
* @Version 1.0
**/
@RestController
public class MailController {
@Autowired
MailService service;
/**
* 发送邮件的主界面
*/
@GetMapping("/mail")
public ModelAndView index(ModelAndView modelAndView) {
modelAndView =new ModelAndView("/sendMail");
//打开发送邮件的页面
modelAndView.addObject("from", service.getMailSendFrom());//邮件发信人
return modelAndView;
}
/**
* 发送邮件
*/
@PostMapping("/send")
public Mail sendMail(Mail mail, MultipartFile[] files) throws MessagingException {
mail.setMultipartFiles(files);
Mail mail1 = service.sendMail(mail);//发送邮件和附件
return mail1;
}
}
把我们的“from”传到sendeMail界面
sendMail界面,它是用的thymeleaf模板引擎
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8"/>
<title>发送邮件</title>
<link th:href="@{/webjars/bootstrap/4.0.0/css/bootstrap.min.css}" rel="stylesheet" type="text/css"/>
<script th:src="@{/webjars/jquery/3.3.1/jquery.min.js}"></script>
<script th:href="@{/webjars/bootstrap/4.0.0/js/bootstrap.min.js}"></script>
</head>
<body>
<div class="col-md-6" style="margin:20px;padding:20px;border: #E0E0E0 1px solid;">
<marquee behavior="alternate" onfinish="alert(12)" id="mq"
onMouseOut="this.start();$('#egg').text('嗯 真听话!');"
onMouseOver="this.stop();$('#egg').text('有本事放开我呀!');">
<h5 id="egg">祝大家新年快乐!</h5><img style="display: inline-block;width: 100px;height: 100px" id="doge" src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1597645635473&di=9acb697a372d54e689be3c600228d114&imgtype=0&src=http%3A%2F%2Fimg5.cache.netease.com%2Fgame%2F2012%2F10%2F19%2F201210191523330b2ec.gif" alt="">
</marquee>
<form class="form-horizontal" id="mailForm">
<div class="form-group">
<label class="col-md-2 control-label">邮件发信人:</label>
<div class="col-md-6">
<input class="form-control" id="from" name="from" th:value="${from}" readonly="readonly">
</div>
</div>
<div class="form-group">
<label class="col-md-2 control-label">邮件收信人:</label>
<div class="col-md-6">
<input class="form-control" id="to" name="to" title="多个邮箱使用,隔开">
</div>
</div>
<div class="form-group">
<label class="col-md-2 control-label">邮件主题:</label>
<div class="col-md-6">
<input class="form-control" id="subject" name="subject">
</div>
</div>
<div class="form-group">
<label class="col-md-2 control-label">邮件内容:</label>
<div class="col-md-6">
<textarea class="form-control" id="text" name="text" rows="5"></textarea>
</div>
</div>
<div class="form-group">
<label class="col-md-2 control-label">邮件附件:</label>
<div class="col-md-6">
<input class="form-control" id="files" name="files" type="file" multiple="multiple">
</div>
</div>
<div class="form-group">
<label class="col-md-2 control-label">邮件操作:</label>
<div class="col-md-3">
<a class="form-control btn btn-primary" onclick="sendMail()">发送邮件</a>
</div>
<div class="col-md-3">
<a class="form-control btn btn-default" onclick="clearForm()">清空</a>
</div>
</div>
</form>
<script th:inline="javascript">
var appCtx = [[${#request.getContextPath()}]];
function sendMail() {
var formData = new FormData($('#mailForm')[0]);
$.ajax({
url: appCtx + '/send',
type: "POST",
data: formData,
contentType: false,
processData: false,
success: function (result) {
alert(result.status === 'ok' ? "发送成功!" : "你被Doge嘲讽了:" + result.error);
},
error: function () {
alert("发送失败!");
}
});
}
function clearForm() {
$('#mailForm')[0].reset();
}
setInterval(function () {
var total = $('#mq').width();
var width = $('#doge').width();
var left = $('#doge').offset().left;
if (left <= width / 2 + 20) {
$('#doge').css('transform', 'rotateY(180deg)')
}
if (left >= total - width / 2 - 40) {
$('#doge').css('transform', 'rotateY(-360deg)')
}
});
</script>
</div>
</body>
</html>
最后我们运行的结果是这样的
邮件发送人使我们直接在配置文件中获取的,当然我们也可以自己写,自己写那个也是一样的