Отправка электронного письма email с прикреплённым файлом из Arduino + SIM900

semyanov_dmitry
Offline
Зарегистрирован: 24.02.2015

Добрый день!

Возникла необходимость периодически отправлять электронные письма с прикреплённым текстовым SMTP-файлом из Arduino. Для WIFI-модуля CC3000 даже упоминания на подобную функцию не нашёл. У SIM900 есть AT-команда, дающая такую возможность +SMTPFILE. Информации в сети очень мало по моей проблеме, единственное, что нашёл, это небольшая переписка на англоязычном форуме, которая вселяет надежду

www.edaboard.com/thread326603.html

Что скажете, в каком направлении двигаться? Все железки есть.

semyanov_dmitry
Offline
Зарегистрирован: 24.02.2015

Прошу прощения, описка вышла. Файл, который необходимо отправлять, разумеется HTML, а не SMTP.

Araris
Offline
Зарегистрирован: 09.11.2012

Проблема отправить электронное письмо, или проблема прикрепить текстовый файл к электронному письму ?

semyanov_dmitry
Offline
Зарегистрирован: 24.02.2015

Хороший вопрос, пока я не умею ни того, ни другого. Не получается даже зарегистрировать sim-карту в сети. В идеале, хотелось бы увидеть готовый пример, или пообщаться с человеком, который уже реализовывал подлбную функцию. Чуть позже выложу код того, что уже написал.

Araris
Offline
Зарегистрирован: 09.11.2012

Хороший ответ, зарегистрировать sim-карту в сети - уже полдела.))

Я умею отправлять письмо вот так:





void SendEMail(String TextToSend)
{
byte smtpip[] = { 999, 999, 999, 999 }; // SMTP server IP
if (client.connect(smtpip,25)) 
 {
 client.println("EHLO XXX"); // XXX - your SMTP server name
 client.println("AUTH LOGIN");                    // see "http://base64-encoder-online.waraxe.us/"
 client.println("XXXXXXXXXXXXXXXXXXXXXXX");       // Type mail box name and encode it
 client.println("XXXXXXXXXXXX");                  // Type password and encode it
 client.println("MAIL FROM:<admin@XXX.XXX>");   
 client.println("RCPT TO:<admin@XXX.XXX>");
 client.println("DATA");
 client.println("from:admin@XXX.XXX");
 client.println("to:XXX@XXX.XXX.XX");
 client.print("SUBJECT: ");
 client.println(TextToSend); // subject
 client.println();
 client.println(TextToSend); // body
 client.println(".");
 client.println(".");
 client.println("QUIT");
 delay(1000);
 client.stop();
 }
else { Serial.println("SMTP connection ERROR..."); }
}

Это работает, но есть нюансы. Кстати, текстовый файл можно не прикреплять, а прямо в тело письма вставлять, так проще будет.

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

С отправкой писем Ардуиной не все так просто.

Нужно подключиться к какому-нибудь серверу (mail.ru или gmail.com) и умудриться пройти STARTTLS.

Я вроде встречал в сети попытки реализовать это, но не помню удачных. Проще воспользоваться сторонним сервисом (есть и бесплатные) для отправки почты.

Если есть свой веб-сервер - можно использовать стандартные скрипты на отсылку почты.

Araris
Offline
Зарегистрирован: 09.11.2012

Именно так, я тоже не смог найти готовых реализаций для STARTTLS, поэтому пользую свой почтовый сервер.

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Araris пишет:

Именно так, я тоже не смог найти готовых реализаций для STARTTLS, поэтому пользую свой почтовый сервер.

"свой", это какой?

semyanov_dmitry
Offline
Зарегистрирован: 24.02.2015

Спасибо за пример, буду разбираться. Я так понял, здесь на АТ-командах сделано? Файл будет содержать динамические данные, да и размер около 4кБ, боюсь, что у ардуины памяти не хватит, 512 байт она всего, если не прав, поправьте. Значит буду допиливать инициализацию sim900.

Araris
Offline
Зарегистрирован: 09.11.2012

Размер не помеха, считали строку из файла, затем ее в client.println(TextToSend);, и так построчно и отправили.

semyanov_dmitry
Offline
Зарегистрирован: 24.02.2015

Araris пишет:

Кстати, текстовый файл можно не прикреплять, а прямо в тело письма вставлять, так проще будет.

