2016-05-17 119 views
1

這是我的第一個問題,所以我想保持簡單。 我從Spring Framework 4.1.8.RELEASE中遇到JavaMailSender的問題。看起來,對於特定的SMTP,它不會將收件人添加到郵件中。我想提一下,我們在其他項目中使用相同的解決方案,並始終有效。從現在起,收件人沒有問題。Spring JavaMailSender:收件人設置爲「默認」

下面是代碼示例中,我們如何建立收件人(setupRecipients法):

String emailTo = entity.getEmailTo(); 
Preconditions.checkNotNull(!Strings.isNullOrEmpty(emailTo)); 
emailTo = emailTo.replace(",", " "); 
emailTo = emailTo.replace(";", " "); 
InternetAddress[] emails = InternetAddress.parse(emailTo); 

for (InternetAddress address : emails) 
    address.validate(); 

for (InternetAddress address : emails) 
    messageHelper.setTo(address.getAddress()); 

if (!Strings.isNullOrEmpty(bcc)) 
    messageHelper.addBcc(bcc); 

下面是例子,我們如何發送電子郵件(其中mailSender是類型JavaMailSender的):

MimeMessage message = this.mailSender.createMimeMessage(); 

    try { 
     MimeMessageHelper e = new MimeMessageHelper(message, true, "utf-8"); 
     e.setFrom(this.from); 
     message.setSubject(this.createSubject(entity)); 
     this.setupRecipients(entity, e); 
     this.setupBody(entity, e); 
     this.setupAttachments(entity, e); 
     this.setupInlines(entity, e); 
     this.mailSender.send(message); 
    } catch (IOException | MessagingException var4) { 
     Throwables.propagate(var4); 
    } 

當我嘗試發送電子郵件與特殊的SMTP,我得到這個迴應:

org.springframework.mail.MailSendException: Failed messages: javax.mail.SendFailedException: Invalid Addresses; 
    nested exception is: 
com.sun.mail.smtp.SMTPAddressFailedException: 504 5.5.2 <default>: Recipient address rejected: need fully-qualified address 
; message exception details (1) are: 
    Failed message 1: 
    javax.mail.SendFailedException: Invalid Addresses; 
    nested exception is: 
    com.sun.mail.smtp.SMTPAddressFailedException: 504 5.5.2 <default>: Recipient address rejected: need fully-qualified address 

    at com.sun.mail.smtp.SMTPTransport.rcptTo(SMTPTransport.java:1196) 
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:584) 
    at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:433) 
    at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:345) 
    at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:340) 
    at packagename.EmailExporter.export(EmailExporter.java:57) 
    at packagename.ExportJobImpl$ExportCallback.onResult_aroundBody0(ExportJobImpl.java:86) 
    at packagename.ExportJobImpl$ExportCallback$AjcClosure1.run(ExportJobImpl.java:1) 
    at org.springframework.transaction.aspectj.AbstractTransactionAspect.ajc$around$org_springframework_transaction_aspectj_AbstractTransactionAspect$1$2a73e96cproceed(AbstractTransactionAspect.aj:66) 
    at org.springframework.transaction.aspectj.AbstractTransactionAspect$AbstractTransactionAspect$1.proceedWithInvocation(AbstractTransactionAspect.aj:72) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281) 
    at org.springframework.transaction.aspectj.AbstractTransactionAspect.ajc$around$org_springframework_transaction_aspectj_AbstractTransactionAspect$1$2a73e96c(AbstractTransactionAspect.aj:70) 
    at packagename.ExportJobImpl$ExportCallback.onResult(ExportJobImpl.java:81) 
    at packagename.ExportableEntityEnumeratorImpl.lambda$iterate$9(ExportableEntityEnumeratorImpl.java:30) 
    at packagename.ExportableEntityEnumeratorImpl$$Lambda$31/1744828123.processRow(Unknown Source) 
    at org.springframework.jdbc.core.JdbcTemplate$RowCallbackHandlerResultSetExtractor.extractData(JdbcTemplate.java:1607) 
    at org.springframework.jdbc.core.JdbcTemplate$1.doInPreparedStatement(JdbcTemplate.java:708) 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:644) 
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:695) 
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:727) 
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:752) 
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:767) 
    at packagename.ExportableEntityEnumeratorImpl.iterate_aroundBody0(ExportableEntityEnumeratorImpl.java:28) 
    at packagename.ExportableEntityEnumeratorImpl$AjcClosure1.run(ExportableEntityEnumeratorImpl.java:1) 
    at org.springframework.transaction.aspectj.AbstractTransactionAspect.ajc$around$org_springframework_transaction_aspectj_AbstractTransactionAspect$1$2a73e96cproceed(AbstractTransactionAspect.aj:66) 
    at org.springframework.transaction.aspectj.AbstractTransactionAspect$AbstractTransactionAspect$1.proceedWithInvocation(AbstractTransactionAspect.aj:72) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281) 
    at org.springframework.transaction.aspectj.AbstractTransactionAspect.ajc$around$org_springframework_transaction_aspectj_AbstractTransactionAspect$1$2a73e96c(AbstractTransactionAspect.aj:70) 
    at packagename.ExportableEntityEnumeratorImpl.iterate(ExportableEntityEnumeratorImpl.java:27) 
    at packagename.ExportJobImpl.run(ExportJobImpl.java:50) 
    at packagename.MultiExportJobImpl.run(MultiExportJobImpl.java:42) 
    at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 
    at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: com.sun.mail.smtp.SMTPAddressFailedException: 504 5.5.2 <default>: Recipient address rejected: need fully-qualified address 

    at com.sun.mail.smtp.SMTPTransport.rcptTo(SMTPTransport.java:1094) 
    ... 38 more 

