Я использую пакет R mRpostman
для доступа к своей почтовой учетной записи с помощью R. И все работает отлично, когда я получаю письма, отправленные с моего компьютера на выделенный почтовый адрес через Thunderbird. Но когда я использую свой телефон Android, чтобы сделать то же самое, текст странно закодирован и больше не читается. Как это исправить? Я пытался использовать base64enc::base64decode()
, но не смог заставить это работать. Точно так же я потерпел неудачу, пытаясь изменить кодировку через Encoding()
.
Я отправил два письма. Один с моего компьютера с помощью Thunderbird, а текст просто «Отправлено с Thunderbird на компьютер». Другая почта была отправлена с помощью моего телефона Android с использованием почтового приложения по умолчанию. Этот содержит только текст «Отправлено с Android».
library(mRpostman) # for email communication
# Connect to mail server
imap_mail <- 'imaps://imap.gmail.com' # mail client
user_mail <- keyring::key_get('dataviz-mail')
password_mail <- keyring::key_get('dataviz-mail-password')
# Establish connection to imap server
con <- configure_imap(
url = imap_mail,
user = user_mail,
password = password_mail
)
# Switch to Inbox
con$select_folder('Inbox')
# Fetch Thunderbird mail
con$fetch_text(11)
#> $text11
#> [1] "Sent from thunderbird on computer\r\n\r\n"
# Fetch Android mail
con$fetch_text(12)
#> $text12
#> [1] "----_com.samsung.android.email_7640956728775490\r\nContent-Type: text/plain; charset=utf-8\r\nContent-Transfer-Encoding: base64\r\n\r\nVGhpcyBtYWlsIGlzIHNlbnQgZnJvbSBBbmRyb2lk\r\n\r\n----_com.samsung.android.email_7640956728775490\r\nContent-Type: text/html; charset=utf-8\r\nContent-Transfer-Encoding: base64\r\n\r\nPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0\r\nL2h0bWw7IGNoYXJzZXQ9VVRGLTgiPjwvaGVhZD48Ym9keSBkaXI9ImF1dG8iPlRoaXMgbWFpbCBp\r\ncyBzZW50IGZyb20gQW5kcm9pZDwvYm9keT48L2h0bWw+\r\n\r\n----_com.samsung.android.email_7640956728775490--\r\n\r\n"
Created on 2022-04-06 by the reprex package (v2.0.0)
Строка Android содержит сообщение в кодировке base 64, но оно встроено в другой текст, не закодированный в base64, поэтому его необходимо извлечь.
Если мы возьмем строку из вашего вопроса:
text12 <- "----_com.samsung.android.email_7640956728775490\r\nContent-Type: text/plain; charset=utf-8\r\nContent-Transfer-Encoding: base64\r\n\r\nVGhpcyBtYWlsIGlzIHNlbnQgZnJvbSBBbmRyb2lk\r\n\r\n----_com.samsung.android.email_7640956728775490\r\nContent-Type: text/html; charset=utf-8\r\nContent-Transfer-Encoding: base64\r\n\r\nPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0\r\nL2h0bWw7IGNoYXJzZXQ9VVRGLTgiPjwvaGVhZD48Ym9keSBkaXI9ImF1dG8iPlRoaXMgbWFpbCBp\r\ncyBzZW50IGZyb20gQW5kcm9pZDwvYm9keT48L2h0bWw+\r\n\r\n----_com.samsung.android.email_7640956728775490--\r\n\r\n"
Затем мы можем выделить строку с основанием 64, декодировать ее в байты и преобразовать в символ следующим образом:
library(dplyr)
library(purrr)
library(base64enc)
text12 %>%
strsplit("base64\r\n\r\n") %>%
pluck(1, 2) %>%
strsplit("----") %>%
pluck(1, 1) %>%
gsub(pattern = "[\r\n]+", replacement = "", .) %>%
base64decode() %>%
rawToChar()
#> [1] "This mail is sent from Android"
Created on 2022-04-06 by the reprex package (v2.0.1)