sendmail限制使用者傳送的郵件的大小

之前在一份國賽的試題上看到有一題要求限制sendmail傳送郵件的附件大小,但是我翻遍了百度和谷歌,試遍了各種方法,也詢問了來學校培訓Linux的兩位老師及外校一名久負盛名的指導教師,均未能得到有效答案。
記憶猶新的是,當我和其中一位培訓老師說,我試遍了各種方法也行不通,想請老師指點的時候,對方直接拋給我一句話:我不知道,但這個題目已經考了好幾次了,你在質疑賽題的準確性?自己百度去。。。汗。。。
最後我不得不妥協一步,既然無法限制附件的大小,那我直接限制整封郵件的大小好啦(郵件大小=正文+附件+郵件資訊等附加內容的大小總和)。
編輯sendmail的/etc/mail/sendmail.cf配置檔案

# vim /etc/mail/sendmail.cf

轉到第186行(因軟體版本號不同位置可能略有不同,可在vim中搜尋關鍵字來查詢),可以看到如下內容(翻譯成中文是,每條訊息的最大大小):

將# O MaxMessageSize=0選項前的註釋去掉,其引數值就是每封郵件的最大值,單位是KB。例如,我想限制使用者只能傳送2MB大小的郵件則可以將其修改為如下形式:

O MaxMessageSize=2048

儲存退出後直接重啟sendmail服務就可以,不需要使用m4工具重新生成sendmail.cf檔案,因為我們編輯的就是sendmail.cf檔案。

# service sendmail restart

最後,盡情測試吧。

淺析郵件伺服器原理

上面的架構圖中包含兩組郵件系統、兩個客戶端和一個DNS伺服器,其中的郵件系統是企業中比較經典的架構形式,下面我將依據此圖來簡述郵件伺服器的工作流程。

名詞解釋:

  • MUA 接收郵件所使用的郵件客戶端,使用IMAP或POP3協議與伺服器通訊,常見的有:outlook、foxmail;
  • MTA 透過SMTP協議傳送、轉發郵件,常見的有:sendmail、postfix、qmail;
  • MDA 將MTA接收到的郵件儲存到磁碟或指定地方,通常會進行垃圾郵件及病毒掃描;
  • MRA 負責實現IMAP與POP3協議,與MUA進行互動;
  • SMTP 傳輸傳送郵件所使用的標準協議;
  • IMAP 接收郵件使用的標準協議之一;
  • POP3 接收郵件使用的標準協議之一;
  • MailBox 使用者郵箱;
  • cyrus-SASL及courier-authlib 提供使用者認證相關的支援。
  • SQL 資料庫,用於儲存使用者身份資訊

前面的架構圖中,MUA想傳送郵件,就要將郵件透過SMTP協議送到MTA上,MTA通常會要求使用者認證身份(也可不認證),認證通常使用SASL,認證源可以是像上面的架構圖中那樣使用SQL資料庫也可以使用其他方式。MTA收到郵件後會檢查郵件目的地址的郵件域,此時會產生兩種情況。
情況一,目的郵件域是本伺服器:
如果發現是本伺服器的郵件域則將郵件送到MDA,由MDA將其投遞到使用者的郵箱(MailBox)中。最後使用者在MUA上使用POP3/IMAP協議連結MRA,MRA通常也會要求使用者認證身份,其認證源同MTA一樣可以是SQL也可以是其他方式,若認證透過,則允許MUA讀取郵件資訊。
情況二,目的郵件域非本伺服器:
若是郵件域是其他郵件伺服器的,則MTA會傳送UDP報文向DNS伺服器查詢郵件域對應的郵件主機,並最終解析出其IP地址,隨後MTA會查詢本伺服器的轉發控制策略,若允許轉發,則將郵件轉發到該域對應的伺服器上,最終會重複情況一中MTA收到郵件後的處理方式。

sendmail郵件傳輸伺服器

前言:

sendmail是UNIX和Linux下的老牌郵件傳輸代理程式(MTA),以穩定著稱,一個調教的好的sendmail伺服器能承受很大的任務量,其在企業中也比較常用。
本專題將向你介紹sendmail伺服器的配置方法及配置過程中的注意事項。

實驗環境:

伺服器作業系統:CentOS 6.5
所用軟體包:sendmail-8.14.4-8.el6.x86_64、sendmail-cf-8.14.4-8.el6.noarch、dovecot-2.0.9-7.el6.x86_64、bind-9.8.2-0.17.rc1.el6_4.6.x86_64、cyrus-sasl-plain.x86_64 0:2.1.23-13.el6_3.1、cyrus-sasl-devel.x86_64 0:2.1.23-13.el6_3.1
客戶端作業系統:Windows 7
郵件客戶端:FoxMail

文章列表:

一、郵件伺服器工作原理淺析
二、使用sendmail搭建簡單郵件傳輸服務
三、使用dovecot搭建簡單郵件接收代理服務
四、sendmail開啟基於sasl的smtp認證
五、sendmail下的郵件轉發控制
六、sendmail下的郵件群發配置
七、使用者郵箱大小限制
八、限制每封郵件的大小

常見問題及解決方案:

一、sendmail啟動緩慢的解決方法
 
本專題內文章均為原創,謝絕轉載。

sendmail啟動緩慢的解決方法

問題表現:
原本配置的好好的sendmail服務,速度颼颼的。直到某一個月黑風高的夜晚,你重啟服務會發現關閉的很快,但啟動時巨慢無比。
解決方法(不保證百分百有效):
這個問題通常是在更改了主機名的時候產生的,解決辦法就是編輯/etc/hosts檔案

vim /etc/hosts

在檔案末尾新增如下內容:
你的公網ip地址     你的主機名.      你的主機名                //注意第一個主機名後面有一個“.”!!!
例如:

我的公網ip是192.168.162.246      主機名是mail2
儲存此檔案,然後再重啟senmdail試一下,又感受到了以往的速度是不是?

sendmail開啟基於sasl的smtp認證

sendmail預設是不會認證發信人身份的,這就導致你的郵件伺服器可能會被人隨意的傳送垃圾郵件。

而開啟smtp認證之後,只有認證身份的使用者才可以傳送郵件,這樣就很好的解決了上面的安全因患。

軟體包安裝:

開始設定前首先要確保你的CentOS上已經安裝瞭如下四個軟體包(sasl認證相關)。

cyrus-sasl-2.1.10-4.i386.rpm
cyrus-sasl-md5-2.1.10-4.i386.rpm
cyrus-sasl-plain-2.1.22-5.el5
cyrus-sasl-devel-2.1.22-5.el5

一般CentOS 6.5系統中都會內建前兩個包,我們執行安裝命令安裝餘下兩個包。

[root@localhost ~]# yum install *sasl-p*
[root@localhost ~]# yum install *sasl-d*

*sendmail配置部分:*

編輯/etc/mail/sendmail.mc檔案

[root@localhost ~]# vim /etc/mail/sendmail.mc

轉到第52行(因軟體版本號差異,行號可能不同)可以看到如下兩條語句,去掉這兩行前面的註釋dnl #(注:前往不要留有空格,否則報錯)。

修改後如圖:

TRUST_AUTH_MECH的作用是使sendmail不管access檔案中如何設定, 都能relay那些透過EXTERNAL, LOGIN, PLAIN, CRAM-MD5或DIGEST-MD5等方式驗證的郵件,注意這裡是對需要relay的郵件進行驗證,這點很重要,只有這樣透過驗證的郵件才會被 relay以防止sendmail伺服器被濫用。

confAUTH_MECHANISMS的作用是確定系統的認證方式。Outlook Express支援的認證方式是LOGIN。

儲存並退出。

生成對應的sendmail.cf檔案。

[root@localhost ~]# m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf

重啟sendmail服務。

[root@localhost ~]# service sendmail restart

啟動saslauthd服務,用於支援sasl認證。

[root@localhost ~]# service saslauthd start

至此,配置工作完成,現在開始測試吧~

sendmail郵件群發配置

解決思路:
郵件群發的配置過程非常簡單,只需要為需要群發的郵箱配置一個統一的別名即可。發信時信件發給別名,這樣即可傳送給別名所對應的每一個郵箱賬號了。
配置過程:
1、新增別名,編輯系統配置檔案/etc/aliases

vim /etc/aliases

將游標移至檔案末尾,新增別名。
格式:別名:        郵箱賬戶名1,郵箱賬戶名2,郵箱賬戶名3
本實驗中別名為test,郵箱賬戶名分別為user1、user2,配置如下圖。

配置檔案修改後需要生成對應的資料庫檔案才能被sendmail讀取。
資料庫檔案生成命令:

newaliases

重啟sendmail,讓其讀取別名資料庫。

service sendmail restart

最後,傳送一封郵件給別名郵箱看看其對應的郵箱使用者能不能收到吧!

sendmail下配置/etc/mail/access檔案實現郵件轉發控制

前言

/etc/mail/access 檔案是sendmail的轉發控制檔案,用以定義對特定網段、域中的主機發來的郵件的處理方式。

基本格式:

[標籤]:[引數]  [制約關鍵字]

示例:

標籤:

  1. Connect: 檢查物件域名或IP
  2. From: 檢查物件 送信人地址
  3. To: 檢查物件 收信人地址
  4. 不加標籤的預設為Connect。