這裏是th e我們嘗試的列表:

  1. 首先,我們已經諮詢了SMTP提供商;然而,他們的答案是收件人被設置爲「默認」,沒有別的。我們還要求提供日誌,但從那以後他們沒有提供它們(它不是我們的SMTP,但它們甚至沒有提供給所有者)。其次,當我試圖用Spring配置JavaMail並使用我的開發機器而不是服務器在本地發送電子郵件時,我們的應用程序通常運行,它按預期工作。另外SMTP在使用ex時配置發送電子郵件沒有問題。雷鳥。
  2. 當我們在服務器上使用我們的SMTP切換SMTP時,它可以正常工作。

結論是,問題必須在服務器配置中,服務器和SMTP或SMTP之間。然而我不知道什麼可能會導致它。

+0

而不是'messageHelper.setTo(address.getAddress());'try'messageHelper.setTo(address);'保存Spring再次進行翻譯。也不是'setTo'不應該使用'addTo'?以防萬一有多個地址?另外一個重複的循環似乎效率低下。你可以使用一個。 –

+0

我試過messageHelper.setTo(address);和addTo但結果是一樣的。它總是將默認設置爲收件人。 – WakeCaine

+0

然後在那裏必須有一個地址觸發該行爲。 –

回答

0

我找到了是什麼導致了問題發送電子郵件。但我不知道爲什麼會發生。

消息無法發送,並得到「默認」爲收件人當我們添加BCC或CC地址MessageHelper。我嘗試了不同的方法來做到這一點addBcc,setBcc,addCc,setCc但他們都產生相同的結果。這很奇怪,我也找不到解釋。

UPDATE:

我們發現實際的罪魁禍首。在密件抄送中使用的地址得到的值爲默認爲,當然這並沒有被記錄和驗證(這樣的錯誤)。但最有趣的是,即使在設置爲其他正確的地址之後,bcc得到的值默認爲,因爲註釋@ Autowired。有趣的是,即使我們沒有聲明可以連線的任何值,Spring也沒有拋出異常。