Отправка Email из ардуины

Wiring, Processing, библиотеки

Отправка Email из ардуины

Сообщение Ajava » 27 дек 2013, 21:51

Всем привет! Не знаю пригодится кому или нет, но решил провести не большой ликбез по отправки почты из ардуино.
Для отправки Email понадобится Ethernet Shield - стандартные либы уже есть, и библиотека для кодирования логина и пароля в формат "Base64". Ее можно скачать вот тут https://github.com/adamvr/arduino-base64 - там справа внизу кнопка dowland ZIP. Качаем, распаковываем, переименовываем в Base64 и кидаем в папку с библиотеками.

Вот, в принципе и все приготовления, думаю то, что шилд нужно подключить к маршрутизатору или роутеру, говорить не нужно((((

Совсем немного теории.

Вся почта из почтовых сервисов отправляется через спец. сервер smtp(smtp3). Для mail.ru это - smtp.mail.ru, для google.ru это - smtp.google.ru и т.д..
Этот сервер имеет очень не большой ряд команд на которые он отвечает. Список их я приводить не буду, кому интересно гуглите. Так вот, отправляя поочередно команды на сервер мы заставляем его отправлять сообщения. Код очень легок для понимания и расписывать по строчкам его не буду, приведу сразу листинг, там есть комменты, не запутаетесь))))))

Вот собственно код:
#include <Base64.h>
#include <SPI.h>
#include <Dhcp.h>
#include <Dns.h>
#include <Ethernet.h>
#include <EthernetClient.h>
#include <EthernetServer.h>
#include <EthernetUdp.h>
#include <util.h>

//структура для сообщения
struct Message
{
  String From;//адрес отправителя
  String To;// адрес получателя
  String Subject;// Тема письма
  String Body;// Текст письма
};

//mac адрес устройства (можно не менять)
byte mac[] = {
  0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x05 };

//IP адрес адруины (можно не менять)   
IPAddress ip(192,168,0,54);

// IP smtp сервера
IPAddress server(94, 100, 177, 1);// mail.ru
// IP других сереров можно найти в инете 

// логин и пароль к почтовому сервису
char login[] = "ВашЛогин";//без @mail.ru
char password[] = "ВашПароль";

// создаем экземпляр клиента
EthernetClient client;

void setup(){
  Serial.begin(9600);// UART
  Ethernet.begin(mac,ip);// Запускаем шилд
  Serial.println("Start");
}

void loop(){
  while(Serial.available()){
    char inSerialChar = 0;
    inSerialChar = Serial.read();
    if(inSerialChar == 's'){
      SendMessage();// При отправке в дуину 's', отправляем сообщение.
    }
  }
}
// метод подключения к серверу
bool connectToServer(){
  if(client.connected()){
  }
  else{
    if(client.connect(server,25)){
      return true;
    }
    else{
      return false;
    }
  }
}

// метод отправки сообщения
void SendMessage(){
  Serial.println("Please wite...");
  LogPass();
  Message message = {
    "ваш_почтовый_ящик@mail.ru",
    "почтовый_ящик_получателя@gmail.com",
    "Проба пера",//тема
    "Огромный привет от Ардуино!!!!" };//само сообщение
  client.println("MAIL From:<"+message.From+">");
  delay(250);
  client.println("RCPT To:<"+message.To+">");
  delay(250);
  client.println("DATA");
  delay(250);
  client.println("From:"+message.From);
  client.println("To:"+message.To);
  client.println("Subject:"+message.Subject);
  delay(250);
  client.println(message.Body);
  delay(250);
  client.println(".");// по приходу точки сервер ставит сообщение в очередь
  delay(250); // на отправку
  client.println("QUIT");// как только закрыли соединение, сообщение улетает
  delay(250);
  Serial.println("Message sending...");
}

// подключение к сереверу и авторизация
void LogPass(){
  char array[64];// массив для кодирования
  if(connectToServer()){
    client.println(F("helo 1.2.3.4"));
    delay(250);
    client.println(F("AUTH LOGIN"));
    delay(250);
    client.println(strToBase64(login));
    delay(250);
    client.println(strToBase64(password));
    delay(250);

  }
  else{
    Serial.println("Server not connected...");
  }

}

// кодировка Base64
String strToBase64(char str[]){
  char charArray[64];
  base64_encode(charArray,str,strlen(str));
  String result = charArray;
  return result;
}


Код полностью рабочий, так что если что то не задалось, курите код!!!

Если будут вопросы, пишите.
Ajava
 
Сообщения: 7
Зарегистрирован: 25 ноя 2013, 16:07
programming: C++,C#

Re: Отправка Email из ардуины

Сообщение semyanov » 19 фев 2015, 18:44

Большое спасибо за пример и комментарии, главное, что он рабочий!
Но у меня два вопроса:
1) Будет ли он работать для wi-fi шилда, где установлена микросхема CC3000?
2) Требуется отправлять вместе с письмом прикреплённый текстовый файл, небольшой, около 4кб, как это реализовать?
semyanov
 
Сообщения: 1
Зарегистрирован: 19 фев 2015, 18:40

Re: Отправка Email из ардуины

Сообщение noonv » 24 фев 2015, 10:13

По сути - то же самое, текст файла придётся перекодировать в Base64.
Аватара пользователя
noonv
Администратор
 
Сообщения: 553
Зарегистрирован: 05 май 2011, 15:44
Откуда: Калининград
programming: С++

Re: Отправка Email из ардуины

Сообщение pastry777 » 27 фев 2015, 21:26

зарегистрировался на mail.ru...вписал в скетче все как положено,но никак не работает,не проходит авторизацию на сервере,пишет Server not connected... :cry_ing:
pastry777
 
Сообщения: 1
Зарегистрирован: 27 фев 2015, 21:24
programming: C++

Re: Отправка Email из ардуины

Сообщение admin » 02 мар 2015, 12:31

А вручную через telnet отправить получается?
Аватара пользователя
admin
Администратор
 
Сообщения: 315
Зарегистрирован: 05 май 2011, 14:57
Откуда: Калининград

Re: Отправка Email из ардуины

Сообщение Serg2000 » 03 авг 2015, 10:49

С прошлого года mail.ru ввели шифрование, теперь отправить почту можно только на 465 порт с шифрованием SSL.
Serg2000
 
Сообщения: 1
Зарегистрирован: 03 авг 2015, 10:46

Re: Отправка Email из ардуины

Сообщение klanov1991 » 17 авг 2015, 22:19

Добрый день! Код понятный, большое спасибо. У меня вопрос: залил данный скетч в ардуино, прописал свои параметры, в мониторе последовательного порта после отправки символа 's' пишет Please wite..., затем Message sending... Это сообщение висит постоянно. Я так понимаю, с сервером соединяется нормально, но вот сообщения до адресата не доходят. пробовал менять на порт 465, та же история. Что подскажете? может дело в том, что mail использует SSL?
klanov1991
 
Сообщения: 1
Зарегистрирован: 17 авг 2015, 22:13
programming: C++254


Вернуться в Программирование

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

© 2009-2017 |  О проекте  |  Политика Конфиденциальности  |