Вообще, идея отличная, сам так изначально хотел сделать, но после нескольких попыток встроить код HTML в письмо Яндекс.почты понял, что у меня руки кривые. В принятом по почте письме отображался только обычный HTML-код.

Поделитесь опытом, как можно встроить HTML-страницу в тело письма, т.к. сам HTML-файл содержит таблицы и др.форматированный текст.

semyanov_dmitry
Offline
Зарегистрирован: 24.02.2015
#include <GPRS_Shield_Arduino.h>
#include <SoftwareSerial.h>
#include <Wire.h>
#include <Suli.h>

#define PIN_TX 7
#define PIN_RX 8
#define BAUDRATE 9600
#define PHONE_NUMBER "+79179401322"
#define MESSAGE "hello,world"

GPRS gprsTest(PIN_TX,PIN_RX,BAUDRATE);

void setup()  
{
  // Инициализируем последовательный интерфейс и ждем открытия порта:
  Serial.begin(9600);
  while (0!=gprsTest.init())
  {
    delay(1000);
    Serial.print("init error\r\n");
  }
  Serial.println("gprs init success");
  Serial.println("start to send message...");
  gprsTest.sendSMS(PHONE_NUMBER,MESSAGE);
}
 
void loop() // выполняется циклически
{
  //место для программы
}

После нескольких неудачных попыток работы с AT-командами, решил скачать и воспользоваться библиотекой с примерами от производителя GPRS/GSM Shield на сайте makerstudio.cc.

Пример отправляет sms-сообщения. Мелочь, но уже хоть что-то ))

 

semyanov_dmitry
Offline
Зарегистрирован: 24.02.2015
char incoming_char=0;
...
void setup()
{ 
  Serial.begin(9600);
  gprsSerial.begin(9600);
...
  gprsCmdAndWaitln("AT+SAPBR=4,1");
} 
void loop()
{ 
  if(gprsSerial.available() >0)
  {
    incoming_char=gprsSerial.read(); //Get the character from the cellular serial port.
    Serial.print(incoming_char); //Print the incoming character to the terminal.
  }
}

Продолжу сам, раз уж никто пока не пишет.

Перешёл я всё-таки на AT-команды и привязал SoftwareSerial к Serial-монитору (см.выше)

При попытке узнать текущие настройки GPRS Serial-монитор выводит обрезаный фрагмент ответа модуля SIM900:

AT+SAPBR=4,1

+SAPBR:

CONTYPE: GPRS

APN:

PHONENUM:

USE

и всё, дальше обрезается, а должно быть USER и ещё много другой информации.

Может я неправитьно связал Serial-порты? Парни, выручайте! )

semyanov_dmitry
Offline
Зарегистрирован: 24.02.2015

Продолжим.

Кто-нибудь знает, стандартная прошивка позволяет работать с функциями EMAIL или необходимо искать другую?

Дело в том, что при попытке отправить модулю SIM900 команды касаемые EMAIL, в ответ я получаю ERROR.

Neitrino
Offline
Зарегистрирован: 05.01.2016

Можно какой нибудь пример? я пытался отправить email используя данный шаблон ничего не получилось.

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

 Во первых сервер SMTP должен быть без SSL - ардуино не сможет его закодировать.

Во вторых пользоватль пароль и все бинарные данные кодируются в base64 - тоесть должны быть заранее подготовленны.

Если хочется прикреплять файлы создавамые на arduino то нужно функцию по кодированию данных в base64.

А само общение с сервером это подключение по tcp и отправка ему текстовых данных, а пример представленный выше всего лишь заготовка(так как не содержит не имени сервера. ни пользователя с паролем).

Araris
Offline
Зарегистрирован: 09.11.2012

Gippopotam пишет:

Araris пишет:

Именно так, я тоже не смог найти готовых реализаций для STARTTLS, поэтому пользую свой почтовый сервер.

"свой", это какой?

Прошу прощения, недоглядел, вопрос остался неотвеченным. "Свой" - это бесплатный hMailServer, стоящий на одном из моих серверов, не использует SSL/TLS и прочего, старый классический POP3 и SMTP.

Свои попытки отправлять почту через более современные почтовые шлюзы я давно забросил (по причине SSL/TLS), да и тема электропочты применительно к Ардуино не особо популярна в Интернете, информации крайне мало.