Опять отправка почты с Arduino
- Войдите на сайт для отправки комментариев
Вс, 20/11/2016 - 09:23
Встала проблема отправки почты с 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
Уважаемые форумчане прошу помочь советом, что не так
у Вас на bk.ru есть учётная запись?
Уже 12 лет
а отправляете какому серверу? как правило логин должен быть полный если сервер обрабатывает более одного доменного имени, то-есть как сервер определит адресата вы к примеру arduino@mail.ru, asrduino@bk.ru и т.д., зайдите на сайт почтового сервиса и посмотрите документацию по настройке SMTP
Пытался логин вводить полностью XXXX@bk.ru, не помогло
Надо писать ответы сервера в лог, сек гляну, что у меня пор почте, если есть возможность дам тестовую учётку
кстати у вас - client.println(("EHLO bk.ru")); )))
Толком не понял что это, написал как было в примере client.println(("EHLO mail.ru"));
Скорее всего Hello
дайте вашу почту, пришлю тестовый аккаунт
goldz@bk.ru
Ткните носом, какую полезную информацию я могу подчерпнуть из Вашего письма
чтобы получить полезную информацию надо будет посмотреть лог сервера. ЧТО ЕМУ НЕ НРАВИТСЯ
в мониторе ком порта у вас всё замечательно?
Если да, значит что-то на стороне сервера
Экстрасенсов тут нет )))
Если сделали всё по рекомендациям mail
работать должно, только там порт smtp 465 а у вас 25
чтобы получить полезную информацию надо будет посмотреть лог сервера. ЧТО ЕМУ НЕ НРАВИТСЯ
...
работать должно, только там порт smtp 465 а у вас 25
Работать должно ? Сомневаюсь. Серверу не нравится отсутствие SSL-соединения, а с этим у Ардуино бооольшие проблемы.
Почитайте давнее обсуждение этой проблемы, насколько я знаю, с тех пор мало что изменилось.
http://arduino.ru/forum/programmirovanie/otpravka-elektronnogo-pisma-email-s-prikreplennym-failom-iz-arduino-sim900
P.S. Про команду "EHLO" информацию несложно найти, кстати.
таки и предложил товарищу аккаунт без ssl, на мне железо, так что имею общее представление - не больше, по команде глянул, ну нельзя же так, ощущаешь себя ископаемым динозавром )))
ну да ладно!
А через bk.ru выходит никак )))
Аккаунт удалил
Оно и немудрено - протоколу SMTP уже 34 года )))
))) а вообще для этих целей есть другие железки, надо оставить ардуине то, что она умеет делать хорошо, а сеть оставить линуксу (ORANGE PI)
либо пользовать сервис temboo....уже года полтора с его помощью из ардуины отправляю емейлы,твиты...это пока единственное простое решение которое заработало...
Встала проблема отправки почты с Arduino
1. Вы ответы почтового сервера "видите", или пишете в "пустоту"?
2. Всю кириллицу в теле письма надо перекодировать в Base64
3. Авторизации в Base64
4. Если UART занят, используйте програмный UART (только на передачу) для отладочных сообщений, или отладьте программу на компе.
У меня был старый проэкт, но там код на машине состояния был. Восстановил алгоритм.
PS: Раньше mail.ru bk.ru yandex.ru ramler.ru по 25 порту работали. Сейчас загнивают и не работают!!! Да и регистрацию вроде закрыли без телефона.
Используйте заграничные серверы, например openmailbox.org.
Работает с яндекса на яндекс:
#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;
}