У меня есть запланированный R script, запущенный с Windows-машины. После того, как он закончится, я хочу, чтобы этот script автоматически отправил электронное письмо с прикрепленным файлом журнала. Использование shell() с некоторыми другими скриптами может быть возможно, но мне было интересно, есть ли лучшее решение внутри R. спасибо.
Как отправить электронную почту с вложением из R в windows
Ответ 1
sendmailR работает для меня в Windows 7. Я ссылался на http://cran.es.r-project.org/web/packages/sendmailR/sendmailR.pdf
smtpServer = информация для Outlook 2010 находится в файле → Настройки учетной записи → Настройки учетной записи → дважды щелкните вашу учетную запись → текст в поле "Сервер"
library(sendmailR)
#set working directory
setwd("C:/workingdirectorypath")
#####send plain email
from <- "[email protected]"
to <- "[email protected]"
subject <- "Email Subject"
body <- "Email body."
mailControl=list(smtpServer="serverinfo")
sendmail(from=from,to=to,subject=subject,msg=body,control=mailControl)
#####send same email with attachment
#needs full path if not in working directory
attachmentPath <- "subfolder/log.txt"
#same as attachmentPath if using working directory
attachmentName <- "log.txt"
#key part for attachments, put the body and the mime_part in a list for msg
attachmentObject <- mime_part(x=attachmentPath,name=attachmentName)
bodyWithAttachment <- list(body,attachmentObject)
sendmail(from=from,to=to,subject=subject,msg=bodyWithAttachment,control=mailControl)
Кроме того, несколько файлов могут быть отправлены путем добавления другого mime_part в список msg следующим образом (я также сократил его):
attachmentObject <- mime_part(x="subfolder/log.txt",name="log.txt")
attachmentObject2 <- mime_part(x="subfolder/log2.txt",name="log2.txt")
bodyWithAttachment <- list(body,attachmentObject,attachmentObject2)
Ответ 2
Используйте mailR - он работает с аутентификацией, вложениями, он автоматически отправляет сообщение txt вместе с html и более.
mailR
требует rJava, который иногда может быть немного больно. На окнах у меня не было никаких проблем. На ubuntu это решило один вопрос, который у меня был:
sudo apt-get install openjdk-jdk
в R
install.packages("devtools", dep = T)
library(devtools)
install_github("rpremraj/mailR")
(если у вас возникли проблемы с rJava - попробуйте sudo R CMD javareconf
в терминале)
mailR
легко работать и хорошо документироваться на странице github.
Пример из документации
library(mailR)
send.mail(from = "[email protected]",
to = c("[email protected]", "[email protected]"),
subject = "Subject of the email",
body = "Body of the email",
smtp = list(host.name = "smtp.gmail.com", port = 465, user.name = "gmail_username", passwd = "password", ssl = TRUE),
authenticate = TRUE,
send = TRUE,
attach.files = c("./download.log", "upload.log", "https://dl.dropboxusercontent.com/u/5031586/How%20to%20use%20the%20Public%20folder.rtf"),
file.names = c("Download log.log", "Upload log.log", "DropBox File.rtf"), # optional parameter
file.descriptions = c("Description for download log", "Description for upload log", "DropBox File"), # optional parameter
debug = TRUE)
Примечание: ваш smtp-сервер может обнаружить чрезмерное использование подозрительного. Это имеет место, например, GMail. Поэтому после отправки нескольких писем вы, вероятно, должны войти в аккаунт gmail и посмотреть, была ли временно отключена учетная запись. Также обратите внимание, что если вы используете учетную запись gmail с двухфакторной аутентификацией, вам нужно использовать пароль для конкретного приложения.
Ответ 3
Вы согласны на сообщение Twitter? Вы можете использовать Rcurl для публикации обновления в twitter, который затем может быть перенаправлен на ваш мобильный телефон в виде текста или на ваш адрес электронной почты с помощью настроек уведомлений.
Смотрите здесь: http://www.sakana.fr/blog/2007/03/18/scripting-twitter-with-curl/
Ответ 4
Вы заглянули в пакет sendmailR
? Это позволяет SMTP отправлять сообщение, и вы, вероятно, можете отредактировать функцию, чтобы разрешить вложение. Опять же, если его единственный один файл журнала, возможно, стоит использовать shell()
, как вы упомянули.
Ответ 5
Для Windows можно разобрать VB- Script (см., например, http://www.paulsadowski.com/wsh/cdo.htm), а затем вызвать его через оболочку.
Это может выглядеть так:
SendMail <- function(from="[email protected]",to="[email protected]",text="Hallo",subject="Sag Hallo",smtp="smtp.my.server.de",user="me.myself.and.i",pw="123"){
require(stringr)
part1 <- "Const cdoSendUsingPickup = 1 'Send message using the local SMTP service pickup directory.
Const cdoSendUsingPort = 2 'Send the message using the network (SMTP over the network).
Const cdoAnonymous = 0 'Do not authenticate
Const cdoBasic = 1 'basic (clear-text) authentication
Const cdoNTLM = 2 'NTLM "
part2 <- paste(paste("Set objMessage = CreateObject(",'"',"CDO.Message",'"',")" ,sep=""),
paste("objMessage.Subject = ",'"',subject,'"',sep=""),
paste("objMessage.From = ",'"',from,'"',sep=""),
paste("objMessage.To = ",'"',to,'"',sep=""),
paste("objMessage.TextBody = ",'"',text,'"',sep=""),
sep="\n")
part3 <- paste(
"'==This section provides the configuration information for the remote SMTP server.
objMessage.Configuration.Fields.Item _
(\"http://schemas.microsoft.com/cdo/configuration/sendusing\") = 2
'Name or IP of Remote SMTP Server
objMessage.Configuration.Fields.Item _
(\"http://schemas.microsoft.com/cdo/configuration/smtpserver\") = ",'"',smtp,'"',"
'Type of authentication, NONE, Basic (Base64 encoded), NTLM
objMessage.Configuration.Fields.Item _
(\"http://schemas.microsoft.com/cdo/configuration/smtpauthenticate\") = cdoBasic
'Your UserID on the SMTP server
objMessage.Configuration.Fields.Item _
(\"http://schemas.microsoft.com/cdo/configuration/sendusername\") = ",'"',user,'"',"
'Your password on the SMTP server
objMessage.Configuration.Fields.Item _
(\"http://schemas.microsoft.com/cdo/configuration/sendpassword\") = ",'"',pw,'"', "
'Server port (typically 25)
objMessage.Configuration.Fields.Item _
(\"http://schemas.microsoft.com/cdo/configuration/smtpserverport\") = 25
'Use SSL for the connection (False or True)
objMessage.Configuration.Fields.Item _
(\"http://schemas.microsoft.com/cdo/configuration/smtpusessl\") = False
'Connection Timeout in seconds (the maximum time CDO will try to establish a connection to the SMTP server)
objMessage.Configuration.Fields.Item _
(\"http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout\") = 60
objMessage.Configuration.Fields.Update
'==End remote SMTP server configuration section==
objMessage.Send
",sep="")
vbsscript <- paste(part1,part2,part3,sep="\n\n\n")
str_split(vbsscript,"\n")
writeLines(vbsscript, "sendmail.vbs")
shell("sendmail.vbs")
unlink("sendmail.vbs")
}
Ответ 6
Просто хочу напомнить людям, которые хотят самообслуживающую функцию сервиса twilio, они предоставляют бесплатную услугу для отправки смс на ваш собственный мобильный телефон. Прогулка с использованием R доступна здесь https://dreamtolearn.com/ryan/data_analytics_viz/78
Приведен пример кода, просто замените учетные данные на свои собственные.
library(jsonlite)
library(XML)
library(httr)
library(rjson)
library(RCurl)
options(RCurlOptions = list(cainfo = system.file("CurlSSL", "cacert.pem", package = "RCurl")))
authenticate_twilio <- "https://[ACCOUNT SID]:[AUTH TOKEN]@api.twilio.com/2010-04-01/Accounts"
authenticate_response <- getURL(authenticate_twilio)
print(authenticate_response)
postForm("https://[ACCOUNT SID]:[AUTH TOKEN]@api.twilio.com/2010-04-01/Accounts/[ACCOUNT SID]/Messages.XML",.params = c(From = "+1[twilio phone#]", To = "+1[self phone#]",Body = "Hello from twilio"))