[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