Опять отправка почты с Arduino

Goldz
Offline
Зарегистрирован: 23.04.2011

Встала проблема отправки почты с Arduino

Прочесал Internet

Нашел пример от 13 года

#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,1,177);

// IP smtp сервера
IPAddress server(217,69,139,163);// bk.ru
// IP других сереров можно найти в инете 

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

// создаем экземпляр клиента
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)){
      Serial.println("CONNECT");
      return true;
    }
    else{
      return false;
    }
  }
}

// метод отправки сообщения
void SendMessage(){
  Serial.println("Please wite...");
  LogPass();
  Message message = {
    "goldz@bk.ru",
    "zki28@lenta.ru",
    "Проба пера",//тема
    "Огромный привет от Ардуино!!!!" };//само сообщение
  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(("EHLO bk.ru"));
    delay(250);
    client.println(("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;
}

Переработал

Говорит что соединение с сервером есть

Хаб подтверждает соединение

Письмо до адресата не доходит

Для отправки использую smtp.bk.ru

Уважаемые форумчане прошу помочь советом, что не так

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

у Вас на bk.ru есть учётная запись?

Goldz
Offline
Зарегистрирован: 23.04.2011

Уже 12 лет

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

а отправляете какому серверу? как правило логин должен быть полный если сервер обрабатывает более одного доменного имени, то-есть как сервер определит адресата вы к примеру arduino@mail.ru, asrduino@bk.ru и т.д., зайдите на сайт почтового сервиса и посмотрите документацию по настройке SMTP

Goldz
Offline
Зарегистрирован: 23.04.2011

Пытался логин вводить полностью XXXX@bk.ru, не помогло

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Надо писать ответы сервера в лог, сек гляну, что у меня пор почте, если есть возможность  дам тестовую учётку
кстати у вас -    client.println(("EHLO bk.ru")); )))

Goldz
Offline
Зарегистрирован: 23.04.2011

Толком не понял что это, написал как было в примере  client.println(("EHLO mail.ru"));

Скорее всего Hello

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

дайте вашу почту, пришлю тестовый аккаунт

Goldz
Offline
Зарегистрирован: 23.04.2011
Goldz
Offline
Зарегистрирован: 23.04.2011

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

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

чтобы получить полезную информацию надо будет посмотреть лог сервера. ЧТО ЕМУ НЕ НРАВИТСЯ
в мониторе ком порта у вас всё замечательно?
Если да, значит что-то на стороне сервера

Экстрасенсов тут нет )))

Если сделали всё по рекомендациям mail

работать должно, только там порт smtp 465 а у вас 25

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

ua6em пишет:

чтобы получить полезную информацию надо будет посмотреть лог сервера. ЧТО ЕМУ НЕ НРАВИТСЯ

...

работать должно, только там порт smtp 465 а у вас 25

Работать должно ? Сомневаюсь. Серверу не нравится отсутствие SSL-соединения, а с этим у Ардуино бооольшие проблемы. 

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

http://arduino.ru/forum/programmirovanie/otpravka-elektronnogo-pisma-email-s-prikreplennym-failom-iz-arduino-sim900

P.S. Про команду "EHLO" информацию несложно найти, кстати.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

таки и предложил товарищу аккаунт без ssl, на мне железо, так что имею общее представление - не больше, по команде глянул, ну нельзя же так, ощущаешь себя ископаемым динозавром )))
ну да ладно!
А через bk.ru выходит никак )))
Аккаунт удалил

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

Оно и немудрено - протоколу SMTP уже 34 года )))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

))) а вообще для этих целей есть другие железки, надо оставить ардуине то, что она умеет делать хорошо, а сеть оставить линуксу (ORANGE PI)

pastry777
Offline
Зарегистрирован: 16.01.2014

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

_kp
Offline
Зарегистрирован: 07.10.2016

Goldz пишет:

Встала проблема отправки почты с Arduino

1. Вы ответы почтового сервера "видите", или пишете в "пустоту"?
2. Всю кириллицу в теле письма надо перекодировать в Base64
3. Авторизации  в Base64
4. Если UART занят, используйте програмный UART (только на передачу) для отладочных сообщений, или отладьте программу на компе.

У меня был старый проэкт, но там код на машине состояния был. Восстановил алгоритм.
 

//подключение к серверу 
 answ:  220 mail.ru la-la-la


 send:  "HELO"
 answ:   250 domain name la-la-la \n la-la-la
//Читаем строки в цикле пока сервер не угомонится или не будет ответ 250
//Если ответ не 250, прекращаем

 authorize();  //авторизация!!!!! !!!!! !!!!!


 send:  "MAIL FROM: <UserName@mail.ru>"  CRLF
 answ:  250 user@mail.ru seder accepted //Так же обычно посылают если FROM не совпал с логином
//Если ответ не 250, прекращаем

 send:  "RCPT TO: <на деревню дедушке>" CRLF
 answ:  250 на деревню дедушке ok
//Тут ответ можно игнорировать 

 send:  "DATA" CRLF
 answ:  354  Start mail input; end with <CRLF>.<CRLF>

//Подзаголовок
 send:  "FROM: "Дядя Вася<UserName@mail.ru>"  CRLF
 send:  "TO: <dest_user@dest_domain.com>"        CRLF
 send:  "SUBJECT: test"                       CRLF CRLF //Важно, не 1 не 3, а 2 СRLF!

send: "Hello world from email."
send: "Hello world from email."
send: "Hello world from email."

send: CRLF "." CRLF
 
answ:  250 
//Если ответ не 250, прекращаем
send: "QUIT" CRLF

- - - - - - - - - - -

//Авторизируемся на smtp сервере
bool authorize() //Псевдокод
{

  send: "AUTH LOGIN" CRLF
  if( (a=read_answer()) <0 ) return FALSE; 
  if( a==503 )) return TRUE; //уже залогинены
  if( a==334 )) return FALSE; 

  send: Base64Encode( user_login )  CRLF
  if( (a=read_answer()) <0 ) return FALSE; 
  if( a==334 )) return FALSE; 


  send: Base64Encode( user_password )  CRLF
  if( (a=read_answer()) <0 ) return FALSE; 
  if( a==235 )) return FALSE; 
  return TRUE; //login OK
}

PS: Раньше mail.ru bk.ru yandex.ru ramler.ru по 25 порту работали. Сейчас загнивают и не работают!!! Да и регистрацию вроде закрыли без телефона.
Используйте заграничные серверы, например openmailbox.org.

Aircross
Offline
Зарегистрирован: 05.04.2017

Работает с яндекса на яндекс:

 

#include <Dhcp.h>
#include <Dns.h>
#include <Ethernet.h>
#include <EthernetClient.h>
#include <EthernetServer.h>
#include <EthernetUdp.h>

#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,1,48);

// IP smtp сервера
IPAddress server(87,250,251,50);
// IP других сереров можно найти в инете

// логин и пароль к почтовому сервису
char login[] = "A........@yandex.ru";//
char password[] = "A.......";

// создаем экземпляр клиента
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 = {
"A.......@yandex.ru",
"B......@yandex.ru",
"Проба пера",//тема
"Огромный привет от Ардуино!!!!" };//само сообщение
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;
}