/

Raspberry Pi 開機時自動寄送 IP 設定

前言

在使用 Raspberry Pi(以下簡稱為 Pi)時,如果每一次都要佔用一個電腦的 USB port 非常不方便,而且電腦輸出電壓不一定夠,如果條件允許,我們會希望將 Pi 用變壓器獨立插在插座上,再使用 SSH 這類的工具遠端操作。

但是要 SSH 前必須要知道 IP,我們希望讓 Pi 在開機完畢後自動將 IP 發送至自己的信箱。如此一來之後只要 Pi 有取得 IP 的話就會自動寄信,我們不必再透過 USB 線材以及 screen 指令進行連線。

寄信方式

要寄信的方式有兩種,一種是直接架設 SMTP server 來寄信,但是通常收信方會因為該信件的來源沒有 Domain Name 而不收信(惡意郵件),或是直接將信箱放置垃圾信件處理,所以不建議此種方式。

第二種方法則是利用 Gmail 提供的 SMTP server 來寄信(要自備 Gmail 帳號)。該方式需要先到 Google 低安全性應用程式存取權 允許低安全性應用程式來存取你的帳戶,請斟酌使用。

寄信腳本

請將以下欄位自行填入,並且賦予該腳本執行權限。(建議使用 Python2)

  • to
  • gmail_user
  • gmail_password
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/usr/bin/python
import subprocess
import smtplib
import socket
from email.mime.text import MIMEText
import datetime

# Which email address want to send
to = 'XXX'

# Using specific gmail account
gmail_user = 'XXX'
gmail_password = 'XXX'

# SMTP command
smtpserver = smtplib.SMTP('smtp.gmail.com', 587)
smtpserver.ehlo()
smtpserver.starttls()
smtpserver.login(gmail_user, gmail_password)
today = datetime.date.today()

# Linux Specific shell command
arg='ip route list'
p=subprocess.Popen(arg,shell=True,stdout=subprocess.PIPE)
data = p.communicate()
split_data = data[0].split()
ipaddr = split_data[split_data.index('src')+1]
my_ip = 'Your ip is %s' % ipaddr
msg = MIMEText(my_ip)
msg['Subject'] = 'IP For RaspberryPi on %s' % today.strftime('%b %d %Y')
msg['From'] = gmail_user
msg['To'] = to
smtpserver.sendmail(gmail_user, [to], msg.as_string())
smtpserver.quit()

開機時執行

/etc/rc.local 中執行 Script(mail.py)

1
2
3
4
5
6
7
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
printf "My IP address is %s\n" "$_IP"
/home/pi/mail.py
fi

exit 0