1. 程式人生 > >搭建Apache James郵件服務

搭建Apache James郵件服務

centos 最終 and 測試工具 one 富文本 1.3 class nload

什麽是郵件服務器

郵件服務器是一種用來負責電子郵件收發管理的設備,而郵件服務就是責郵件的收信和發信功能,其最主要有pop和smtp兩個協議。關於這兩個協議,有著很多的知識點涵蓋其中,這裏不過多介紹。下面是我接觸過的兩個可以實現郵件服務的解決方案。

1.易郵郵件服務

在windows系統下,可以使用 易郵郵件服務 ,這個服務器簡單而且實用,用在平時開發,測試或者局域網間的郵件收發還是挺方便的,不過我沒有找到官方的,可以將易郵郵件服務安裝在Linx的相關資料,因此不使用這個。這是易郵郵件服務的官方網站地址: http://www.eyousoft.net/

2.Apache james

Apache 應該都不陌生,開源免費,對於我們開發者來說是最好的家園。當時我項目需要時,一直在找郵件服務相關資料,於是找到了它。Apache James相關資料不多,所以希望寫篇博客將其記錄。以備以後用到,也對郵件服務能夠有更深入的理解。這是官方的介紹

James stands for Java Apache Mail Enterprise Server!
It has a modular architecture based on a rich set of modern and efficient components which provides at the end complete, stable, secure and extendable Mail Servers running on the JVM.

通過介紹,不難看出,James小巧,可擴展而又不失強大,其支持pop,smtp以及相關SSL/TLS加密協議。可以用做開發測試,也可以對其擴展封裝後作為企業級郵件服務。不過有一點需要說明的是,現在國內的很多雲服務器是默認關閉 25 端口的,也就是默認不能使用未加密的 smtp 發送郵件,據說是為了減少垃圾郵件的產生。下圖是其雲服務提供商的解釋截圖(這個問題我自己找了很久,當時在本機測試代碼完全沒問題,但發布到服務器發現項目無法啟動,最後無法解決,就用了AWS亞馬遜雲服務器作為郵件服務器測試,最終成功)。

技術分享圖片

Emmm…
好吧,那如果服務器是國內雲服務器,需要實現和外網(如QQ,163郵件服務)之間收發郵件的話,只有三個辦法:
1.申請開通25端口。不過申請基本不會通過…
2.使用加密的smtp協議傳輸。其端口則可以使用 465 等,避免使用25端口。
3.使用aws服務器。網上也聽說會封25端口,不過我當時(2017年12月份末)測試時,還是可以使用的。

那麽,我們現在搭建的郵件服務,如果不發布到雲服務器或者企業獨立的服務器,是無法收到外網郵件服務器發的郵件的,其實也很好理解,因為外網的服務器根本找不到你的郵件服務器在哪裏,找不到你的機器IP地址。不過這不影響郵件發送,和局域網內的郵件收發

功能。因此,以下的郵件服務搭建主要實現的功能就是:
1.局域網內的所有郵件收信和發信(普通郵件,Html郵件,附件郵件);
2.外網的郵件發送(如果有條件測試郵件接收功能是最好的)。

將會分別在Windows平臺和Linux平臺搭建。

Windows平臺安裝配置

說明:本機測試使用的是 win10系統

下載,解壓

下載地址: http://james.apache.org/download.cgi

配置開始

首先,前往 james-2.3.2.1\bin 找到 run.bat,雙擊啟動,會發現啟動以後窗口自動關閉,這是因為沒有配置的原因,可能會啟動失敗,不過不要緊,這一次啟動會生成一個文件,它就在 james-2.3.2.1\apps\james\SAR-INF\目錄下,文件名 config.xml,現在配置的重點就是這個文件(如果不啟動一次,這個文件是沒有的)。

配置config.xml

修改xml代碼,將所有localhost 替換為你的郵箱域名,這個可以隨便寫一個,等會配置一下hosts文件,將域名指向本機,即可將本機的james作為郵件服務器。

<!-- 配置這裏,將這個xml文件的localhost替換成你的域名(這裏測試使用xingchen.cn)-->
<postmaster>[email protected]</postmaster>

郵件數據存儲選擇,根據xml來看,提供的有3中數據存儲方式:
1.file:// 文件存儲
2.db:// 數據庫存儲
3.dbfile:// 數據文件式存儲

