Как отправить электронное письмо с помощью Arduino и Wi-Fi shield?

Я хочу, чтобы ардуино подключался через Wi-Fi, а затем отправлял email. Идея очень проста, но проблема в том, что я никогда раньше не работал с этими протоколами и другими вещами. Я просто хотел что-то уже готовое, поэтому просто изменил бы информацию.

Есть ли библиотека или функция, которая отправляет электронное письмо?

Если бы кто-то мог помочь мне понять, чтобы я мог сделать это сам, это было бы лучше всего.

, 👍4

Обсуждение

Электронная почта может быть слишком большой для устройства, работающего на частоте 16 МГц. Тайм-аут, вероятно, предотвратил бы это. Какую плату вы используете?, @Anonymous Penguin

Но это довольно просто с внешним сервисом, таким как temboo или аналогичные сервисы, и вполне возможно с arduino. Если бы пользователь опубликовал какой-то код, используя библиотеку для одного из таких сервисов, был бы это адекватный вопрос? Итак, проблема в том, что рекомендовать решения SO из-за политики SO недостаточно?, @drodri

@drodri Я не совсем понимаю ваши последние несколько предложений... вы спрашиваете, будет ли это по теме, если использовать подобный сервис? Если да, то это можно считать ответом на поставленный вопрос. Я не знаю ни о каких политиках SE, которые не позволяют рекомендовать программные решения... вы имеете в виду никаких вопросов о покупках? Если да, то это совершенно другая тема., @Anonymous Penguin

Это, конечно, возможно, и я использую его с небольшими текстовыми оповещениями. Посмотрите библиотеку Ethernet - версия WiFi должна работать аналогичным образом. По сути, вы открываете соединение с портом 25 (или соответствующим портом на вашем почтовом сервере), согласовываете HELO с println() и отправляете электронное письмо. Найдите "telnet для отправки электронной почты", так как это, по сути, тот синтаксис, который вам понадобится. Обратите внимание, что большинство почтовых провайдеров блокируют такие попытки отправки электронной почты (для ограничения спам-ботов), поэтому убедитесь, что это разрешено, прежде чем пытаться это сделать., @Ron J.


5 ответов


5

То, что вы ищете, - это библиотека SMTP (Simple Mail Transport Protocol). Поиск в Google находит 2 для Arduino:

  • SmtpClient

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

  • ФуллИП

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

,

Я сталкиваюсь с той же проблемой, но беспокоюсь о безопасности. Если вы используете, например, мою учетную запись gmail, мне пришлось бы предоставить свой gmail passwd для smtp-соединения, что не очень безопасно. Я пробовал внешние сервисы, такие как temboo, который позволяет хранить мои учетные данные gmail, и я подключаюсь к сервису (http) через учетные данные службы, которые также безопасны, но, по крайней мере, кажутся чрезмерным уровнем косвенности. Какой подход вы бы порекомендовали? Заслуживает ли эта озабоченность отдельного вопроса?, @drodri

GMail может использовать SSMTP, который является SMTP, защищенным с помощью SSL. Я не уверен, есть ли какие-либо библиотеки SSMTP для Arduino, или даже если у него достаточно мощности для этого. Возможно, вам понадобится что-то вроде Due или Yun (или что-то большее, например RPi или BB), что может обеспечить немного больше эффекта., @Ignacio Vazquez-Abrams

@drodri Для первой из перечисленных библиотек используется только не прошедший проверку подлинности SMTP-сервер... никаких паролей. Было некоторое упоминание о реализации этого позже, но я не знаю, будет ли он использовать SSMTP или нет., @Anonymous Penguin


3

