javascript
SpringBoot之发送邮件
1.pom配置
? ?<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency> ?<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency></dependencies>2.添加yml配置
spring:mail:host: smtp.163.com ? #前面的host為163普通郵箱的配置,如果要用163企業郵箱,host為:smtphz.qiye.163.comusername: xxx@163.compassword: xxxxxxxx#該密碼不是郵箱登錄密碼,而是smtp授權碼,同時要發送的郵件必須要開啟對應的授權port: 465properties:mail.smtp.auth: truemail.smtp.ssl.enable: truemail.smtp.socketFactory.class: javax.net.ssl.SSLSocketFactorymail.smtp.socketFactory.port: 465identify-code:title: 【測試】驗證碼確認郵件text: 您好,您的驗證碼是%s,請在有效期(一小時)內完成校驗,每日驗證碼限發5條。3.郵箱服務設置
拿163郵箱舉例
-  開啟遠程登錄協議: 
?
-  獲取授權碼: 
?
4.MailService
@Service public class MailService {private final Logger logger = LoggerFactory.getLogger(this.getClass()); ?@Autowiredprivate JavaMailSender javaMailSender; ?@Value("${spring.mail.username}")private String sender;@Value("${spring.mail.identify-code.title}")private String title;@Value("${spring.mail.identify-code.text}")private String text; ? ?public void sendIdentifyCode(String email, String code) {SimpleMailMessage mailMessage = new SimpleMailMessage();mailMessage.setFrom(sender);mailMessage.setTo(email);mailMessage.setSubject(title);mailMessage.setText(String.format(text, code));try {javaMailSender.send(mailMessage);logger.info("驗證碼郵件發送成功");System.out.println("簡單郵箱已發送");} catch (MailException e) {logger.error("發送驗證碼郵件時發生異常!");}} ?public void send(String email, String title, String message) {SimpleMailMessage mailMessage = new SimpleMailMessage();mailMessage.setFrom(sender);mailMessage.setTo(email);mailMessage.setSubject(title);mailMessage.setText(message);try {javaMailSender.send(mailMessage);logger.info("簡單郵件發送成功");System.out.println("簡單郵箱已發送");} catch (MailException e) {logger.error("發送簡單郵件時發生異常!");}} }5.測試類
@RunWith(SpringRunner.class) @SpringBootTest public class Study3ApplicationTests { ?@Autowiredprivate MailService mailService; ?@Testpublic void testSendMail() {mailService.sendIdentifyCode("583509857@qq.com", "soi19a");} ?@Testpublic void testSend() {mailService.send("583509857@qq.com", "測試郵箱", "hello world");} }6.進階
我們還可以在郵件中發送html富文本,還可以發送帶附件的郵件和帶靜態資源的文件。
? ?public void sendHtmlMail(String to, String subject, String content) {MimeMessage message = javaMailSender.createMimeMessage(); ?try {//true表示需要創建一個multipart messageMimeMessageHelper helper = new MimeMessageHelper(message, true);helper.setFrom(sender);helper.setTo(to);helper.setSubject(subject);helper.setText(content, true); ?javaMailSender.send(message);logger.info("html郵件發送成功");} catch (MessagingException e) {logger.error("發送html郵件時發生異常!", e);}} ?public void sendAttachmentsMail(String to, String subject, String content, String filePath) {MimeMessage message = javaMailSender.createMimeMessage(); ?try {MimeMessageHelper helper = new MimeMessageHelper(message, true);helper.setFrom(sender);helper.setTo(to);helper.setSubject(subject);helper.setText(content, true); ?FileSystemResource file = new FileSystemResource(new File(filePath));String fileName = filePath.substring(filePath.lastIndexOf(File.separator));helper.addAttachment(fileName, file); ?javaMailSender.send(message);logger.info("帶附件的郵件已經發送。");} catch (MessagingException e) {logger.error("發送帶附件的郵件時發生異常!", e);} catch (UnsupportedEncodingException e) {logger.error("附件標題轉碼失敗!", e);}} ?public void sendInlineResourceMail(String to, String subject, String content, String rscPath, String rscId) {MimeMessage message = javaMailSender.createMimeMessage(); ?try {MimeMessageHelper helper = new MimeMessageHelper(message, true);helper.setFrom(sender);helper.setTo(to);helper.setSubject(subject);helper.setText(content, true); ?FileSystemResource res = new FileSystemResource(new File(rscPath));helper.addInline(rscId, res); ?javaMailSender.send(message);logger.info("嵌入靜態資源的郵件已經發送。");} catch (MessagingException e) {logger.error("發送嵌入靜態資源的郵件時發生異常!", e);}}7.進階測試
? ?@Testpublic void testSendHtml() {String content = "<html>\n" +"<body>\n" +" ? <h3>hello world ! 這是一封Html郵件!</h3>\n" +"</body>\n" +"</html>";mailService.sendHtmlMail("583509857@qq.com", "test simple mail", content);} ?@Testpublic void testSendAttachmentsMail() {String filePath = "/Users/apple/Desktop/鈷行業深度報告:嘉能可重拾“鈷定價權”,若“控量保價”電鈷價格有望突破25萬元噸.pdf";mailService.sendAttachmentsMail("583509857@qq.com", "研報", "您好,研報在附件中,請查收", filePath);} ?@Testpublic void sendInlineResourceMail() {String rscId = "neo006";String content = "<html><body>這是有圖片的郵件:<img src=\'cid:" + rscId + "\' ></body></html>";String imgPath = "/Users/apple/Pictures/img2.jpeg"; ?mailService.sendInlineResourceMail("583509857@qq.com", "主題:這是有圖片的郵件", content, imgPath, rscId);}8.發送附件郵箱亂碼問題
當我們按上面的方法發送附件時,如果附件的標題中有一些特殊符號,則會出現亂碼問題。
?
這時我們需要對附件名稱進行編碼后在發送
helper.addAttachment(MimeUtility.encodeWord(fileName), file);但是上面這樣處理標題后,如果標題過長,還會出現亂碼問題。
這時因為參數mail.mime.splitlongparameters 在linux下會默認為 true,附件名過長,就會被截斷。
我們還需要在MailService中設置如下屬性:
? ?static {System.setProperty("mail.mime.splitlongparameters", "false");}9.異步發送
很多時候郵件發送并不是我們主業務必須關注的結果,比如通知類、提醒類的業務可以允許延時或者失敗。這個時候可以采用異步的方式來發送郵件,加快主交易執行速度,在實際項目中可以采用MQ發送郵件相關參數,監聽到消息隊列之后啟動發送郵件。也可以使用SpringBoot自帶的@Async注解達到異步發送的目的,啟動類中需要添加@EnableAsync注解。
10.失敗重試機制
拿163郵箱舉例,一般普通郵箱每天能發送的郵件數為50封左右,企業郵箱每天能發送1000封。在一個項目中,如果郵箱業務用的比較頻繁的時候,1000篇郵件也很明顯是不夠的。我們就可以搭建一個郵箱服務,根據業務大小弄足夠的郵箱,可以數據庫中弄一張表去維護它。然后用java的異常處理機制,當捕獲到發送郵件失敗后拿其它郵箱重發。重試次數可以設置為一個固定值,比如3次,防止重試次數過多系統變慢。
總結
以上是生活随笔為你收集整理的SpringBoot之发送邮件的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Linux之文件查找
- 下一篇: Zookeeper之ZAB协议
