por enviar correo con adjunto python r jython

correo - enviar pdf por email python



Enviar un archivo adjunto en R con gmail (8)

Eche un vistazo al paquete sendmailR que puede enviar archivos adjuntos. Para hacer que sendmail funcione con gmail en una Mac, se necesitarían algunos arreglos adicionales, pero puedes encontrar las instrucciones para hacerlo usando una búsqueda de Google.

Estoy deseando enviar un correo electrónico en R con un archivo adjunto usando gmail. Descubrí que sendmailR no funciona con gmail porque requiere autenticación (no pude hacer que funcione con gmail, así que supongo que esto es cierto a menos que alguien me diga que estoy equivocado, en cuyo caso publicaré la R). mensaje de salida y error para eso). Encontré un fragmento de código encontrado aquí (ENLACE) . Como el sitio sugiere, el código no está formateado para enviar archivos adjuntos, pero lo tengo para enviar un correo electrónico. Me gustaría extender este código para enviar archivos adjuntos (en una correspondencia de correo electrónico, el autor de este código no pudo extender el código para enviar archivos adjuntos).

Quiero enviar correos electrónicos con R usando gmail. Soy un usuario de Windows 7 con la versión 2.14 beta de R.

El código que envía correos electrónicos pero no adjuntos:

require(rJython) rJython <- rJython() rJython$exec( "import smtplib" ) rJython$exec("from email.MIMEText import MIMEText") rJython$exec("import email.utils") mail<-c( #Email settings "fromaddr = ''[email protected]''", "toaddrs = ''[email protected]''", "msg = MIMEText(''This is the body of the message.'')", "msg[''From''] = email.utils.formataddr((''sender name'', fromaddr))", "msg[''To''] = email.utils.formataddr((''recipient name'', toaddrs))", "msg[''Subject''] = ''Simple test message''", #SMTP server credentials "username = ''[email protected]''", "password = ''pw''", #Set SMTP server and send email, e.g., google mail SMTP server "server = smtplib.SMTP(''smtp.gmail.com:587'')", "server.ehlo()", "server.starttls()", "server.ehlo()", "server.login(username,password)", "server.sendmail(fromaddr, toaddrs, msg.as_string())", "server.quit()") jython.exec(rJython,mail)

Tenga en cuenta que este mensaje está publicado en talkstats.com. No recibí una respuesta allí (solo los miembros me dijeron que desearían poder ayudar). Si recibo una solución viable, también la publicaré allí.


Está ejecutando el código Jython dentro de su entorno R, por lo que está buscando una forma de enviar un archivo adjunto utilizando el lenguaje Jython, no R.

Dado que Jython es básicamente Python, aquí hay una forma de enviar un correo electrónico con un archivo adjunto con Python: Cómo enviar archivos adjuntos de correo electrónico con Python .

Solo tendrás que introducir ese código en el tuyo.


Me encontré con este código hoy de la lista de correo de ayuda. Tal vez ayude a las cosas a lo largo de

send.email <- function(to, from, subject, message, attachment=NULL, username, password, server="smtp.gmail.com:587", confirmBeforeSend=TRUE){ # to: a list object of length 1. Using list("Recipient" ="[email protected]") will send the message to the address but # the name will appear instead of the address. # from: a list object of length 1. Same behavior as ''to'' # subject: Character(1) giving the subject line. # message: Character(1) giving the body of the message # attachment: Character(1) giving the location of the attachment # username: character(1) giving the username. If missing and you are using Windows, R will prompt you for the username. # password: character(1) giving the password. If missing and you are using Windows, R will prompt you for the password. # server: character(1) giving the smtp server. # confirmBeforeSend: Logical. If True, a dialog box appears seeking confirmation before sending the e-mail. This is to # prevent me to send multiple updates to a collaborator while I am working interactively. if (!is.list(to) | !is.list(from)) stop("''to'' and ''from'' must be lists") if (length(from) > 1) stop("''from'' must have length 1") if (length(to) > 1) stop("''send.email'' currently only supports one recipient e-mail address") if (length(attachment) > 1) stop("''send.email'' can currently send only one attachment") if (length(message) > 1){ stop("''message'' must be of length 1") message <- paste(message, collapse="//n//n") } if (is.null(names(to))) names(to) <- to if (is.null(names(from))) names(from) <- from if (!is.null(attachment)) if (!file.exists(attachment)) stop(paste("''", attachment, "'' does not exist!", sep="")) if (missing(username)) username <- winDialogString("Please enter your e-mail username", "") if (missing(password)) password <- winDialogString("Please enter your e-mail password", "") require(rJython) rJython <- rJython() rJython$exec("import smtplib") rJython$exec("import os") rJython$exec("from email.MIMEMultipart import MIMEMultipart") rJython$exec("from email.MIMEBase import MIMEBase") rJython$exec("from email.MIMEText import MIMEText") rJython$exec("from email.Utils import COMMASPACE, formatdate") rJython$exec("from email import Encoders") rJython$exec("import email.utils") mail<-c( #Email settings paste("fromaddr = ''", from, "''", sep=""), paste("toaddrs = ''", to, "''", sep=""), "msg = MIMEMultipart()", paste("msg.attach(MIMEText(''", message, "''))", sep=""), paste("msg[''From''] = email.utils.formataddr((''", names(from), "'', fromaddr))", sep=""), paste("msg[''To''] = email.utils.formataddr((''", names(to), "'', toaddrs))", sep=""), paste("msg[''Subject''] = ''", subject, "''", sep="")) if (!is.null(attachment)){ mail <- c(mail, paste("f = ''", attachment, "''", sep=""), "part=MIMEBase(''application'', ''octet-stream'')", "part.set_payload(open(f, ''rb'').read())", "Encoders.encode_base64(part)", "part.add_header(''Content-Disposition'', ''attachment; filename=/"%s/"'' % os.path.basename(f))", "msg.attach(part)") } #SMTP server credentials mail <- c(mail, paste("username = ''", username, "''", sep=""), paste("password = ''", password, "''", sep=""), #Set SMTP server and send email, e.g., google mail SMTP server paste("server = smtplib.SMTP(''", server, "'')", sep=""), "server.ehlo()", "server.starttls()", "server.ehlo()", "server.login(username,password)", "server.sendmail(fromaddr, toaddrs, msg.as_string())", "server.quit()") message.details <- paste("To: ", names(to), " (", unlist(to), ")", "/n", "From: ", names(from), " (", unlist(from), ")", "/n", "Using server: ", server, "/n", "Subject: ", subject, "/n", "With Attachments: ", attachment, "/n", "And the message:/n", message, "/n", sep="") if (confirmBeforeSend) SEND <- winDialog("yesnocancel", paste("Are you sure you want to send this e-mail to ", unlist(to), "?", sep="")) else SEND <- "YES" if (SEND %in% "YES"){ jython.exec(rJython,mail) cat(message.details) } else cat("E-mail Delivery was Canceled by the User")

Ahora lo intento:

x<-paste(getwd(),"/Eercise 6.doc",sep="") send.email(list("[email protected]"), list("[email protected]"), ''dogs'', ''I sent it!'', attachment=x, ''[email protected]'', ''mypassword'', server="smtp.gmail.com:587", confirmBeforeSend=FALSE)

Y EL ERROR:

> x<-paste(getwd(),"/Eercise 6.doc",sep="") >send.email(list("[email protected]"), list("[email protected]"), ''dogs'', + ''I sent it!'', attachment=x, ''[email protected]'', ''mypassword'', + server="smtp.gmail.com:587", confirmBeforeSend=FALSE) Error in .jcall("RJavaTools", "Ljava/lang/Object;", "invokeMethod", cl, : SyntaxError: ("mismatched character ''//n'' expecting ''''''", (''<string>'', 15, 52, "/tpart.add_header(''Content-Disposition'', ''attachment;/n"))


Opción 1: para sendmailR , parece que está teniendo problemas con la adición del puerto 25. Debería poder especificar el puerto de destino mediante sendmail_options(smtpPort = 587) , antes de usar el comando sendmail() .

No estoy seguro de que esto resolverá sus otros problemas, pero debería proporcionarle el puerto correcto.

Opción 2: si desea invocar un script de Python, este parece ser el más relevante. Es posible que le resulte más fácil hacer una sustitución de token, es decir, tomar un script base, colocar cadenas que simplemente encontrará (es decir, los tokens) y reemplazar (es decir, sustituir por sus strings deseados), y luego ejecutar el script revisado.

Por ejemplo, usando el script en el enlace anterior (guardado en un directorio local como "sendmail_base.py"):

BasePy = scan("sendmail_base.py", what = "character", sep = "/n") OutPy = gsub("[email protected]", "yourRealEmailAddress", InFile) OutPy = gsub("your_password", "yourRealPassword", OutFile)

y así sucesivamente, sustituyendo el encabezado, el destinatario, etc., con las cadenas de texto que le gustaría usar, y lo mismo para la especificación del nombre del archivo adjunto. Finalmente, puedes guardar la salida en un nuevo archivo de Python y ejecutarlo:

cat(OutPy, file = "sendmail_new.py", sep = "/n") system("chmod u+x sendmail_new.py; ./sendmail_new.py")

Aunque este es un enfoque muy ingenuo, es simple y la depuración de la secuencia de comandos implica solo un examen de si el programa Python de salida está funcionando y si R está generando o no el programa Python de salida correcto. Esto contrasta con la depuración de lo que está pasando con R pasando objetos hacia y desde varios paquetes e idiomas.


Para trabajar con Gmail usando R, el mejor ejemplo de trabajo está disponible here . Es básico es el siguiente:

  1. Un proyecto en Google Developers Console para administrar el uso de la API de Gmail.

  2. el paquete gmailr R de Jim Hester, que envuelve la API de Gmail (desarrollo en GitHub)

  3. los paquetes plyr y dplyr para la gestión de datos (haga esto con base R si lo prefiere)

  4. address.csv un archivo que contiene direcciones de correo electrónico, identificado por una clave. En nuestro caso, los nombres de los alumnos.

  5. marks.csv un archivo que contiene los bits variables del correo electrónico que planea enviar, incluida la misma clave de identificación que la anterior. En nuestro caso, la tarea marca.

  6. el script enviar-email-con-rr


Pegando aquí por conveniencia el código de un enlace de arriba

send.email <- function(to, from, subject, message, attachment=NULL, username, password, server="smtp.gmail.com:587", confirmBeforeSend=TRUE){ # to: a list object of length 1. Using list("Recipient" = "[email protected]") will send the message to the address but # the name will appear instead of the address. # from: a list object of length 1. Same behavior as ''to'' # subject: Character(1) giving the subject line. # message: Character(1) giving the body of the message # attachment: Character(1) giving the location of the attachment # username: character(1) giving the username. If missing and you are using Windows, R will prompt you for the username. # password: character(1) giving the password. If missing and you are using Windows, R will prompt you for the password. # server: character(1) giving the smtp server. # confirmBeforeSend: Logical. If True, a dialog box appears seeking confirmation before sending the e-mail. This is to # prevent me to send multiple updates to a collaborator while I am working interactively. if (!is.list(to) | !is.list(from)) stop("''to'' and ''from'' must be lists") if (length(from) > 1) stop("''from'' must have length 1") if (length(to) > 1) stop("''send.email'' currently only supports one recipient e-mail address") if (length(attachment) > 1) stop("''send.email'' can currently send only one attachment") if (length(message) > 1){ stop("''message'' must be of length 1") message <- paste(message, collapse="//n//n") } if (is.null(names(to))) names(to) <- to if (is.null(names(from))) names(from) <- from if (!is.null(attachment)) if (!file.exists(attachment)) stop(paste("''", attachment, "'' does not exist!", sep="")) if (missing(username)) username <- winDialogString("Please enter your e-mail username", "") if (missing(password)) password <- winDialogString("Please enter your e-mail password", "") require(rJython) rJython <- rJython() rJython$exec("import smtplib") rJython$exec("import os") rJython$exec("from email.MIMEMultipart import MIMEMultipart") rJython$exec("from email.MIMEBase import MIMEBase") rJython$exec("from email.MIMEText import MIMEText") rJython$exec("from email.Utils import COMMASPACE, formatdate") rJython$exec("from email import Encoders") rJython$exec("import email.utils") mail<-c( #Email settings paste("fromaddr = ''", from, "''", sep=""), paste("toaddrs = ''", to, "''", sep=""), "msg = MIMEMultipart()", paste("msg.attach(MIMEText(''", message, "''))", sep=""), paste("msg[''From''] = email.utils.formataddr((''", names(from), "'', fromaddr))", sep=""), paste("msg[''To''] = email.utils.formataddr((''", names(to), "'', toaddrs))", sep=""), paste("msg[''Subject''] = ''", subject, "''", sep="")) if (!is.null(attachment)){ mail <- c(mail, paste("f = ''", attachment, "''", sep=""), "part=MIMEBase(''application'', ''octet-stream'')", "part.set_payload(open(f, ''rb'').read())", "Encoders.encode_base64(part)", "part.add_header(''Content-Disposition'', ''attachment; filename=/"%s/"'' % os.path.basename(f))", "msg.attach(part)") } #SMTP server credentials mail <- c(mail, paste("username = ''", username, "''", sep=""), paste("password = ''", password, "''", sep=""), #Set SMTP server and send email, e.g., google mail SMTP server paste("server = smtplib.SMTP(''", server, "'')", sep=""), "server.ehlo()", "server.starttls()", "server.ehlo()", "server.login(username,password)", "server.sendmail(fromaddr, toaddrs, msg.as_string())", "server.quit()") message.details <- paste("To: ", names(to), " (", unlist(to), ")", "/n", "From: ", names(from), " (", unlist(from), ")", "/n", "Using server: ", server, "/n", "Subject: ", subject, "/n", "With Attachments: ", attachment, "/n", "And the message:/n", message, "/n", sep="") if (confirmBeforeSend) SEND <- winDialog("yesnocancel", paste("Are you sure you want to send this e-mail to ", unlist(to), "?", sep="")) else SEND <- "YES" if (SEND %in% "YES"){ jython.exec(rJython,mail) cat(message.details) } else cat("E-mail Delivery was Canceled by the User") }


Podría darle al nuevo paquete mailR un disparo que permita la autorización de SMTP: http://rpremraj.github.io/mailR/

La siguiente llamada debería funcionar:

27/05/14: Ejemplo de edición a continuación para demostrar cómo se pueden enviar archivos adjuntos a través de R:

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"), file.names = c("Download log", "Upload log"), # optional parameter file.descriptions = c("Description for download log", "Description for upload log"))