Come inviare una mail con allegato da R in windows

Ho programmato uno script R in esecuzione da una macchina Windows.

Al termine, desidero che questo script invii automaticamente un’email con un file di registro allegato.

Usare shell() con altri script potrebbe essere ansible, ma mi chiedevo se c’è una soluzione migliore all’interno di R. Grazie.

sendmailR funziona per me su Windows 7. Ho fatto riferimento a http://cran.es.r-project.org/web/packages/sendmailR/sendmailR.pdf

smtpServer = info per Outlook 2010 è in File -> Impostazioni account -> Impostazioni account -> fai doppio clic sul tuo account -> testo nella casella “Server”

 library(sendmailR) #set working directory setwd("C:/workingdirectorypath") #####send plain email from < - "you@account.com" to <- "recipient@account.com" 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) 

Inoltre, è ansible inviare più file aggiungendo un altro mime_part all'elenco msg come segue (l'ho anche condensato):

 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) 

Usa mailR – funziona con autenticazione, allegati, invia automaticamente messaggi txt insieme a HTML e altro ancora.

mailR richiede rJava che a volte può essere un po ‘un dolore. Su Windows non ho avuto problemi. Su Ubuntu questo ha risolto l’unico problema che ho avuto:

 sudo apt-get install openjdk-jdk 

in R

 install.packages("devtools", dep = T) library(devtools) install_github("rpremraj/mailR") 

(se hai problemi con rJava – prova sudo R CMD javareconf nel terminale)

mailR è facile da lavorare e ben documentato sulla pagina github.

Esempio dal documento

 library(mailR) send.mail(from = "sender@gmail.com", to = c("recipient1@gmail.com", "recipient2@gmail.com"), 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) 

Nota: il tuo server smtp potrebbe trovare eccessivo uso sospetto. Questo è il caso, ad esempio, di Gmail. Quindi, dopo aver inviato alcuni messaggi, probabilmente devi accedere all’account Gmail e vedere se l’account è stato temporaneamente distriggersto. Si noti inoltre che se si utilizza un account Gmail con autenticazione a due fattori è necessario utilizzare una password specifica dell’applicazione .

Vuoi accontentarti di un messaggio twitter? È ansible utilizzare Rcurl per pubblicare un aggiornamento su Twitter, che può quindi essere inoltrato al cellulare come testo o alla propria posta elettronica tramite le impostazioni di notifica.

Vedi qui: http://www.sakana.fr/blog/2007/03/18/scripting-twitter-with-curl/

Hai già esaminato il pacchetto sendmailR ? Consente a SMTP di inviare un messaggio e probabilmente è ansible modificare la funzione per consentire un allegato. Poi di nuovo, se il suo unico file di log potrebbe valere la pena di usare shell() come hai detto.

Per Windows è ansible analizzare un VB-Script (vedere ad esempio http://www.paulsadowski.com/wsh/cdo.htm ) e quindi chiamarlo tramite shell.

Questo potrebbe apparire come questo:

 SendMail < - function(from="me@my-server.de",to="me@my-server.de",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") } 

Voglio solo ricordare alle persone che vogliono la funzione di notifica automatica di un servizio chiamato twilio, forniscono un servizio gratuito per inviare sms al tuo cellulare. Un walk-through con R è disponibile qui https://dreamtolearn.com/ryan/data_analytics_viz/78

Un codice di esempio è allegato, basta sostituire le credenziali con quelle del tuo.

 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"))