前言:我以前用Log4j发邮件,发现特别影响性能,若是频繁遇到异常触发邮件就会影响其余请求访问,后来换成 new thread 来单独 发送 javaXMail 。html
今天发现 spring-boot-starter-mail,虽然也是依赖javaxMail 实现的,可是强迫症犯了 ,认为Spring大法是最好的。java
1.maven依赖spring
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency>
2.配置相关配置服务器
#mail spring.mail.host=smtp.exmail.qq.com spring.mail.username= spring.mail.password= spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.starttls.enable=true spring.mail.properties.mail.smtp.starttls.required=true spring.mail.sendTo=
3.使用方法异步
@Autowired private JavaMailSender mailSender; SimpleMailMessage message = new SimpleMailMessage(); message.setFrom(env.getProperty("spring.mail.username")); message.setTo(env.getProperty("spring.mail.sendTo")); message.setSubject(title); message.setText(text); mailSender.send(message);
测试发现用JavaMailSender 发送也是同步,影响性能maven
4.使用Spring的TaskExecutor实现异步发送。spring-boot
@Bean public ThreadPoolTaskExecutor createThreadPoolTaskExecutor() { ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor(); threadPoolTaskExecutor.setCorePoolSize(10); threadPoolTaskExecutor.setMaxPoolSize(20); return threadPoolTaskExecutor; }
taskExecutor.execute(() -> { try { SimpleMailMessage message = new SimpleMailMessage(); message.setFrom(env.getProperty("spring.mail.username")); message.setTo(env.getProperty("spring.mail.sendTo")); message.setSubject(title); message.setText(text); mailSender.send(message); } catch (Exception e) { logger.warn("发送邮件消息失败=exception:{}", e); } });
上面的()->的写法是 java8的Lambda写法, new Runnable()
5.使用Spring的@Async实现异步性能
@Async public static void AsyncMethod(){ //执行发邮件操做 }
须要启用Async , 配置一下@EnableAsync测试
经过@Async注解代表该方法是异步方法,若是注解在类级别上则代表该类全部的方法都是异步方法。ui
java原生也有线程池,有兴趣的同窗能够去看看ThreadPoolExecutor类的说明
6.Main方法运行
// 建立Properties 类用于记录邮箱的一些属性 final Properties props = new Properties(); // 表示SMTP发送邮件,必须进行身份验证 props.put("mail.smtp.auth", "true"); //此处填写SMTP服务器 props.put("mail.smtp.host", "smtp.qq.com"); //端口号,QQ邮箱给出了两个端口,可是另外一个我一直使用不了,因此就给出这一个587 props.put("mail.smtp.port", "587"); // 此处填写你的帐号 props.put("mail.user", "2251181679@qq.com"); // 此处的密码就是前面说的16位STMP口令 props.put("mail.password", ""); // 构建受权信息,用于进行SMTP进行身份验证 Authenticator authenticator = new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { // 用户名、密码 String userName = props.getProperty("mail.user"); String password = props.getProperty("mail.password"); return new PasswordAuthentication(userName, password); } }; // 使用环境属性和受权信息,建立邮件会话 Session mailSession = Session.getInstance(props, authenticator); // 建立邮件消息 MimeMessage message = new MimeMessage(mailSession); // 设置发件人 InternetAddress form = new InternetAddress(props.getProperty("mail.user")); message.setFrom(form); // 设置收件人的邮箱 InternetAddress[] sendTo = new InternetAddress[2]; sendTo[0] = new InternetAddress("22511181167911@qq.com"); sendTo[1] = new InternetAddress("1431081761916@qq.com"); message.setRecipients(Message.RecipientType.TO, sendTo); // 设置邮件标题 message.setSubject("测试邮件"); // 设置邮件的内容体 message.setContent("这是一封测试邮件", "text/html;charset=UTF-8"); // 最后固然就是发送邮件啦 Transport.send(message);
博客地址:http://my.oschina.net/wangnian