在R中使用Gmail发送带附件的邮件
我想用R语言通过Gmail发送带附件的邮件。我发现sendmailR这个工具在用Gmail时不太好用,因为它需要身份验证(我自己试过没成功,所以我猜是这样,除非有人告诉我我错了,如果真有的话,我会把R的输出和错误信息发上来)。我在这个链接找到了一段代码。网站上说这段代码没有格式化来发送附件,但我已经让它能发送邮件了。我想在这段代码的基础上扩展一下,让它能发送附件(这段代码的作者在邮件中提到他没能让代码发送附件)。
我想用R和Gmail发送邮件。我是Windows 7用户,使用的是R的2.14测试版。
这段代码可以发送邮件,但不能发送附件:
require(rJython)
rJython <- rJython()
rJython$exec( "import smtplib" )
rJython$exec("from email.MIMEText import MIMEText")
rJython$exec("import email.utils")
mail<-c(
#Email settings
"fromaddr = 'bigbird@gmail.com'",
"toaddrs = 'oscarthegrouch@gmail.com'",
"msg = MIMEText('This is the body of the message.')",
"msg['From'] = email.utils.formataddr(('sender name', fromaddr))",
"msg['To'] = email.utils.formataddr(('recipient name', toaddrs))",
"msg['Subject'] = 'Simple test message'",
#SMTP server credentials
"username = 'bigbird@gmail.com'",
"password = 'pw'",
#Set SMTP server and send email, e.g., google mail SMTP server
"server = smtplib.SMTP('smtp.gmail.com:587')",
"server.ehlo()",
"server.starttls()",
"server.ehlo()",
"server.login(username,password)",
"server.sendmail(fromaddr, toaddrs, msg.as_string())",
"server.quit()")
jython.exec(rJython,mail)
请注意,这个问题也在talkstats.com上发过。我在那边没有收到回复(只是有成员告诉我他们希望能帮忙)。如果我找到可行的解决方案,我也会把它发到那边。
8 个回答
选项 1:关于 sendmailR
,看起来你在使用 25 端口时遇到了问题。你可以通过 sendmail_options(smtpPort = 587)
来指定目标端口,这个设置要在使用 sendmail()
命令之前进行。
我不确定这样做是否能解决你其他的问题,但至少可以让你使用正确的端口。
选项 2:如果你想运行一个 Python 脚本,这个链接看起来最相关。你可能会发现,最简单的方法是进行“令牌替换”,也就是说,拿一个基础脚本,把你想要的字符串(也就是令牌)放进去,然后替换成你想要的内容,最后执行修改后的脚本。
比如,使用上面链接中的脚本(保存在本地目录中,命名为 "sendmail_base.py"):
BasePy = scan("sendmail_base.py", what = "character", sep = "\n")
OutPy = gsub("your_email@gmail.com", "yourRealEmailAddress", InFile)
OutPy = gsub("your_password", "yourRealPassword", OutFile)
然后继续替换标题、收件人等信息,使用你想要的文本字符串,附件文件名也是一样。最后,你可以把输出保存到一个新的 Python 文件中并执行:
cat(OutPy, file = "sendmail_new.py", sep = "\n")
system("chmod u+x sendmail_new.py; ./sendmail_new.py")
虽然这是一种非常简单的方法,但它很直接,调试这个脚本只需要检查你的输出 Python 程序是否正常工作,以及 R 是否生成了正确的输出 Python 程序。这和调试 R 在不同包和语言之间传递对象的情况是不同的。
你在R环境中运行Jython代码,所以你想用Jython语言发送一个附件,而不是用R。
因为Jython基本上就是Python,这里有一种用Python发送带附件的邮件的方法:如何用Python发送邮件附件。
你只需要把那段代码整合到你的代码里就可以了。
这里有一个有效且表现良好的解决方案:
http://r.789695.n4.nabble.com/Email-out-of-R-code-td3530671.html
感谢nutterb在rhelp列表中提供的答案。也感谢所有尝试帮助我并耐心对待我对python不熟悉的朋友们。