2015-08-17 2 views
0

Я пытаюсь отправить электронное письмо с вложениями в R через gmail с помощью пакета jython. Я понимаю, что jython - это язык python внутри R, проблема в том, что я не знаю python, поэтому надеюсь, что кто-то, владеющий этим языком, сможет мне помочь.Отправка вложений в R через gmail (с использованием jython)

Почему я использую jython? Поскольку другой почтовый пакет, который кажется популярным на SO - sendmailR, не работает с gmail, поскольку он требует аутентификации.

Исходный код, который я использовал, - here. Как говорит парень по ссылке, исходный код построен для писем без вложений. Я смог полностью запустить эту версию без ошибок (то есть можно отправлять электронные письма без вложений через jython в R).

Однако, когда я попытался добавить скрипт для включения вложений, он не сработал. Это моя попытка форматирования этого кода для обработки вложений (подробность Логина/электронной почты гасится):

rJython <- rJython() 
rJython$exec("import smtplib") 
rJython$exec("from email.MIMEMultipart import MIMEMultipart") 
rJython$exec("from email.MIMEBase import MIMEBase") 
rJython$exec("from email.MIMEText import MIMEText") 
rJython$exec("import email.utils") 
rJython$exec("import smtplib") 
rJython$exec("import os") 
rJython$exec("from email.Utils import COMMASPACE, formatdate") 
rJython$exec("from email import Encoders") 



mail<-c( 
    #Email settings 
    "fromaddr = '@gmail.com'", 
    "toaddrs = '@gmail.com'", 
    "msg = MIMEMultipart('This is the body of the message.')", 
    "msg['From'] = email.utils.formataddr(('', fromaddr))", 
    "msg['To'] = email.utils.formataddr(('', toaddrs))", 
    "msg['Subject'] = 'Monitor'", 

    #SMTP server credentials 
    "username = ''", 
    "password = ''", 

    #Attach file 
    "files = 'E:/R/R_Data/output/S.pdf'", 
    "msg.attach(MIMEText('Your message contents'))", 

    "for f in files:", 
    " part = MIMEBase('application', 'octet-stream')", 
    " part.set_payload(open(f, 'rb').read())", 
    " Encoders.encode_base64(part)", 
    " part.add_header('Content-Disposition', 'attachment; 
    " filename=\"S.pdf\"' % os.path.basename(files))", 
    " msg.attach(part)", 

    #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) 

Когда я запускаю это, я получаю следующее сообщение об ошибке:

Error in jython.exec(rJython, mail) : [Errno 2] ENOENT: 'E' 

Я понимаю, что эта ошибка в Python означает «нет такого файла или каталога».

Вещи, которые я могу делать неправильно: 1. Я неправильно размещаю каталог своих вложений? 2. Не работает ли код, потому что я указываю только один файл в каталоге для прикрепления? 3. Может ли код не обрабатывать .pdfs? 4. Неправильная ли какая-либо другая часть кода?

Детали Версия: платформы x86_64-рс-Mingw32
арка x86_64
ОС mingw32
система x86_64, mingw32
статус
главная 2
незначительные 13,1
год 2011
месяц 07
день 08
svn rev 56322
язык R
version.string R версия 2.13.1 (2011-07-08)

Большое спасибо за вашу помощь. А.

+0

Вы пробовали [пакет gmailR] (https://github.com/trinker/gmailR)? – Dason

ответ

0

ENOENT означает file not found - ваш код принимает только первый символ files, что - конечно - не является допустимым именем файла.Для того, чтобы успешно отправить почту через Gmail с приложением PDF с помощью Jython, вы можете использовать:

library(rJython) 
rJython <- rJython() 
rJython$exec("import smtplib") 
rJython$exec("from email.MIMEMultipart import MIMEMultipart") 
rJython$exec("from email.MIMEBase import MIMEBase") 
rJython$exec("from email.MIMEText import MIMEText") 
rJython$exec("import email.utils") 
rJython$exec("import smtplib") 
rJython$exec("import os") 
rJython$exec("from email.Utils import COMMASPACE, formatdate") 
rJython$exec("from email import Encoders") 

mail<-c( 
    #Email settings 
    "fromaddr = '@gmail.com'", 
    "toaddrs = '@gmail.com'", 
    "msg = MIMEMultipart('This is the body of the message.')", 
    "msg['From'] = email.utils.formataddr(('', fromaddr))", 
    "msg['To'] = email.utils.formataddr(('', toaddrs))", 
    "msg['Subject'] = 'Monitor'", 

    #SMTP server credentials 
    "username = ''", 
    "password = ''", 

    #Attach file 
    "files = ['E:/R/R_Data/output/S.pdf']", 
    "msg.attach(MIMEText('Your message contents'))", 

    "for f in files:", 
    " part = MIMEBase('application', 'octet-stream')", 
    " part.set_payload(open(f, 'rb').read())", 
    " Encoders.encode_base64(part)", 
    " part.add_header('Content-Disposition', 'attachment', filename='S.pdf')", 
    " msg.attach(part)", 

    #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) 

Как уже упоминалось в другой ответ, вы первым получили allow less secure apps to access your Gmail. Тогда результат будет:

enter image description here

+0

отлично работает, большое спасибо за вашу любезную помощь! Очень признателен. – asingh

0

Вот пример с Google счета и mailR пакет:

library("mailR") 

mail.from <- "[email protected]" 
mail.to <- "[email protected]" 
mail.subject <- "subject" 

smtp.host.name <- "smtp.gmail.com" # if you are using gmail smtp keep this 
smtp.host.port <- 465    # if you are using gmail smtp keep this 
smtp.user.name <- "[email protected]" 
smtp.host.passwd <- "yourpass" 
smtp.ssl <- TRUE     # if you are using gmail smtp keep this 

smtp = list(host.name = smtp.host.name, port = smtp.host.port, 
       ssl=smtp.ssl, user.name = smtp.user.name, 
       passwd = smtp.host.passwd) 

send.mail(from = mail.from, 
      to = mail.to, 
      subject = mail.subject, 
      body = "BodyText", 
      attach.files = c("path/to/your_file.ext"), 
      smtp = smtp, 
      authenticate = TRUE, 
      send = TRUE) 

Кроме того, включить доступ к SMTP для вашей учетной записи Google. https://www.google.com/settings/security/lesssecureapps