目的
自宅で使っているルータからDHCPで配布されているRaspberryPIのIPアドレスを取得し、
Gmailへ取得情報を送信することが目的です。
勿論固定IPで運用している場合、このメール処理は不要ですが、
DHCPで運用している環境ならばこれがあると便利かなと思っています。
事前準備
下記の手順で送信専用のGmailのアカウントを作成します。
①下記の画面で「アカウントを作成」ボタンを押下します。
②「自分用」を選びます。
③「基本情報」を入力します。
④電話番号で認証するため、携帯の電話番号を入力する必要があります。
⑤携帯へSMSからきた確認コードを入力します。
⑥「基本情報」を入力します。
⑦「スキップ」を選びます。
⑧「プライバシー ポリシーと利用規約」を確認します。
⑨「同意する」ボタンを押下します。
⑩Googleを確認します。「Gmail」リンクボタンを押下します。※既に登録情報を基にログイン済みの状態です。
⑪Gmail画面が表示されます。
これで送信専用のGmailの登録は完了です。
メール送信用のソースを用意します。
下記のソースを「mail.py」ファイル名に保存します。
※注意事項:メール送信のため、下記の2か所には送信専用のメールアドレスとパスワードを記載する必要があります。
そしてRaspberryPIのIP情報を受け取る宛先メールアドレスの指定が必要です。
■送信専用のメールアドレス情報を設定
userid = 'send mail address'
userpw = 'send mail password'
■RaspberryIPのIP情報を受け取るメールの宛先を設定
to_mail = 'to mail address'
■ソースの中でIP情報を設定する箇所
sub_ip=get_ip_address('lo')
※使ってないので、無視しても問題ないです。
host_ip=get_ip_address('eth0')
※Wifiを使っている場合は、「wlan0~9」を指定します。
global_ip=getip()
※家に使っているGlobalのIPアドレスが取得されます。
■mail.pyソース
# !/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import socket
import fcntl
import struct
import subprocess
import sys
########## Global IP ##########
def getip():
cwd='./'
cmdline = 'curl ipv4.icanhazip.com'
p = subprocess.Popen (cmdline, shell=True, cwd=cwd, stdin=subprocess.PIPE,
stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
close_fds=True)
(stdouterr, stdin) = (p.stdout, p.stdin)
if sys.version_info.major == 3:
i=0
while True:
line = str (stdouterr.readline (), encoding='utf-8')
if not line:
break
if i == 3:
return line.strip()
i=i+1
else:
i=0
while True:
line = stdouterr.readline ()
if not line:
break
if i == 3:
return line.strip()
i=i+1
ret = p.wait ()
######## Ethernet Local IP #######
def get_ip_address(ifname):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
return socket.inet_ntoa(fcntl.ioctl(
s.fileno(),
0x8915, # SIOCGIFADDR
struct.pack('256s', ifname[:15])
)[20:24])
######## SendMail #######
def sendMail():
######## Ethernet IP #########
sub_ip=get_ip_address('lo')
host_ip=get_ip_address('eth0')
global_ip=getip()
######## Mail Setup ##########
userid = 'send mail address'
userpw = 'send mail password'
smtp_host = 'smtp.gmail.com'
smtp_port = 587
from_mail = userid
to_mail = 'to mail address'
######## Mail Content ########
subject = '[raspberry pi]ip = ' + str(host_ip)
message = 'host_ip=' + str(host_ip) + '\n' + 'global ip=' + str(global_ip) + '\n'
######## Mail Message Setting #############
msg = MIMEMultipart('alternative')
msg['Subject'] = subject
msg['From'] = from_mail
msg['To'] = to_mail
msg.attach(MIMEText(message, 'plain'))
######## Mail ##########
server = smtplib.SMTP(smtp_host, smtp_port)
server.ehlo()
server.starttls();
server.login(userid, userpw)
server.sendmail(from_mail, to_mail, msg.as_string())
server.close()
if __name__ == '__main__' :
sendMail()
RaspberryPIでソースを実行。
①mail.pyを実行します。
下記のエラーが発生している場合、取得するEthのIPが正しく取得されてないからです。
Ethの名が合っているか確認してください。
私は無線でしたので、「eth0→wlan0」に変更しました。
※例外処理が入ってません。>。<
pi@raspberrypi:~ $ python mail.py
Traceback (most recent call last):
File "mail.py", line 94, in <module>
sendMail()
File "mail.py", line 62, in sendMail
host_ip=get_ip_address('eth0')
File "mail.py", line 54, in get_ip_address
struct.pack('256s', ifname[:15])
IOError: [Errno 99] Cannot assign requested address
②上記のethの名を変更し、再実行します。
次は下記のエラーメッセージが表示されます。
※パスワードを正しく入力しましたが、表示されるエラーです。これはセキュリティの設定を変える必要があります。
pi@raspberrypi:~ $ python mail.py
Traceback (most recent call last):
File "mail.py", line 94, in <module>
sendMail()
File "mail.py", line 88, in sendMail
server.login(userid, userpw)
File "/usr/lib/python2.7/smtplib.py", line 623, in login
raise SMTPAuthenticationError(code, resp)
smtplib.SMTPAuthenticationError: (535, '5.7.8 Username and Password not accepted. Learn more at\n5.7.8 https://support.google.com/mail/?p=BadCredentials e12sm2747045pgv.16 - gsmtp')
pi@raspberrypi:~ $
③下記の画面で「Googleアカウントを管理」ボタンを押下します。
※Gmailではデフォルトで2段階認証プロセスが走っているようですので、安全性の低いアプリがアカウントにアクセスすることを許可する必要があります。
④下記の画面で左側にある「セキュリティ」メニューを押下します。
⑤セキュリティ画面が表示されます。下記の手順でセキュリティを「Off→On」に設定します。
★「安全性の低いアプリのアクセス」内容を探します。★
★下記の内容で「アクセスを有効にする(非推薦)」リンクを押下します。★
⑥mail.pyを再実行します。
下記の2回目の実行は問題なく実行されていることが確認できます。Gmailを確認します。
pi@raspberrypi:~ $ python mail.py
Traceback (most recent call last):
File "mail.py", line 94, in <module>
sendMail()
File "mail.py", line 88, in sendMail
server.login(userid, userpw)
File "/usr/lib/python2.7/smtplib.py", line 623, in login
raise SMTPAuthenticationError(code, resp)
smtplib.SMTPAuthenticationError: (535, '5.7.8 Username and Password not accepted. Learn more at\n5.7.8 https://support.google.com/mail/?p=BadCredentials e12sm2747045pgv.16 - gsmtp')
pi@raspberrypi:~ $ python mail.py
pi@raspberrypi:~ $
⑦Gmailを確認画面です。
1番目のメールが先ほど、Pythonコードを実行してメールが送信されたメールです。
メールの本文を確認します。これでPythonコードからGmailへ送信ができました。
⑧RaspberryPIが起動される場合、自動でメール送信するためには下記のファイルに次のコマンドを記載します。
追加するコマンドです。コマンドを追加した後、RaspberryPIを再起動します。(sudo reboot)
/usr/bin/python /home/pi/mail.py &
pi@raspberrypi:~ $ cat /etc/rc.local
# !/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
printf "My IP address is %s\n" "$_IP"
fi
/usr/bin/docker start LAMP &
/usr/bin/python /home/pi/mail.py &
exit 0
pi@raspberrypi:~ $
⑨RaspberryPIが起動されて2回目のメールが届いている画面です。
終わりに
これでRaspberryPIを起動し、ip情報をメールに受け取ることができました。
ipアドレス以外に現在のsdカードの容量なども送信できるといいですね。
下記のコマンドで情報取得は可能ですので、皆さん、ご自身で試してみてください。
pi@raspberrypi:~ $ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/root 59G 9.3G 47G 17% /
devtmpfs 841M 0 841M 0% /dev
tmpfs 970M 0 970M 0% /dev/shm
tmpfs 970M 9.6M 961M 1% /run
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 970M 0 970M 0% /sys/fs/cgroup
/dev/mmcblk0p1 253M 53M 200M 22% /boot
tmpfs 194M 0 194M 0% /run/user/1000
pi@raspberrypi:~ $