Arduinoからメールを送信する

日本語のメールを送る


前回、Arduino Playgroundのサンプルコードを使って、Arduinoからメールを送る方法を紹介しました。
そこで、今回はメールタイトルとメール本文に日本語を送る方法を紹介します。
日本語化したメールを送るためには、Linuxマシンが必要になります。

まずタイトルに日本語を送るときは、Linuxマシン(私はRaspberryPiを使いました)で以下のコマンドを実行します。
nkfで変換された文字列がタイトル文字列になります。
こちらの 記事を参考にさせていただきました。ありがとうございます。
pi@raspberrypi ~ $ echo 日本語のタイトル | nkf -W -M -j
=?ISO-2022-JP?B?GyRCRnxLXDhsJE4lPyUkJUglaxsoQg==?=

次に本文に日本語を送るときは、Linuxマシンで以下のコマンドを実行します。
nkfで変換された文字列が本文になりますが、1点だけ注意する点が有ります。
変換後の文字に「\」が含まれているときは「\\」にする必要が有ります。
これは、こちらの記事を参考 にさせていただきました。ありがとうございます。
pi@raspberrypi ~ $ echo 日本語も送ることができます  | nkf -W -j
F|K\8l$bAw$k$3$H$,$G$-$^$9
  ↓
F|K\\8l$bAw$k$3$H$,$G$-$^$9

Arduinoのスケッチは以下の通りです。
前回から赤字の部分だけ変更しています。
また、前回と同様に以下の値は変更が必要です。
smtp_user64:前のページで紹介しました「Email AddressをBase64に変換した文字列」
smtp_pass64:前のページで紹介しました「PasswordをBase64に 変換した文 字列」
mail_from:メール送信者のメールアドレス
mail_to:メール送信先のメールアドレス

/*
   Email client sketch for W51000
*/

#include <SPI.h>
#include <Ethernet.h>
 
// this must be unique
byte mac[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05 }; 

char smtp_server[] = "mail.smtp2go.com";
int smtp_port = 2525;
char smtp_user64[] = "Email AddressをBase64に変換した文字列"; // Your Username of SMTP2GO
char smtp_pass64[] = "PasswordをBase64に変 換した文字列"; // Your Password of SMTP2GO
char mail_from[] = "MailFrom@example.com"; // Mail From
char mail_to[] = "MailTo@example.com"; // Mail To

bool connect;
 
EthernetClient client;
 
void setup()
{
  Serial.begin(9600);
  connect = 0;
  Serial.print("Ethernet.begin....");
  int ret = Ethernet.begin(mac);
  if (ret) {
    Serial.println("ok....");
    Serial.print("localIP: ");
    Serial.println(Ethernet.localIP());
    Serial.print("subnetMask: ");
    Serial.println(Ethernet.subnetMask());
    Serial.print("gatewayIP: ");
    Serial.println(Ethernet.gatewayIP());
    Serial.print("dnsServerIP: ");
    Serial.println(Ethernet.dnsServerIP());
    connect = 1;
    delay(2000);
    Serial.println(F("Ready. Press 'e' to send."));
   } else {
    Serial.println("ng....");
    Serial.println(F("DHCP Server not response."));
  }
}
 
void loop()
{
  byte inChar;

  if (connect) {
    inChar = Serial.read();
    if(inChar == 'e') {
      if(sendEmail()) {
        Serial.println(F("Email sent"));
        Serial.println(F("Ready. Press 'e' to send."));
      } else {
        Serial.println(F("Email failed"));
      }
    }
  }
}
 
