[R] Email out of R (code)
MacQueen, Don
macqueen1 at llnl.gov
Fri Oct 28 20:04:32 CEST 2011
The various suggestions seem kind of complex to me, at least on a
unix-like system (including Mac OS X).
This is what I do:
sink('tmp.txt')
cat('This is the body of the message\n')
sink()
system('cat tmp.txt | mail -s "A test email" macqueen1 at llnl.gov')
One could probably avoid the temporary external text file using
connections, but I haven't had that need.
For attachments, the following approach works on at least some systems
(RHEL for one):
pdf('temp.pdf')
## create a plot
dev.off()
sink('tmp.txt')
## print() and cat() commands
sink()
cmd <- '/bin/mailx -s "Subject line text"
-a temp.pdf -S replyto=macqueen1 at llnl.gov
recipient at some.host < tmp.txt'
system(cmd)
It's not hard, of course, to wrap such a thing up in a function with
arguments for various elements such as the subject, the file names, the
email address(es), and then construct the cmd using paste().
--
Don MacQueen
Lawrence Livermore National Laboratory
7000 East Ave., L-627
Livermore, CA 94550
925-423-1062
On 10/28/11 7:28 AM, "nutterb" <NutterB at ccf.org> wrote:
>Thanks for posting this. If anyone is interested in a short extension to
>include an attachment, try the function below.
>
>I make no guarantees though. Also, note that winDialog() is used in a
>couple places, so it may need some therapy before working outside of
>Windows.
>
>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" =
>"recip at 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")
>}
>
>--
>View this message in context:
>http://r.789695.n4.nabble.com/Email-out-of-R-code-tp3530671p3948061.html
>Sent from the R help mailing list archive at Nabble.com.
>
>______________________________________________
>R-help at r-project.org mailing list
>https://stat.ethz.ch/mailman/listinfo/r-help
>PLEASE do read the posting guide
>http://www.R-project.org/posting-guide.html
>and provide commented, minimal, self-contained, reproducible code.
More information about the R-help
mailing list