2007-02-08

輕巧的 Mail Agent (esmtp)

Asus WL-500g 的運算能力不是很強,架設了那麼多服務或程式,如果出了問題,並沒有任何回報機制。一般我們想到的是透過 mail,如果出什麼狀況 e-mail 出來通知就好,但不可能在WL-500g 上裝一套 mail server 吧?!我們要的只是有個 Agent 程式幫我們寄信,達到通知的目的就好。一般 ISP 都有提供他們的 SMTP server 給他們的用戶做 mail relay (信件轉寄),所以我們只要把信件的目的地和內容轉交給它,就可以達到代發寄信的目的(很多垃圾廣告信也是用這個原理寄出來的)。我們需要安裝一隻程式:esmtp,它能模擬成 Liunx 的 sendmail,幫我們把信交給 SMTP server,請它代發。安裝如下:

ipkg install esmtp

這個動作就可以把這個 agent 程式裝好了,我裝的版本是 0.5.1,跟著會安裝 library libesmtp (1.0.4)。但是只有這樣好像是不夠的,因為我執行時會發生 sendmail: can't load library 'libssl.so.0.9.7' 這樣的錯誤,看來連 openssl 的套件有相關性也要一併裝上,因為要用到其中的一些 library(這好像蠻重要的,這邊不裝其他地方也要裝,這也是為什麼很多文件會漏掉的原因,所以還是先補上去吧!我裝的版本是 0.9.7d):

ipkg install openssl

最後只要設定幫你做 mail relay 的 SMTP server 在哪裡,信件就可以寄了!原來預設是沒有設定檔的,我們手動建立:

nano /opt/etc/esmtprc

然後填入關於你的 SMTP 設定(hostname 後面最好把 port 25 加上,如果沒有帳號密碼,則第二和第三行可以不要。假設和我一樣用 Hinet ,設定為 'msa.hinet.net:25'):

hostname = your.smtp.server:25
username = "user"
password = "password"

存檔後就搞定啦!如果你不想用自己的 ISP 提供的服務,想用別人免費(如GMail)的 SMTP,有些要求用 SSL 認證,你還要搞定憑證的相關設定,可以到這邊參考怎麼弄。如果要先測試 mail relay 用的 SMTP 設定和伺服器能不能用,可以 telnet port 25 過去,用下面的幾個命令測試:

HELO <你要寄去的對方郵件伺服器>
MAIL FROM: <寄件人,有些 SMTP 會檢查寄件人以杜絕廣告信,亂打會有問題>
RCPT TO: <收件人,要打完整的 user@domain>
DATA
<接下來就是郵件內容,完整的 mail header 要自己做>
Subject: This is a test mail
To: user@domain.com
This is the text of my test mail.
. <"." 是用來作為內容結束提示的,按下 enter 以後就寄出了>
QUIT

esmtp 設定檔搞定好,接下來要測試一下,寄一封出來看看(esmtp 的執行檔也叫做 sendmail):

echo "Test Message" | sendmail receiver@domain.com -f sender@domain.com

其中 -f 後面帶的是寄信人的電子郵件,只要信箱 receiver@domain.com 有收到,這樣就大功告成啦(如果執行後等了很久 hang 住,代表你設定檔內容可能有誤)。不過這樣寄出來的信很醜,標題沒有內容,所以建議可以先產生一個信件檔,再把檔案內容透過 esmtp 寄出會比較漂亮。而內容至少要有三個欄位,然後再帶入郵件內容:

To: receiver@domain.com
From: sender@domain.com
Subject: <郵件主旨>

信件內容

假設這個郵件檔檔名叫 mail.txt,那麼把這封信寄出去的語法為:(-f 後面可以省略,還是會寄到)

cat mail.txt | sendmail receiver@domain.com -f sender@domain.com

寄信需要花一點時間。如果最後跳出一些其他的訊息,裡面還有 (null) 之類的字樣,代表是你的 SMTP server 有回錯誤出來,可能是伺服器、帳號密碼錯誤,也有可能是寄件人或收件人錯誤,要確定所有的資料都是對的才行。上面的辦法還要做一個檔案,下面我寫了一隻程式程式,是一個 shell 執行檔,可以在一行內把所需的資料都填入,方便做系統自動回報使用。你可以在 /opt/sbin 產生一個 shell 檔(我把執行檔檔名就叫做 "mail"):

nano /opt/sbin/mail

填入以下內容:

#!/bin/sh

#path to sendmail
SENDMAIL='/opt/sbin/sendmail'

while [ -n "$(echo $1 | grep '-')" ];
do
 case $1 in
  -s) SUBJECT=$2
      shift;;
  -r) RECEIVER=$2
      shift;;
  -m) MESSAGE=$2
      shift;;
  -f) FROM=$2
      shift;;
 esac
 shift
done

# You must at least have mail subject and receiver
if [ -z "$SUBJECT" ] || [ -z "$RECEIVER" ]
then
  echo "Usage: `basename $0` -s <subject> -r <receiver> [-f <sender>] [-m <text>]"
  exit
fi

if [ ! -z "$FROM" ]
then
  SENDMAIL="$SENDMAIL $RECEIVER -f $FROM"
else
  SENDMAIL="$SENDMAIL $RECEIVER"
fi

(
echo "To: <$RECEIVER>"
if [ ! -z "$FROM" ]
then
  echo "From: <$FROM>"
fi
echo "Subject: $SUBJECT"
echo ""
echo "$MESSAGE"
) | (eval $SENDMAIL)

最後存檔,記得變更檔案屬性成可執行:

chmod 755 /opt/sbin/mail

這個執行檔可以用參數的形式用一行命令列寄信出去,用法如下:

Usage: mail -s <subject> -r <receiver> [-f <sender>] [-m <text>]

-s 後面帶的是郵件標題,-r 帶的是收件者,-f 可以指定你寄出去的寄件者,-m 則是郵件的內容了。使用的範例:

mail -s "這是郵件主旨" -r receiver@domain.com -f sender@domain.com -m "信件的內容"

這個 mail 工具很好用,當系統出錯時可以指定執行寄發通知給你,也可以設在 crontab 裡面向你定期回報系統狀態,不需要架設郵件伺服器就可以做到了喔!(其實如果機器整個當掉,mail 也別想寄出去了~)

參考文章:
esmtp Turorial

回應: 0

張貼留言

歡迎留言或發表意見,不過要理性不做人身攻擊。匿名的朋友得到回應的速度會比較慢喔~
發問相關的禮貌和規矩請先參考這篇文章,不當留言、和本文無關的回應可能會被直接刪除無視喔!