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

Курсы

Программирование
Microservice Architecture
-5%
React.js Developer
-4%
C++ Developer. Professional
-5%
Scala-разработчик
-8%
Backend-разработчик на PHP
-9%
Алгоритмы и структуры данных
-9%
Python Developer. Basic
-12%
Golang Developer. Professional
-5%
HTML/CSS
-11%
C# ASP.NET Core разработчик
-5%
Kotlin Backend Developer
-8%
iOS Developer. Professional
-8%
Java Developer. Professional Web-разработчик на Python MS SQL Server Developer Android Developer. Basic Разработчик программных роботов (RPA) на базе UiPath и PIX Highload Architect Reverse-Engineering. Professional Vue.js разработчик Node.js Developer Интенсив «Оптимизация в Java» Супер-практикум по использованию и настройке GIT Symfony Framework Java Developer. Basic Unity Game Developer. Professional Супер-интенсив Azure
Инфраструктура
Microservice Architecture
-5%
Экспресс-курс «IaC Ansible»
-10%
Administrator Linux.Basic
-10%
Мониторинг и логирование: Zabbix, Prometheus, ELK
-10%
Экспресс-курс «CI/CD или Непрерывная поставка с Docker и Kubernetes»
-30%
Administrator Linux. Professional
-6%
Экcпресс-курс «ELK»
-10%
Экспресс-курс по управлению миграциями (DBVC)
-10%
Базы данных Network engineer Разработчик программных роботов (RPA) на базе UiPath и PIX Highload Architect Разработчик голосовых ассистентов и чат-ботов VOIP инженер Супер-практикум по работе с протоколом BGP Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes Супер-интенсив "Tarantool"
Специализации Курсы в разработке Подготовительные курсы
+7 499 938-92-02

Чтение и отправка почты с помощью 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="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 минут

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

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

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

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

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