55 votes

Comment envoyer un courriel avec pièce jointe à partir de R dans Windows

J'ai programmé un script exécuté depuis une machine Windows.

Une fois qu'il est terminé, je souhaite que ce script envoie automatiquement un e-mail avec un fichier journal joint.

Utilisation de shell() avec d'autres scripts est peut-être possible, mais je me demandais s'il existait une meilleure solution dans R. Merci.

2 votes

Je suppose que vous vouliez dire system() quand vous avez écrit shell() .

0 votes

Bonjour Ahala, j'espère que la solution de Stedy vous aidera. Puis-je vous demander ce que vous utilisez pour avoir un script R programmé ? Merci.

4 votes

Tal, utilisez les tâches planifiées dans Windows (je pense que l'entrée est quelque chose comme R CMD BATCH script.R), cron sur les systèmes *NIX.

48voto

ARobertson Points 429

SendmailR fonctionne pour moi sous Windows 7. J'ai référencé http://cran.es.r-project.org/web/packages/sendmailR/sendmailR.pdf

L'information smtpServer= pour Outlook 2010 se trouve dans Fichier -> Paramètres du compte -> Paramètres du compte -> double-cliquez sur votre compte -> texte dans la case "Serveur".

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)

En outre, il est possible d'envoyer plusieurs fichiers en ajoutant un autre mime_part à la liste des msg comme suit (je l'ai également condensé) :

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)

0 votes

Pouvez-vous utiliser le langage html dans "Email body." ? Pouvez-vous utiliser l'encodage utf-8 (pour les textes multilingues) ?

2 votes

Je ne sais pas. Essayez et voyez.

2 votes

Comment configurer la partie serverinfo pour gmail ?

10voto

chrisamiller Points 1236

Vous contenteriez-vous d'un message sur Twitter ? Vous pouvez utiliser Rcurl pour publier une mise à jour sur Twitter, qui peut ensuite être transmise à votre téléphone portable sous forme de texte, ou à votre courrier électronique via les paramètres de notification.

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

5 votes

Il existe un paquet CRAN appelé twitteR pour interfacer twitter à partir de R : cran.r-project.org/web/packages/twitteR/index.html

6voto

Stedy Points 2704

Avez-vous regardé dans le sendmailR déjà ? Il permet de soumettre un message par SMTP et vous pourriez probablement modifier la fonction pour autoriser une pièce jointe. Encore une fois, si ce n'est qu'un seul fichier journal, cela pourrait valoir la peine de l'utiliser. shell() comme vous l'avez mentionné.

4voto

marvin_dpr Points 625

Pour Windows, on pourrait analyser ensemble un VB-script (voir par exemple http://www.paulsadowski.com/wsh/cdo.htm ) et ensuite l'appeler via le shell.

Cela pourrait ressembler à ceci :

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

3 votes

Merci beaucoup, cela fonctionne comme un rêve ! C'est la seule approche que j'ai trouvée pour fonctionner dans R (sous Windows). Comme expliqué dans la page web de Paul, si vous utilisez gmail, vous devez définir le port du serveur à 465 et définir l'option "Use SSL" à True. J'ai utilisé le code suivant pour l'appeler : SendMail(from="dag.hjermann@gmail.com",to="dhj@niva.no",text‌​="Hallo", subject="Sag Hallo",smtp="smtp.gmail.com",user="dag.hjermann@gmail.com",p‌​w="********") Insérez votre vrai mot de passe bien sûr... De plus, le répertoire de travail de R doit se trouver quelque part sur le disque dur (C :).

0 votes

C'est génial ! Est-il possible d'ajouter une pièce jointe ? J'ai une expérience très limitée de VB... c'est pourquoi je demande.

0 votes

J'aime aider :-) ... jip, cela semble possible bien que je ne l'ai jamais essayé moi-même, voir ici : paulsadowski.com/wsh/cdo.htm sous le titre "Sending a text email with an attached file" ... on pourrait inclure les lignes pertinentes dans la fonction.

1voto

stevejb Points 401

Vous pourriez utiliser un Perl script et l'appeler depuis R.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X