Maciej B.

Maciej B. Doktorant

Temat: Python i R - wysyłanie maili z R wykorzystując Pythona

Witam,

natknąłem się w sieci na fajny kod do wysyłania maili wykorzystując R ale mam pewien problem. Oprócz tego, że nie znam Pythona ( :) ), nie wiem jak sprawić aby w wysyłanych mailach znajdowały się polskie czcionki zamiast znaków zapytania (?).

Jak również możliwość wyboru ścieżki do załączonego pliku, która zawiera polskie znaki.

Może ktoś z Was wie jak rozwiązać ten problem, jak zmodyfikować poniższy kod?
źródło: http://www.talkstats.com/showthread.php/20845-Email-fr...


send.email <- function(to, from, subject,
message, attachment=NULL,
username, password,
server="smtp.gmail.com:587",
confirmBeforeSend=FALSE){
# to: a list object of length 1. Using list("Recipient" = "recip@somewhere.net") 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")
}


Kod do wysłania wiadomości


send.email(list('mail.docelowy@domena.com'),list("mail.wysyłany@domena.com"),subject="testuję maila i jest błąd", message="Źródło opracowanie własne bez polskich czcionek", username='użytkownik', password='a tutaj jego hasło')

próbowałem

rJython$exec("import sys")
rJython$exec("reload(sys)")
rJython$exec("sys.setdefaultencoding('utf-8')")

i

paste("msg.attach(MIMEText('", message,"'", ".encode('utf-8'),'plain', 'utf-8'))", sep="")

ale to nic nie zmienia.

Będę wdzięczny za pomoc!
MB

konto usunięte

Temat: Python i R - wysyłanie maili z R wykorzystując Pythona

Dla mnie locale trzeba ustawić w pythonie / jythonie, czyli właśnie ten:
sys.setdefaultencoding('utf-8')
, ale też w R:
http://stat.ethz.ch/R-manual/R-devel/library/base/html...
Maciej B.

Maciej B. Doktorant

Temat: Python i R - wysyłanie maili z R wykorzystując Pythona

W win7 mogę ustawić na Poland.1250, utf-8 nie mogę ;/

konto usunięte

Temat: Python i R - wysyłanie maili z R wykorzystując Pythona

O tym systemie operacyjnym za wiele nie powiem... Może ustawić te 1250 i przekodować na utfa, żeby w R było już ok?
Na mój, prosty, sposób myślenia. Jestem w stanie ogarnąć, że w Pythonie czegoś tam się nie da ustawić, bo biblioteki, pod spodem są systemowe. No, ale jak rozumem, tu jest Jython - utf w JVMie działa bez problemowo... No, chyba że to też cecha Linuxa. ;)

Następna dyskusja:

Python + GUI




Wyślij zaproszenie do