從0到1搭建域名郵件伺服器

樹醬發表於2021-09-25

image.png

前言:哈嘍,我是樹醬。文章的源頭,是因為在一次交談中,朋友提到一個需求。需要一批郵箱去做一些"事情",具體是幹啥事,留點懸念。如果手動去註冊郵箱,只需要解決接收郵件問題。不僅費力而且現在包括像@163等郵箱都還需要手機驗證。手動不行,那我們就自己"造"郵箱。一開始覺得挺複雜,畢竟作為一名前端工程師,這個“需求”已經超綱了。問題不大莫慌,看完這篇你就可以打造自己的域名郵箱了

1.前期準備

搭建郵件伺服器需要一些“基礎建設”,包括如下

  • 一臺伺服器 推薦centos
  • 一個域名

1.1 配置細節

郵件伺服器是通過SMTP協議進行通訊,為了讓伺服器能夠成功接收郵件,我們需要開啟25這個埠,並允許訪問25埠。同時如果你需要使用像類似foxmail這種客戶端接發收郵件,還需要支援POP3協議,需要開啟110埠。換句話說為了保證郵件服務的正常使用,需要開啟25和110這兩個埠

關於 POP3協議(Post Office Protocol 3):協議主要用於支援使用客戶端遠端管理在伺服器上的電子郵件,將電子郵件儲存到本地主機

下圖是阿里雲伺服器配置安全策略組的規則,在其中加入一條訪問規則

image.png

接下來是域名,需要配置域名解析,配置主機記錄

如下圖是域名的解析配置,主要包括幾個記錄數值

  • MX類:增加 MX 記錄,型別選擇 MX記錄,值可以填寫主機名,也可以填寫你的公網ip地址也可以是mail.example.com。如果配置的是域名,還需要新增一條A型別的記錄,主機記錄定義為:mail,具體看下圖
  • A類:該配置主要用來支援客戶端接收郵件(比如:foxmail)分別新增smtp、imap、pop等配置,記錄值為 ip

配置完如下圖所示,可以在列表中看到配置好的,

image.png

2 伺服器安裝

2.1 Postfix

關於 postfix:Postfix 是實現 SMTP 協議的軟體,也叫做郵件傳送伺服器,負責對郵件進行轉發,具體的轉發規則,就需要我們對postfix的配置進行修改