На самом деле вы представляете здесь 2 вопроса, которые можно решить отдельно:

  • Вы беспокоитесь о том, чтобы иметь Wi-Fi, а не Ethernet-щит. Это никак не влияет на отправку электронной почты или любой другой сетевой материал. Когда у вас есть подключение к Интернету, оно почти прозрачно со стороны программирования. Поэтому я рекомендую сначала попробовать подключение и настройку wifi shield как отдельную проблему, с более простой задачей, как простой HTTP_GET на известную веб-страницу. Такая функция может помочь, если предположить, что у вас есть экземпляр WiFiClient (который является клиентом), который был подключен (с помощью connect) к URL-адресу и порту 80:

    void http_get(Client& www, char website[], char webpage[], int timeout, Stream& stream) {
        if (www.connected()) {
            int n = www.print("GET ");
            www.print(webpage);
            www.print(" HTTP/1.1\r\n");
            www.print("Host: ");
            www.print(website);
            www.print("\r\n");
            www.print("\r\n");
        } else {
            stream.println(F("Connection failed get"));
            return;
        }
    
        /* Read data until either the connection is closed, or the idle timeout is reached. */
        unsigned long lastRead = millis();
        while (www.connected() && (millis() - lastRead < timeout)) {
            while (www.available()) {
                char c = www.read();
                stream.print(c);
                lastRead = millis();
            }
        }
    }
    
  • Вторая проблема заключается в том, что вы хотите отправить электронное письмо. Если у вас есть соединение, не имеет значения, Wi-Fi оно или проводное. Вышеуказанные рекомендуемые библиотеки (SmtpClient, FullIP) будут напрямую подключаться к вашему провайдеру (например, gmail) и запрашивать ваш пароль gmail, что не является безопасным по сравнению с небезопасными соединениями (и эти библиотеки, похоже, не обеспечивают безопасный уровень), поэтому лично меня этот вариант не устраивает. Я пользуюсь сервисом temboo, который позволяет отправлять электронные письма, и нахожу его довольно удобным и простым. Кроме того, у них есть много других услуг. Служба хранит ваши учетные данные gmail или любого другого поставщика, и вы получаете доступ к службе с помощью секретного ключа и пароля приложения, которые они предоставляют. Хотя эти ключи могут быть не полностью безопасными для отправки через небезопасные уровни, по крайней мере, они компрометируют только ваше приложение в облачном приложении, которым вы можете просто управлять, а не вашу полную учетную запись электронной почты. (Отказ от ответственности: я не имею никакого отношения к temboo, и для этой задачи могут быть другие подобные сервисы, например Carriots, я просто говорю, что я успешно использовал их для этой задачи и чувствую, что это относительно просто). Ваш код, использующий temboo, может быть чем-то вроде:

    TembooChoreo choreo(client); // ваш объект WiFiClient
    
    // Установить учетные данные учетной
    choreo.setAccountName(temboo_account);
    choreo.setAppKeyName(temboo_app);
    choreo.setAppKey(temboo_app_key);
    
    // credential - это имя вашего профиля gmail в temboo
    choreo.setCredential(credential);
    choreo.addInput("MessageBody", body);
    choreo.addInput("Subject", subject);
    choreo.addInput("ToAddress", address);
    
    //Определите Choreo для запуска
    choreo.setChoreo("/Library/Google/Gmail/SendEmail");
    
    choreo.run();
    choreo.close();
    
,

Выпьем за это! Вы и @Ignacio Васкес-Абрамс очень помогли мне! в самом деле! Но, если я использую SMTP / FUllIp вместо этих более защищенных соединений, было бы проще / проще кодировать? Моему проекту не нужна безопасность, потому что это просто автоматизация для меня, и я создам для этого электронное письмо, @user3504192

Если вам не нужна такая безопасность, и вы можете просто отправлять электронные письма с выделенной учетной записью электронной почты, SmtpClient действительно очень прост в программировании, как вы можете видеть в README https://github.com/gregington/SMTPClient , я бы сказал, что сложность кода и настройки одинакова, но SmtpClient не потребует настройте свой сервис temboo, что тоже несложно, но займет у вас еще некоторое время. Таким образом, вы можете придерживаться SMTP, рассматривая внешние службы как тембу для более сложных задач, например, если вашему сервису (twiter, dropbox?) Требуется безопасное или более сложное соединение., @drodri


2

Может возникнуть проблема с отправкой электронной почты с Arduino, но не там, где вы ее ожидаете. Протокол SMTP очень прост, даже Arduino может справиться с этим. Но вам понадобится SMTP-сервер, который будет разговаривать с вашим Arduino. SSL-соединения (как в Gmail) не принимаются во внимание (код для обработки шифрования был бы слишком большим для Arduino), поэтому вам придется найти почтового оператора, который предоставляет простой SMTP - а их не так много. Если вы создадите его сами, скажем, на своем домашнем компьютере со статическим IP-адресом, это будет приглашением для спамеров и гарантированным способом занести ваш IP в черный список Spamhaus. Мой совет - разместить где-нибудь скрипт Python, PHP или Perl, который будет обрабатывать HTTP POST-запросы от вашего Arduino и отправлять электронную почту. Это безопаснее и проще.

,

На самом деле многие интернет-провайдеры (по крайней мере, здесь, в США) предоставляют почтовые серверы, не использующие SSL, которые разрешают входящие соединения только с диапазонов IP своих клиентов; если ваш Arduino будет подключаться к фиксированному соединению (например, к домашнему Wi-Fi), вы можете использовать SMTP-сервер провайдера., @Doktor J


1

Отправка gmail через SMTP с Arduino вполне осуществима. Я делаю это из Arduino MKR WIFI 1010, используя библиотеку WIFINina. Я почти уверен, что мое решение будет работать на любом из Arduino на базе SAMD.

Есть немного "настройки", но это не сложно.

Проверьте мое решение в моем репо gitlab.

Обязательно выполните настройку, ПРЕЖДЕ чем пытаться выполнить код... Удачи вам! ГФ

,

0

Самый простой способ отправить электронную почту с Arduino - сделать HTTP-запрос на IFTTT. См . Arduino - IFTTT

,