Примерно с начала 2010-х 10 R как язык переживает пик роста. Активно развиваются возможности R для Data Science и Machine Learning, возникают целые фреймворки, например Shiny, позволяющие визуализировать результаты анализа и разместить их онлайн. Появляются пакеты, позволяющие делать практически что угодно, в том числе и экзотические, например, этот мем создан с помощью пакета meme:
Надеюсь, в ближайшем будущем скрипты на моем RStudio Server начнут готовить мне кофе.
Некоторое время назад появилась необходимость автоматизировать процесс обработки почты. Есть некоторая пропиетарная система, которая шлет на почту информацию о подозрительных ситуациях, но окончательное решение о том, является ли этот случай фродом, или это ложная тревога, нужно предпринимать самостоятельно, получая из баз данных дополнительную информацию. Возникла идея по письму от внешней системы с помощью R искать все нужные данные в базах, а на выходе отправлять письмо со всей фактурой и вердиктом – фрод или не фрод. Соответственно задачу можно декомпозировать до следующих шагов алгоритма:
Сначала я попробовала пойти по самому легкому пути и использовать свой ящик от 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="mail@copany.ru",to=c('name@GMAIL.COM', 'fraud@company.ru'),subject='Fraud review',body=html_body,html=TRUE,authenticate=TRUE,smtp = list(host.name="host.company.ru", user.name = "user@company.ru", passwd = "password", ssl = F),encoding = "utf-8",send=TRUE)},"")# пример условия - проверка на то, что между временем получения письма и отправкой результата прошло менее 15 минут
К сожалению, корпоративная этика вносит свои коррективы, а информационная безопасность такая безопасность, поэтому вторая часть этой статьи будет посвящена использованию альтернативных пакетов для мониторинга корпоративного ящика.