20 февраля 2016

Как послать электронное письмо из R



Представьте, что мы выполняем ресурсоемкие вычисления в R, которые длятся несколько часов (например, обучение той или иной модели на большом объеме данных и одновременное оценивание качества ее предсказаний путем перекрестной проверки). Сидеть перед монитором и ждать, когда эти вычисления завершатся - не очень хороший способ провести время с пользой. Вместо этого можно "попросить" R послать нам по электронной почте автоматическое уведомление о завершении вычислений. Есть как минимум четыре пакета для R, которые позволяют организовать автоматические уведомления посредством электронной почты - sendmailR, mailRgmailR и gmailr, несколько различающихся по своему функционалу и легкости процесса настройки отправки сообщений. В качестве примера рассмотрим, как работает mailR - один наиболее "продвинутых" пакетов.




Собственно, в состав в mailR входит лишь одна функция - send.mail() - со следующими основными аргументами:
  • from - электронный адрес отправителя
  • to - электронный адрес получателя
  • subject - тема письма
  • body - тело письма
  • encoding - символьный вектор, обозначающий кодировку текста в письме; поддерживаются следующие стандарты: iso-8859-1 (по умолчанию), utf-8, us-ascii, и koi8-r.
  • html - логический аргумент: TRUE, если тело письма размечено с использованием HTML, и FALSE - если нет.
  • smtp - список с настройками SMTP-сервера, с которого будет отправлено сообщение. Единственным обязательным параметром является host.name - адрес SMTP-сервера. В большинстве случаев необходимо также задать соответствующий порт при помощи одноименной опции port. Если аргумент authenticate = TRUE (см. ниже), то в списке параметров для smtp следует также указать user.name - имя пользователя, и passwd - пароль для авторизации на сервере. При необходимости можно также указать протокол шифрования: ssl = TRUE или tls = TRUE.
  • authenticate - логический аргумент: TRUE, если для подключения к SMTP-серверу требуется авторизация, и FALSE - если нет.
  • attach.files - символьный вектор, содержащий пути или URL-ссылки к файлам, которые необходимо вложить в письмо.
Дополнительную информацию по этой функции можно получить, выполнив команду ?send.mail.

Для корректной работы пакет mailR требует, чтобы на компьютере были установлены актуальная версия Java и пакет rJava (устанавливается автоматически вместе с mailR). Если Java на вашей машине еще нет, то выполните установку, скачав соответствующий вашей операционной системе дистрибутив отсюда: https://www.java.com/en/download/manual.jsp

Во избежание возможных проблем, настоятельно рекомендуется скачать этот дистрибутив самостоятельно, т.е. не использовать автоматический установщик Java. Например, при работе на компьютере с 64-битной Windows нужен будет следующий файл (указан стрелкой):



По умолчанию Java будет установлена в C:\Program Files. Рекомендуется этот путь не изменять. Далее о месте нахождения Java необходимо сообщить R. Лучше всего это сделать путем настройки соответствующей глобальной опции - java.home где-нибудь в вашем скрипте до вызова функции send.mail(). Соответствующая команда будет выглядеть примерно следующим образом:

options(java.home = "C:\\Program Files\\Java\\jre1.8.0_73")

Дальше можно вызывать пакет mailR и отсылать письмо. В приведенном ниже примере, предполагается что уведомление отсылается с Gmail-адреса отправитель@gmail.com на адрес получатель@домен.расширение (обратите внимание на необходимость заключения этих адресов при работе с Gmail  в < и >) через стандартный Gmail SMTP Server (подробнее о его конфигурации см. здесь):

library(mailR)

send.mail(from = "<отправитель@gmail.com>",
                to = "<получатель@домен.расширение>",
                subject = "Обучение модели завершено",
                body = "Хватит чаи гонять!",
                smtp = list(host.name = "smtp.gmail.com",
                            port = 465, 
                            user.name = "отправитель@gmail.com",
                            passwrd = "xxxxxx",
                            ssl = TRUE),
                authenticate = TRUE,
                encoding = "utf-8")

Множество других примеров работы с mailR (в частности, примеры отправки отчетов в формате HTML, сгенерированных при помощи R Markdown), можно найти на GitHub-странице этого проекта.

В заключение хотелось бы напомнить о необходимости соблюдения мер безопасности при использовании пакетов вроде mailR. В частности, речь идет о том, что если вы, например, вставите учетные данные для своего Gmail-акаунта в R-скрипт, а затем выложите этот скрипт в публичный доступ на сайте вроде GitHub, то ваши учетные данные сразу станут "достоянием общественности". В блоге Revolution Analytics есть хорошая статья, посвященная этой проблеме и тому, как с ней бороться.

5 комментариев :

max.there комментирует...

В январе появилась библиотека для telegram (название telegram), в разы практичнее.

max.there комментирует...

https://github.com/lbraglia/telegram

Sergey Mastitsky комментирует...

Да, вариантов много. Например, Pushbullet - отличный сервис. Есть и соответствущий пакет для R - https://cran.rstudio.com/web/packages/RPushbullet

max.there комментирует...

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

A.Chuikov комментирует...

У меня не получилось. Пишет "Error in .authenticateSMTP(smtp) :
Username and password required for SMTP authentication." Имя пользователя и пароль вписал

Отправить комментарий