HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>Теги: r для аналитика, программирование на r, r, чтение, отправка почты, shiny, meme, rstudio server, автоматизация, фрод</p>
1 <p>Теги: r для аналитика, программирование на r, r, чтение, отправка почты, shiny, meme, rstudio server, автоматизация, фрод</p>
2 <p>Примерно с начала 2010-х R как язык переживает пик роста. Активно развиваются возможности R для Data Science и Machine Learning, возникают целые фреймворки, например<a>Shiny</a>, позволяющие визуализировать результаты анализа и разместить их онлайн. Появляются пакеты, позволяющие делать практически что угодно, в том числе и экзотические, например, этот мем создан с помощью пакета<a>meme</a>:</p>
2 <p>Примерно с начала 2010-х R как язык переживает пик роста. Активно развиваются возможности R для Data Science и Machine Learning, возникают целые фреймворки, например<a>Shiny</a>, позволяющие визуализировать результаты анализа и разместить их онлайн. Появляются пакеты, позволяющие делать практически что угодно, в том числе и экзотические, например, этот мем создан с помощью пакета<a>meme</a>:</p>
3 <p>Надеюсь, в ближайшем будущем скрипты на моем<strong>RStudio Server</strong>начнут готовить мне кофе.</p>
3 <p>Надеюсь, в ближайшем будущем скрипты на моем<strong>RStudio Server</strong>начнут готовить мне кофе.</p>
4 <p>Некоторое время назад появилась необходимость автоматизировать процесс обработки почты. Есть некоторая пропиетарная система, которая шлёт на почту информацию о подозрительных ситуациях, но окончательное решение о том, является ли этот случай фродом, или это ложная тревога, нужно предпринимать самостоятельно, получая из баз данных дополнительную информацию. Возникла идея по письму от внешней системы с помощью R искать все нужные данные в базах, а на выходе отправлять письмо со всей фактурой и вердиктом -<strong>фрод или не фрод</strong>.</p>
4 <p>Некоторое время назад появилась необходимость автоматизировать процесс обработки почты. Есть некоторая пропиетарная система, которая шлёт на почту информацию о подозрительных ситуациях, но окончательное решение о том, является ли этот случай фродом, или это ложная тревога, нужно предпринимать самостоятельно, получая из баз данных дополнительную информацию. Возникла идея по письму от внешней системы с помощью R искать все нужные данные в базах, а на выходе отправлять письмо со всей фактурой и вердиктом -<strong>фрод или не фрод</strong>.</p>
5 <p>Соответственно, задачу можно декомпозировать до следующих шагов алгоритма: 1. Мониторинг ящика на предмет получения новых писем от заданного адресата. 2. Вычленение информации из письма для поиска по БД. 3. Поиск информации и принятие решения. 4. Формирование и отправка письма с информацией и выводами.</p>
5 <p>Соответственно, задачу можно декомпозировать до следующих шагов алгоритма: 1. Мониторинг ящика на предмет получения новых писем от заданного адресата. 2. Вычленение информации из письма для поиска по БД. 3. Поиск информации и принятие решения. 4. Формирование и отправка письма с информацией и выводами.</p>
6 <p>Сначала я попробовала пойти по самому лёгкому пути и использовать свой ящик от Google и пакеты<a>gmailr</a>и<a>mailr</a>. C пакетом gmailr и с<a>OAuth 2.0 protocol</a>от Google все шаги алгоритма предельно просты - достаточно один раз запустить код в консоли и авторизоваться в своей почте - и дальше можно использовать скрипт автоматически без собственного участия (например с помощью<a>cronR</a>):</p>
6 <p>Сначала я попробовала пойти по самому лёгкому пути и использовать свой ящик от Google и пакеты<a>gmailr</a>и<a>mailr</a>. C пакетом gmailr и с<a>OAuth 2.0 protocol</a>от Google все шаги алгоритма предельно просты - достаточно один раз запустить код в консоли и авторизоваться в своей почте - и дальше можно использовать скрипт автоматически без собственного участия (например с помощью<a>cronR</a>):</p>
7 ## ## 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&lt;-messages(search = 'search', num_results = NULL, label_ids = NULL, include_spam_trash = NULL, page_token = NULL, user_id = "me") # поиск письма от адресата search size&lt;-MessageId[[1]]$resultSizeEstimate #письма в папке от нужного адресата final_goal&lt;-message(MessageId[1][[1]]$messages[[1]]$id)$snippet<p>Использование R в качестве коннектора к различным базам данных для реализации пункта 3 алгоритма выше не является темой этой заметки, по этому поводу написано много прекрасных статей, но лично я использую следующие библиотеки для доступа к зоопарку баз:</p>
7 ## ## 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&lt;-messages(search = 'search', num_results = NULL, label_ids = NULL, include_spam_trash = NULL, page_token = NULL, user_id = "me") # поиск письма от адресата search size&lt;-MessageId[[1]]$resultSizeEstimate #письма в папке от нужного адресата final_goal&lt;-message(MessageId[1][[1]]$messages[[1]]$id)$snippet<p>Использование R в качестве коннектора к различным базам данных для реализации пункта 3 алгоритма выше не является темой этой заметки, по этому поводу написано много прекрасных статей, но лично я использую следующие библиотеки для доступа к зоопарку баз:</p>
8 library(DBI) library(RMySQL) library(RODBC)<p>Формирование письма с использованием<strong>gmailr</strong>также не представляет труда, т. к. можно сохранить html-разметку в виде строковой переменной и затем просто вставить её в тело письма:</p>
8 library(DBI) library(RMySQL) library(RODBC)<p>Формирование письма с использованием<strong>gmailr</strong>также не представляет труда, т. к. можно сохранить html-разметку в виде строковой переменной и затем просто вставить её в тело письма:</p>
9 library(htmlTable) html_body &lt;- paste0("&lt;html&gt;&lt;head&gt; &lt;style&gt; 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;} &lt;/style&gt; &lt;/head&gt;&lt;body&gt;&lt;p&gt; Заголовок 1:&lt;/p&gt;","&lt;br&gt;",htmlTable(cars, rnames = F),"&lt;br&gt;&lt;p&gt; Заголовок 2:&lt;/p&gt;", "&lt;br&gt;","&lt;/body&gt;&lt;/html&gt;") 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")&lt;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 минут<p>К сожалению, корпоративная этика вносит свои коррективы, а информационная безопасность такая безопасность, поэтому вторая часть этой статьи будет посвящена<strong>использованию альтернативных пакетов для мониторинга корпоративного ящика</strong>.</p>
9 library(htmlTable) html_body &lt;- paste0("&lt;html&gt;&lt;head&gt; &lt;style&gt; 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;} &lt;/style&gt; &lt;/head&gt;&lt;body&gt;&lt;p&gt; Заголовок 1:&lt;/p&gt;","&lt;br&gt;",htmlTable(cars, rnames = F),"&lt;br&gt;&lt;p&gt; Заголовок 2:&lt;/p&gt;", "&lt;br&gt;","&lt;/body&gt;&lt;/html&gt;") 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")&lt;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 минут<p>К сожалению, корпоративная этика вносит свои коррективы, а информационная безопасность такая безопасность, поэтому вторая часть этой статьи будет посвящена<strong>использованию альтернативных пакетов для мониторинга корпоративного ящика</strong>.</p>
10  
10