ラズベリーパイなどのサードパーティー製の端末からインターネットを通じてGメール送信するためには、Googleアカウントのセキュリティ設定の変更が必要。
以下その手順。
Googleアカウントの設定
まずGmailにログインして右上のアカウントアイコンをクリック。
Googleアカウントをクリック。
セキュリティタブをクリック。
安全性の低いアプリのアクセスという項目までスクロールして「アクセスを有効にする(非推奨)」をクリック。
安全性の低いアプリの許可:無効と表示されている右側のボタンをクリック。
ボタンが青く変化して安全性の低りアプリの許可:有効と表示が変わる。
設定は以上でOK。
安全性の低りアプリの許可を有効にするとすぐにGoogleから「重大なセキュリティ通知」というタイトルで以下のようなメールが到着する。
セキュリティ上は危険度が上がったということなので、ここから先は自己責任でということになる。
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)) # メールが正常に送信されたときのメッセージ
コメント
はじめまして。
今月からラズパイにチャレンジしている超初心者です。
3B+にて下記のようなエラーが出てしまうのですが、
よくわかりません。
ご教授頂けないでしょうか?
>>> %Run sendGmailPi.py
メール送信中…
except: ‘ascii’ codec can’t encode character ‘\u300a’ in position 1: ordinal not in range(128)
よろしくお願い致します。
こんばんは、ラズパイ超初心者さん。管理人です。
エラーメッセージからの憶測ですが、サンプルコードの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”
などのようにして設定し直してください。
なお、サンプルコードの方は分かりやすく訂正させていただきました。
以上、お役に立てるかわかりませんが、ご確認お願いします。
管理者様
早速のレスありがとうございます。
ご指摘の通り22、23、29行を入力し直しましたら送信する事が出来ました!
入力が全角のところがどこかにあったという事いうですので、多分23行
パスワードが全角になっていたと思われます。
送受信のメアドはコピペ入力したので。
‘ascii’ codec can’t encode characterというエラーをググって日本語入力ヌンヌンまでは
たどり付けたのですが、‘\u300a’ in position 1:っが何を指すまではわかりませんでした。
大変わかりやすくご丁寧に教えて頂きましてありがとうございました。
メール送信ができたようで良かったです。
自分としてはエラーメッセージにはいつも勉強させてもらっています。
今回もエラーメッセージを教えて頂いたので原因に辿り着きました。ありがとうございました!
元ラズパイ超初心者 より