Чтение и отправка почты с помощью R
Примерно с начала 2010-х R как язык переживает пик роста. Активно развиваются возможности R для Data Science и Machine Learning, возникают целые фреймворки, например Shiny, позволяющие визуализировать результаты анализа и разместить их онлайн.
Надеюсь, в ближайшем будущем скрипты на моем 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 минут
К сожалению, корпоративная этика вносит свои коррективы, а информационная безопасность такая безопасность, поэтому вторая часть этой статьи будет посвящена использованию альтернативных пакетов для мониторинга корпоративного ящика.