由於經常工作在linux下,所以很多時候需要將自己工作的報告或其他有用的東東發送給相關的人,所以花時間研究了一下在linux下如何發送mail。我們通常能用到下面3中發送方式:
1. 使用Shell當編輯器發送郵件
這種方式可以直接在shell視窗編輯郵件內文,當編輯完成之後使用Ctrl+D退出,同時郵件也會被發送出去
| 代碼如下 |
複製代碼 |
# -s後面是郵件的主題,主題後面是目標郵件地址[root@centos6 ~]# mail -s “Lucky mail” xlapn@126.com Hi Tomas, Thank you for you help! Regards, Daniel2. 使用管道發送郵件 |
echo後面的是郵件內文
| 代碼如下 |
複製代碼 |
[root@centos6 ~]# echo "Hi Tomas, > Thank you for you help! > Regards, > Daniel" | mail -s "Thank you mail" xlapn@126.com3. 以檔案的形式發送郵件內文 |
這種形式適合比較長的郵件內文編寫,將郵件內文寫入到檔案mail.body,然後通過<定位到目標郵件
| 代碼如下 |
複製代碼 |
| [root@centos6 ~]# mail -s "Thanks mail" xlapn@126.com < mail.body4. 發送帶有附件的郵件 |
要發送帶有附件的郵件,需要安裝uuencode軟體包,在配置好YUM源的前提下可以使用下面的命令安裝uuencode包
| 代碼如下 |
複製代碼 |
| [root@centos6 ~]# yum install sharutils安裝好uuencode就可以發送帶有附件的郵件了 |
# uuencode後面跟了兩個參數,第一個參數”/root/batch.file“是附件全路徑,第二個參數”batch“是附件在郵件中顯示的名字[root@centos6 ~]# uuencode /root/batch.file batch | mail -s "Batch file" xlapn@126.com < mail.body以上的一些命令都是在CentOS6上測試過的
使用sendmail發送郵件
sendmail是linux/unix系統下用來發送郵件的用戶端。sendmail使用SMTP協議將郵件發送到目的SMTP伺服器。其工作流程大概如下:
首先要說一下DNS的MX記錄:SMTP伺服器基於DNS中的MX(mail exchange)記錄來路由電子郵件,MX記錄註冊了網域名稱和相關的SMTP轉送主機,屬於該域的電子郵件都應向該主機發送。
(1)Sendmail 請求DNS給出主機sh.abc.com的CNAME 記錄,如有,假若CNAME(別名記錄)到shmail.abc.com,則再次請求shmail.abc.com的CNAME記錄,直到沒有為止。
(2)假定被CNAME到shmail.abc.com,然後sendmail請求@abc.com 域的DNS給出shmail.abc.com的MX記錄(郵件路由及記錄),shmail MX 5 shmail.abc.com 10 shmail2.abc.com。
(3)Sendmail組合請求DNS給出shmail.abc.com的A記錄(主機名稱(或網域名稱)對應的IP地址記錄),即IP地址,若傳回值為10.0.0.4(假設值)。
(4)Sendmail與10.0.0.4串連,傳送這封給user@sh.abc.com 的信到1.2.3.4 這台伺服器的SMTP背景程式。
1. 構造郵件
在使用sendmail發送郵件之前,首先需要按郵件格式構造一封郵件。包括郵件標頭,郵件訊息體。郵件格式在
| 代碼如下 |
複製代碼 |
RFC5322:internet message format(http://tools.ietf.org/html/rfc5322)中有詳細說明。 ? Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->From: John Doe <jdoe@machine.example> Sender: Michael Jones <mjones@machine.example> To: Mary Smith <mary@example.net> Subject: Saying Hello Date: Fri, 21 Nov 1997 09:55:06 -0600 Message-ID: <1234@local.machine.example> This is a message just to say hello. So, "Hello". |
可以暫不指定date頭(郵件發送時間)和messageid,這個資訊將由sendmail程式填寫。
2. 使用sendmail發送郵件
將郵件構造好之後,儲存到一個本地檔案,如/data/mail_content。然後調用sendmail發送,發送時指定接收郵箱地址:
cat /data/mail_content | sendmail user@163.com
3. 發送HTML格式的郵件
如果要發送html格式的郵件, 就是說,郵件的訊息體為一個html檔案,需要在郵件標頭中指定 content-type為 text/html。如果不指定,預設情況下,content-type為text/plain,即普通文本。
| 代碼如下 |
複製代碼 |
Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->From: John Doe <jdoe@machine.example> Sender: Michael Jones <mjones@machine.example> To: Mary Smith <mary@example.net> Content-type: text/html Subject: Saying Hello <div style="border:solid 1px #1D448C;"> <h1>This is a message just to say hello.</h1> <p>So, "Hello".</p> </div> |
4. 字元編碼
在發送中文郵件中,字元編碼是一個比較重要的問題,如果設定不正確,會導致郵件標題或郵件內容顯示亂碼。
郵件內容的編碼可以在郵件標頭content-type中設定,如設定郵件內容為utf-8編碼:
Content-type: text/html;charset=utf-8
郵件標頭中,如From,To,Subject等,如果需要用到中文,可以這樣設定:
| 代碼如下 |
複製代碼 |
“=?UTF-8?B?”+base64encode(內容UTF8編碼)+"?=" Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->From: =?UTF-8?B?5L2g5aW9?= <jdoe@machine.example> Sender: Michael Jones <mjones@machine.example> To: Mary Smith <mary@example.net> Content-type: text/html;charset=utf-8 Subject: =?UTF-8?B?5L2g5aW9?= <div style="border:solid 1px #1D448C;"> <h1>This is a message just to say hello.</h1> <p>So, "Hello".</p> </div> |
上面我們也看到sendmail郵件發送配置超麻煩,下面我們不用sendmail來發,執行個體
bin/mail會預設使用本地sendmail發送郵件,這樣要求本地的機器必須安裝和啟動Sendmail服務,配置非常麻煩,而且會帶來不必要的
資源佔用。而通過修改設定檔可以使用外部SMTP伺服器,可以達到不使用sendmail而用外部的smtp伺服器發送郵件的目的:
修改/etc/nail.rc (/etc/mail.rc)
| 代碼如下 |
複製代碼 |
| set from=fromUser@domain.com smtp=smtp.domain.comset smtp-auth-user=username smtp-auth-password=passwordset smtp-auth=login |
說明:
from是發送的郵件地址
smtp是發生的外部smtp伺服器的地址
smtp-auth-user是外部smtp伺服器認證的使用者名稱
smtp-auth-password是外部smtp伺服器認證的使用者密碼
smtp-auth是郵件認證的方式
配置成功後,就可以使用了
可以發送一封郵件測試一下:
| 代碼如下 |
複製代碼 |
| mail -s "test" user@sohu.com <content.txt |
其中-s後面的是郵件標題,user@sohu.com是收件者地址,content.txt裡面是郵件內文