Sahara's WebLog

日記のような、備忘録のような、うらみつらみのような、自慢のような…。

ESP8266モジュール(ESP-WROOM-02)を試す その40 - メールを送る -

追記(2017/12/14)
コメントをもらったので1年半ぶりにスケッチを動かしてみたら、どれもタイム・アウトしてメールは送れなかった。
スケッチを若干直すと改善したので、それについてこちらに書いた

メールを送ると簡単に言っても、実はその仕組みすらよく理解していないので、ちょっと確認しておく。
とは言ってもESP8266からメールを送るのに必要な最低限の内容。

送信で使われるプロトコルが SMTP(Simple Mail Transfer Protocol) で、受信で使われるプロトコルが POP(Post Office Protocol) だ。
ここで言う「ESP8266でメールを送る。」というのは「『SMTPを使ってSMTPサーバに送信を指示する。』という作業をESP8266にやらせる。」ことを意味している。

と理解しているが、何せ付け焼刃なので、この解釈で正しいのかは良く分からない。

スケッチを1から自分で書けるわけも無いので、さまよった挙句に見つけたコードはここから拝借した。
以下、いただいたスケッチから変更した点だけを書く。
(1)Wi-Fi接続のためのSSIDとPassword
 変更してなければルータの裏に書いてあるやつでいいはず。
(2)送信に使うSMTPサーバーのアドレス
 自分が借りてるサーバーへ行って確認しておく。
(3)関数をあらかじめ宣言
 そのままだとコンパイル時に暗黙の宣言がらみのエラーが出る。
 プログラムのはじめの方で関数をあらかじめ宣言しておく。
esp8266_sendmail_01
 最初は 2525 となっていたが、connection failed になった。
 どこかでSMTPのポートは25がデフォルトのようなことを聞きかじった。
 25 に変更してみたら問題なく動作した。
esp8266_sendmail_02
(4)送信に使うメール・アドレスのユーザー名
(5)送信に使うメール・アドレスのパスワード
esp8266_sendmail_03
 これらは(2)と同様にサーバーで確認しておく。
 ここへ行ってASCII文字でBase64フォーマットに変換する必要がある。
 手順は以下の通り。
  上の欄に変換したい文字列を入れる。
  出力文字をASCIIにしてから[> ENCODE <]をクリックする。
  下の欄に表示された文字列をコピーしてスケッチにペーストする。
esp8266_sendmail_04
(6)送信に使うメール・アドレス
 (4)(5)で設定したメール・アドレスのこと。
(7)送信先のメール・アドレス
 適当なフリー・メールを設定してみた。
(8)メールの件名と本文
esp8266_sendmail_05
ちゃんと届いた。
もっとも、最初は迷惑メールのフォルダに入れられたが。
esp8266_sendmail_06
esp8266_sendmail_07
ESP8266関連記事一覧へ

このエントリーをはてなブックマークに追加

Posted under: ESP8266


15 comments

  • レイコ on 2017年12月13日 at 8:07 PM said:

    Reply

    同じように、進めているのですが、メール送信が出来ずにいます。2点質問がございます!
    ①SMTPサーバーは、どこのを利用していますか?
    ②送信用のメールアドレスは、gmailでしょうか?
    ご返信お願いいたします!!

    • レイコさん、こんにちは。
      当時のスケッチによれば、プロバイダ、ここのサーバ、そしてGmailの3つのSMTPサーバを試しています。
      送信用のメール・アドレスは、そのSMTPサーバーで使っているメール・アドレスにしたと思います。

    • もし、タイムアウトしているようでしたら、WiFiClientSecureに変更してみてください。
      記事先頭に追記しました。

  • レイコ on 2017年12月19日 at 7:40 PM said:

    Reply

    Sahara’s WebLogさん

    追記ありがとうございます!

    追加で質問なのですが、
    byte eRcv()〜の処理はどういう処理を行っているのでしょうか?

    byte sendEmail()〜の処理は、メールを送信するプログラムだと理解は出来たのですが、byte eRcv()〜の処理
    の方は、イマイチ理解が追いついておりません、、ご回答お願い致します!

      • レイコ on 2017年12月20日 at 5:11 PM said:

        Sahara’s WebLogさん

        メール送信は無事できるようになりました!
        ありがとうございます!

      • それはよかったです。
        さて、byte eRcv()に関してですが、
        基本的には、サーバから返ってくるコードを読んで、そのメッセージをシリアル・モニタに表示する。
        その際に、タイム・アウトだったりエラーが出ているようなら中断して0を返す。
        というような処理だと思います。

  • こんにちは、
    初めまして、
    サンプルを打ち込んだのですが、
    コンパイルすると、
    unterminated argument list invoking macro “F”
    とエラーになります。

    あまりC言語、arduinoは詳しくないので、
    よろしくお願いいたします。

    • 「マクロFを呼び出す際の引数のリストが完結していません。」
      というような訳になります。
      F()の()の中を引数と言います。
      ()内に書かれている内容、カッコやダブルクォーテーションが閉じているか、
      などをチェックしてみてください。
      それでもエラーが出るようでしたらスケッチを貼ってみてください。

  • 早速のご返答ありがとうございます。
    ダブルクォーテーションが一か所抜けていました。
    今度はif (!eRcv()) return 0;のところで、以下のエラーが出ます。

    return-statement with a value, in function returning ‘void’ [-fpermissive]

    たびたび、申し訳ございません。
    よろしくお願いいたします。

    • 平山さん、こんにちは。
      よろしければ、スケッチをコメント欄にお貼りください。
      お使いの環境についてもお知らせください。

  • すみません、以下になります。
    #include
    #include
    #include

    const char SSID[] = “###”;
    const char PASSWORD[] = “xxxxxxxxx”;
    char server[] = “###” ;
    byte sendEmail(void);
    byte eRcv(void);

    //WiFiServer server(25);
    WiFiClient client;
    void setup(){
    if (client.connect(server,25)==1){
    Serial.println(F(“connected”));
    }else {
    Serial.println(F(“connection failed”));
    return 0;
    //void loop(){
    Serial.print(F(“sending user”));
    client.println(“###”);
    if (!eRcv()) return 0;
    Serial.println(F(“sending Password”));
    client.println(“###”);
    if (!eRcv()) return 0;
    client.println(F(“To: ###”));
    client.println(F(“subject: esp32 email test\r\n”));
    client.println(F(“this is from my esp32 \n”));
    client.println(F(“this is line2 from my esp32”));
    client.println(F(“this is line3 from my esp32”));

    }
    void loop(){
    }

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

    • いろいろ問題があって簡単には解決できそうにありません。
      変更点が多すぎて、どこが意図的で、どこがミスなのか判断できかねます。
      まずは、記事内のリンク先をそのまま試されることをお勧めします。
      https://www.esp8266.com/viewtopic.php?p=39817#p39817
      そのままコピペし、記事にある必要最小限の部分だけ変更してください。

      なお、スケッチ内の個人情報っぽい部分は###に書き換えました。

  • 共有いただきありがとうございます。 1つの質問、なぜUTF8ではなくbase64エンコーディングのASCIIを選択したのですか?

    • コメントありがとうございます。
      参考にしたサイトのスケッチのコメントにそう書いてあったからです。
      メール・サーバの仕様なのではないかと思います。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Time limit is exhausted. Please reload CAPTCHA.