Ethernet Shield メール送信

メール...です

思わぬ伏兵にやられそうになってしまいましたが、気を取り直して再び前進です。TCPを使ってwebサーバと通信ができましたので、今回はArduinoからメールを送信する実験です。

私たちがメールを送る時、その作業はメールソフトがやってくれるので、普段は気に留めることもありません。しかし、今回は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アドレスも調べてセットです。果たして実行結果は?

やりました。ちゃんと送信することができました。

7 thoughts on “Ethernet Shield メール送信

  1. いつも、教えていただきありがとうございます。
    今回もまた、この記事で質問があるのですが、お時間の取れるとき教えてください。
    上記の方法で自分のSMTPメールサーバ(debian)にコネクションして無事にできました。
    ここで、質問なのですが、smtp.gmail.comに直接コネクションしてメール送信(や受信)するサンプルをアップお願いします。
    お手数で申し訳ありません、よろしくお願い致します。

    • Arduinoさんこんにちは。Gmailに接続してメールを送受信するためにはSSL暗号化が必要です。googleで検索してみましたが、sslのライブラリは容量が大きいのでarduinoに実装は出来ないみたいです。

  2. ありがとうございます。何かログを見ているとSSL認証しろ!みたいなログが出ていて私も調べてみましたが、arduinoでその認証をしているページは見つかりませんでした。
    あきらめて、自分のsmtpサーバ経由で送信することにします。ありがとうございました!!

  3. 上記の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)サーバー
      サーバー名 mailserv.emobile.ne.jp
      ポート番号 465 (SSLによる通信の暗号化を行う場合)
      587 (SSLを利用しない場合)
      ユーザー名 メールアドレス(****@emobile.ne.jp)
      パスワード メールパスワード

      イーモバイルのSMTPサーバはサブミッションポート587を使いSMTP AUTHを利用して送信する仕様みたいです。残念ながら上記のスケッチでは動きません。

      何か方法は無いかArduino のフォーラムなどを検索してみましたが見つけられませんでした。 m(__)m

      イーモバイルのネットワークから 外部のSMTPサーバに接続しメールを送る方法もあるのですが、
      迷惑メール対策(Outbound Port 25 Blocking)のため、やはりこのスケッチではできません。

      • 管理人さん
        お手数お掛けします。調べて頂きありがとうございます
        プロバイダはOCNでメールサーバもOCNのを使用しているのですが、メールだけ残してネット接続を途中からイーモバイルへ変更しました。
        イーモバイルのメールサーバーについては全く気が付きませんでした。

        また分からない場合教えて頂けますか。
        有難うございました。

        • プロバイダがOCNなら以前はOCNの送信メールサーバで SMTP prot 25 が使えたのですが、現在はSubmission Port 使用に移行しつつあるみたいですね。
          どうぞよろしくお願いいたいます。

コメントを残す

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください