Блог про интернет-маркетинг для бизнеса

Аналитика

Как настроить отправку писем с помощью языка R

48
0
3
16

Хотите оперативно и своевременно узнавать о сбоях в работе скриптов R? Достаточно настроить оповещения на email. В этой статье я опишу, как настроить рассылку с помощью языка R и как избежать подводных камней.

Что можно отправлять в письмах:

  • отчеты по результату работы скрипта на свою почту или по списку конкретных email-адресов;
  • сообщения об ошибках, которые возникли в работе скриптов;
  • файлы с локального диска, например, фотографию или CSV-документ.

Чтобы настроить отправку писем, потребуется:

  • язык R;
  • интегрированная среда разработки RStudio.

Как выбрать пакет R для отправки email

Как выбрать пакет R для отправки email?

Для отправки писем существует несколько пакетов. При выборе подходящего учитывайте:

  • нужна ли аутентификация в почтовом сервисе;
  • пользователям каких почтовых ящиков будете отправлять сообщения.

Рассмотрим подробнее плюсы и минусы пакетов «sendmailR» и «mailR».

1. Пакет «sendmailR»

Этот пакет не поддерживает процедуру аутентификации, а значит, можно отправлять письма не из всех почтовых сервисов. Более того, сервисы, позволяющие рассылать письма без аутентификации, накладывают определенные ограничения. К примеру, SMTP сервер для Gmail (ASPMX.L.GOOGLE.COM) не требует аутентификации, но отправлять сообщения можно только пользователям Gmail или G Suite.

Преимущество «sendmailR» в том, что этот пакет достаточно прост в установке, не требуется дополнительное программное обеспечение.

2. Пакет «mailR»

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

Сложности могут возникнуть в связи с тем, что для работы пакета требуется установка Java.

Если нужно провести рассылку исключительно по пользователям Gmail или G Suite и при этом аутентификация необязательна — без особых раздумий пользуйтесь пакетом «sendmailR», в противном случае — выбирайте «mailR».

Как установить пакет «sendmailR»?

1. Для установки пакета откройте RStudio и в области «Source» вставьте код:

#Установка пакета
install.packages("sendmailR")

#Подключение пакета
library(sendmailR)

Если вы впервыв запустили RStudio, воспользуйтесь сочетанием клавиш «Ctrl+«Alt+Shift+0», чтобы появилась панель «Source».

Как установить пакет «sendmailR»

2. Чтобы настроить отправку писем, подставьте ваши данные в код ниже:

from = "<sender@gmail.com>"
to = c("<recipient1@gmail.com>","<recipient2@gmail.com>")
subject <- “My first test letter”
body    <- (“It`s my first letter from R by sendmailR package!” ,mime_part(iris))
sendmail(from=from,to=to,subject=subject,msg=body,control=list(smtpServer="ASPMX.L.GOOGLE.COM"))

 

2.1. Вместо «sender@gmail.com» впишите адрес своей Gmail-почты, вместо «recipient1@gmail.com» и «recipient2@gmail.com» — адреса получателей. Помните, что с SMTP сервера ASPMX.L.GOOGLE.COM можно рассылать письма только пользователям Gmail и G Suite,

2.2. В «subject» впишите тему письма,

2.3. Объект «body» содержит тело письма. В теле письма может быть не только текст («It`s my first letter from R by sendmailR package!»), но и вложения, например, встроенная R-таблица «iris».

2.4. Команда «sendmail» отправляет письмо. При проверке почты в первую очередь посмотрите папку «Спам»: из-за того, что вы отправили email без аутентификации и предварительно не настроили фильтр на почте, письмо сначала, скорее всего, попадет в спам.

Как установить пакет «mailR»?

1. Скачайте и установите версию Java, соответствующую разрядности на вашем компьютере.

Для 32-разрядной операционной системы скачайте Java по ссылке.

Если у вас 64-разрядная ОС, рекомендую скачать нужную версию из стороннего ресурса. На официальном сайте указано, что 64-битную Java можно скачать только через 64-разрядную версию браузера — я пробовал этот способ и не получил нужный результат.

2. Далее нужно установить пакеты «rJava» и «mailR»:

#Установка пакета
install.packages("rJava")
install.packages("mailR")

