您好,登錄后才能下訂單哦!
這篇文章主要介紹“怎么使用spring boot發郵件”,在日常操作中,相信很多人在怎么使用spring boot發郵件問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么使用spring boot發郵件”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
spring boot發郵件還是挺簡單的,首先把發郵件的start加到pom里面:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency>
然后在application.properties里面配置好關于發郵件的參數
spring.mail.host=smtp.163.com spring.mail.port=25 spring.mail.username=yourmail@163.com spring.mail.password=yourpassword
其中spring.mail.host和spring.mail.username是一一對應的,哪里的郵箱就要用哪里的smtp服務器
然后我寫了一個controller來接收留言板的內容:
@Value("${spring.mail.username}") private String fromMail; @Autowired private JavaMailSender mailSender; @RequestMapping(value = "/getNote", method = RequestMethod.POST) public String getNote(Note note) { MimeMessage mimeMessage = mailSender.createMimeMessage(); MimeMessageHelper helper; try { helper = new MimeMessageHelper(mimeMessage, true); //發件人 helper.setFrom(fromMail,note.yourName); //收件人(留言內容最終發往的郵箱地址) helper.setTo("recieve@mail.com"); //標題 helper.setSubject(note.yourSubject); //文本 helper.setText("from email:"+note.yourEmail+"\n"+note.yourMessage); mailSender.send(mimeMessage); } catch (MessagingException | UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } return "redirect:return.htm"; }
public class Note { String yourName; String yourEmail; String yourSubject; String yourMessage; //getter,setter省略 }
note對象是留言板的內容
JavaMailSender和MimeMessageHelper是官方推薦的好基友,一般配套使用
fromMail就是在application.properties里面配置的spring.mail.username屬性,也就是發郵件的一方,用helper.setTo(...)配置
額外說一下,由于填留言板時一般也會留郵件地址,但那個郵件地址和這里的任何一個設置郵件的地方毫無關系,只需要在郵件的文本里面做記錄就好了,我之前就弱智了一把,把留言板里面的郵件地址填到helper.setTo(...),結果浪費了我半個小時查這種bug,真是一言難盡...
很多時候,按照上面的方法發郵件會出現下面的錯誤:
javax.mail.AuthenticationFailedException: 535 Error: authentication failed
其中的一個原因是郵件服務器使用了授權碼登錄方式,也就是第三方登錄不能直接使用賬號密碼,而需要使用一種授權碼的方式,比如上面的163.com郵箱,就可以設置授權碼登錄,設置界面如下:
QQ郵箱更是默認就需要用授權碼登錄,QQ郵箱的授權登錄操作文檔請看這里
使用授權碼登錄后,需要把之前application.properties里面spring.mail.password的內容從密碼換成授權碼,就能夠正常發郵件了。
我們查下JavaMailSender的代碼就知道,它其實背景比較復雜。首先它繼承了org.springframework.mail.MailSender接口。
public interface JavaMailSender extends MailSender { ... }
而它本身也是一個接口,實現類只有一個,JavaMailSenderImpl
我們再來翻JavaMailSenderImpl的代碼,發現spring并沒有自己來做發送郵件的功能,而是直接用了java自身的郵件發送功能,核心是這一段
protected void doSend(MimeMessage[] mimeMessages, @Nullable Object[] originalMessages) throws MailException { Map<Object, Exception> failedMessages = new LinkedHashMap<>(); Transport transport = null; try { for (int i = 0; i < mimeMessages.length; i++) { // Check transport connection first... if (transport == null || !transport.isConnected()) { if (transport != null) { try { transport.close(); } catch (Exception ex) { // Ignore - we're reconnecting anyway } transport = null; } try { transport = connectTransport(); } catch (AuthenticationFailedException ex) { throw new MailAuthenticationException(ex); } catch (Exception ex) { // Effectively, all remaining messages failed... for (int j = i; j < mimeMessages.length; j++) { Object original = (originalMessages != null ? originalMessages[j] : mimeMessages[j]); failedMessages.put(original, ex); } throw new MailSendException("Mail server connection failed", ex, failedMessages); } } // Send message via current transport... MimeMessage mimeMessage = mimeMessages[i]; try { if (mimeMessage.getSentDate() == null) { mimeMessage.setSentDate(new Date()); } String messageId = mimeMessage.getMessageID(); mimeMessage.saveChanges(); if (messageId != null) { // Preserve explicitly specified message id... mimeMessage.setHeader(HEADER_MESSAGE_ID, messageId); } Address[] addresses = mimeMessage.getAllRecipients(); transport.sendMessage(mimeMessage, (addresses != null ? addresses : new Address[0])); } catch (Exception ex) { Object original = (originalMessages != null ? originalMessages[i] : mimeMessage); failedMessages.put(original, ex); } } } finally { try { if (transport != null) { transport.close(); } } catch (Exception ex) { if (!failedMessages.isEmpty()) { throw new MailSendException("Failed to close server connection after message failures", ex, failedMessages); } else { throw new MailSendException("Failed to close server connection after message sending", ex); } } } if (!failedMessages.isEmpty()) { throw new MailSendException(failedMessages); } }
doSend方法中調用的核心類就是Transport類,這個類的包名是javax.mail。spring不愧是集成大師,java自帶的mail功能經過spring的標準化包裝就成了spring自身功能的一部分,再通過spring boot的包裝,用starter的方式再次做簡化,我們就能夠直接通過極簡的方式使用了。
當然,簡化的方法多種多樣,另外的一種形式的包裝就是使用helper類的方法,spring使用的就是MimeMessageHelper。在javax.mail在處理郵件的方式上,使用的是分而治之的辦法,不同的類處理不同的問題,所以看到很多的類在處理各種問題和情況。
這種做法在實現功能上是很好的,把一個復雜的問題分解成若干個小問題,分別實現。但對使用的開發人員就談不上友好了,容易出現以下幾個問題:
不直觀,調用者不知道從何下手
查找麻煩,類太多而且功能分散,不容易找到對應的功能類
關系復雜,經常對要引用哪個類會很沒有把握,因為太多處理單一問題的類
沒有統一的入口,上手難,很難脫離文檔直接使用
針對上述情況,spring通過MimeMessageHelper,把幾乎所有郵件發送需要處理的問題就集中到了這個類里面,使用方便又好找。下面是這個類所有的方法。
到此,關于“怎么使用spring boot發郵件”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。