byte sendEmail()
{
  char buff[64];
 
  if(client.connect(smtp_server,smtp_port) == 1) {
    Serial.println(F("connected"));
  } else {
    Serial.println(F("connection failed"));
    return 0;
  }
 
  if(!eRcv()) return 0;
 
  Serial.println(F("Sending hello"));
// replace 1.2.3.4 with your Arduino's ip
  client.println("EHLO 1.2.3.4");
  if(!eRcv()) return 0;
 
  Serial.println(F("Sending auth login"));
  client.println("auth login");
  if(!eRcv()) return 0;
 
  Serial.println(F("Sending User"));
// Change to your base64 encoded user
  client.println(smtp_user64);
  if(!eRcv()) return 0;
 
  Serial.println(F("Sending Password"));
// change to your base64 encoded password
  client.println(smtp_pass64);
  if(!eRcv()) return 0;
 
// change to your email address (sender)
  Serial.println(F("Sending From"));
  sprintf(buff,"MAIL From: <%s>",mail_from);
  client.println(buff);
  if(!eRcv()) return 0;
 
// change to recipient address
  Serial.println(F("Sending To"));
  sprintf(buff,"RCPT To: <%s>",mail_to);
  client.println(buff);
  if(!eRcv()) return 0;
 
  Serial.println(F("Sending DATA"));
  client.println("DATA");
  if(!eRcv()) return 0;
 
  Serial.println(F("Sending email"));
  sprintf(buff,"To: You <%s>",mail_to);
  client.println(buff);

  sprintf(buff,"From: Me <%s>",mail_from);
  client.println(buff);

//  client.println("Subject: Arduino email test");
  strcpy(buff,"Content-Type: text/plain;charset=\"ISO-2022-JP\"");
  client.println(buff);

//  client.println("Subject: Esp8266 email test");
// 日本語のタイトルは以下で作成できる
// echo 日本語のタイトル | nkf -W -M -j
// http://hogem.hatenablog.com/entry/20100122/1264169093
  client.println("Subject: =?ISO-2022-JP?B?GyRCRnxLXDhsJE4lPyUkJUglaxsoQg==?=\r\n");

//  client.println("Hello !!");
//  client.println("Mail from my Arduino!");
  char start_jis[4];
  memset (start_jis,0,sizeof(start_jis));
  start_jis[0] = 0x1b; // esc
  start_jis[1] = 0x24; // $
  start_jis[2] = 0x42; // B

  char end_jis[4];
  memset (end_jis,0,sizeof(end_jis));
  end_jis[0] = 0x1b; // esc
  end_jis[1] = 0x28; // (
  end_jis[2] = 0x42; // B

// 日本語の本文は以下で作成できる
// echo 日本語も送ることができます  | nkf -W -j
// \ が含まれているときはエスケープする
  strcpy(buff,start_jis);
  strcat(buff,"F|K\\8l$bAw$k$3$H$,$G$-$^$9");
  strcat(buff,end_jis);
  client.println(buff);

  client.println(".");
  if(!eRcv()) return 0;
 
  Serial.println(F("Sending QUIT"));
  client.println("QUIT");
  if(!eRcv()) return 0;
 
  client.stop();
 
  Serial.println(F("disconnected"));
 
  return 1;
}
 
byte eRcv()
{
  byte respCode;
  byte thisByte;
  int loopCount = 0;
 
  while(!client.available()) {
    delay(1);
    loopCount++;
 
    // if nothing received for 10 seconds, timeout
    if(loopCount > 10000) {
      client.stop();
      Serial.println(F("\r\nTimeout"));
      return 0;
    }
  }
 
  respCode = client.peek();
 
  while(client.available())
  { 
    thisByte = client.read();   
    Serial.write(thisByte);
  }
 
  if(respCode >= '4')
  {
    efail();
    return 0; 
  }
 
  return 1;
}
 
 
void efail()
{
  byte thisByte = 0;
  int loopCount = 0;
 
  client.println(F("QUIT"));
 
  while(!client.available()) {
    delay(1);
    loopCount++;
 
    // if nothing received for 10 seconds, timeout
    if(loopCount > 10000) {
      client.stop();
      Serial.println(F("\r\nTimeout"));
      return;
    }
  }
 
  while(client.available())
  { 
    thisByte = client.read();   
    Serial.write(thisByte);
  }
 
  client.stop();
 
  Serial.println(F("disconnected"));
}

このスケッチを実行すると日本語化されたメールが送られます。

続く....