數位天堂

Nokia:科技始終來自於人性; 拜耳:如果文明不能使我們更相愛,那科技便失去意義!
歡迎您的加入,讓我們一起討論科技與環保的整合應用...

您尚未登入。

#1 2008-05-15 00:14:10

lubyhung
新生
註冊日期: 2008-05-07
文章數: 7
目前積分 :   
網站

輕巧的 Mail Agent (esmtp)

轉自: http://abintech.azhai.org/search/label/WL-500g%20HACK


輕巧的 Mail Agent (esmtp)


作者: Abin   Taipei, Taiwan

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 -r [-f ] [-m ]" 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 -r [-f ] [-m ]


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

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


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

參考文章:
esmtp Turorial



最後修改: lubyhung (2008-05-15 00:15:28)


離線

 

相關討論主題

主題 回覆 點閱 最後發表
Mail Agent - msmtp 作者 a00403a
0 5125 2016-08-14 02:15:56 作者 a00403a
Baresip, SIP user agent 作者 hippo
0 7429 2014-01-12 21:00:53 作者 hippo
如何設定DHCP Relay Agent? 作者 tsengleoo
0 6887 2013-08-28 16:33:18 作者 tsengleoo
0 9721 2011-05-16 23:40:32 作者 hippo
2 18870 2008-12-28 06:16:55 作者 kav

友情連結

論壇頁尾

Powered by PunBB
© Copyright 2018 Rickard Andersson
RSS Feed