這些數據存儲方式可以根據自己實際需求來定,不過如果選擇文件存儲方式,在啟動時會出現找不到文件等錯誤,所以需要確認已經創建好文件夾再啟動。當時為了方便,所以選擇的是數據庫存儲方式,數據庫使用Mysql數據庫存儲,因此需要作一下代碼變更。如果你不需要使用數據庫存儲,就可以跳過數據庫相關配置,包括 驅動包的導入,DBCP連接池配置等。

Mysql數據庫配置 1:

<!-- 重要說明: 註釋掉默認的 file:// ,這個在文件中有好幾處地方,修改方式雷同,都要註釋掉默認的這個,再打開數據庫存儲方式的配置
<inboxRepository>
<repository destinationURL="file://var/mail/inboxes/" type="MAIL"/>
</inboxRepository>
-->
<!--使用數據庫作為數據存儲-->
<inboxRepository>
<repository destinationURL="db://maildb/inbox/" type="MAIL"/>
</inboxRepository>

Mysql數據庫配置 2:
將mysql的驅動包拷貝到 james2.3.2\lib目錄下

Mysql數據庫配置 3:
找到 <data-source> 節點 配置數據庫連接

<data-source name="maildb" class="org.apache.james.util.dbcp.JdbcDataSource">
<driver>com.mysql.jdbc.Driver</driver>
<dburl>jdbc:mysql://127.0.0.1/mail?autoReconnect=true</dburl>
<user>username</user>
<password>password</password>
<max>20</max>
</data-source>

Mysql數據庫配置 4:在Mysql數據庫中添加一個空的數據庫 mail ,數據庫只能是mail,以後的數據都將會存儲在這個數據庫中。

找到 <administrator_accounts>,將!changeme!改掉,等會登錄使用的就是這個密碼。

<administrator_accounts>
<!-- CHECKME! -->
<!-- Change the default login/password. -->
<account login="root" password="!changeme!"/>
</administrator_accounts>
找到<servernames>,將兩true改為false
<servernames autodetect="false" autodetectIP="false">
<!-- CONFIRM? -->
<servername>xingchen.cn</servername>
</servernames>

找到下面的代碼,註釋掉。

<!--
<mailet match="InSpammerBlacklist=dnsbl.njabl.org."
class="ToProcessor">
<processor> spam </processor>
<notice>550 Requested action not taken: rejected - see http://njabl.org/</notice>
</mailet>
-->

?

