2010-08-26 5 views
17

En suivant les instructions fournies dans this question connexe, j'ai été en mesure d'envoyer des messages électroniques formatés html. Maintenant, la question est la suivante: Comment dois-je modifier le code suivant, afin de joindre un ou plusieurs fichiers (de tout type) à ce message?sendmailR (Part2): Envoi de fichiers sous forme de pièces jointes

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

J'ai ajouté code pour gérer plusieurs pièces jointes ici: http://stackoverflow.com/questions/2885660/how-to-send-email-with-attachment-from-r-in-windows/9131917#9131917 – ARobertson

Répondre

7

Avec le paquet mailR (https://github.com/rpremraj/mailR), vous pouvez envoyer des e-mails HTML et attacher plus facilement les fichiers comme ci-dessous:

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) 

Edit (13/05/2014):

mailR a été mis à jour pour permettre différents codages de caractères. Voici un exemple pour envoyer le message en 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) 
+1

Merci, comment puis-je définir que le jeu de caractères serait UTF-8? –

+0

Je vois que la dernière version supporte aussi l'encodage utf-8. Votre réponse mérite d'être acceptée. –

+0

thnks pour un super paquet! –

2

Je renoncerais à utiliser R pour cela. Il existe des solutions fonctionnelles, multiplates-formes et stables pour ce faire en Python, et vous pouvez appeler Python depuis R.

Si je devais ajuster un modèle à effets mixtes dans un programme Python, j'appellerais R pour le faire - si Je veux faire une tâche système comme envoyer un email dans R Je vais appeler Python pour le faire. Cela vaut la peine d'apprendre si vous ne le connaissez pas encore.

+2

Si les outils externes sont autorisés, il est plus facile d'exécuter 'writeLines (message, p <-pipe ('mutt -s blah -a att.ext [email protected]')); close (p)'. Il y a un port Windows de mutt, donc c'est multi-plateforme. – mbq

7

Un travail (pour moi au moins) fonction:

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

Peut être utilisé comme ceci:

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

Soyez averti que message envoyé par cet exemple sera probablement marqué comme spam, depuis c'est un texte court et une grande image - néanmoins pour les messages plus importants et, disons, les pièces jointes en pdf, il devrait passer. Sinon, vous pouvez envisager d'ajouter également une version texte du message.

EDIT (moins pertinent maintenant): L'aperçu le plus profond sur la façon de créer des messages MIME peut être trouvé here.

+0

Je suppose que je suis dans un de mes jours de «lent-esprit». Je dois admettre que je n'ai pas compris si je peux le faire ou non. Si vous pensez que c'est possible, pourriez-vous s'il vous plaît utiliser mon exemple et le transformer de manière appropriée? –

+0

Certainement vous pouvez, vous devez juste presser le message et les pièces jointes dans ce format fou et le transmettre comme un message réel. Je prévois de le modifier en code utilisable, mais cela prendra du temps car j'ai maintenant d'autres choses à faire. – mbq

+0

Ok, étendu maintenant. – mbq

3

Notez que les versions actuelles de sendmailR pièces jointes de soutien de la boîte en faisant msg une liste de mime_type objets, à savoir que vous feriez maintenant

sendmail(from,to,subject, 
      msg=list(mime_part("Here's an attachment for you!"), 
      mime_part(attachmentFileName)), control, headers)` 
1

Voici un exemple qui est configuré pour un traitement par lots par jour comme le réglage en utilisant sendmail() dans R (disponible avec le package sendmailR) avec plusieurs pièces jointes (un CSV, un PDF):

Mise en place informations à jour pour référencer dans les noms de fichiers:

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

créez maintenant une partie des informations nécessaires à la fonction sendmail() à la fin de ce post:

> from <- "[email protected]" 
> to <- c("[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"      

Spécifier le serveur de mail:

> mailControl=list(smtpServer="mail.whateveryourmailserveris.com") 

Définir l'annexe 1 chemin et le nom:

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

Define pièce jointe 1 objet:

> attachmentObject1 <- mime_part(x=attachmentPath1,name=attachmentName1) 

Définir l'annexe 2 chemin et le nom:

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

Define pièce jointe 2 objet:

> attachmentObject2 <- mime_part(x=attachmentPath2,name=attachmentName2) 

Maintenant moissonneuse-batteuse le corps de l'e-mail avec vos pièces jointes:

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

Envoyer l'e-mail en utilisant la fonction sendmail():

> sendmail(from=from, to=to, subject=subject, msg=bodyWithAttachment, control=mailControl) 
Questions connexes