制約關鍵字:

  1. OK : 只接收發給自己/本地的郵件. 其他的全部拒絕並向送信伺服器返回錯誤訊息(未指定製約關鍵字的預設值為OK)。
  2. RELAY: 允許接收允許轉發。
  3. REJECT:拒絕接收/轉發,向送信伺服器返回錯誤訊息。
  4. 500: 與reject基本相同,拒絕接收/轉發,並向送信伺服器返回錯誤訊息和原郵件。
  5. DISCARD:丟棄接收到的郵件,並且不向送信郵件伺服器返回任何訊息。
  6. ERROR:拒絕接收/轉發並向發信伺服器返回指定的錯誤訊息,格式參見前面的示例。

注意事項:

修改完檔案後記得生成對應的資料庫檔案,否則是不會生效的。

[root@localhost ~]# makemap hash /etc/mail/access < /etc/mail/access    //生成資料庫檔案

最後,在保證防火牆和SELinux均正確配置的情況下重啟sendmail服務使配置生效。

[root@localhost ~]# service sendmail restart

CentOS 6下使用sendmail搭建簡單郵件傳輸伺服器

介紹:

sendmail是linux/unix下比較常用的開源免費郵件傳輸代理程式(MTA)。

需要安裝的軟體包:

sendmail(郵件傳輸代理,用於傳送及轉發郵件,使用smtp協議)
sendmail-cf(包含配置過程中需要使用的m4工具)

安裝命令:

yum install -y sendmail sendmail-cf

DNS配置:

DNS伺服器的配置方法參考此篇文章:

https://www.ibadboy.net/archives/1027.html

最終要求新增一個sx.com的域名並配置DNS解析為如下形式:

本實驗中DNS伺服器IP地址:192.168.162.244,郵件伺服器IP地址:192.168.162.245。

注意MX記錄要寫在前面(如上圖),否則會出錯。

配置完DNS伺服器之後別忘了將郵件傳輸伺服器的DNS修改為DNS伺服器的地址,否則會導致郵件傳輸伺服器無法轉發郵件哦。

Centos下修改DNS的方法參考此篇文章:

https://www.ibadboy.net/archives/1055.html

sendmail配置部分:

sendmail主配置檔案:

實際上sandmail的主配置檔案是/etc/mail/sendmail.cf,但因為該配置檔案使用宏語言編寫,一般人難以看懂更別提編輯了。
所以sendmail提供了一個/etc/mail/sendmail.mc檔案,此檔案可讀性遠遠大於sendmail.cf,使用者可以直接編輯sendmail.mc檔案再透過m4工具生成相對應的sendmail.cf配置檔案供sendmail讀取。

使用vim文字編輯器開啟sendmail.mc

vim /etc/mail/sendmail.mc

找到第116行(因軟體版本差異行號可能對不上),如下圖,將此行中Addr=127.0.0.1修改為本機公網IP地址(MX記錄對應的域名所解析出的IP地址,本實驗中為192.168.162.245),也可以改為0.0.0.0。這裡是定義讓sendmail監聽哪個地址,預設是監聽127.0.0.1(本地迴環),修改為0.0.0.0是監聽所有地址,也可以像本實驗中設定的只監聽某個指定的公網地址。

修改後如圖:

儲存並退出。

使用m4工具生成與剛剛編輯的sendmail.mc相對應的sendmail.cf檔案

m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf

編輯/etc/mail/access檔案定義允許接收或轉發哪些主機的郵件。

vim /etc/mail/access

如上圖,定義了允許接收並轉發192.168.162網段中所有主機的郵件。

關於/etc/mail/access配置檔案的詳細配置方法請轉到此篇文章瞭解:

https://www.ibadboy.net/archives/676.html

儲存並退出

生成與剛剛編輯的/etc/mail/access相對應的資料庫檔案。

makemap hash /etc/mail/access < /etc/mail/access

編輯/etc/mail/local-host-names定義本機的域(如不定義,預設以主機名作為本機域),當sendmail收到郵件時會依據此檔案來判斷郵件的目標地址是本域還是其他域,如果是本域則投遞到對應賬號的郵箱內,如果是其他域則進行轉發。

vim /etc/mail/local-host-names

配置方法很簡單,一行一個域名即可,如下圖。

儲存並退出,自此sendmail部分配置完成。

啟動服務:

在保證selinux及防火牆均已關閉的情況下啟動sendmail服務。

service sendmail start

但需要注意的是,一個完整的郵件系統不應該只包含使用SMTP協議的MTA(郵件傳輸代理),還應該包括使用POP3或IMAP協議的MRA(郵件接收代理)

推薦同時配置完MTA(郵件傳輸代理)和MRA(郵件接收代理)後一起進行最後的服務測試。

關於MRA(郵件接收代理)的配置參考此篇文章:

https://www.ibadboy.net/archives/958.html