#Подключение пакета
library(mailR)

При запуске кода может появиться следующая ошибка:

Error: .onLoad failed in loadNamespace() for 'rJava', details: call: fun(libname, pkgname) error: JAVA_HOME cannot be determined from the Registry

Рассмотрим возможные причины:

2.1. Разрядность установленной Java не соответствует текущей версии Windows. Обычно подобная ошибка возникает, если у вас 64-разрядная ОС.

Как определить, какую версию Java вы используете? Проверьте системный диск Windows: для установки программного обеспечения по умолчанию используются две папки, расположенные в корне системного диска. Если папка «Java» появилась в «Program Files» — это 64-разрядная версия, а если в папке «Program Files (x86)» — 32-разрядная.

2.2. Вторая причина ошибки: в R не прописана или неверно прописана опция «JAVA_HOME». Чтобы устранить ошибку, запустите в R команды:

    • для 32-разрядной ОС:
Sys.setenv(JAVA_HOME='C:\\Program Files (x86)\\Java\\jre1.8.0_102')
    • для 64-разрядной ОС:
Sys.setenv(JAVA_HOME='C:\\Program Files\\Java\\jre1.8.0_102')

 

Перед запуском команды замените «jre1.8.0_102» на название файла Java, установленного на вашем клмпьютере. Файл можно найти в одноименной папке «Java», о которой я упоминал в предыдущем пункте. 

3. Далее нужно определить, требует ли ваш SMTP-сервер прохождения аутентификации, и в зависимости от этого выбрать подходящий код для отправки писем.

3.1. Для отправки писем без процедуры аутентификации в код подставьте данные:

  • тема и тело письма;
  • отправитель и получатели;
  • параметры SMTP-сервера.
library(mailR)
send.mail(from = "sender@gmail.com",
         to = c("Recipient 1 <recipient1@gmail.com>", "recipient2@gmail.com"),
         cc = c("CC Recipient <cc.recipient@gmail.com>"),
         bcc = c("BCC Recipient <bcc.recipient@gmail.com>"),
         subject = "Subject of the email",
         body = "Body of the email",
         smtp = list(host.name = "aspmx.l.google.com", port = 25),
         authenticate = FALSE,
         send = TRUE)

3.2. Чтобы отправить письмо через SMTP с прохождением аутентификации, используйте код: 

library(mailR)
send.mail(from = "sender@gmail.com",
         to = c("recipient1@gmail.com", "Recipient 2 <recipient2@gmail.com>"),
         replyTo = c("Reply to someone else <someone.else@gmail.com>")
         subject = "Subject of the email",
         body = "Body of the email",
         smtp = list(host.name = "smtp.gmail.com", port = 465, user.name = "gmail_username", passwd = "password", ssl = TRUE),
         authenticate = TRUE,
         send = TRUE)

Аргумент «smtp» содержит все параметры SMTP сервера и в нем необходимо указать учетные данные. 

Как отправлять письма с текстом на русском языке? 

Если вы используете пакет «mailR» и хотите, чтобы ваши письма содержали в теме или теле кириллические символы, воспользуйтесь аргументом «encoding» и укажите кодировку «utf-8».

library(mailR)
send.mail(from = "Sender Name <sender@gmail.com>",
                  to = "recipient@gmail.com",
                  subject = "Тема тестового письма на русском языке.",
                  body = "Русскоязычное тело письма!",
                  encoding = "utf-8",
                  smtp = list(host.name = "smtp.gmail.com", port = 465, user.name = "gmail_username", passwd = "password", ssl = T),
              authenticate = TRUE,
                  send = TRUE)

 

Для отправки русскоязычного текста с помощью пакета «sendmailR» необходимо предварительно дважды перекодировать этот текст в UTF-8.

library(sendmailR)
from = "<sender@gmail.com>"
to = c("<recipient1@gmail.com>","<recipient2@gmail.com>")
subject <- iconv(iconv('Тема письма',to = "UTF-8"),to = "UTF-8")
body    <- iconv(iconv('Тело письма',to = "UTF-8"),to = "UTF-8")
sendmail(from=from,to=to,subject=subject,msg=body,control=list(smtpServer="ASPMX.L.GOOGLE.COM"))

Как отправлять письма в формате HTML?

