Wi-Fi接続したRaspberry Pi Pico Wからメール送信

技術開発MicroPython,Raspberry Pi Pico

概要

組込デバイスからの通知はLINEやslackが流行っているようですが、環境によってはメール送信の方が都合がいいこともあるかと思います。ここではGmailの送信サーバーを使ってメールを送信する方法を解説します。

実行環境

MCU:Raspberry Pi Pico W
IDE:Thonny 4.1.4(Python:3.10.11)
MicroPython:RPI_PICO_W-20240602-v1.23.0.uf2

MicroPythonの書き込み、Thonnyの環境構築は完了している前提で進めます。Lチカが出来ていれば十分です。

参考サイト

Googleのアプリパスワードを取得

Gmailの送信元に使いたいアカウントでGoogleにログインし、以下のリンク先でGoogleのアプリパスワードを取得します。

https://myaccount.google.com/apppasswords

後で見てわかりやすいアプリ名を入力し、「作成」をクリックします。

    アプリパスワードが表示されるので、どこかにメモしてください。後ほどプログラムで使用します。

    メール送信ライブラリ「uMail」の導入

    このライブラリはパッケージ管理ツールに登録されていないので、手動で導入が必要になります。
    まずGithubのuMailのページを開きます。

    https://github.com/shawwwn/uMail/blob/master/umail.py

    Thonnyで新規ファイルを作成し、ソースコードをコピペします。
    コピペをしたらCtrl+Fで検索画面を開き「ussl」と検索、すべて「ssl」に置き換えてください。
    ※MicroPython-v1.23からライブラリ名が変わったようです。

    コピペをしたら[ファイル] – [名前を付けて保存]をクリックします。
    以下のように保存先の選択肢が出るので「Raspberry Pi Pico」を選択します。

    保存のダイアログが開くので「umail.py」というファイル名で保存します。

    main.pyのコーディング

    準備が整ったのでmain.pyのコーディングに入ります。以下のコードをコピペしてください。
    詳しい意味は参考サイトを参照してください。

    ****となっている各パラメータは以下を入力してください

    sender_email送信元メールアドレス
    ※アプリパスワードを取得したアカウントのアドレスを入れてください。
    sender_app_passwordアプリパスワード
    先ほど取得したアプリパスワードを入れます。
    recipient_email送信先メールアドレス
    ssidWi-FiのSSID
    passwordWi-Fiのパスワード
    import umail
    import network
    import time
    
    # Your email details
    sender_email = '**********@gmail.com'
    sender_name = 'RaspberryPiPico'
    sender_app_password = '****************'
    recipient_email ='**********@gmail.com'
    email_subject ='Email from RPi Pico'
    
    # Your network credentials
    ssid = '**********'
    password = '**********'
    
    #Connect to Wi-Fi
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    wlan.connect(ssid, password)
    
    # Wait for connection to establish
    max_wait = 10
    while max_wait > 0:
        if wlan.status() < 0 or wlan.status() >= 3:
                break
        max_wait -= 1
        print('waiting for connection...')
        time.sleep(1)
        
    # Manage connection errors
    if wlan.status() != 3:
        raise RuntimeError('Network Connection has failed')
    else:
        print('connected')
    
    
    # Send email once after MCU boots up
    smtp = umail.SMTP('smtp.gmail.com', 465, ssl=True)
    smtp.login(sender_email, sender_app_password)
    smtp.to(recipient_email)
    smtp.write("From:" + sender_name + "<"+ sender_email+">\n")
    smtp.write("Subject:" + email_subject + "\n")
    smtp.write("This is an email from Raspberry Pi Pico")
    smtp.send()
    smtp.quit()
    print('E-Mail Sent')
    

    動作確認

    「現在のスクリプトを実行」をクリックします。「connected」と出ればWi-Fi接続に成功、「E-Mail Sent」と出ればメール送信完了です。上手くいけば送信元の送信済みボックスと送信先の受信ボックスにメールがあるはずです。