springboot项目发送简单邮件
添加依赖
<!-- 邮件所需依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<!-- Spring Boot Freemarker 依赖,发送HTML格式的邮件的方式 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
编写定时器
import com.dangdang.ddframe.job.api.ShardingContext;
import com.dangdang.ddframe.job.api.simple.SimpleJob;
import com.dangdang.elasticjob.lite.annotation.ElasticSimpleJob;
import lombok.extern.slf4j.Slf4j;
import net.yto.basesrv.api.service.MailService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
*项目中使用定时器,每隔两分钟执行代码
*/
@ElasticSimpleJob(cron="0 0/2 * * * ?",jobName="getOrderDetailsTask",shardingTotalCount=1,jobParameter="参 数",shardingItemParameters="0=C")
@Component
@Slf4j
public class testTask implements SimpleJob{
@Autowired
private MailService mailService;
@Override
public void execute(ShardingContext arg0) {
log.info("定时任务开始:");
try {
mailService.sendSimpleMail();
} catch (Exception e) {
log.error("定时器出错");
}
}
}
properties文件配置
##邮件系统
#启用邮件运行状况检查。
management.health.mail.enabled = false
# 设置邮箱主机
spring.mail.host = mail.yto.net.cn
spring.mail.jndi-name =
spring.mail.port = 25
spring.mail.username =
spring.mail.password =
#设置是否需要认证,如果为true,那么用户名和密码就必须的,
#如果设置false,可以不设置用户名和密码,当然也得看你的对接的平台是否支持无密码进行访问的。
spring.mail.properties.mail.smtp.auth = true
# STARTTLS[1] 是对纯文本通信协议的扩展。它提供一种方式将纯文本连接升级为加密连接(TLS或SSL),而不是另外使用一个端口作加密通信。
spring.mail.properties.mail.smtp.starttls.enable = false
spring.mail.properties.mail.smtp.starttls.required = false
#模板文件后缀
spring.freemarker.suffix = .ftl
spring.freemarker.enabled = true
spring.freemarker.cache = false
spring.freemarker.charset = UTF-8
spring.freemarker.content-type = text/html
spring.freemarker.allow-request-override = false
#是否需要检查模板路径是否存在
spring.freemarker.check-template-location = true
spring.freemarker.expose-request-attributes = false
spring.freemarker.expose-session-attributes = false
spring.freemarker.expose-spring-macro-helpers = false
发送简单邮件
@Value("${spring.mail.username}")
private String from;
@Autowired
private JavaMailSender mailSender;
@Override
public boolean sendSimpleMail() throws Exception {
MimeMessage message = null;
boolean flag = true;
try {
message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo("870992278@qq.com");
helper.setSubject("邮件主题");
helper.setText("内容");
mailSender.send(message);
} catch (Exception e) {
flag = false;
log.error("系统异常邮件发送异常:{}", e);
e.printStackTrace();
}
return flag;
}
遇到问题:
553 Mail from must equal authorized user
原因:
由于在做邮件发送时,登录用户(properties文件中配置的用户名密码)和发信人必须一致;而在测试时我登录用户的邮箱是163邮箱,发信人邮箱是QQ邮箱,导致报错
发送带附件的邮件
public void sendAttachmentsEmail() throws Exception {
try {
//这个是javax.mail.internet.MimeMessage下的,不要搞错了。
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
//基本设置.
helper.setFrom(from);//发送者.
helper.setTo("870992278@qq.com");//接收者.
helper.setSubject("测试附件(邮件主题)");//邮件主题.
helper.setText("这是邮件内容(有附件哦.)");//邮件内容.
//org.springframework.core.io.FileSystemResource下的:
//附件1,获取文件对象.
FileSystemResource file1 = new FileSystemResource(newFile("D:/test/head/head.jpg"));
//添加附件,这里第一个参数是在邮件中显示的名称,也可以直接是head.jpg,但是一定要有文件后缀,不然就无法显示图片了。
helper.addAttachment("头像1.jpg", file1);
mailSender.send(mimeMessage);
} catch (Exception e) {
e.printStackTrace();
}
发送内嵌静态资源的邮件
内嵌图片,给定一个CID值即可,增加附件,使用MimeMessageHelper的addAttachment即可现在一般不会做内嵌图片,因为这样邮件会很大,容易对服务器造成压力,一般做法是使用图片链接。
@Override
public void sendInlineMail() throws Exception {
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
//基本设置.
helper.setFrom(from);//发送者.
helper.setTo("870992278@qq.com");//接收者.
helper.setSubject("测试静态资源(邮件主题)");//邮件主题.
// 邮件内容,第二个参数指定发送的是HTML格式
//说明:嵌入图片<img src='cid:head'/>,其中cid:是固定的写法,而aaa是一个contentId。
helper.setText("<body>这是图片:<img src='cid:head' /></body>", true);
FileSystemResource file = new FileSystemResource(newFile("D:/test/head/head.jpg"));
helper.addInline("head",file);
mailSender.send(mimeMessage);
}