Java遠程調用郵件服務器,實現郵件…

寫這篇文章的背景是公司Android客戶端需要實現一個功能,實現類似於密碼找回或者用戶註冊完發送一個郵件給用戶的功能,當然這些邏輯客戶端只負責請求自己的服務端,自己的服務端再去請求郵件服務器。

郵件服務器使用的Apache的James,Java寫的開源的,而且方便調用。遠程調用使用的是Java Mail的API。

首先我們需要把James這個郵件服務器跑起來,官網下載地址:http://james.apache.org/,下載先來之後直接解壓,直接運行bin\run.bat。出現如下圖所示說明運行OK了。


如果運行不成功,可能是你的JDK或者環境變量沒有配置好,這個我就不說了。

運行起來之後,會在apps\james\SAR-INF這個目錄下生成一個config.xml文件,這就是郵件服務器的配置文件。打開它,修改一些配置:

1.修改localhost,改成你自己的服務器域名,比如:[email protected]

2.修改這些,也是改成自己的

    zhangyuan123.com

3.修改dns server,這是爲了可以發外網郵件,查看DNS地址使用ipconfig/all,然後在配置文件中dnsserver節點下加入server地址,比如:

[html] view plaincopy
  1. <</span>dnsserver>  
  2.       <</span>servers>  
  3.            
  4.            
  5.            
  6.         <</span>server>114.114.114.114</</span>server>   
  7.         <</span>server>8.8.8.8</</span>server>  
  8.       </</span>servers>  
  9.         
  10.         
  11.       <</span>autodiscover>false</</span>autodiscover>  
  12.       <</span>authoritative>false</</span>authoritative>  
  13.   
  14.         
  15.       <</span>maxcachesize>50000</</span>maxcachesize>  
  16.    </</span>dnsserver>  
4.找到C:\Windows\System32\drivers\etc\host文件,其中加入127.0.0.1   zhangyuan123.com

重新啓動郵件服務器。

下面就添加一個用戶到郵件服務器,James是使用telnet進行命令行操作的。win7默認沒有打開telnet服務,可以搜一下如何打開。然後在命令行輸入telnet zhangyuan123.com 4555,輸入用戶名root,密碼root。添加一個用戶使用命令:adduser admin admin,其他命令我就不說了。

添加完了之後我們就開始使用客戶端模仿調用服務器發送一封郵件。