配置 DNSServer, 使用Google 的 Public DNS (還可以使用阿裏雲的DNSServer,之前我測試沒毛病,可以使用,查閱地址在這裏 https://baike.baidu.com/item/dns/427444?fr=aladdin#14 ):

<servers>
  <server>8.8.8.8</server>
  <server>8.8.4.4</server>
</servers>

此時,再次運行 run.bat即可。如果看到以下界面,說明安裝成功。

技術分享圖片

3.客戶端登錄

使用telnet指令登錄

telnet localhost 4555
#因為是本機服務,所以直接使用localhost連接郵件服務器

4.添加用戶

adduser test test

這個命令很簡單,就是添加一個用戶名為 [email protected] ,密碼 test 的用戶只要在註冊一個用戶,就可以實現郵件互發了。下面舉例使用 Foxmail 測試郵件收發。

Windows測試郵件收發

1.測試工具 : Foxmail客戶端
2.前提:兩個註冊在你的郵件服務器的帳號
3.預計實現結果:正常收發郵件,包括普通文本、富文本格式和附件收發。

註冊帳號
adduser test2 test2

因為上文中也提到,已經有一個帳號 test 了,所以這裏添加另外一個,這裏的密碼已經加密,由James內部實現。你可以前往數據庫 Mail 的users表中查看相關信息。如下圖

技術分享圖片

Foxmail設置

安裝,打開foxmail,將我們剛剛註冊的兩個用戶添加進去。步驟如下:

技術分享圖片

技術分享圖片

技術分享圖片

另一個帳號以此為例,創建即可。

測試開始

第一封:普通文本

技術分享圖片

技術分享圖片

因為篇幅有限,富文本格式和附件收發測試就不截圖了。本機測試可行,配置無誤應該都沒問題。

至此,Windows環境下配置,測試完畢。其中比較繁瑣的是 config.xml的修改配置,如果發現啟動失敗,報錯情況。很大可能是這個配置未完整或者有誤。在文章後面我會提供一個本機測試可用的 config.xml 文件。

Linux平臺安裝配置

說明:Linux系統環境是 CentOS6.8 32位機器。

上傳安裝包 解壓

軟件包在上文已經提供,直接將 tar.gz 安裝包下載下來,並上傳至服務器解壓即可。

#解壓命令
tar -zxvf james-binary-2.3.2.1.tar.gz

首次啟動

./run.sh

如果出現 -bash: ./run.sh: Permission denied,說明沒有執行的權限,需要給當前用戶添加一個可執行的權限。

技術分享圖片

可以發現執行成功。此時 使用 Ctrl + C 終止程序 。

配置

1.開始配置 //apps/james/SAR-INF/config.xml .具體配置和windows上配置大同小異,DNSServer使用Google 的 Public DNS :

<servers>
  <server>8.8.8.8</server>
  <server>8.8.4.4</server>
</servers>

2.同樣,數據庫相關也要根據你的服務器中安裝的Mysql做相應配置。

<data-source name="maildb" class="org.apache.james.util.dbcp.JdbcDataSource">
  <driver>com.mysql.jdbc.Driver</driver>
  <dburl>jdbc:mysql://127.0.0.1/mail?autoReconnect=true</dburl>
  <user>root</user>
  <password>yourMysqlPwd</password>
  <max>20</max>
</data-source>

3.將數據庫驅動添加到 //lib 目錄下。

4.創建數據庫 mail

mysql> create database mail;
Query OK, 1 row affected (0.00 sec)

5.啟動

6.測試連接

可以使用本機或者別的電腦測試連接 4555端口,如下:

telnet 你的IP 4555

技術分享圖片

似曾相識頁面出來了,這樣就可以添加用戶,郵件收發啦…

adduser admin@yourdomain password

Foxmail測試

此時,將剛新建的用戶配置到foxmail客戶端中即可收發所有郵件。

與上文的Windows測試大同小異,不細述。

常見的坑

1.報錯一 : java.io.IOException: 文件名、目錄名或卷標語法不正確。

原因:這個報錯的原因是用戶信息,郵件收發產生的數據存儲路徑有誤,默認使用的是文件存儲。

解決:參考文章前半部分

? a. 找到 所有的 destinationURL ,默認配置的是 ‘file://var/mail….’,就是使用文件存儲,這裏將其註釋。如下圖所示:

技術分享圖片

? b.把數據庫驅動添加到 //lib/ 目錄下,我這裏用的是Mysql,所以將 mysql-connector-java-5.1.39-bin.jar 添加到 lib 文件夾下。

? c.在數據庫中創建一個 名為 mail 的數據庫。當再次運行後James內部就會自動創建幾個表。如下:

技術分享圖片

? 此時,再次啟動,應該就成功了。

2.報錯二 : om.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown database ‘mail‘

原因:沒有創建數據庫 mail ,創建即可解決。這是由這項配置決定的,需要確認填寫無誤,還有數據庫驅動已加入其中即可避免。

  1. <data-source name="maildb" class="org.apache.james.util.dbcp.JdbcDataSource">
  2. <driver>com.mysql.jdbc.Driver</driver>
  3. <dburl>jdbc:mysql://127.0.0.1/mail?autoReconnect=true</dburl>
  4. <user>root</user>
  5. <password>yourMysqlPwd</password>
  6. <max>20</max>
  7. </data-source>

3.無法收發外網郵件

原因:這個錯誤原因會比較多,也很難總結,包括安裝,配置,帳號等方面都有可能出問題。不過大多數還是配置出錯引起的。可以參考這篇文章:Apache James使用的方法及相關心得(轉),這是博客園上的文章,感謝原作者的分享和總結,當時我也是根據這篇文章解決無法的收發外網郵件的BUG。

4.說明:如果沒有獨立域名和服務器,沒有獨立的公網IP地址,無法真正做到收外網郵件,不過為了滿足開發測試,可以在hosts文件中添加偽域名,實現其功能。

這個鏈接是下載配置樣例的config.xml,僅供參考。

總結

是的,又是造輪子,但是對於技術提升和代碼實踐還是很有幫助,可以更深理解別人的代碼思想,技術邏輯。其實我一直覺得,技術對我來說,把坑挖得越深越好,理解越透徹越好,代碼不在於多,而在於真正理解編程思想,解決實際問題。這才是編程的實際意義。


原文出自:星塵 www.myxinge.cn

搭建Apache James郵件服務