Python:ラズベリーパイでGmail送信出来るようにする

ラズベリーパイのロゴ Python

ラズベリーパイなどのサードパーティー製の端末からインターネットを通じてGメール送信するためには、Googleアカウントのセキュリティ設定の変更が必要
以下その手順。

Googleアカウントの設定

まずGmailにログインして右上のアカウントアイコンをクリック。

ラズベリーパイでGmail送信出来るようにする

Googleアカウントをクリック。

ラズベリーパイでGmail送信出来るようにする

セキュリティタブをクリック。

ラズベリーパイでGmail送信出来るようにする

安全性の低いアプリのアクセスという項目までスクロールして「アクセスを有効にする(非推奨)」をクリック。

ラズベリーパイでGmail送信出来るようにする

安全性の低いアプリの許可:無効と表示されている右側のボタンをクリック。

ラズベリーパイでGmail送信出来るようにする

ボタンが青く変化して安全性の低りアプリの許可:有効と表示が変わる。

ラズベリーパイでGmail送信出来るようにする

設定は以上でOK。

安全性の低りアプリの許可を有効にするとすぐにGoogleから「重大なセキュリティ通知」というタイトルで以下のようなメールが到着する。
セキュリティ上は危険度が上がったということなので、ここから先は自己責任でということになる。

ラズベリーパイでGmail送信出来るようにする

Gmail送信サンプルコード

実際にラズベリーパイでメール送信できるかどうかのチェック用にメール送信サンプルコードを掲載しておく。

各自のGmailアカウントに合わせて以下の行の修正が必要

22行 Gmailアドレス
23行 Gmailパスワード
29行 送信先のメールアドレス

実行方法

sudo python3 sendGmailPi.py

sendGmailPi.py

#!/usr/bin python3
# -*- coding: utf-8 -*-

"""
	ラズパイ(Raspberry Pi)でGmail送信をやってみる
		python 3.2.5
		OS: Rasbian(Raspberry Pi Model B)
"""

# メール送信のためのSMTPセッションクライアントを作成するため
import smtplib

# メールの送信日付をインターネットで送信できるフォーマットで指定するため
from email.utils import formatdate

# メール本文に日本語を送信できるようにするためのMIME規格に変換するため(E-mailも基本は英語圏でできた規格なのです!)
from email.mime.text import MIMEText

if __name__ == "__main__":

	# Gmailアカウント設定
	gmail_addr = "Gmailアドレス"	# 記述例)gmail_addr = "hogehoge@gmail.com"
	gmail_pass = "Gmailパスワード"	# 記述例)gmail_pass = "abc123xyz"
	SMTP = "smtp.gmail.com"
	PORT = 587

	# 送信メール情報
	from_addr = gmail_addr			# 送信元メールアドレス(Gmailでなくてもよい)
	to_addr = "送信先メールアドレス"		# 記述例)to_addr = "helloworld@yahoo.com"
	subject = "ラズパイGmail送信テスト"		# 件名
	body = "ラズパイだよ!\n今日の調子はどうかな?"	# 本文
	# メールメッセージを作成
	msg = MIMEText(body, "plain", "utf-8")	# ラズパイのpython3では3つの引数でエンコードをutf-8にしないと
						# 'ascii' codec can't encode characters in position 0-14: ordinal not in range(128) というエラーがでる
	msg["From"] = from_addr
	msg["To"] = to_addr
	msg["Date"] = formatdate()			# 日付をインターネットで送信できるフォーマットで指定
	msg["Subject"] = subject

	# メール送信
	try:
		print("メール送信中...")
		send = smtplib.SMTP(SMTP, PORT)		# GmailのSMTPを利用してSMTPオブジェクトを生成
		send.ehlo()
		send.starttls()
		send.ehlo()
		send.login(gmail_addr, gmail_pass)	# Gmailにログイン
		send.send_message(msg)			# メールを送信
		send.close()
	except Exception as e:
		print("except: " + str(e))		# エラー送出時のメッセージ表示
	else:
		print("{0}へメール送信したよ!".format(to_addr))	# メールが正常に送信されたときのメッセージ

コメント

  1. ラズパイ超初心者 より:

    はじめまして。
    今月からラズパイにチャレンジしている超初心者です。
    3B+にて下記のようなエラーが出てしまうのですが、
    よくわかりません。
    ご教授頂けないでしょうか?

    >>> %Run sendGmailPi.py

    メール送信中…
     except: ‘ascii’ codec can’t encode character ‘\u300a’ in position 1: ordinal not in range(128)

    よろしくお願い致します。

    • shuichi より:

      こんばんは、ラズパイ超初心者さん。管理人です。
      エラーメッセージからの憶測ですが、サンプルコードの22、23、29行目の記述を以下のようにされているのではないでしょうか?
      (メールアドレス自体は例ですのでラズパイ超初心者さんが利用するメールアドレスに置き換えて考えてください)

      22行目
      gmail_addr = "《hogehoge@gmail.com》"

      23行目
      gmail_pass = "《abc123xyz》"

      29行目
      to_addr = "《helloworld@yahoo.com》"

      なぜそう思ったかといいますとエラーメッセージにある‘\u300a’の部分が気になったからです。
      ‘\u300a’は、全角文字の《を表しています。メールアドレスに全角文字が紛れ込んでいるので送信できないのではないかと思われます。
      わたしにも非があります。

      gmail_addr = “《Gmailアドレス》”

      などとサンプルコードに記述してあったので、そのままメールアドレスを当てはめてしまうと

      gmail_addr = “《hogehoge@gmail.com》”

      などとなってしまうからです。
      というわけで、もし上記のような形であれば失礼しました!

      《と》の文字は必要ありませんので、

      gmail_addr = “hogehoge@gmail.com”

      などのようにして設定し直してください。
      なお、サンプルコードの方は分かりやすく訂正させていただきました。

      以上、お役に立てるかわかりませんが、ご確認お願いします。

  2. ラズパイ超初心者 より:

    管理者様

    早速のレスありがとうございます。
    ご指摘の通り22、23、29行を入力し直しましたら送信する事が出来ました!

    入力が全角のところがどこかにあったという事いうですので、多分23行
    パスワードが全角になっていたと思われます。
    送受信のメアドはコピペ入力したので。

    ‘ascii’ codec can’t encode characterというエラーをググって日本語入力ヌンヌンまでは
    たどり付けたのですが、‘\u300a’ in position 1:っが何を指すまではわかりませんでした。

    大変わかりやすくご丁寧に教えて頂きましてありがとうございました。

    • shuichi より:

      メール送信ができたようで良かったです。

      自分としてはエラーメッセージにはいつも勉強させてもらっています。
      今回もエラーメッセージを教えて頂いたので原因に辿り着きました。ありがとうございました!

      元ラズパイ超初心者 より

タイトルとURLをコピーしました