樹莓派3自帶了WiFi,所以一般買來之后插上電配置好WiFi就扔在一個地方不用管了.但是在有些地方獲取樹莓派的IP確實(shí)是比較麻煩的一件事,比如用的是學(xué)校的網(wǎng)絡(luò),學(xué)校每天會斷網(wǎng),或者使用的是租房的網(wǎng)絡(luò),不知道路由器密碼的情況.這時,如果能夠有一種方法讓樹莓派自動發(fā)送IP地址給我,將是一件特別方便的事情.我使用的是通過發(fā)郵件的方式,讓樹莓派每次啟動之后自動發(fā)送郵件將IP發(fā)給我,我在手機(jī)上查看就好.
配置msmtp和mutt自動發(fā)送郵件
發(fā)送郵件的原理我也懂得不多,主要是參考的網(wǎng)上的教程,我參考的是這一篇:[原創(chuàng)] 讓樹莓派自動上報IP地址到郵箱.作者寫的很清楚,不過這篇文章是在Arch系統(tǒng)下面配置的,我是用的Raspbian系統(tǒng),所以我簡單說下我的配置過程,給使用Raspbian的同學(xué)參考.步驟還是盡量按照原文中的步驟:)
1.安裝msmtp和mutt
一句話介紹下這兩個軟件分別是做什么的:
mutt: 是一個Linux下的郵件程序,Mutt 更像一個文件管理器,只不過它管理的是email。它的功能是借助各個其他的程序來實(shí)現(xiàn)的
msmtp: 是Linux下一個非常簡單易用的smtp客戶端。利用這個我們便可以發(fā)送郵件。
(這兩句話引用自此,表示感謝)
Debian系列裝軟件很方便,直接apt就可以.
sudo apt install msmtp
sudo apt install mutt
這兩個軟件都不大,應(yīng)該很快就能裝好.
2.配置msmtp和mutt
裝好軟件之后,要分別為這兩個軟件編輯配置文件.這里的配置方法與參考文章中稍有不同,我當(dāng)時在這里困惑了好久才搞定.
首先,配置文件的內(nèi)容和參考文章基本相同.先配置msmtp,在用戶的根目錄下新建文件.msmtprc,內(nèi)容如下:
account default
host smtp.aliyun.com
from 你的郵箱地址
auth plain
user 你的郵箱地址
password 你的郵箱密碼
logfile /var/log/msmtp.log
這里我對配置文件的內(nèi)容稍微解釋一下.需要我們自己修改的主要是host,from,user,password和logfile這幾項.
- host 你的郵箱的SMTP服務(wù)器地址,可以在郵件的網(wǎng)站上查到,我用的阿里云的郵箱,所以是aliyun.com后綴
- from 這里是發(fā)件人地址,在收件方會顯示,設(shè)置成你給樹莓派申請的郵箱地址
- user 這里是用戶名,網(wǎng)上有用戶說這里設(shè)置郵箱的用戶名即@符號前面的字符串就可以,我沒有嘗試,還是設(shè)置的我的郵箱地址,建議先使用郵箱地址,配置成功之后可以自己進(jìn)行修改
- password 這個就是自己郵箱的密碼,沒什么好說的,但是這里是明文密碼,要注意保密:)
- logfile 這是msmtp的程序運(yùn)行日志文件路徑,需要自己創(chuàng)建,msmtp自己不會創(chuàng)建.在發(fā)送郵件之后程序會把發(fā)送日志寫到這個路徑的文件里,這里的路徑是在/var下面,我前幾次使用的時候都由于沒有寫權(quán)限而不能把日志寫進(jìn)去,所以如果你也使用Raspbian并且不是root用戶的話你也應(yīng)該會遇到權(quán)限問題寫不進(jìn)去,這里要修改下文件所有者,使用chown命令把這個文件修改為pi用戶所有就OK了.當(dāng)然你也可以選擇在根目錄下自己建立一個文件作為log文件,那樣也不會有權(quán)限問題.
這里要說明的一點(diǎn)是由于在這個文件中密碼是明文保存,msmtp考慮到安全問題,會要求強(qiáng)制設(shè)置文件訪問權(quán)限為600,所以在寫好配置文件之后,需要手動修改文件權(quán)限為600,使用命令: chmod 600 .msmtprc
.另外說下我在這里遇到的一個經(jīng)驗,我在最開始給樹莓派申請郵箱的時候使用的是網(wǎng)易163的郵箱,但是配置之后,進(jìn)行發(fā)送的時候總是報錯發(fā)送失敗,原因是郵箱服務(wù)器響應(yīng)554,認(rèn)為我的郵件不合法.我開始還以為是我配置出錯了,后來換了郵箱試了下才知道是網(wǎng)易郵箱的監(jiān)測機(jī)制太嚴(yán)格了,拒絕接受發(fā)送請求,不是我的設(shè)置的錯誤.這里讓我浪費(fèi)了2天的時間,所以后來申請阿里郵箱之后,嘗試發(fā)送成功才知道我的配置沒問題.如果有人在這里遇到發(fā)送失敗,并且錯誤碼也是服務(wù)器拒絕的話,建議嘗試一個其他郵箱試試,說不定是郵箱服務(wù)器端的問題.
下面配置mutt的文件,同樣在用戶根目錄下新建文件.muttrc,內(nèi)容如下:
set sendmail="/usr/bin/msmtp"
set use_from=yes
set realname="RaspberryPi"
set editor="vim"
這里我也對配置文件解釋一下,配置不多,就4條.
-
sendmail 這個是用來發(fā)送郵件的程序,mutt其實(shí)是一個上層應(yīng)用,負(fù)責(zé)編輯郵件內(nèi)容和添加附件,實(shí)際發(fā)送要依賴別的發(fā)送程序.這里我們使用的是msmtp,就在這里寫msmtp的路徑.查看msmtp的路徑可以用命令
whereis msmtp
.最后要注意msmtp路徑名要用雙引號引起來. - use_from 按我的寫就行.說實(shí)話,這個我也不知道是什么意思~
- realname 這個是發(fā)送郵件之后,收件方顯示的發(fā)件人的名字,注意也要用引號引起來
- editor 這個是使用mutt寫郵件的時候默認(rèn)的編輯器.我是emacs用戶. ##
一共配置的內(nèi)容就這么多,很簡單.配置完之后就可以試著發(fā)一封郵件了,發(fā)送命令為:
echo “hello world” | mutt -s “title” xxx@gmail.com
其中echo后面的內(nèi)容是郵件的正文,mutt -s 后面的引號內(nèi)是郵件的主題,xxx@gmail.com是收件人的地址.如果配置沒問題的話,你的郵箱應(yīng)該能收到郵件了,下一步我們要設(shè)置樹莓派在開機(jī)之后自動獲取IP地址并發(fā)送郵件.
3.設(shè)置樹莓派開機(jī)自動提取IP地址并發(fā)郵件給指定用戶
前面寫了這么多,看起來已經(jīng)離完成一步之遙了,但是我還是在這里被坑了2天,這里遇到的問題也是促使我寫這篇文章的原因.一步步來說.按照參考文章的內(nèi)容,我直接用的他的shell腳本去檢測網(wǎng)絡(luò)是否通暢,然后獲取IP地址并發(fā)郵件,這個文章的作者寫的很棒,我把腳本拿來直接就可以用,我也就不針對腳本詳細(xì)去解釋了.在這里我再把這個腳本copy一遍,當(dāng)做原文的備份吧.
send-ip-mail.sh腳本的內(nèi)容如下:
#!/bin/bash
# check network availability
while true
do
TIMEOUT=5
SITE_TO_CHECK="www.126.com"
RET_CODE=`curl -I -s --connect-timeout $TIMEOUT $SITE_TO_CHECK -w %{http_code} | tail -n1`
if [ "x$RET_CODE" = "x200" ]; then
echo "Network OK, will send mail..."
break
else
echo "Network not ready, wait..."
sleep 1s
fi
done
# get the IP address of eth0, e.g. "192.168.16.5"
ETH0_IP_ADDR=`ifconfig eth0 | sed -n "2,2p" | awk '{print substr($2,1)}'`
# send the Email
echo "Current time: `date '+%F %T'`. Enjoy it" | mutt -s "IP Address of Raspberry Pi: $ETH0_IP_ADDR" xxx@gmail.com
這里再嘮叨一下,這個腳本中獲取的是eth0的IP地址,如果你使用的是WiFi的話,那么要改成wlan0,我自己就是用的WiFi.還有獲取IP地址這一句,這個腳本中的命令是沒問題的,但是我偶然發(fā)現(xiàn)了一個更簡潔的命令,是在/etc/rc.local
里面,樹莓派的這個文件中都默認(rèn)有一個獲取IP的shell語句,是IP=\
hostname -I` `可以自己修改下,更加簡潔~
腳本寫好之后,添加可執(zhí)行權(quán)限,然后直接運(yùn)行一遍,看看是否可以正常發(fā)送郵件,并打印log到指定文件中.如果有問題,參考log返回的信息加Google,應(yīng)該很快可以解決.
4.我的經(jīng)驗:用戶執(zhí)行權(quán)限問題
下面就是添加開機(jī)自動執(zhí)行了,前面已經(jīng)提到過,在Raspbian系統(tǒng)中,把要執(zhí)行的命令或者腳本寫到/etc/rc.local
文件中就OK了,按道理來說樹莓派就可以按照我們的想法,開機(jī)等待獲取IP,然后發(fā)送郵件.參考的文章也是到這里就結(jié)束了.但是我在執(zhí)行完這些之后,重啟路由器卻沒有收到樹莓派發(fā)到的郵件,然后我嘗試登錄進(jìn)去手動執(zhí)行這個腳本就可以發(fā)送成功,甚至我把/etc/rc.local
里面的這條腳本執(zhí)行語句拷出來執(zhí)行都可以發(fā)送成功.但是就是在樹莓派自動執(zhí)行時卻不會收到郵件,我檢查了發(fā)送日志確實(shí)有等待網(wǎng)絡(luò)暢通的語句,也有發(fā)送成功的語句.我還在這里添加打印語句調(diào)試了好久.最終在網(wǎng)上瀏覽別的信息的時候發(fā)現(xiàn)的一句話提示了我:用戶權(quán)限問題.原來是我上面配置.muttrc和.msmtprc的時候都是在用戶的根目錄下配置的,也就是pi用戶的家目錄中,所以我手動以pi身份執(zhí)行的時候是成功的,因為msmtp和mutt都匹配到了正確的配置文件.但是在開機(jī)自動執(zhí)行的時候,執(zhí)行的用戶變成了root用戶,這時兩個程序會去root的家目錄下尋找配置文件,這當(dāng)然找不到,所以就會發(fā)送失敗,但是我卻看不到發(fā)送失敗的原因,并且手動執(zhí)行的話還能成功.這個原因?qū)嵲谑请y以想到.最后我的解決辦法是復(fù)制了一份兩個程序的配置文件到/root目錄下面,然后用root用戶手動發(fā)送一次,確認(rèn)能發(fā)送成功,然后再重啟一遍,就能看到樹莓派自己也可以發(fā)送了.還有一個解決辦法是msmtp和mutt都支持全局的配置文件,好像是/etc/Msmtprc
和/etc/Muttrc
,但是我沒有嘗試這種方法.我想如果使用全局配置文件的話,可能也就不會遇到我的這個問題了.