2025年8月12日火曜日

gmail送信

  


今回はRaspberry Pi Pico Wを使って、MicroPythonでGmailを送信してみます。
手軽で便利だし、いろいろな場面で活用できそうです。

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 件のコメント:

コメントを投稿

Google Spread Sheetの利用

  以前に ESP32 で作っていたものを、Raspberry Pi Pico W + MicroPythonで再現してみました。 1.Googleスプレッドシートの設定 1.Google Drive → 右クリック → Google スプレッドシート 2.作成して共有をクリック