我使用的是阿里雲的伺服器,首先我們安裝郵件服務`postfix'

  • 安裝
yum install postfix // 伺服器安裝 
  • 配置

安裝成功之後,修改配置,通過vi /etc/postfix/main.cf 命令列修改以下配置

myhostname =  email.example.com //  設定系統的主機名

mydomain = example.com  //  設定域名(我們將讓此處設定將成為E-mail地址“@”後面的部分)

myorigin = $mydomain  //  將發信地址“@”後面的部分設定為域名(非系統主機名)

inet_interfaces = all  //  接受來自所有網路的請求

mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain  //  指定發給本地郵件的域名

home_mailbox = Maildir/  // 指定使用者郵箱目錄

# 規定郵件最大尺寸為10M
message_size_limit = 10485760
# 規定收件箱最大容量為1G
mailbox_size_limit = 1073741824
# SMTP認證
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
smtpd_recipient_restrictions = permit_mynetworks,permit_auth_destination,permit_sasl_authenticated,reject

下圖是postfix中主要的引數
image.png

  • 啟動

配置完postfix的,啟動服務

postfix check   // 檢查配置檔案是否正確
systemctl start postfix  //開啟postfix服務
systemctl enable postfix //設定postfix服務開機啟動

完成postfix的配置,接下來我們還需要安裝dovecot

2.2 Dovecot

關於 Dovecot:是一款能夠為Linux系統提供IMAP和POP3電子郵件服務的開源服務程式,安全性極高,配置簡單,執行速度快,而且佔用的伺服器硬體資源也較少。上文提到POP3/IMAP是從郵件伺服器中讀取郵件時使用的協議
  • 安裝
yum install dovecot // 伺服器安裝 
  • 配置
    安裝成功之後,修改配置,通過vi /etc/dovecot/dovecot.conf 命令列修改以下配置
protocols = imap pop3 lmtp listen = *, 

#新新增以下配置 #

!include conf.d/10-auth.conf 

ssl = no 

disable_plaintext_auth = no 

mail_location = maildir:~/Maildir
  • 啟動
systemctl start dovecot   //開啟dovecot服務
systemctl enable dovecot   //置dovecot服務開機啟動

完成以上兩個服務的配置,你離成功就近一步了!

啊樂同學:postfix與dovecot這兩個其實有什麼區別?

答:postfix主要做傳送郵件使用,而dovecot主要做接收使用,兩者結合才能完成一個完整的郵件服務

3 新建使用者

搭建完郵件伺服器之後,我們需要建立使用者來完成 郵件的接收和傳送

  • 如何建立使用者
useradd tree/ 新增使用者
passwd tree   // 設定使用者密碼
啊樂同學:如果這樣我建立100個郵箱使用者,豈不是很浪費時間?

莫慌,我們寫個shell指令碼,批量建立就可以解決你這個問題

建立一個檔案,createUser.sh 內容如下

/bash
#user.txt 為需要建立的使用者的檔案passwd.txt為隨機生成密碼
USER_FILE=user.txt
pass_FILE=passwd.txt
for user in `cat user.txt`
do
id $user &> /dev/null  #檢視使用者是否存在
if [ $? -eq 0 ]
then
echo "The $user already exist"
else
useradd $user    #建立使用者
if [ $? -eq 0 ]
then
echo "$user create sucessful"
PASSWD=$(echo $RANDOM |md5sum |cut -c 1-8)    #隨機生成數字
echo $PASSWD |passwd --stdin $user &>/dev/null   #修改使用者密碼
echo -e "$user\'$PASSWD'\'$(date +%Y%m%d)'" >> $pass_FILE   #將使用者,密碼,日期輸入到檔案中
fi
fi
done

前提需要建立一個user.txt 來維護我們要建立的使用者,比如

tree
shujiang

指令碼會根據我們列出的使用者名稱去批量生成使用者

4.測試郵箱

搭建好服務以及完成使用者的建立,接下來就是測試郵件是否正常接收環節了

我使用的是foxmail來做驗證

image.png

這個使用者名稱就是我們上一節建立的使用者名稱稱,完成建立之後,我們通過傳送郵件來測試是否能夠成功接收

image.png

還有一種方式就是藉助telnet去做測試,這裡不做大篇幅介紹。最原始的方式

阿樂同學:如果我每個新建的郵箱使用者,我都得去配置一個客戶端去接收郵寄,豈不是很費勁,有沒有其他方式?

有的,換個角度思考,你可以通過配置郵件轉發,將所有郵件接收都轉發到某一個使用者的郵箱中去,你就可以只在該郵箱查閱郵件(我開始懷疑你的動機,是不是搞什麼批量註冊!)

具體如下,需要配置下第二節中提到的postfix配置檔案,在檔案最後新增

virtual_alias_domains = ensbook.com  mail.ensbook.com
virtual_alias_maps = hash:/etc/postfix/virtual

完成配置之後,我查閱網上一些資料,需要配置/etc/postfix/virtual檔案,該檔案主要用來管理電子郵件轉發規則的

於是我嘗試修改/etc/postfix/virtual檔案,並新增一下資訊

image.png

這條規則的含義是:所有郵件傳送至 @ensbook.com 轉發到 qq郵箱

發現竟然沒有生效,最後是建立一個virtual的使用者實現轉發接收的。如果你看得出問題,記得在評論區告訴我

阿樂同學:我接收不到郵箱,又不知道什麼問題,如何排查?

你可以通過tail -n /var/log/maillog檢視郵件日誌

最後

通過上文的瞭解,我們不難看到,一個域名郵件伺服器的建立其實很簡單,而且技術很老。但是無論老不老,能夠解決我們的需求就好。如果你有其他方式實現,歡迎在評論區留言。

相關文章