SendmailR (Part2): отправка файлов в виде почтовых вложений
Следуя указаниям, приведенным в этом связанном вопросе, я смог отправить html-форматированные почтовые сообщения. Теперь возникает вопрос: как мне изменить следующий код, чтобы прикрепить к этому сообщению один или несколько файлов (любого типа)?
library(sendmailR)
from <- "<[email protected]>"
to <- c("<[email protected]>","<[email protected]>")
subject <- iconv("Message Title", to = "utf8")
msg <- "<hr size='2' width='33%' style='text-align: left;'><font size='2'>
<i>This email was sent automatically using <a href='http://finzi.psych.upenn.edu/R/library/sendmailR/html/00Index.html' rel='nofollow' target='_blank'>sendmailR</a>.<br>
Please do not reply directly to this e-mail.</i></font>"
msg <- iconv(msg, to = "utf8")
sapply(to,function(x) sendmail(from, x, subject, msg, control=list(smtpServer="###.###.###.###"), headers=list("Content-Type"="text/html; charset=UTF-8; format=flowed")))
Ответы
Ответ 1
С пакетом mailR (https://github.com/rpremraj/mailR) вы можете отправлять HTML-письма и дополнительно прикреплять файлы с легкостью, как показано ниже:
send.mail(from = "[email protected]",
to = c("[email protected]", "[email protected]"),
subject = "Subject of the email",
body = "<html>The apache logo - <img src=\"http://www.apache.org/images/asf_logo_wide.gif\"></html>",
html = TRUE,
smtp = list(host.name = "smtp.gmail.com", port = 465, user.name = "gmail_username", passwd = "password", ssl = TRUE),
attach.files = c("./download.log", "upload.log"),
authenticate = TRUE,
send = TRUE)
Изменить (2014-05-13):
mailR был обновлен, чтобы разрешить различные кодировки символов. Ниже приведен пример отправки сообщения как UTF-8.
send.mail(from = "Sender Name <[email protected]>",
to = "[email protected]",
subject = "A quote from Gandhi",
body = "In Hindi : थोडा सा अभ्यास बहुत सारे उपदेशों से बेहतर है।
English translation: An ounce of practice is worth more than tons of preaching.",
encoding = "utf-8",
smtp = list(host.name = "smtp.gmail.com", port = 465, user.name = "gmail_username", passwd = "password", ssl = T),
authenticate = TRUE,
send = TRUE)
Ответ 2
Работающая (для меня как минимум) функция:
sendMessage<-function(contents,subject,from,to,attMIME,attachment,control){
msg<-list(contents,sendmailR:::.file_attachment(attachment,attachment,attMIME));
sendmail(from=from,to=to,subject=subject,msg=msg,control=control);
}
Может использоваться следующим образом:
png('a.png');hist(rnorm(700));dev.off()
sendMessage('Here you have a nice histogram:',
'Nice picture',
'[email protected]',
'[email protected]',
'image/png',
'a.png',list(smtpServer="..."))
Будем предупреждать, что сообщение, отправленное этим примером, вероятно, будет помечено как спам, поскольку это короткий текст и большая фотография - тем не менее, для больших сообщений и, скажем, вложений PDF, которые он должен пройти. Если нет, вы можете также добавить текстовую версию сообщения.
EDIT (менее актуально сейчас): наиболее глубокое понимание того, как создавать сообщения MIME, можно найти здесь.
Ответ 3
Обратите внимание, что текущие версии sendmailR
поддерживают вложения из коробки, делая msg
список объектов mime_type
, т.е. вы теперь
sendmail( from,to,subject,
msg=list(mime_part("Here an attachment for you!"),
mime_part(attachmentFileName)), control, headers)`
Ответ 4
Я бы отказался от использования R для этого. Рабочие, кросс-платформенные, стабильные решения для этого в Python существуют, и вы можете вызвать Python из R.
Если бы мне пришлось подгонять модель смешанных эффектов в программе Python, я бы назвал R, чтобы сделать это - если я хочу выполнить системную задачу, такую как отправка электронной почты в R, я позвоню Python для этого. Его стоит узнать, если вы еще этого не знаете.
Ответ 5
Вот пример, который настраивается для ежедневного пакетного задания, например, с помощью sendmail() в R (доступно с пакетом sendmailR) с несколькими вложениями (один CSV, один PDF):
Настройка даты для ссылки в именах файлов:
> yesterday_date_stuff <- new.env()
> yesterday_date_stuff[['month']] <- strftime(Sys.Date()-1, format="%m")
> yesterday_date_stuff[['day']] <- strftime(Sys.Date()-1, format="%d")
> yesterday_date_stuff[['year']] <- strftime(Sys.Date()-1, format="%y")
> yesterday_date_stuff$month
[1] "03"
> yesterday_date_stuff$day
[1] "29"
> yesterday_date_stuff$year
[1] "17"
Теперь создайте часть необходимой информации для функции sendmail() в конце этого сообщения:
> from <- "[email protected]"
> to <- c("person_A_to_send_emai[email protected]", "[email protected]", "[email protected]")
> subject <- paste("whatever you want subject line to read for batch job analyzing data for ", yesterday_date_stuff$month, "/", yesterday_date_stuff$day, "/", yesterday_date_stuff$year, sep="")
> body <- "Text to insert into the body of your email"
Укажите почтовый сервер здесь:
> mailControl=list(smtpServer="mail.whateveryourmailserveris.com")
Определите путь и имя вложения 1:
> attachmentPath1 <- paste("file1name", "_", yesterday_date_stuff$month, yesterday_date_stuff$day, yesterday_date_stuff$year, ".csv", sep="")
> attachmentName1 <- paste("file1name", "_", yesterday_date_stuff$month, yesterday_date_stuff$day, yesterday_date_stuff$year, ".csv", sep="")
Определить объект приложения 1:
> attachmentObject1 <- mime_part(x=attachmentPath1,name=attachmentName1)
Определите путь и имя вложения 2:
> attachmentPath2 <- paste("file2name", "_", yesterday_date_stuff$month, yesterday_date_stuff$day, yesterday_date_stuff$year, ".pdf", sep="")
> attachmentName2 <- paste("file2name", "_", yesterday_date_stuff$month, yesterday_date_stuff$day, yesterday_date_stuff$year, ".pdf", sep="")
Определить объект приложения 2:
> attachmentObject2 <- mime_part(x=attachmentPath2,name=attachmentName2)
Теперь объедините тело письма с вашими вложениями:
> bodyWithAttachment <- list(body,attachmentObject1, attachmentObject2)
> bodyWithAttachment
[[1]]
[1] "Text to insert into the body of your email"
[[2]]
<environment: 0x000000004efff188>
attr(,"class")
[1] "mime_part"
[[3]]
<environment: 0x00000000407a1b68>
attr(,"class")
[1] "mime_part"
Отправьте электронное письмо с помощью функции sendmail():
> sendmail(from=from, to=to, subject=subject, msg=bodyWithAttachment, control=mailControl)