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