本文不贅述James服務器的參數細節,這個以后有機會再詳細討論,這里先從服務器搭建開始,用搭建的服務器收、發電子郵件來熟悉一下Apache James。本人也是新手,希望能得到各位高手的指點,使大家能悟到進階的方向。
開始之前,先聲明一下本文操作的系統環境:
1. JDK 6u10b
2. JMail API v1.4.2
3. JAF API v1.1(JavaBean Activation Framework)
4. Apache James 2.3.1
5. Eclipse 3.4 for J2EE Developers
6. Windows 2000 Server sp4
1。請下載安裝JDK,并設置好其環境變量:JAVA_HOME=…… 、PATH=…… 、CLASSPATH=…… Eclipse 3.4 是目前的最新版本,可以從http://www.eclipse.org/下載。
2。請下載JMail API、JAF API,可以在www.java.sun.com找到他們,找不到也不要緊,本文附件示例代碼免費提供一份(^_^)。
3。Apache James 的官方網站為:http://james.apache.org/,當前 Server 的最新版為 2.3.1版. 安裝非常簡單,下載后得到james-binary-2.3.1.zip 文件,解壓后即可。這里假設解壓到D盤(D:/james-2.3.1),目錄結構如下:
D:/james-2.3.1
|--- apps
|--- bin
|
…………
4。啟動 James 服務器
雙擊或在命令行下執行D:/james-2.3.1/bin 目錄下的 run.bat文件,即可啟動 James 服務器。
啟動后能在控制臺看到如下信息,說明啟動成功:
要關閉 James 服務,請使用 Ctrl + C
說明:啟動前請確保您的JDK環境變量如JAVA_HOME等已經設置好;James 啟動時,其SMTP 服務默認在 25 端口啟動,POP3 服務默認在 110 端口啟動, NNTP 服務默認在 119 端口啟動, 請確保這些端口未被占用。比如本系統下就已經安裝了Microsoft的 SMTP 服務,造成 James無法啟動,解決方法為:開始--->設置--->控制面板--->管理工具--->服務,打開后找到“Simple Mail Transport Protocol(SMTP)”服務項,關閉即可。
5。配置服務
服務器啟動后會在本機配置一個默認的服務,這可以用來在本機上本服務器范圍內收發郵件,但是郵件發不到163等外網郵箱。我們這里關注的重點就是配置一個能發到外網如163這樣的郵箱的郵件,這樣才有價值。不過由于本人是在本機上測試,一時不能獲取公司的域名參數,無法測試接收外網郵箱(如163)的郵件,見晾,不過做法都是一樣的,至少我們可以向外網郵箱發送郵件,局域網內可以收、發郵件。
打開D:/james-2.3.1/apps/james/SAR-INF 下的 config.xml 文件,初次啟動James之前,不會有這個文件,只有當James服務啟動一次之后才自動構件該文件。
找到
把localhost該成你自己想要的郵箱域名, 把自動探測IP屬性設置為“false”這里假設改成 zhaipuhong.com 如果開了一個帳號 zph ,那么他的郵件地址就是 [email protected] (^_^)修改結果如下:
找到
將其注釋,結果如下:
找到下面元素,去掉其注釋
這樣郵箱訪問需要帳號驗證,你不希望別人用你的帳號收發消息吧……^_^
如此,James服務配置已經完成。
6。創建郵件帳號
創建郵件帳號后,就可以用來收發郵件了。James的賬號管理是通過基于Telnet客戶機的遠程管理器,這點頗為不爽,尤其是我的操作系統下的命令行控制臺是不顯示telnet命令輸入字符的,經常出錯。
現在進入命令行控制臺,在telnet localhsot 4555 進入James管理器,操作如下:
將進入
默認的登陸id 為root 密碼也為 root ,登陸成功后結果如下:
創建新用戶的命令是:adduser username password
這里創建了兩個賬戶來作為演示使用: zhaipuhong/zhangpuhong ; zph/zph
說明:你可以輸入help來獲取命令幫助
賬號創建成功后,使用quit退出管理器?,F在我們可以開始部署我們的JMail應用了。
7。用James收發郵件
現在我們來寫兩個簡單的程序來體驗一下如何使用James收發郵件。請注意,示例程序是通用的。關于如何用JMail API收發郵件,這里不詳細介紹,如果還沒有接觸過請參考一下我之前的文章:
http://zhaipuhong.javaeye.com/admin/blogs/213005
關于接受郵件部分,我們在代碼中通過注釋來描述。另外我們來回憶一下上述步驟配置James服務器的參數:
1。smtp 服務器:192.168.1.98或者localhost 192.168.1.98是我的局域網IP,由于我James服務就裝在我的機器上,所以我可以用localhost
2。兩個郵件帳號:zhaipuhong/zhaipuhong 對應郵箱地址: [email protected]
zph/zph 對應郵箱地址: [email protected]
注意:郵箱域名我們配置的是zhaipuhong.com
示例程序:
- package com.zhaipuhong.j2ee.jmail;
-
- import java.io.IOException;
- import java.util.Properties;
-
- import javax.mail.Authenticator;
- import javax.mail.Folder;
- import javax.mail.Message;
- import javax.mail.MessagingException;
- import javax.mail.PasswordAuthentication;
- import javax.mail.Session;
- import javax.mail.Store;
- import javax.mail.Transport;
- import javax.mail.internet.InternetAddress;
- import javax.mail.internet.MimeMessage;
- import javax.mail.internet.MimeUtility;
-
- public class HelloJMail {
-
- //發送郵件
- public static void sendMail() {
- //String host = "192.168.1.98"; // 指定的smtp服務器,本機的局域網IP
- String host = "localhost"; // 本機smtp服務器
- //String host = "smtp.163.com"; // 163的smtp服務器
- String from = "[email protected]"; // 郵件發送人的郵件地址
- String to = "[email protected]"; // 郵件接收人的郵件地址
- final String username = "zhaipuhong"; //發件人的郵件帳戶
- final String password = "zhaipuhong"; //發件人的郵件密碼
-
- // 創建Properties 對象
- Properties props = System.getProperties();
-
- // 添加smtp服務器屬性
- props.put("mail.smtp.host", host);
- props.put("mail.smtp.auth", "true");
-
- // 創建郵件會話
- Session session = Session.getDefaultInstance(props, new Authenticator(){
- @Override
- public PasswordAuthentication getPasswordAuthentication() {
- return new PasswordAuthentication(username, password);
- }
-
- });
-
- try {
- // 定義郵件信息
- MimeMessage message = new MimeMessage(session);
- message.setFrom(new InternetAddress(from));
- message.addRecipient(Message.RecipientType.TO, new InternetAddress(
- to));
- //message.setSubject(transferChinese("我有自己的郵件服務器了"));
- message.setSubject("I hava my own mail server");
- message.setText("From now, you have your own mail server, congratulation!");
-
- // 發送消息
- session.getTransport("smtp").send(message);
- //Transport.send(message); //也可以這樣創建Transport對象發送
- System.out.println("SendMail Process Over!");
-
- } catch (MessagingException e) {
- e.printStackTrace();
- }
- }
-
- //接受郵件
- public static void getMail(){
- String host = "localhost";
- final String username = "zph";
- final String password = "zph";
-
- // 創建Properties 對象
- Properties props = new Properties();
-
- // 創建郵件會話
- Session session = Session.getDefaultInstance(props, new Authenticator(){
- @Override
- public PasswordAuthentication getPasswordAuthentication() {
- return new PasswordAuthentication(username, password);
- }
-
- });
-
-
- try {
- // 獲取郵箱的pop3存儲
- Store store = session.getStore("pop3");
- store.connect(host, username, password);
-
- // 獲取inbox文件
- Folder folder = store.getFolder("INBOX");
- folder.open(Folder.READ_ONLY); //打開,打開后才能讀取郵件信息
-
- // 獲取郵件消息
- Message message[] = folder.getMessages();
-
- for (int i=0, n=message.length; i<n; i++) {
- System.out.println(i + ": " + message[i].getFrom()[0]
- + "/t" + message[i].getSubject());
- try {
- message[i].writeTo(System.out);
- } catch (IOException e) {
- e.printStackTrace();
- }
-
- }
-
- // 關閉資源
- folder.close(false);
- store.close();
-
- } catch (MessagingException e) {
- e.printStackTrace();
- }
-
- System.out.println("GetMail Process Over!");
-
- }
-
- //郵件主題中文字符轉換
- public static String transferChinese(String strText){
- try{
- strText = MimeUtility.encodeText(new String(strText.getBytes(), "GB2312"), "GB2312", "B");
- }catch(Exception ex){
- ex.printStackTrace();
- }
- return strText;
- }
-
- public static void main(String[] args) {
- HelloJMail.sendMail();
- //HelloJMail.getMail();
- }
-
- }
說明: 執行測試時,先執行發送,在main方法中注釋掉郵件接受方法調用,等待片刻,再注釋掉郵件發送方法調用,執行郵件接受方法調用。因為就算163這樣優秀的企業級郵箱也不可能瞬間就能收到發送的郵件。
在郵件發送方法中:sendMail(), 可以嘗試一下又本郵件服務器向163郵箱發送郵件,如果想通過163郵件服務器想本地發送郵件,你需要配置DSN。
新聞熱點
疑難解答