Для отправки сообщений в HTML-формате с помощью пакета «mailR» достаточно воспользоваться аргументом «html»:

library(mailR)
send.mail(from = "sender@gmail.com",
         to = c("recipient1@gmail.com", "recipient2@gmail.com"),
         subject = "Subject of the email",
         body = "<html>The apache logo - <img src=\"http://www.apache.org/images/asf_logo_wide.gif\"></html>",
         html = TRUE,
         smtp = list(host.name = "smtp.gmail.com", port = 465, user.name = "gmail_username", passwd = "password", ssl = TRUE),
         authenticate = TRUE,
         send = TRUE)

 

Для отправки письма в HTML-формате с помощью пакета «sendmailR» используйте такой код:

library(sendmailR)
msg <- mime_part('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0
Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
 <title>HTML demo</title>
 <style type="text/css">
 </style>
</head>
<body>
<h1>HTML demo</h1>
</body>
</html>')

msg[["headers"]][["Content-Type"]] <- "text/html"

from = "<sender@gmail.com>"
to = c("<recipient1@gmail.com>","<recipient2@gmail.com>")
subject <- "HTML test"
body    <- list(msg)
sendmail(from=from,to=to,subject=subject,msg=body,control=list(smtpServer="ASPMX.L.GOOGLE.COM"))

Как отправить в теле письма HTML-таблицу?

Самый простой способ — использовать пакет «htmlTable». Приведу примеры преобразования встроенной в R-таблицы «iris» в HTML-формат и добавление ее в тело письма.

Код для пакета «mailR»:

iris_html <- htmlTable(iris)
library(mailR)
send.mail(from = "sender@gmail.com",
         to = c("recipient1@gmail.com", "recipient2@gmail.com"),
         subject = "Subject of the email",
         body = iris_html,
         html = TRUE,
         smtp = list(host.name = "smtp.gmail.com", port = 465, user.name = "gmail_username", passwd = "password", ssl = TRUE),
         authenticate = TRUE,
         send = TRUE)

Пример для «sendmailR»:

library(sendmailR)

iris_html <- htmlTable(iris)

msg <- mime_part(paste0('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0
                Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
                <html xmlns="http://www.w3.org/1999/xhtml">
                <head>
                <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
                <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
                <title>HTML table demo</title>
                <style type="text/css">
                </style>
                </head>
                <body>
                <h1>My table iris</h1>',
                iris_html ,'
                </body>
                </html>'))

msg[["headers"]][["Content-Type"]] <- "text/html"

from = "<sender@gmail.com>"
to = c("<recipient1@gmail.com>","<recipient2@gmail.com>")
subject <- "HTML test"
body    <- list(msg)
sendmail(from=from,to=to,subject=subject,msg=body,control=list(smtpServer="ASPMX.L.GOOGLE.COM"))

Так же легко преобразовать любую таблицу из R в HTML-формат и отправлять ее в письме.

Выводы

Язык R достаточно мощный, чтобы автоматизировать практически любой процесс работы с данными. Чтобы получать отчеты о работе скриптов или уведомления об ошибках, выберите подходящий пакет R и настройте рассылку.

  1. Пакет «sendmailR» прост в установке, но не поддерживает процедуру аутентификации, и вы сможете отправлять письма только пользователям Gmail или G Suite.
  2. Пакет «mailR» поддерживает аутентификацию, но в процессе его установки вам также придется инсталлировать Java.
  3. С помощью языка R можно настроить не только отправку простых текстовых сообщений, но и письма:
    • с текстом на кириллице;
    • в формате HTML;
    • с HTML-таблицей в теле.
Обнаружили ошибку? Выделите ее и нажмите Ctrl + Enter.

Комментарии (1)

  1. 2
    7 месяцев назад

    Настроил рассылку у себя с помощью mailR. К счастью, не пришлось с java заморачиваться. Сразу все заработало.

    В помощь новичкам, настройки SMTP популярных почтовых сервисов:

    * yandex - https://yandex.com/support/mail-new/mail-clients.html

    * gmail - https://support.google.com/a/answer/176600?hl=en

Чтобы оставить комментарий, необходимо авторизироваться

Подписаться

на самую полезную рассылку по интернет-маркетингу

Самое

обсуждаемое популярное читаемое