@javazjm
2017-11-01T12:53:05.000000Z
字数 4108
阅读 1681
Springboot mail
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency>
使用用户名密码的方式
spring.mail.default-encoding=UTF-8# 邮箱服务器地址spring.mail.host=10.6.4.78# 用户名spring.mail.username=zhangjinmiao@zihexin.com# 密码spring.mail.password=xxxxxx# 邮件发送人mail.fromMail.addr=zhangjinmiao@zihexin.com
使用用户名授权码的方式(比如QQ)
spring.mail.default-encoding=UTF-8# 邮箱服务器地址spring.mail.host=smtp.qq.com# 用户名spring.mail.username=1539745948@qq.com# 密码spring.mail.password=xxxxxxxxxxx# 客户端授权验证spring.mail.properties.mail.smtp.auth=true# 始终使用安全设置spring.mail.properties.mail.smtp.starttls.enable=true# 安全设置必须spring.mail.properties.mail.smtp.starttls.required=true# 邮件发送人mail.fromMail.addr=1539745948@qq.com
public interface MailService {/*** Send a text mail* @param to 接收人* @param subject 主题* @param content 内容*/public void sendSimpleMail(String to, String subject, String content);/*** Send HTML mail* @param to 接收人* @param subject 主题* @param content 内容*/public void sendHtmlMail(String to, String subject, String content);/*** Send an email with attachments* @param to 接收人* @param subject 主题* @param content 内容* @param filePath 附件地址*/public void sendAttachmentsMail(String to, String subject, String content, String filePath);/*** 发送正文中有静态资源(图片)的邮件* @param to 接收人* @param subject 主题* @param content 内容* @param rscPath 静态文件名* @param rscId 静态文件地址*/public void sendInlineResourceMail(String to, String subject, String content, String rscPath, String rscId);}
具体查看代码,springboot 已经封装了host,port,username,password属性的设置,所以实现类中没有出现,详见类。
@Componentpublic class MailServiceImpl implements MailService {// ...}
特别注意,发送模板文件
1. 在resources下新建templates\emailTemplate.html
代码中
//创建邮件正文
Context context = new Context();
context.setVariable("id", "006");
String emailContent = templateEngine.process("emailTemplate", context);
mailService.sendHtmlMail(to, "主题:这是模板邮件", emailContent);
public class Email implements Serializable {private static final long serialVersionUID = 1L;//必填参数private String[] email;//接收方邮件private String subject;//主题private String content;//邮件内容//选填private String template;//模板private HashMap<String, String> kvMap;// 自定义参数public Email() {super();}public Email(String[] email, String subject, String content, String template, HashMap<String, String> kvMap) {this.email = email;this.subject = subject;this.content = content;this.template = template;this.kvMap = kvMap;}// getter setter ...}
见IMailService
见MailServiceImpl2,包括Thymeleaf和Freemarker模板,发送1000次,建议使用Freemarker模板。
解决短时间内频繁发送邮件引起邮件服务器报警,邮件发送失败的情况,使用队列来对邮件发送进行流量削峰、间隔发送以及重复内容检测。
MailQueue
ConsumeMailQueue
LinkedBlockingQueue是进程内的队列,容器挂掉后,队列中的内容就丢了。所以我们推荐使用Redis队列,
只要redis没挂掉,即使邮件服务挂掉也不担心。
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-redis</artifactId><version>1.4.3.RELEASE</version></dependency>
public void sendRedisQueue(Email mail) throws Exception {redisTemplate.convertAndSend("mail", mail);}
监听器监听队列mail是否有邮件进入,有的话调用方法receiveMessage消费队列开始发送邮件。
/*** 统计失败邮件定时重新发送*/@Component("sendMail")public class SendMail {//@Scheduled(cron = "0/5 * * * * ?")public void sendMail() {System.out.println("同步开始");}}
或者使用注解@Scheduled和@EnableScheduling,
这样就不需要配置文件spring-context-task.xml了。
<!-- DubboX相关 --><dependency><groupId>com.alibaba</groupId><artifactId>dubbo</artifactId><!-- 这里使用最新的2.8.4版本,中央仓库不存在,请自行打入本地仓库 --><!-- 百度网盘:http://pan.baidu.com/s/1gfxiuYZ --><version>2.8.4</version><exclusions><exclusion><artifactId>spring</artifactId><groupId>org.springframework</groupId></exclusion></exclusions></dependency><!-- zookeeper 第三方操作工具类 --><dependency><groupId>com.101tec</groupId><artifactId>zkclient</artifactId><version>0.6</version><exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId></exclusion></exclusions></dependency>
在实现类上使用注解
com.alibaba.dubbo.config.annotation.Service
配置文件
spring-context-dubbo.xml
参考: