使用shell發送郵件,方便快捷
前言
很多時候我們需要發送郵件,比如定時任務,比如郵件驗證碼等等。
各大編程語言都可以實現發送郵件功能,但還是太麻煩了,所以通過tcpdump抓包發現smtp發送郵件原理還是很簡單嘛。
所以就想着能不能通過shell搞定,這樣在Linux平台下就很通用,不必準備各種安裝環境啥的。
鑒賞代碼
該腳本需要安裝
sudo apt-get install expect telnet
這兩個工具,一個負責tcp連接到smtp服務器,一個負責收髮指令。
執行./mail.sh [email protected] password [email protected] sendMsg 123456
命令即可發送一封郵件。
需要注意的是現在各大郵件服務器發送郵件的密碼是授權碼,而不是登錄郵箱密碼。
可以試着使用編程語言發送複雜郵件,通過tcpdump抓包分析發送郵件的具體機制,自行模擬一下下就ok了。
#!/bin/bash
user=$1
pass=$2
to=$3
subject=$4
data=$5
username=$(echo -n $user | base64)
password=$(echo -n $pass | base64)
expect <<EOF
spawn telnet smtp.163.com 25
expect "220 163.com*"
send "EHLO localhost\n"
expect "250 8BITMIME"
send "AUTH LOGIN\n"
expect "334 dXNlcm5hbWU6"
send "$username\n"
expect "334 UGFzc3dvcmQ6"
send "$password\n"
expect "235 Authentication successful"
send "MAIL FROM:<$user> BODY=8BITMIME\n"
expect "250 Mail OK"
send "RCPT TO: <$to>\n"
expect "250 Mail OK"
send "DATA\n"
expect "354 End data with <CR><LF>.<CR><LF>"
send "Mime-Version: 1.0\n"
send "From: <$user>\n"
send "To: $to\n"
send "Subject: $subject\n"
send "Content-Type: text/plain; charset=UTF-8\n"
send "Content-Transfer-Encoding: quoted-printable\n\n"
send $data
send "\n.\n"
expect "250 Mail OK*"
send "QUIT\n"
expect EOF
EOF
總結
該腳本解決了我的發送郵件驗證碼的小需求,以前都是通過編程語言去實現,有些有依賴,各種準備環境也麻煩。
而使用上述腳本可以靈活的滿足各種需求,需要改動時直接修改shell腳本就ok了。媽媽再也不用擔心我發郵件麻煩了。