私たちがメールを送る時、その作業はメールソフトがやってくれるので、普段は気に留めることもありません。しかし、今回はArduino君にやってもらうので、その前に手動で試してみます。
プロバイダによっては流儀が違って、この方法ではメールを送れないかもしれません。私は自宅でメールサーバを運用しているので、そちらで試してみました。
[SMTP サーバにtelnetで接続してメールを送る]
telnet SMTPサーバアドレス 25 HELO クライアントドメイン MAIL FROM:送信元メールアドレス RCPT TO: 送信先メールアドレス DATA Subject:題名 From: 送信元メールアドレス To: 送信先メールドレス 本文 . QUIT
このような順番で通信です。さっそく自宅にあるDebian LinuxPCのターミナルから試してみましょう。
$ telnet mail.hogehoge.co.jp 25 Trying 123.xxx.789.101... Connected to 123.xxx.789.101. Escape character is '^]'. 220 mail.foobar.com ESMTP Postfix (Debian/GNU) HELO foobar.co.jp 250 mail.foobar.co.jp MAIL FROM:baz@foobar.co.jp 250 2.1.0 Ok RCPT TO: hoge@hogehoge.co.jp 250 2.1.5 Ok DATA 354 End data with <CR><LF>.<CR><LF> Subject:test From: baz@foobar.co.jp To: hoge@hogehoge.co.jp Hello world. . 250 2.0.0 Ok: queued as CE7AE57054D QUIT 221 2.0.0 Bye Connection closed by foreign host.
やりました、ちゃんと送信できました。さて、先日のEthernetClient()を元にしてスケッチを作ってみましょう。Arduino 1.0 の環境で動かします。
/* Simple SMTP Email Sender Arduino 1.0 version */ #include <Ethernet.h> #include <SPI.h> byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; byte ip[] = { 192, 168, xxx, xxx }; // Arduino EtherShield IP address byte gateway[] = { 192,168, xxx, xxx }; // Default Gateway IP address byte subnet[] = { 255, 255, 255, 0 }; // Subnet Mask byte server[] = { xxx,xxx,xxx,xxx }; // SMTP server address EthernetClient client; void setup() { Ethernet.begin(mac, ip ,subnet,gateway ); //Arduino 1.0 http://arduino.cc/forum/index.php?topic=83800.0 Serial.begin(9600); delay(1000); Serial.println("connecting..."); if (client.connect(server, 25)) { //port 25 Serial.println("connected"); client.println("HELO foobar.co.jp"); client.println("MAIL FROM: baz@foobar.co.jp"); client.println("RCPT TO: hoge@hogehoge.co.jp"); client.println("DATA"); client.println("Subject:test"); client.println("From: baz@foobar.co.jp"); client.println("To: hoge@hogehoge.co.jp"); client.println("Hello world."); client.println("."); client.println("QUIT"); client.println(); } else { Serial.println("connection failed"); } } void loop() { if (client.available()) { char c = client.read(); Serial.print(c); } if (!client.connected()) { Serial.println(); Serial.println("disconnecting."); client.stop(); for(;;) ; } }
例によってMACアドレスがDE:AD:BE:EF:FE:ED (Dead Beef Feed 「死んだ牛のえさ?」)になっていますが家庭内LANに接続する分には問題ないでしょう。このまま続行です。IPアドレス、デフォルトゲートウエイ、サブネットマスクは適切な値にセットします。SMTPサーバのIPアドレスも調べてセットです。果たして実行結果は?
やりました。ちゃんと送信することができました。
いつも、教えていただきありがとうございます。
今回もまた、この記事で質問があるのですが、お時間の取れるとき教えてください。
上記の方法で自分のSMTPメールサーバ(debian)にコネクションして無事にできました。
ここで、質問なのですが、smtp.gmail.comに直接コネクションしてメール送信(や受信)するサンプルをアップお願いします。
お手数で申し訳ありません、よろしくお願い致します。
Arduinoさんこんにちは。Gmailに接続してメールを送受信するためにはSSL暗号化が必要です。googleで検索してみましたが、sslのライブラリは容量が大きいのでarduinoに実装は出来ないみたいです。
ありがとうございます。何かログを見ているとSSL認証しろ!みたいなログが出ていて私も調べてみましたが、arduinoでその認証をしているページは見つかりませんでした。
あきらめて、自分のsmtpサーバ経由で送信することにします。ありがとうございました!!
上記のArduinoスケッチを参考にさせて頂き、Arduinoから自宅PCへメールを出せるように試してみました。MAC,IP,SMTPなど変更し間違いはないと思うのですが,
if client.connect(server, 25))のところで接続できず、connection failedになります。
ネットワークの知識が乏しく分からないので教えてください。
インタネット回線はイーモバイルのポケットwifiを使用しており、Arduinoからハブ変わりに無線ルータ、
無線ルータからPCへ接続、PCへポケットwifiを接続してます。
環境的に無理があるのでしょうか?
saitouさんこんにちは。
イーモバイルのメールサーバを調べてみました。
(http://emobile.jp/service/emmail/ より)
イーモバイルのSMTPサーバはサブミッションポート587を使いSMTP AUTHを利用して送信する仕様みたいです。残念ながら上記のスケッチでは動きません。
何か方法は無いかArduino のフォーラムなどを検索してみましたが見つけられませんでした。 m(__)m
イーモバイルのネットワークから 外部のSMTPサーバに接続しメールを送る方法もあるのですが、
迷惑メール対策(Outbound Port 25 Blocking)のため、やはりこのスケッチではできません。
管理人さん
お手数お掛けします。調べて頂きありがとうございます
プロバイダはOCNでメールサーバもOCNのを使用しているのですが、メールだけ残してネット接続を途中からイーモバイルへ変更しました。
イーモバイルのメールサーバーについては全く気が付きませんでした。
また分からない場合教えて頂けますか。
有難うございました。
プロバイダがOCNなら以前はOCNの送信メールサーバで SMTP prot 25 が使えたのですが、現在はSubmission Port 使用に移行しつつあるみたいですね。
どうぞよろしくお願いいたいます。