[java] view plaincopy
  1. package org.sunchao;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.Properties;  
  5.   
  6. import javax.mail.Authenticator;  
  7. import javax.mail.Folder;  
  8. import javax.mail.Message;  
  9. import javax.mail.MessagingException;  
  10. import javax.mail.PasswordAuthentication;  
  11. import javax.mail.Session;  
  12. import javax.mail.Store;  
  13. import javax.mail.internet.InternetAddress;  
  14. import javax.mail.internet.MimeMessage;  
  15. import javax.mail.internet.MimeUtility;  
  16.   
  17. public class Mail {  
  18.     // String host = "smtp.163.com"; // 163的smtp服務器  
  19.     // 本機smtp服務器  
  20.     private static final String HOST = "zhangyuan123.com";  
  21.     // 郵件發送人的郵件地址  
  22.     private static final String FROM = "admin@" + HOST;  
  23.     // 郵件接收人的郵件地址  
  24.     private static final String TO = "[email protected]";  
  25.     // 發件人的郵件帳戶  
  26.     private static final String USERNAME = "admin";  
  27.     // 發件人的郵件密碼  
  28.     private static final String PASSWORD = "admin";  
  29.   
  30.     public static void main(String[] args) {  
  31.         Mail.sendMail();  
  32.         // Mail.getMail();  
  33.     }  
  34.   
  35.       
  36.     public static void sendMail() {  
  37.         // 創建Properties 對象  
  38.         Properties props = System.getProperties();  
  39.         // 添加smtp服務器屬性  
  40.         props.put("mail.smtp.host", HOST);  
  41.         props.put("mail.smtp.auth""true");  
  42.   
  43.         // 創建郵件會話  
  44.         Session session = Session.getDefaultInstance(props,  
  45.                 new Authenticator() {  
  46.                     @Override  
  47.                     public PasswordAuthentication getPasswordAuthentication() {  
  48.                         return new PasswordAuthentication(USERNAME, PASSWORD);  
  49.                     }  
  50.                 });  
  51.         try {  
  52.             // 定義郵件信息  
  53.             MimeMessage message = new MimeMessage(session);  
  54.             message.setFrom(new InternetAddress(FROM));  
  55.             message.addRecipient(Message.RecipientType.TO, new InternetAddress(  
  56.                     TO));  
  57.             message.setSubject("I hava my own mail server");  
  58.             message  
  59.                     .setText("From now, you have your own mail server, congratulation!");  
  60.             // 發送消息  
  61.             session.getTransport("smtp").send(message);  
  62.             // Transport.send(message); //也可以這樣創建Transport對象發送  
  63.             System.out.println("SendMail Process Over!");  
  64.         } catch (MessagingException e) {  
  65.             e.printStackTrace();  
  66.         }  
  67.     }  
  68.   
  69.       
  70.     public static void getMail() {  
  71.         String host = "localhost";  
  72.         final String username = "admin";  
  73.         final String password = "admin";  
  74.         // 創建Properties 對象  
  75.         Properties props = new Properties();  
  76.   
  77.         // 創建郵件會話  
  78.         Session session = Session.getDefaultInstance(props,  
  79.                 new Authenticator() {  
  80.                     @Override  
  81.                     public PasswordAuthentication getPasswordAuthentication() {  
  82.                         return new PasswordAuthentication(username, password);  
  83.                     }  
  84.                 });  
  85.         try {  
  86.             // 獲取郵箱的pop3存儲  
  87.             Store store = session.getStore("pop3");  
  88.             store.connect(host, username, password);  
  89.             // 獲取inbox文件  
  90.             Folder folder = store.getFolder("INBOX");  
  91.             folder.open(Folder.READ_ONLY); // 打開,打開後才能讀取郵件信息  
  92.             // 獲取郵件消息  
  93.             Message message[] = folder.getMessages();  
  94.             for (int i = 0, n = message.length; i < n; i++) {  
  95.                 System.out.println(i + ": " + message[i].getFrom()[0] + "\t"  
  96.                         + message[i].getSubject());  
  97.                 try {  
  98.                     message[i].writeTo(System.out);  
  99.                 } catch (IOException e) {  
  100.                     e.printStackTrace();  
  101.                 }  
  102.             }  
  103.             // 關閉資源  
  104.             folder.close(false);  
  105.             store.close();  
  106.         } catch (MessagingException e) {  
  107.             e.printStackTrace();  
  108.         }  
  109.         System.out.println("GetMail Process Over!");  
  110.     }  
  111.   
  112.     // 郵件主題中文字符轉換  
  113.     public static String transferChinese(String strText) {  
  114.         try {  
  115.             strText = MimeUtility.encodeText(new String(strText.getBytes(),  
  116.                     "GB2312"), "GB2312""B");  
  117.         } catch (Exception ex) {  
  118.             ex.printStackTrace();  
  119.         }  
  120.         return strText;  
  121.     }  
  122. }  
把上面代碼中qq郵箱地址換成自己的就行。最後run一把就OK了。但是QQ郵箱自身有過濾機制,它會認爲來自zhangyuan123.com的郵件是垃圾郵件,你需要設置一下白名單:

添加域名白名單:


再發每一次,QQ郵箱就可以收到了。

對於騰訊的過濾,如果不讓他過濾,我估計得交錢給騰訊了,其他的163的,新浪的大家也可以試一下。


轉至:http://blog.csdn.net/sunchaoenter/article/details/9280815

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章