2010-08-26 30 views
17

Siguiendo las instrucciones provistas en la pregunta relacionada this, pude enviar mensajes de correo con formato html. Ahora la pregunta es: ¿Cómo debo modificar el siguiente código para adjuntar uno o más archivos (de cualquier tipo) a este mensaje?sendmailR (Part2): Envío de archivos como archivos adjuntos de correo

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

añadí código para manejar múltiples archivos adjuntos aquí: http://stackoverflow.com/questions/2885660/how-to-send-email-with-attachment-from-r-in-windows/9131917#9131917 – ARobertson

Respuesta

7

Con el paquete mailR (https://github.com/rpremraj/mailR), puede enviar mensajes de correo electrónico HTML y, además, adjuntar archivos con facilidad de la siguiente manera:

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) 

edición (13/05/2014):

mailR ha sido actualizado para permitir codificaciones de caracteres diferentes. A continuación se muestra un ejemplo para enviar el mensaje como 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

¡Gracias! ¿Cómo puedo establecer que el juego de caracteres sea UTF-8? –

+0

Veo que la última versión también es compatible con la codificación UTF-8. Su respuesta merece ser aceptada. –

+0

gracias por un gran paquete! –

2

Me rendiría en el uso de R para esto. Existen soluciones estables de trabajo, multiplataforma para hacer esto en Python, y puede llamar a Python desde R.

Si tuviera que ajustar un modelo de efectos mixtos en un programa de Python llamaría a R para hacerlo - si Quiero hacer una tarea de sistema como enviar un correo electrónico en R Llamaré a Python para que lo haga. Vale la pena aprender si aún no lo sabes.

+2

Si se permiten herramientas externas, es más fácil ejecutar 'writeLines (mensaje, p <-pipe ('mutt -s blah -a att.ext - [email protected]')); cerrar (p)'. Hay un puerto de mutt de Windows, por lo que es multiplataforma. – mbq

7

A (al menos para mí) la función de trabajo:

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

Puede ser utilizado como esto:

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

Ten en cuenta que el mensaje enviado por este ejemplo probablemente será marcado como spam, ya es un texto breve y una gran imagen, sin embargo, para mensajes más grandes y, por ejemplo, archivos adjuntos en formato PDF. Si no, puede considerar agregar también una versión de texto del mensaje.

EDITAR (menos relevante ahora): Puede encontrar la información más profunda sobre cómo hacer mensajes MIME here.

+0

Supongo que estoy en uno de mis días 'tontos'. Debo admitir que no entendí si puedo hacerlo o no. Si crees que es posible, ¿podrías usar mi ejemplo y transformarlo adecuadamente? –

+0

Ciertamente puede, debe simplemente exprimir el mensaje y los archivos adjuntos en este formato loco y pasarlo como un mensaje real. Estoy planeando editarlo en código utilizable, aún esto llevará algo de tiempo porque ahora tengo otras cosas que hacer. – mbq

+0

Ok, ahora extendido. – mbq

3

Tenga en cuenta que las versiones actuales de los archivos adjuntos sendmailR de apoyo fuera de la caja por lo que msg una lista de mime_type objetos, es decir, que había ahora

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

Aquí hay un ejemplo que está configurado para un trabajo por lotes todos los días como el establecimiento utilizando Sendmail() en R (disponible con el paquete sendmailR) con varios archivos adjuntos (uno CSV, un PDF):

Configuración información de la fecha de referencia en los nombres de archivo:

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

cree ahora parte de la información necesaria para sendmail() función al final de este 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"      

Especificar servidor de correo aquí:

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

Definir archivo adjunto 1 ruta y nombre:

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

Definir archivo adjunto 1 objeto:

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

Definir archivo adjunto 2 ruta y nombre:

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

Definir el anexo 2 del objeto:

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

combinan ahora el cuerpo del correo electrónico con archivos adjuntos:

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

enviar el correo electrónico usando sendmail función():

> sendmail(from=from, to=to, subject=subject, msg=bodyWithAttachment, control=mailControl) 
Cuestiones relacionadas