1日1回だけメールを送信する

Raspberryへのping結果をメールする(3)


3番目のArduinoのスケッチは以下の通りです。
こちらで100円ショップのストップウォッチを使って、1日1回、決まった時間 にスケッチを実行する方法を紹介しています。
そこで、この仕組みを組み込んで、1日1回、12:00にメール送信をするように変更します。

以下の値は変更が必要です。
user64:こちらのページで 紹介しました「Email AddressをBase64に変換した文字列」
pass64:こちらのページで 紹介しました「PasswordをBase64に変換した文 字列」
mail_from:メール送信者のメールアドレス
mail_to:メール送信先のメールアドレス

/*
   Email client sketch for W51000
   Using SMTPClient Library
*/

#include <SPI.h>
#include <Ethernet.h>
#include <Mail.h>
#include <SMTPClient.h>
#include <ICMPPing.h>

#define inPin A0   // PC0
#define Alarm 200
 
// this must be unique
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; // mac address for ethernet shield
byte ips[] = {10,40,100,101,102,103,104,105,106,107,108,109,110}; // ip address for ping target
 
char server[] = "mail.smtp2go.com";
int port = 2525;
char user64[] = "Email AddressをBase64に変換した文字列"; // Your Username of SMTP2GO
char pass64[] = "PasswordをBase64に変換した文字列"; // Your Password of SMTP2GO
char mail_from[] = "Me<MailFrom@example.com>"; // Mail From
char mail_to[] = "You<MailTo@example.com>"; // Mail To

EthernetClient ethClient;

SmtpClient client(&ethClient, server, port);

IPAddress pingAddr(192,168,111,000); // ip address to ping

SOCKET pingSocket = 0;

ICMPPing ping(pingSocket, (uint16_t)random(0, 255));

bool connect;
byte MyIP;

void setup()
{
  Serial.begin(9600);
  pinMode(inPin,INPUT);
  connect = 0;
}
 
void loop()
{
  byte inChar;
  Mail mail;
  char *body;
  int ret;
  int val;
  static int val0 = 0;
  int delta;
  static unsigned long interval = 100;

  if (!connect) {
    Serial.print("Connecting DHCP Server....");
    if (Ethernet.begin(mac)) {
      connect=1;
      Serial.println("OK");
      Serial.println(Ethernet.localIP());  // IPアドレスを表示
      MyIP = Ethernet.localIP()[3];  // 自分のIPアドレス
      Serial.print("MyIP=");
      Serial.println(MyIP);
    } else {
      Serial.println("FAIL");
    }
  }

  if (connect) {
//    inChar = Serial.read();
//    if(inChar == 'e') {
    val=analogRead(inPin);
    if (val0 == 0) val0 = val;
    delta = abs(val - val0);
    Serial.print("val=");
    Serial.print(val);
    Serial.print(" val0=");
    Serial.print(val0);
    Serial.print(" delta=");
    Serial.println(delta);
    if (delta > Alarm) { // アラーム時間になった
      Serial.println("Alarm!!");
      for(int i=0;i<sizeof(ips);i++) {
        if (ips[i] == MyIP) continue;
        pingAddr[3]=ips[i];
        body=execPing(pingAddr);
        if (body == NULL) continue;
        Serial.println(body);
      
        mail.login(user64);
        mail.password(pass64);
        mail.from(mail_from);
        mail.to(mail_to);
        mail.subject("Raspberry Ping Alarm");
        mail.body(body);
        if (client.send(&mail)) {
          Serial.println("Email sent");
        } else {
          Serial.println("Email failed");
        }
        free(body);
        delay(1000);
      } // end for
      interval = 60000UL;
      ret = Ethernet.maintain();
      Serial.print("maintain()=");
      Serial.println(ret);
      if (ret == 1 || ret == 3) connect = 0;
    } // end if
  } // end if

  delay(interval);
  interval = 100;
}


char *execPing(IPAddress pingAddr) {
  char *buffer = NULL;

  ICMPEchoReply echoReply = ping(pingAddr, 4);
  if (echoReply.status == SUCCESS) return buffer;
  buffer=(char *)malloc(256);
  if (buffer == NULL) return buffer;
  memset(buffer,0,256);
  sprintf(buffer, "%d.%d.%d.%d Echo request failed; %d",
  pingAddr[0],pingAddr[1],pingAddr[2],pingAddr[3],echoReply.status);
  return buffer;
}

このスケッチを実行すると1日1回、ストップウォッチのアラーム時刻に以下のメールが届きます。
送信時刻はサーバーの時刻になるので、GMT+0の時間(日本時間-9時間)の時間となっています。



このシリーズはおしまいの予定です