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.
Email out of R (code)
3 messages · nutterb, MacQueen, Don, Uwe Ligges
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.
R has packages for almost everything, so there is "sendmailR" .... Uwe Ligges
On 28.10.2011 20:04, MacQueen, Don wrote:
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().