使用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了。媽媽再也不用擔心我發郵件麻煩了。