Чтение и отправка почты с помощью R | OTUS

Чтение и отправка почты с помощью R

Примерно с начала 2010-х R как язык переживает пик роста. Активно развиваются возможности R для Data Science и Machine Learning, возникают целые фреймворки, например Shiny, позволяющие визуализировать результаты анализа и разместить их онлайн. Появляются пакеты, позволяющие делать практически что угодно, в том числе и экзотические, например, этот мем создан с помощью пакета meme:

1-20219-04ce0a.jpg

Надеюсь, в ближайшем будущем скрипты на моем RStudio Server начнут готовить мне кофе.

Некоторое время назад появилась необходимость автоматизировать процесс обработки почты. Есть некоторая пропиетарная система, которая шлёт на почту информацию о подозрительных ситуациях, но окончательное решение о том, является ли этот случай фродом, или это ложная тревога, нужно предпринимать самостоятельно, получая из баз данных дополнительную информацию. Возникла идея по письму от внешней системы с помощью R искать все нужные данные в базах, а на выходе отправлять письмо со всей фактурой и вердиктом – фрод или не фрод.

Соответственно, задачу можно декомпозировать до следующих шагов алгоритма: 1. Мониторинг ящика на предмет получения новых писем от заданного адресата. 2. Вычленение информации из письма для поиска по БД. 3. Поиск информации и принятие решения. 4. Формирование и отправка письма с информацией и выводами.

Сначала я попробовала пойти по самому лёгкому пути и использовать свой ящик от Google и пакеты gmailr и mailr. C пакетом gmailr и с OAuth 2.0 protocol от Google все шаги алгоритма предельно просты – достаточно один раз запустить код в консоли и авторизоваться в своей почте – и дальше можно использовать скрипт автоматически без собственного участия (например с помощью cronR):

library(gmailr)
## 
## Attaching package: 'gmailr'
## The following object is masked from 'package:utils':
## 
##     history
## The following objects are masked from 'package:base':
## 
##     body, date, labels, message
MessageId<-messages(search = 'search', num_results = NULL, label_ids = NULL, include_spam_trash = NULL, page_token = NULL, user_id = "me") # поиск письма от адресата search 
size<-MessageId[[1]]$resultSizeEstimate #письма в папке от нужного адресата
final_goal<-message(MessageId[1][[1]]$messages[[1]]$id)$snippet 

Использование R в качестве коннектора к различным базам данных для реализации пункта 3 алгоритма выше не является темой этой заметки, по этому поводу написано много прекрасных статей, но лично я использую следующие библиотеки для доступа к зоопарку баз:

library(DBI)
library(RMySQL)
library(RODBC)

Формирование письма с использованием gmailr также не представляет труда, т. к. можно сохранить html-разметку в виде строковой переменной и затем просто вставить её в тело письма:

library(htmlTable)
html_body <- paste0("<html><head> <style> body{font-family:Calibri, sans-serif;}
                    table{border-left:1px solid #000000;border-top:1px solid #000000;}
                    table th{border-right:1px solid #000000;border-bottom:1px solid #000000;font-size:12px; font-weight:bold; margin: 0px; padding-left: 5px; padding-right: 5px; margin: 0px;}
                    table td{border-right:1px solid #000000;border-bottom:1px solid #000000;font-size:12px; font-weight:normal; margin: 0px; padding-left: 5px; padding-right: 5px; margin: 0px;}
                    </style>
                    </head><body><p> Заголовок 1:</p>","<br>",htmlTable(cars, rnames = F),"<br><p> Заголовок 2:</p>", "<br>","</body></html>")
ifelse(as.numeric(Sys.time()-strptime(message(MessageId[1][[1]]$messages[[1]]$id)[["payload"]][["headers"]][[18]][["value"]],  "%a, %d %b %Y %H:%M:%S %z"),units="mins")<15, {send.mail(from="[email protected]",to=c('[email protected]', '[email protected]'),subject='Fraud review',body=html_body,html=TRUE,authenticate=TRUE,smtp = list(host.name="host.company.ru", user.name = "[email protected]", passwd = "password", ssl = F),encoding = "utf-8",send=TRUE)},"")# пример условия - проверка на то, что между временем получения письма и отправкой результата прошло менее 15 минут

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

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться
Популярное
Сегодня тут пусто