मुझे पता है कि यह मेरे स्वयं के प्रश्न का उत्तर देने के लिए यह बुरा फॉर्म है, लेकिन यह बिना किसी बदलाव के चमत्कारिक रूप से काम करना शुरू कर दिया। मेरा पहला प्रभाव बनाने का क्या तरीका है, है ना?
वैसे भी, मैंने इसे एक आर फ़ंक्शन में लपेट लिया। यह जीमेल से भेजेगा, लेकिन मैंने इसे अभी तक अन्य खातों से भेजने की कोशिश नहीं की है। मुझे Outlook से भेजने में सबसे अधिक दिलचस्पी है, क्योंकि मैं इसका उपयोग अपनी स्क्रिप्ट के भीतर से विश्लेषण रिपोर्ट भेजने के लिए कर रहा हूं। जब मैंने अपने नियोक्ता के एसएमटीपी सर्वर में प्रवेश किया, तो उसने त्रुटि "एसएमटीपी AUTH एक्सटेंशन सर्वर द्वारा समर्थित नहीं है।" मुझे संदेह है कि मुझे अपने तकनीकी सहायता लोगों के साथ यह काम करना होगा।
यह शायद WinDialog() फ़ंक्शंस के लिए धन्यवाद, विंडोज पर ही काम करेगा। लेकिन यह एक अच्छी शुरुआत है।
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")
}
मैं बहुत अजगर पता नहीं है, लेकिन yourr की "[" केवल उपयोग लाइनों में है के बाद से "msg [से 'के साथ शुरू," msg [करने के लिए "और" msg [विषय "है कि यह सुनिश्चित करें की तरह लगता है <] को बदलने के लिए जगह <>। –
इसी तरह का कोड मेरे लिए काम करता प्रतीत होता है। क्या आप पूर्ण ट्रेसबैक पोस्ट कर सकते हैं? इसके अलावा, ऐसा लगता है कि आर के साथ कुछ भी नहीं है, इसलिए मैं उस टैग को हटाने जा रहा हूं। –
आप सही दिखते हैं। जब मैं आज सुबह आया और भाग गया, तो यह ठीक काम करता था। मैंने नीचे एक आर समारोह में अनुकूलन पोस्ट किया। इसे देखने के लिए धन्यवाद। – Benjamin