由于考虑到项目中需要,如果程序出现异常或其它问题,可以发送邮件来及时提醒后台维护人员处理。所以目前考虑使用JavaMail来实现邮件发送!如下,是我整理的一些内容,做个笔记记录下:(当然,在这功能实现之前,需要搭建好ssm的基本框架!)
1、导入jar包。首先我们需要在我们spring项目中添加以下两个jar包(我是使用的maven所以直接配置依赖信息)
代码语言:javascript复制 <!--添加spring支持email 依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.3.19.RELEASE</version>
</dependency>
<!--邮件发送-->
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.1</version>
</dependency>
2、配置邮件服务器等信息。
- 先在邮箱中设置开启smtp和pop3服务然后拿到授权码(需要保存下来,配置到代码中):我这里使用的是QQ邮箱,如下:
mail.properties文件(邮件相关的配置):
#服务器主机名 smtp.xx.com
mail.smtp.host=smtp.qq.com
mail.smtp.username=xxx@qq.com
#密码/客户端授权码
mail.smtp.password=这里填入第二步中生成的授权码
#编码字符
mail.smtp.defaultEncoding=utf-8
#是否进行用户名密码校验
mail.smtp.auth=true
#设置超时时间
mail.smtp.timeout=20000
3、配置spring-dao.xml,在配置文件中导入properties文件的属性(根据自己项目实际情况来配置,mail.properties的扫描):
代码语言:javascript复制 <!--读取属性文件-->
<context:property-placeholder location="classpath:*.properties"/>
- 然后注入一个邮件发送的bean接口,并且初始化配置相关属性(我单独编写一个spring-mail.xml文件来配置,可以直接配置在spring-mvc.xml文件中):
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--配置邮件接口-->
<bean id="javaMailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host" value="${mail.smtp.host}"/>
<property name="username" value="${mail.smtp.username}"/>
<property name="password" value="${mail.smtp.password}"/>
<property name="defaultEncoding" value="${mail.smtp.defaultEncoding}"/>
<property name="javaMailProperties">
<props>
<prop key="mail.smtp.auth">${mail.smtp.auth}</prop>
<prop key="mail.smtp.timeout">${mail.smtp.timeout}</prop>
</props>
</property>
</bean>
</beans>
所有配置都完成了
4、编写一个测试类来测试一下:
代码语言:javascript复制package com.mzj.study.controller;
import com.mzj.study.utils.JsonData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* Author: 小莫
* Date: 2018-11-12 18:10
* Description:<描述>
*/
@RestController
@RequestMapping("/email")
public class SenEmailController {
@Autowired
private JavaMailSender javaMailSender;
@Value("${mail.smtp.username}")
private String emailFrom;
@Value("${mail.smtp.tousername}")
private String toEmail;
@RequestMapping("send")
public Object senMsg(){
SimpleMailMessage message = new SimpleMailMessage();
//发件人的邮箱地址
message.setFrom(emailFrom);
//收件人的邮箱地址
message.setTo(toEmail);
//邮件主题
message.setSubject("spring email test!!!!");
//邮件内容
message.setText("收到的邮件内容:spring email test !!!");
//发送邮件
javaMailSender.send(message);
return JsonData.success("success",message);
}
}
5、测试结果。如图:
- 访问接口运行程序
- 查看邮箱的收到的邮件信息
收到的邮件和我们预期的一样,说明功能就实现了。
这里提供一个工具类(MainUtil),该类封装了JavaMail 各种 email 格式发送的方法,可以直接在项目中使用 :
代码语言:javascript复制package com.gometech.tracker.util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.MailException;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;
import java.util.List;
/**
* Author: 小莫
* Date: 2018-11-12 19:43
* Description: 发送邮件工具类,封装了不同类型的邮件发送方法,根据实际情况使用
*/
public class MailUtil {
private JavaMailSenderImpl mailSender;
/**
* JavaMailSenderImpl支持 MimeMessages 和 SimpleMailMessages。
* MimeMessages为复杂邮件模板,支持文本、附件、html、图片等。
* SimpleMailMessages实现了MimeMessageHelper,为普通邮件模板,支持文本
*/
private SimpleMailMessage simpleMailMessage;
private static final Logger logger = LoggerFactory.getLogger(MailUtil.class);
/**
*功能描述: Spring 依赖注入 JavaMailSenderImpl 对象
* @Author 小莫
* @Date 22:19 2018/11/12
* @Param [mailSender]
* @return void
*/
public void setMailSender(JavaMailSenderImpl mailSender) {
this.mailSender = mailSender;
}
/**
*功能描述: Spring 依赖注入 SimpleMailMessage 对象
* @Author 小莫
* @Date 22:19 2018/11/12
* @Param [simpleMailMessage]
* @return void
*/
public void setSimpleMailMessage(SimpleMailMessage simpleMailMessage) {
this.simpleMailMessage = simpleMailMessage;
}
/**
*功能描述: 发送纯文本的简单邮件
* @Author 小莫
* @Date 22:18 2018/11/12
* @Param [recipient, subject, content]
* recipient 收件人 subject 主题 content 内容
* @return void
*/
public void send (String recipient,String subject,String content){
System.out.println(simpleMailMessage);
simpleMailMessage.setTo(recipient);
simpleMailMessage.setSubject(subject);
simpleMailMessage.setText(content);
try {
mailSender.send(simpleMailMessage);
logger.info("简单邮件已经发送...");
} catch (MailException e) {
//这里直接抛出异常
throw e;
}
}
/**
*功能描述: 群发送纯文本的简单邮件
* @Author 小莫
* @Date 22:17 2018/11/12
* @Param [recipients, subject, content]
* recipients 收件人 subject 主题 content 内容
* @return void
*/
public void send(List<String> recipients, String subject, String content){
simpleMailMessage.setTo(recipients.toArray(new String[recipients.size()]));
simpleMailMessage.setSubject(subject);
simpleMailMessage.setText(content);
try {
mailSender.send(simpleMailMessage);
logger.info("群发邮件已经发送...");
} catch (MailException e) {
//这里直接抛出异常
throw e;
}
}
/**
*功能描述: 发送带附件的邮件
* @Author 小莫
* @Date 22:17 2018/11/12
* @Param [recipient, subject, content, filepath]
* recipients 收件人 subject 主题 content 内容 filepath 文件路径
* @return void
*/
public void sendWithFile(String recipient,String subject,String content,String filepath) throws MessagingException {
//使用JavaMail的MimeMessage,支持更加复杂的邮件格式和内容
MimeMessage msg = mailSender.createMimeMessage();
//创建MimeMessageHelper对象,处理MimeMessage的辅助类
MimeMessageHelper helper = new MimeMessageHelper(msg, true);
//使用辅助类MimeMessage设定参数
helper.setFrom(mailSender.getUsername());
helper.setTo(recipient);
helper.setSubject(subject);
//设置属性为true,让设置的html内容以html格式正确显示
helper.setText(content,true);
//生成日志附件文件
File file = new File(filepath);
FileSystemResource resource = new FileSystemResource(file);
//加入附件
helper.addAttachment(resource.getFilename(),resource);
try {
// 发送邮件
mailSender.send(msg);
logger.info("带附件的邮件已经发送...");
} catch (MailException e) {
throw e;
}
}
/**
*功能描述: 群发送带附件的邮件
* @Author 小莫
* @Date 22:17 2018/11/12
* @Param [recipient, subject, content, file]
* @return void
*/
public void sendAllWithFile(List<String> recipients,String subject,String content,String filepath) throws MessagingException {
//使用JavaMail的MimeMessage,支持更加复杂的邮件格式和内容
MimeMessage mimeMessage = mailSender.createMimeMessage();
//创建MimeMessageHelper对象,处理MimeMessage的辅助类
MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true);
//使用辅助类MimeMessage设定参数
messageHelper.setFrom(mailSender.getUsername());
messageHelper.setTo(recipients.toArray(new String[recipients.size()]));
messageHelper.setSubject(subject);
messageHelper.setText(content,true);
//生成日志附件文件
File file = new File(filepath);
FileSystemResource resource = new FileSystemResource(file);
//加入附件
messageHelper.addAttachment(resource.getFilename(),resource);
// 发送邮件
try {
mailSender.send(mimeMessage);
logger.info("群发带附件的邮件已经发送...");
} catch (MailException e) {
throw e;
}
}
/**
*
* @param
* @param
* @param
*/
/**
*功能描述: 发送嵌入静态资源(一般是图片)的邮件
* @Author 小莫
* @Date 13:44 2018/11/13
* @Param [to, subject, content, rscPath, rscId]
* content 邮件内容,需要包括一个静态资源的id,比如:"<img src='cid:xm'>"
* rscPath 静态资源路径和文件名
* rscId 静态资源 id
* @return void
*/
public void sendInlineResourceMail(String recipient, String subject, String content, String rscPath, String rscId) throws MessagingException {
MimeMessage message = mailSender.createMimeMessage();
try {
MimeMessageHelper helper = setInfoByHelper(recipient, subject, content, message);
FileSystemResource res = new FileSystemResource(new File(rscPath));
helper.addInline(rscId, res);
mailSender.send(message);
logger.info("嵌入静态资源的邮件已经发送...");
} catch (MessagingException e) {
throw e;
}
}
/**
*功能描述: 利用 helper 初始化邮件发送相关的配置信息
* @Author 小莫
* @Date 13:55 2018/11/13
* @Param [recipient, subject, content, message]
* @return org.springframework.mail.javamail.MimeMessageHelper
*/
private MimeMessageHelper setInfoByHelper(String recipient, String subject, String content, MimeMessage message) throws MessagingException {
//true表示需要创建一个multipart message
MimeMessageHelper helper = new MimeMessageHelper(message, true);
//发送人的邮件地址,配置文件中已经注入,直接获取即可
helper.setFrom(mailSender.getUsername());
//收件人的邮箱
helper.setTo(recipient);
//邮件主题
helper.setSubject(subject);
//邮件的内容 true 是代表的html格式生效
helper.setText(content, true);
return helper;
}
}
- 注意:如果需要注入方式引用 MainUtil 的对象,需要将其加入 IOC 中,JavaMailSenderImpl、SimpleMailMessage 对象通过属性配置的方式注入,这里提供一个 mail 的配置文件,相关配置更换成自己项目信息即可用:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--配置simpleMailMessage 实例-->
<bean id="simpleMailMessage" class="org.springframework.mail.SimpleMailMessage">
<!--配置发件人的邮箱地址-->
<property name="from" value="${mail.smtp.username}"/>
<!--配置收件人的邮箱地址-->
<property name="to" value="${mail.smtp.tousername}"/>
</bean>
<!--配置JavaMailSenderImpl 邮件接口实现类-->
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host" value="${mail.smtp.host}"/>
<property name="username" value="${mail.smtp.username}"/>
<property name="password" value="${mail.smtp.password}"/>
<property name="defaultEncoding" value="${mail.smtp.defaultEncoding}"/>
<property name="javaMailProperties">
<props>
<prop key="mail.smtp.auth">${mail.smtp.auth}</prop>
<prop key="mail.smtp.timeout">${mail.smtp.timeout}</prop>
<prop key="mail.smtp.ssl.enable">${mail.smtp.ssl.enable}</prop>
<prop key="mail.smtp.port">${mail.smtp.port}</prop>
<!--配置端口 ,阿里云25端口禁用,使用465端口-->
<prop key="mail.smtp.socketFactory.port">${mail.smtp.socketFactory.port}</prop>
<prop key="mail.smtp.socketFactory.fallback">${mail.smtp.socketFactory.fallback}</prop>
<prop key="mail.smtp.socketFactory.class">${mail.smtp.socketFactory.class}</prop>
</props>
</property>
</bean>
<!--将 mailUtil 类加入IOC容器中管理,并且为属性注入对应的值-->
<bean id="mailUtil" class="com.gometech.tracker.util.MailUtil">
<!--注入JavaMailSenderImpl对象-->
<property name="mailSender" ref="mailSender"/>
<!--注入SimpleMailMessage 对象-->
<property name="simpleMailMessage" ref="simpleMailMessage"/>
</bean>
</beans>
6、使用方法:
代码语言:javascript复制@Autowired
private MailUtil mailUtil;
/**
*功能描述: 捕获抛出的所有系统类异常,并将异常的log信息群发给相关处理人
* 备注:这里可以发送短信提醒也可以发送邮件提醒,后续根据业务需要再修改
* @Author 小莫
* @Date 14:16 2018/11/13
* @Param [e, request]
* @return JsonData
*/
@ExceptionHandler(Exception.class)
public ResponseResult errorHandler(Exception e, HttpServletRequest request) throws MessagingException {
log(e,request);
//mailUtil.send("xxx@163,com","程序出现异常!!!","程序出现异常了,请尽快处理....");
//将异常信息转化为字符串内容输出到email内容中去
StringWriter stringWriter = new StringWriter();
PrintWriter printWriter = new PrintWriter(stringWriter);
e.printStackTrace(printWriter);
//添加群发的收件人邮箱
List<String> persons = new ArrayList<String>();
persons.add("xxx@163.com");
persons.add("xxx@163.com");
....
//服务器log文件日志路径
String filepath ="/usr/local/src/apache-tomcat-8.5.34/logs/tracker/error.log";
mailUtil.sendAllWithFile(persons,"程序出现异常,请及时处理!!!",stringWriter.toString(),filepath);
return ResponseResult.fail("程序出现未知错误...");
}
本文作者: AI码真香
本文标题: 基于SSM的 spring 发送邮件的实现
本文网址: https://www.xmlvhy.com/article/74.html
版权说明: 自由转载-非商用-非衍生-保持署名 署名-非商业性使用4.0 国际 (CC BY-NC 4.0)