2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

RaspberryPIを起動し、IP情報をGmailへ送信

Last updated at Posted at 2020-05-28

目的

自宅で使っているルータからDHCPで配布されているRaspberryPIのIPアドレスを取得し、
Gmailへ取得情報を送信することが目的です。
勿論固定IPで運用している場合、このメール処理は不要ですが、
DHCPで運用している環境ならばこれがあると便利かなと思っています。

事前準備

下記の手順で送信専用のGmailのアカウントを作成します。
①下記の画面で「アカウントを作成」ボタンを押下します。
image.png
②「自分用」を選びます。
image.png
③「基本情報」を入力します。
image.png
④電話番号で認証するため、携帯の電話番号を入力する必要があります。
image.png
⑤携帯へSMSからきた確認コードを入力します。
image.png
⑥「基本情報」を入力します。
image.png

⑦「スキップ」を選びます。
image.png
⑧「プライバシー ポリシーと利用規約」を確認します。
image.png
image.png
⑨「同意する」ボタンを押下します。
⑩Googleを確認します。「Gmail」リンクボタンを押下します。※既に登録情報を基にログイン済みの状態です。
image.png
⑪Gmail画面が表示されます。
これで送信専用のGmailの登録は完了です。
image.png

メール送信用のソースを用意します。

下記のソースを「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段階認証プロセスが走っているようですので、安全性の低いアプリがアカウントにアクセスすることを許可する必要があります。
image.png
④下記の画面で左側にある「セキュリティ」メニューを押下します。
image.png
⑤セキュリティ画面が表示されます。下記の手順でセキュリティを「Off→On」に設定します。
★「安全性の低いアプリのアクセス」内容を探します。★
image.png

★下記の内容で「アクセスを有効にする(非推薦)」リンクを押下します。★
image.png

★OffになっているボタンをOnに変更します。★
image.png

★Onに変更した画面です。★
image.png

⑥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コードを実行してメールが送信されたメールです。
image.png

メールの本文を確認します。これでPythonコードからGmailへ送信ができました。
image.png

⑧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回目のメールが届いている画面です。
image.png

終わりに

これで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:~ $
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?