手軽で便利だし、いろいろな場面で活用できそうです。
1.Gmail側の設定
アカウント→セキュリティー→2段階認証プロセス→アプリ パスワード
ここでアプリ名を入力し作成ボタンを押します。
作成したパスワードを保存し、完了ボタンを押して前準備完了です。
2.ソースコード
import usocket as socket
import ussl as ssl
import network
import time
import ubinascii
# Wi-Fi 接続情報
SSID = 'あなたのSSID'PASSWORD = 'あなたのパスワード'
# Gmail情報
SMTP_SERVER = "smtp.gmail.com"
SMTP_PORT = 465
FROM_EMAIL = "your.email@gmail.com"
APP_PASSWORD = "your_app_password" # アプリパスワードを使う
TO_EMAIL = "recipient@example.com"
SUBJECT = "テストメール"
BODY = "これはRaspberry Pi Pico Wから送ったテストメールです。"
# Wi-Fi接続
def connect_wifi():
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(SSID, PASSWORD)
while not wlan.isconnected():
print("Wi-Fi接続中...")
time.sleep(1)
print("接続完了:", wlan.ifconfig())
# Base64 エンコード
def encode_base64(s):
return ubinascii.b2a_base64(s.encode()).strip().decode()
# メール送信関数
def send_email():
msg = f"From: {FROM_EMAIL}\r\nTo: {TO_EMAIL}\r\nSubject: {SUBJECT}\r\n\r\n{BODY}\r\n"
addr = socket.getaddrinfo(SMTP_SERVER, SMTP_PORT)[0][-1]
s = socket.socket()
s.connect(addr)
s = ssl.wrap_socket(s)
def send_cmd(cmd, expect="250"):
s.write((cmd + "\r\n").encode())
while True:
res = s.readline()
print(res)
if not res.startswith(expect.encode()):
raise Exception("Unexpected response:", res)
if res.startswith(expect.encode() + b' '):
break
s.readline() # サーバーの挨拶(220~)
send_cmd("EHLO pico", "250")
send_cmd("AUTH LOGIN", "334")
send_cmd(encode_base64(FROM_EMAIL), "334") # ユーザー名
send_cmd(encode_base64(APP_PASSWORD), "235") # アプリパスワード
send_cmd(f"MAIL FROM:<{FROM_EMAIL}>", "250")
send_cmd(f"RCPT TO:<{TO_EMAIL}>", "250")
send_cmd("DATA", "354")
s.write((msg + "\r\n.\r\n").encode())
print(s.readline())
send_cmd("QUIT", "221")
s.close()
# 実行
connect_wifi()
send_email()
実行結果
3.トラブルシューティング
MPY: soft reboot
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
ImportError: no module named 'ussl'
>>>
ImportError: no module named 'ussl'
というエラーは、MicroPythonファームウェアが ussl
モジュール(SSL通信)をサポートしていないエラーが発生する(;´・ω・)◆SSL対応のファームウェアを使う
↑これが対応していました。最新のバージョンは対応してなかったので注意(;´・ω・)
0 件のコメント:
コメントを投稿