追記(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)関数をあらかじめ宣言
そのままだとコンパイル時に暗黙の宣言がらみのエラーが出る。
プログラムのはじめの方で関数をあらかじめ宣言しておく。
最初は 2525 となっていたが、connection failed になった。
どこかでSMTPのポートは25がデフォルトのようなことを聞きかじった。
25 に変更してみたら問題なく動作した。
(4)送信に使うメール・アドレスのユーザー名
(5)送信に使うメール・アドレスのパスワード
これらは(2)と同様にサーバーで確認しておく。
ここへ行ってASCII文字でBase64フォーマットに変換する必要がある。
手順は以下の通り。
上の欄に変換したい文字列を入れる。
出力文字をASCIIにしてから[> ENCODE <]をクリックする。
下の欄に表示された文字列をコピーしてスケッチにペーストする。
(6)送信に使うメール・アドレス
(4)(5)で設定したメール・アドレスのこと。
(7)送信先のメール・アドレス
適当なフリー・メールを設定してみた。
(8)メールの件名と本文
ちゃんと届いた。
もっとも、最初は迷惑メールのフォルダに入れられたが。
ESP8266関連記事一覧へ
レイコ on 2017年12月13日 at 8:07 PM said:
同じように、進めているのですが、メール送信が出来ずにいます。2点質問がございます!
①SMTPサーバーは、どこのを利用していますか?
②送信用のメールアドレスは、gmailでしょうか?
ご返信お願いいたします!!
sahara on 2017年12月14日 at 12:33 AM said:
レイコさん、こんにちは。
当時のスケッチによれば、プロバイダ、ここのサーバ、そしてGmailの3つのSMTPサーバを試しています。
送信用のメール・アドレスは、そのSMTPサーバーで使っているメール・アドレスにしたと思います。
sahara on 2017年12月14日 at 2:04 AM said:
もし、タイムアウトしているようでしたら、WiFiClientSecureに変更してみてください。
記事先頭に追記しました。
レイコ on 2017年12月19日 at 7:40 PM said:
Sahara’s WebLogさん
追記ありがとうございます!
追加で質問なのですが、
byte eRcv()〜の処理はどういう処理を行っているのでしょうか?
byte sendEmail()〜の処理は、メールを送信するプログラムだと理解は出来たのですが、byte eRcv()〜の処理
の方は、イマイチ理解が追いついておりません、、ご回答お願い致します!
sahara on 2017年12月19日 at 8:31 PM said:
メールは送信できるようになりましたか?
レイコ on 2017年12月20日 at 5:11 PM said:
Sahara’s WebLogさん
メール送信は無事できるようになりました!
ありがとうございます!
sahara on 2017年12月20日 at 6:21 PM said:
それはよかったです。
さて、byte eRcv()に関してですが、
基本的には、サーバから返ってくるコードを読んで、そのメッセージをシリアル・モニタに表示する。
その際に、タイム・アウトだったりエラーが出ているようなら中断して0を返す。
というような処理だと思います。
平山 on 2018年10月11日 at 12:44 PM said:
こんにちは、
初めまして、
サンプルを打ち込んだのですが、
コンパイルすると、
unterminated argument list invoking macro “F”
とエラーになります。
あまりC言語、arduinoは詳しくないので、
よろしくお願いいたします。
sahara on 2018年10月11日 at 4:50 PM said:
「マクロFを呼び出す際の引数のリストが完結していません。」
というような訳になります。
F()の()の中を引数と言います。
()内に書かれている内容、カッコやダブルクォーテーションが閉じているか、
などをチェックしてみてください。
それでもエラーが出るようでしたらスケッチを貼ってみてください。
平山 on 2018年10月12日 at 6:29 AM said:
早速のご返答ありがとうございます。
ダブルクォーテーションが一か所抜けていました。
今度はif (!eRcv()) return 0;のところで、以下のエラーが出ます。
return-statement with a value, in function returning ‘void’ [-fpermissive]
たびたび、申し訳ございません。
よろしくお願いいたします。
sahara on 2018年10月12日 at 4:19 PM said:
平山さん、こんにちは。
よろしければ、スケッチをコメント欄にお貼りください。
お使いの環境についてもお知らせください。
平山 on 2018年10月12日 at 6:00 PM said:
すみません、以下になります。
#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(){
}
よろしくお願いいたします。
sahara on 2018年10月12日 at 7:37 PM said:
いろいろ問題があって簡単には解決できそうにありません。
変更点が多すぎて、どこが意図的で、どこがミスなのか判断できかねます。
まずは、記事内のリンク先をそのまま試されることをお勧めします。
https://www.esp8266.com/viewtopic.php?p=39817#p39817
そのままコピペし、記事にある必要最小限の部分だけ変更してください。
なお、スケッチ内の個人情報っぽい部分は###に書き換えました。
Sandra on 2020年7月15日 at 9:03 PM said:
共有いただきありがとうございます。 1つの質問、なぜUTF8ではなくbase64エンコーディングのASCIIを選択したのですか?
sahara on 2020年7月16日 at 2:14 AM said:
コメントありがとうございます。
参考にしたサイトのスケッチのコメントにそう書いてあったからです。
メール・サーバの仕様なのではないかと思います。