JavaMail 退回郵件

消息可以被退回的幾個原因。這個問題是在rfc1211深度討論。只有服務器可確定特定的郵箱或用戶名的不存在。當服務器檢測到錯誤,它會返回一個消息,指出失敗的原郵件的發件人的原因。

有覆蓋發送狀態通知許多互聯網標準,但大量的服務器不使用特殊技術來返還這些失敗消息支持這些新的標準代替。因此,它變得非常難以關聯與導致問題的原始郵件的退回郵件。

JavaMail 包括用於解析傳遞狀態通知的支持。有許多技術和試探法來處理這個問題。其中一個是可變的信封返回路徑的技術。可以設置的返回路徑中的包封器,如下面的例子。這是在彈跳郵件被髮送到的地址。您可能需要將其設置爲一個通用的地址,而不同:頭,這樣你就可以處理遠程退回。這可以通過設置mail.smtp.from屬性在JavaMail中。

創建Java類

創建一個Java類文件SendEmail,是其內容如下:

import java.util.Properties; import javax.mail.Message; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; public class SendEmail { public static void main(String[] args) throws Exception { String smtpServer = "smtp.gmail.com"; int port = 587; final String userid = "youraddress";//change accordingly final String password = "*****";//change accordingly String contentType = "text/html"; String subject = "test: bounce an email to a different address " + "from the sender"; String from = "youraddress@gmail.com"; String to = "bouncer@fauxmail.com";//some invalid address String bounceAddr = "toaddress@gmail.com";//change accordingly String body = "Test: get message to bounce to a separate email address"; Properties props = new Properties(); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.starttls.enable", "true"); props.put("mail.smtp.host", smtpServer); props.put("mail.smtp.port", "587"); props.put("mail.transport.protocol", "smtp"); props.put("mail.smtp.from", bounceAddr); Session mailSession = Session.getInstance(props, new javax.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(userid, password); } }); MimeMessage message = new MimeMessage(mailSession); message.addFrom(InternetAddress.parse(from)); message.setRecipients(Message.RecipientType.TO, to); message.setSubject(subject); message.setContent(body, contentType); Transport transport = mailSession.getTransport(); try { System.out.println("Sending ...."); transport.connect(smtpServer, port, userid, password); transport.sendMessage(message, message.getRecipients(Message.RecipientType.TO)); System.out.println("Sending done ..."); } catch (Exception e) { System.err.println("Error Sending: "); e.printStackTrace(); } transport.close(); }// end function main() }

在這裏,我們可以看到,該屬性mail.smtp.from設距離來源地址不同。

編譯並運行

現在,我們的類是準備好了,讓我們編譯上面的類。我已經保存了類SendEmail.java到目錄 : /home/manisha/JavaMailAPIExercise. 我們需要 javax.mail.jar 和 activation.jar 在classpath中。執行下面的命令從命令提示符編譯類(兩個jar文件 被放置在/home/manisha/目錄下):

javac -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: SendEmail.java

現在,這個類被編譯,執行下面的命令來運行:

java -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: SendEmail

驗證輸出

應該看到下面的消息命令控制檯上:

Sending .... Sending done ...