鷹翔宇空

          學習和生活

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            110 Posts :: 141 Stories :: 315 Comments :: 1 Trackbacks

          今天在研究javamail發信的過程中,出現了一些小問題,現總結如下,以免后來者走些不必要的彎路,先把完整的能夠正常運行的代碼示例粘貼如下:
          發郵件源代碼:
          package com.hyq.test;

          import java.util.Properties;
          import javax.mail.*;
          import javax.mail.internet.*;

          public class MailExample {

          ? public static void main (String args[]) throws Exception {
          ???
          ??? String host = "smtp.163.com";?? //發件人使用發郵件的電子信箱服務器
          ??? String from = "你自己的電子信箱";??? //發郵件的出發地(發件人的信箱)
          ??? String to = "收件人信箱";?? //發郵件的目的地(收件人信箱)

          ??? // Get system properties
          ??? Properties props = System.getProperties();

          ??? // Setup mail server
          ??? props.put("mail.smtp.host", host);

          ??? // Get session
          ??? props.put("mail.smtp.auth", "true"); //這樣才能通過驗證

          ??? MyAuthenticator myauth = new MyAuthenticator("你自己的電子信箱", "你自己的信箱密碼");
          ??? Session session = Session.getDefaultInstance(props, myauth);

          //??? session.setDebug(true);

          ??? // Define message
          ??? MimeMessage message = new MimeMessage(session);
          ???

          ??? // Set the from address
          ??? message.setFrom(new InternetAddress(from));

          ??? // Set the to address
          ??? message.addRecipient(Message.RecipientType.TO,
          ????? new InternetAddress(to));

          ??? // Set the subject
          ??? message.setSubject("測試程序!");

          ??? // Set the content
          ??? message.setText("這是用java寫的發送電子郵件的測試程序!");

          ??? message.saveChanges();

          ????? Transport.send(message);
          ????
          ? }
          }

          校驗發信人權限的方法
          package com.hyq.test;

          import javax.mail.PasswordAuthentication;

          class MyAuthenticator
          ????? extends javax.mail.Authenticator {
          ??? private String strUser;
          ??? private String strPwd;
          ??? public MyAuthenticator(String user, String password) {
          ????? this.strUser = user;
          ????? this.strPwd = password;
          ??? }

          ??? protected PasswordAuthentication getPasswordAuthentication() {
          ????? return new PasswordAuthentication(strUser, strPwd);
          ??? }
          ? }


          注意:上面的事例僅為使用163信箱時發送電子郵件的方法,因為使用的host為:smtp.163.com,如源代碼中:String host = "smtp.163.com";?? //發件人使用發郵件的電子信箱服務器,如果使用其它的電子郵件發送,就必須在其郵件服務器上查找相應的電子郵件服務器,例如搜狐就要使用smtp.sohu.com,具體情況具體對待,都可以從所使用的郵件服務器上獲得的。如果沒有使用host ,也就是說,沒有進行props.put("mail.smtp.host", host);設置,那么就會拋javax.mail.MessagingException: Could not connect to SMTP host: localhost, port: 25;的異常。當然了,如果你沒有正確配置,這個異常仍然會被拋出的。

          有些郵件服務系統是不需要驗證發件人的授權的,所以可以很簡單的使用
          ??? Session session = Session.getDefaultInstance(props, null);
          ???????????? 而不必使用
          ??? props.put("mail.smtp.auth", "true");?
          ??? MyAuthenticator myauth = new MyAuthenticator("你自己的電子信箱", "你自己的信箱密碼");
          ??? Session session = Session.getDefaultInstance(props, myauth);

          就可以發送電子郵件了,這個多為一些企事業單位的內部電子信箱系統。
          但是對于很多門戶網站上的電郵系統,如:163,sohu,yahoo等等,如果仍然簡單的這樣使用就會拋

          com.sun.mail.smtp.SMTPSendFailedException: 553 authentication is required,smtp8,wKjADxuAyCAfmnZE8BwtIA==.32705S2


          ?at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:1388)

          ?at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:959)

          ?at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:583)

          ?at javax.mail.Transport.send0(Transport.java:169)

          ?at javax.mail.Transport.send(Transport.java:98)

          這樣的異常,要求你必須進行授權校驗,它的目的就是阻止他人任意亂發郵件,也算是為了減少垃圾郵件的出現吧。這時候,我們就要使用
          ??? props.put("mail.smtp.auth", "true");?
          ??? MyAuthenticator myauth = new MyAuthenticator("你自己的電子信箱", "你自己的信箱密碼");
          ??? Session session = Session.getDefaultInstance(props, myauth);

          這里還有一個特別注意的事情:在你使用Session.getDefaultInstance時,一定要將??? props.put("mail.smtp.auth", "true");?置為true,它默認的是false,如果你沒有做這一步,雖然你使用了Session.getDefaultInstance(props, myauth);,你自己也確實??? MyAuthenticator myauth = new MyAuthenticator("你自己的電子信箱", "你自己的信箱密碼");但是它仍然會拋出
          com.sun.mail.smtp.SMTPSendFailedException: 553 authentication is required,smtp8,wKjADxJA2SBrm3ZEFv0gIA==.40815S2


          ?at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:1388)

          ?at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:959)

          ?at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:583)

          ?at javax.mail.Transport.send0(Transport.java:169)

          ?at javax.mail.Transport.send(Transport.java:98)
          這樣的異常。我就在這一步費了好長時間,后來才發現了這個問題,很是郁悶。不過還好,總算解決了。

          其實上面的做法只是比較簡單的一種,也有很多其它的寫法,如:
          Properties props = System.getProperties();可以使用
          Properties props = new Properties();來代替。

          Transport.send(message);可以使用下面的代碼來代替
          ????? String username = "你的電子信箱用戶名";
          ????? String password = "你的電子信箱密碼";
          ????? message.saveChanges(); //??? implicit with send()
          ????? Transport transport = session.getTransport("smtp");
          ????? transport.connect("mail.htf.com.cn", username, password);
          ????? transport.sendMessage(message, message.getAllRecipients());
          ????? transport.close();
          這種方法在同時發送多封電子郵件時比較有用。

          還有一些具體的相關概念,可以查看相關的官方文檔,在我查詢資料時,發現了一篇文章寫得相當仔細,可以加以參考:http://www.matrix.org.cn/resource/article/44/44101_JavaMail.html

          另附上使用org.apache.commons.mail進行發電子郵件的示例:
          import org.apache.commons.mail.SimpleEmail;
          import org.apache.commons.mail.*;

          public class TestCommon {
          ? public TestCommon() {
          ? }
          ? public static void main(String[] args){
          ??? SimpleEmail email = new SimpleEmail();
          ??? email.setHostName("smtp.163.com");//設置使用發電子郵件的郵件服務器
          ??? try {
          ????? email.addTo("收件人信箱");
          ????? email.setAuthentication("發件人信箱","發件人信箱密碼");
          ????? email.setFrom("發件人信箱");
          ????? email.setSubject("Test?apache.commons.mail message");
          ????? email.setMsg("This is a simple test of commons-email");
          ????? email.send();
          ??? }
          ??? catch (EmailException ex) {
          ????? ex.printStackTrace();
          ??? }
          ? }
          }





          posted on 2006-05-26 14:18 TrampEagle 閱讀(75393) 評論(36)  編輯  收藏 所屬分類: 學習體會

          Feedback

          # re: 使用javamail發信過程中的一些問題及解決方法 2006-06-16 20:19 frankie
          哈哈,我剛才在看JavaMail,調試這個例子出線了上面的錯誤,看了你的文章就解決了,謝謝啊!去看世界杯了  回復  更多評論
            

          # re: 使用javamail發信過程中的一些問題及解決方法 2006-08-16 17:42 lxy
          非常感謝上面的仁兄,謝謝拉!終于可以解決發郵件的問題拉!!!謝謝~~~~~  回復  更多評論
            

          # re: 使用javamail發信過程中的一些問題及解決方法 2006-09-10 10:32 gorebill
          真是太好了  回復  更多評論
            

          # re: 使用javamail發信過程中的一些問題及解決方法 2006-12-30 17:42 ahu
          謝謝你了 我的問題也解決了   回復  更多評論
            

          # re: 使用javamail發信過程中的一些問題及解決方法[未登錄] 2007-04-09 17:19 jerry
          出現com.sun.mail.smtp.SMTPSendFailedException: 550
          是什么原因造成的啊??  回復  更多評論
            

          # re: 使用javamail發信過程中的一些問題及解決方法 2007-04-16 19:25 BruceJini@126.com
          我靠,真是太好了,我的問題完全和你的一樣,太謝謝了  回復  更多評論
            

          # re: 使用javamail發信過程中的一些問題及解決方法 2007-05-11 09:36 你好
          謝謝,正好需要這方面的資料,太感謝你了。  回復  更多評論
            

          # re: 使用javamail發信過程中的一些問題及解決方法 2007-06-29 13:31 tzming
          這個示例講的太明白了.非常好!
          我有兩個163.com郵箱,用其中一個就發郵件成功.用另外一個發郵件就會報錯,我用我的QQ信箱也報錯.代碼相同.
          報錯:QQ信箱
          535 Error: authentication failed
          javax.mail.AuthenticationFailedException
          或者是163信箱.
          550 Error: 用戶被鎖定
          javax.mail.AuthenticationFailedException
          不知道為什么????
            回復  更多評論
            

          # re: 使用javamail發信過程中的一些問題及解決方法 2007-08-02 10:38
          謝謝你啊!正在搞這個,太謝謝了!  回復  更多評論
            

          # re: 使用javamail發信過程中的一些問題及解決方法 2007-09-10 11:31 eydp
          String smtp = "smtp.163.com"; // 設置發送郵件所用到的smtp
          .....
          props.put("mail.smtp.auth", "true"); // 是否到服務器用戶名和密碼驗證
          props.put("mail.smtp.host", smtp); // 設置SMTP主機
          props.put("mail.smtp.user", servername);
          props.put("mail.smtp.password",serverpaswd);
          // 到服務器驗證發送的用戶名和密碼是否正確
          Email_Autherticatorbean myEmailAuther = new Email_Autherticatorbean(servername, serverpaswd);
          // 設置郵件會話
          mailSession = javax.mail.Session.getDefaultInstance(props,(Authenticator) myEmailAuther);

          "smtp.163.com"; 報錯:
          DEBUG SMTP: Found extension "PIPELINING", arg ""
          DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN"
          DEBUG SMTP: Found extension "AUTH=LOGIN", arg "PLAIN"
          DEBUG SMTP: Found extension "8BITMIME", arg ""
          DEBUG SMTP: Attempt to authenticate
          AUTH LOGIN
          334 dXNlcm5hbWU6
          eW91ZGVwZW5n
          334 UGFzc3dvcmQ6
          NHlvdWRlcGVuZzQ=
          550 用戶被鎖定
          javax.mail.SendFailedException: Sending failed;
          nested exception is:
          class javax.mail.AuthenticationFailedException
          at javax.mail.Transport.send0(Transport.java:218)
          at javax.mail.Transport.send(Transport.java:80)
          at mail.a1.SendMailTest.sendmail(SendMailTest.java:104)
          at mail.a1.SendMailTest.main(SendMailTest.java:30)

          如果換成smtp.sina.com就可以發了!  回復  更多評論
            

          # re: 使用javamail發信過程中的一些問題及解決方法[未登錄] 2007-09-10 12:16 lcgxc
          我用163不行,換成了smtp.tom.com就好了,不知為什么。  回復  更多評論
            

          # re: 使用javamail發信過程中的一些問題及解決方法 2007-11-09 23:49 ad100@21cn.com
          報認證失敗時,這樣寫就能通過:
          props.put("mail.smtp.auth", "true");
          Session session = Session.getDefaultInstance(props, new Authenticator(){
          protected PasswordAuthentication getPasswordAuthentication() {
          return new PasswordAuthentication(username, password);
          }});

          ----
          注意:
          username, password在上面要有定義  回復  更多評論
            

          # re: 使用javamail發信過程中的一些問題及解決方法 2007-12-18 12:55 痞子z
          我在用javamail發送郵件時總是報未授權錯誤,但是在發送之前已經設置好了mail.smtp.auth=true,另外還引用了SmtpAuthenticator sa = new SmtpAuthenticator();/*SmtpAuthenticator是繼承了javax.mail.Authenticator類的*/
          Session mailSession = Session.getInstance(props, sa);但是每次運行結果總是如下:
          設置系統屬性:mail.smtp.host = smtp.163.com
          準備獲取郵件會話對象!
          準備創建MIME郵件對象!
          設置smtp身份認證:mail.smtp.auth = true
          開始是否是需要驗證的::---->null
          設置需要驗證true
          設置郵件主題!
          設置發信人!
          增加郵件附件:e:\tt.txt
          正在發送郵件....
          郵件發送失敗!javax.mail.AuthenticationFailedException
          javax.mail.AuthenticationFailedException
          at javax.mail.Service.connect(Service.java:264)
          at javax.mail.Service.connect(Service.java:134)
          at cn.com.testmail.vv.sendMail.sendout(sendMail.java:233)
          at cn.com.testmail.vv.sendMail.main(sendMail.java:273)

          請問是為什么?謝謝  回復  更多評論
            

          # re: 使用javamail發信過程中的一些問題及解決方法[未登錄] 2008-08-12 01:22 過客
          太謝謝了。終于發出去了  回復  更多評論
            

          # re: 使用javamail發信過程中的一些問題及解決方法 2008-08-18 23:05 劉毅
          解決了sina
          126和qq 都是這樣的問題
          550 用戶被鎖定
          Exception in thread "main" javax.mail.SendFailedException: Sending failed;
          nested exception is:
          class javax.mail.AuthenticationFailedException
          at javax.mail.Transport.send0(Transport.java:218)
          at javax.mail.Transport.send(Transport.java:80)
          at javamail.MailExample.main(MailExample.java:34)  回復  更多評論
            

          # re: 使用javamail發信過程中的一些問題及解決方法 2008-10-24 09:54 龍KEN
          我用的也是163的郵箱,可是不行,報告驗證錯誤!!!
          看到上面那么多人說可以了,我感覺不是代碼的問題,是郵箱服務器的問題,可能人家改了吧,導致外部程序很難調用!

          我用其他的郵箱試試啊。
          要是再不行的話,我就很郁悶啦。。。。。。


          Exception in thread "main" javax.mail.SendFailedException: Sending failed;
          nested exception is:
          class javax.mail.AuthenticationFailedException
          at javax.mail.Transport.send0(Transport.java:218)
          at javax.mail.Transport.send(Transport.java:80)
          at com.hyq.test.MailExample.main(MailExample.java:48)
            回復  更多評論
            

          # re: 使用javamail發信過程中的一些問題及解決方法 2008-10-28 13:16 TH000
          我跟樓上的情況一樣,真是郁悶,換了sina的也是不行  回復  更多評論
            

          # re: 使用javamail發信過程中的一些問題及解決方法 2009-01-04 14:08 戰神
          我的也是和樓上幾位一樣啊 郁悶死了
          搞不懂 為什么  回復  更多評論
            

          # re: 使用javamail發信過程中的一些問題及解決方法[未登錄] 2009-03-18 09:45 java菜鳥
          Exception in thread "main" javax.mail.SendFailedException: Sending failed;
          nested exception is:
          class javax.mail.AuthenticationFailedException
          at javax.mail.Transport.send0(Transport.java:218)
          at javax.mail.Transport.send(Transport.java:80)
          at cjn.mail.MailExample.main(MailExample.java:48)
          我的問題差不多。還有很怪的現象,用早期的126郵箱可以發郵件,現在申請的就會報上面的錯誤,請各位大蝦幫幫忙  回復  更多評論
            

          # re: 使用javamail發信過程中的一些問題及解決方法[未登錄] 2009-04-03 15:52 sun
          謝謝你的詳細講解,終于弄好了  回復  更多評論
            

          # re: 使用javamail發信過程中的一些問題及解決方法 2009-04-19 23:01 wenhao
          從樓主上的程序看,好像 protected PasswordAuthentication getPasswordAuthentication() {
          return new PasswordAuthentication(strUser, strPwd);
          }
          這個方法沒有被調用到,我用了你的程序之后,還是一樣出現。
          javax.mail.AuthenticationFailedException這個錯誤,我試了126、163的郵箱,都是不行,請賜教。。  回復  更多評論
            

          # re: 使用javamail發信過程中的一些問題及解決方法 2009-06-09 16:22 小薛
          Exception in thread "main" javax.mail.SendFailedException: Sending failed;
          nested exception is:
          class javax.mail.AuthenticationFailedException
          at javax.mail.Transport.send0(Transport.java:218)
          at javax.mail.Transport.send(Transport.java:80)
          at com.hyq.test.MailExample.main(MailExample.java:52)  回復  更多評論
            

          # re: 使用javamail發信過程中的一些問題及解決方法 2009-07-16 13:22 聚資庫
          學習......  回復  更多評論
            

          # re: 使用javamail發信過程中的一些問題及解決方法 2009-10-05 18:15 小 k
          頂一個,剛剛也遇到這個問題,看了樓主的帖子,很明了。  回復  更多評論
            

          # re: 使用javamail發信過程中的一些問題及解決方法 2009-11-07 00:02 天空戀
          @痞子z
          大俠,你的這個問題雜解決的 啊,我都郁悶死了啊,搜了很多解答都不行啊,能否給我指點一二啊,謝謝了啊  回復  更多評論
            

          # re: 使用javamail發信過程中的一些問題及解決方法 2011-11-03 13:56 快樂水手
          太好了.我的問題終于解決了. 多謝啊.  回復  更多評論
            

          # re: 使用javamail發信過程中的一些問題及解決方法 2011-11-21 19:39 啦啦
          感謝!qq郵箱也可以  回復  更多評論
            

          # re: 使用javamail發信過程中的一些問題及解決方法[未登錄] 2012-01-19 17:28 zhang
          非常感謝樓主!這幾天也研究了下這個問題,出現javax.mail.AuthenticationFailedException這個異常,還有種可能是傳入的用戶名和密碼未解密,程序在執行PasswordAuthentication(strUser, strPwd)這里就拋上面的異常。  回復  更多評論
            

          # re: 使用javamail發信過程中的一些問題及解決方法[未登錄] 2012-01-19 17:40 zhang
          對于在某些服務器上可以正常發郵件,某些服務其上不可發郵件,提示javax.mail.AuthenticationFailedException,還有種可能是可以正常發郵件的兩臺服務器在同一域內或者收件服務器被信任,不可發郵件的兩臺服務器沒在同一域內,參考http://www.magicwinmail.com/faq_setup.php#setup2。  回復  更多評論
            

          # re: 使用javamail發信過程中的一些問題及解決方法 2012-05-25 14:43 魏宏
          非常感謝,看了你提供的寶貴信息,我的問題也解決了,非常感謝  回復  更多評論
            

          # re: 使用javamail發信過程中的一些問題及解決方法 2013-03-22 20:23 liaozhida
          正好用的上 謝謝 測試成功了  回復  更多評論
            

          # re: 使用javamail發信過程中的一些問題及解決方法 2013-03-26 16:46 鞠愛華
          謝謝樓主!!!  回復  更多評論
            

          # re: 使用javamail發信過程中的一些問題及解決方法[未登錄] 2014-04-10 17:38 andy
          Exception in thread "main" javax.mail.SendFailedException: Invalid Addresses;
          nested exception is:
          com.sun.mail.smtp.SMTPAddressFailedException: 553 sorry, that domain isn't in my list of allowed rcpthosts (#5.7.1)

          ----------------------------
          我用的是企業內部郵箱,往別的服務器郵箱發一直報這個錯誤,往自己郵箱發卻沒有問題,上面是異常情況  回復  更多評論
            

          # re: 使用javamail發信過程中的一些問題及解決方法 2015-08-12 15:46 林仔youyou
          package com;

          import java.util.Properties;

          import javax.mail.BodyPart;
          import javax.mail.Message;
          import javax.mail.Multipart;
          import javax.mail.Session;
          import javax.mail.Transport;
          import javax.mail.internet.InternetAddress;
          import javax.mail.internet.MimeBodyPart;
          import javax.mail.internet.MimeMessage;
          import javax.mail.internet.MimeMultipart;

          import com.abcchina.PopupAuthenticator;


          public class Send {
          public static void main(String[] args) throws Exception{
          System.out.println("");
          //
          // String host = "smtp.163.com"; // 163免費企業郵箱的smtp服務器
          // String from = "18612372242@163.com"; // 我的企業郵箱地址
          // String to = "wangyonglin1@sina.com"; // 郵件要發送到的郵箱地址
          // String username = "18612372242";
          //
          // String password = "*******"; //



          // String host = "smtp.ym.163.com"; // 163免費企業郵箱的smtp服務器
          // String from = "18612372242@longxrnd.com"; // 我的企業郵箱地址
          // String to = "wangyonglin1@sina.com"; // 郵件要發送到的郵箱地址
          // String username = "18612372242";

          //String password = "********"; //

          //
          String host = "smtp.exmail.qq.com"; // 163免費企業郵箱的smtp服務器
          String from = "18612372242@longxrnd.com"; // 我的企業郵箱地址
          String to = "wangyonglin1@sina.com"; // 郵件要發送到的郵箱地址
          String username = "18612372242";

          String password = "*****"; //

          Properties props = new Properties();


          props.put("mail.smtp.host", host);
          props.put("mail.smtp.auth", "true");

          PopupAuthenticator smtpAuth = new PopupAuthenticator("18612372242@longxrnd.com", password);
          Session session = Session.getDefaultInstance(props, smtpAuth);


          session.setDebug(true);

          String msg = "hello";
          MimeMessage message = new MimeMessage(session);
          message.setFrom(new InternetAddress(from));
          message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
          BodyPart mdp = new MimeBodyPart();
          mdp.setContent(msg, "text/html;charset=gb2312");
          Multipart mm = new MimeMultipart();
          mm.addBodyPart(mdp);
          message.setContent(mm);

          message.setSubject("這是一個好消息");
          message.saveChanges();
          Transport transport = session.getTransport("smtp");
          transport.connect(host, username, password);
          transport.sendMessage(message, message.getAllRecipients());
          transport.close();


          }
          }
            回復  更多評論
            

          # re: 使用javamail發信過程中的一些問題及解決方法 2015-08-12 15:47 林仔youyou
          剛做了一個 發送企業郵箱的,有什么不明白的可以咨詢我:qq 775048682,歡迎大家交流  回復  更多評論
            

          # re: 使用javamail發信過程中的一些問題及解決方法 2015-09-05 00:06 手動閥
          @痞子z
          大哥求解,  回復  更多評論
            

          主站蜘蛛池模板: 平南县| 蓝田县| 建宁县| 绥江县| 桦甸市| 佛坪县| 伊金霍洛旗| 万源市| 阿合奇县| 庄浪县| 顺平县| 台前县| 南汇区| 库尔勒市| 陵川县| 新丰县| 吴川市| 花莲市| 宣汉县| 敖汉旗| 尉氏县| 吉木乃县| 晋江市| 凤冈县| 保定市| 沾化县| 梁平县| 叶城县| 吉林市| 建昌县| 宜章县| 遵义县| 堆龙德庆县| 香河县| 五寨县| 巴楚县| 石阡县| 肇源县| 洮南市| 达孜县| 莱芜市|