2010-05-21 2 views
47

У меня есть запланированный сценарий R, запущенный с Windows-машины.Как отправить электронное письмо с приложением из R в windows

После этого я хочу, чтобы этот скрипт автоматически отправил электронное письмо с прикрепленным файлом журнала.

Использование shell() с некоторыми другими скриптами может быть возможным, но мне было интересно, есть ли лучшее решение в пределах R. Спасибо.

+1

Я предполагаю, что вы имели в виду 'system()' при написании 'shell()'. –

+0

Привет, Ахала, надеюсь, решение Stedy поможет. Могу я спросить, что вы используете, чтобы иметь запланированный R-скрипт? Благодарю. –

+4

Тал, используйте запланированные задачи в Windows (я считаю, что эта запись похожа на R CMD BATCH script.R), cron on * NIX sistems. – aL3xa

ответ

6

Вы просматривали пакет sendmailR? Это позволяет SMTP отправлять сообщение, и вы, вероятно, можете отредактировать функцию, чтобы разрешить вложение. Опять же, если его единственный один файл журнала, возможно, стоит использовать shell(), как вы упомянули.

10

Вы согласны с сообщением Twitter? Вы можете использовать Rcurl для публикации обновления на твиттер, который затем может быть перенаправлен на ваш мобильный телефон в виде текста или на ваш адрес электронной почты через настройки уведомлений.

Смотрите здесь: http://www.sakana.fr/blog/2007/03/18/scripting-twitter-with-curl/

+4

Существует CRAN-пакет под названием twitteR для взаимодействия твиттера с R: http://cran.r-project.org/web/packages/twitteR/index.html –

+0

+1 для использования Twitter, очень умный – Stedy

43

sendmailR работает для меня на Windows 7. Я ссылается http://cran.es.r-project.org/web/packages/sendmailR/sendmailR.pdf

SMTPServer = данные для Outlook 2010 в Файл -> Настройки аккаунта -> Настройки аккаунта -> дважды щелкните ваш счет -> текст в поле «Сервер»

library(sendmailR) 

#set working directory 
setwd("C:/workingdirectorypath") 

#####send plain email 

from <- "[email protected]" 
to <- "[email protected]" 
subject <- "Email Subject" 
body <- "Email body."      
mailControl=list(smtpServer="serverinfo") 

sendmail(from=from,to=to,subject=subject,msg=body,control=mailControl) 

#####send same email with attachment 

#needs full path if not in working directory 
attachmentPath <- "subfolder/log.txt" 

#same as attachmentPath if using working directory 
attachmentName <- "log.txt" 

#key part for attachments, put the body and the mime_part in a list for msg 
attachmentObject <- mime_part(x=attachmentPath,name=attachmentName) 
bodyWithAttachment <- list(body,attachmentObject) 

sendmail(from=from,to=to,subject=subject,msg=bodyWithAttachment,control=mailControl) 

Кроме того, несколько файлов могут быть отправлены путем добавления другого mime_part в список сбщ следующим образом (я также конденсируется его):

attachmentObject <- mime_part(x="subfolder/log.txt",name="log.txt") 
attachmentObject2 <- mime_part(x="subfolder/log2.txt",name="log2.txt") 
bodyWithAttachment <- list(body,attachmentObject,attachmentObject2) 
+0

Можете ли вы использовать html в «Электронная почта».? Можете ли вы использовать кодировку utf-8 (для многоязычного текста)? –

+2

Не знаю. Попробуй и посмотри. – ARobertson

+2

Как настроить часть serverinfo для gmail? – qed

4

Для Windows можно разобрать VB-Script (см. http://www.paulsadowski.com/wsh/cdo.htm), а затем вызовите его через оболочку.

Это может выглядеть следующим образом:

SendMail <- function(from="[email protected]",to="[email protected]",text="Hallo",subject="Sag Hallo",smtp="smtp.my.server.de",user="me.myself.and.i",pw="123"){ 
require(stringr) 
part1 <- "Const cdoSendUsingPickup = 1 'Send message using the local SMTP service pickup directory. 
Const cdoSendUsingPort = 2 'Send the message using the network (SMTP over the network). 
Const cdoAnonymous = 0 'Do not authenticate 
Const cdoBasic = 1 'basic (clear-text) authentication 
Const cdoNTLM = 2 'NTLM " 

part2 <- paste(paste("Set objMessage = CreateObject(",'"',"CDO.Message",'"',")" ,sep=""), 
paste("objMessage.Subject = ",'"',subject,'"',sep=""), 
paste("objMessage.From = ",'"',from,'"',sep=""), 
paste("objMessage.To = ",'"',to,'"',sep=""), 
paste("objMessage.TextBody = ",'"',text,'"',sep=""), 
sep="\n") 

part3 <- paste(
"'==This section provides the configuration information for the remote SMTP server. 

objMessage.Configuration.Fields.Item _ 
(\"http://schemas.microsoft.com/cdo/configuration/sendusing\") = 2 

'Name or IP of Remote SMTP Server 
objMessage.Configuration.Fields.Item _ 
(\"http://schemas.microsoft.com/cdo/configuration/smtpserver\") = ",'"',smtp,'"'," 

'Type of authentication, NONE, Basic (Base64 encoded), NTLM 
objMessage.Configuration.Fields.Item _ 
(\"http://schemas.microsoft.com/cdo/configuration/smtpauthenticate\") = cdoBasic 

'Your UserID on the SMTP server 
objMessage.Configuration.Fields.Item _ 
(\"http://schemas.microsoft.com/cdo/configuration/sendusername\") = ",'"',user,'"'," 

'Your password on the SMTP server 
objMessage.Configuration.Fields.Item _ 
(\"http://schemas.microsoft.com/cdo/configuration/sendpassword\") = ",'"',pw,'"', " 

'Server port (typically 25) 
objMessage.Configuration.Fields.Item _ 
(\"http://schemas.microsoft.com/cdo/configuration/smtpserverport\") = 25 

'Use SSL for the connection (False or True) 
objMessage.Configuration.Fields.Item _ 
(\"http://schemas.microsoft.com/cdo/configuration/smtpusessl\") = False 

'Connection Timeout in seconds (the maximum time CDO will try to establish a connection to the SMTP server) 
objMessage.Configuration.Fields.Item _ 
(\"http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout\") = 60 
objMessage.Configuration.Fields.Update 

'==End remote SMTP server configuration section== 

objMessage.Send 
",sep="") 

vbsscript <- paste(part1,part2,part3,sep="\n\n\n") 
str_split(vbsscript,"\n") 
writeLines(vbsscript, "sendmail.vbs") 
shell("sendmail.vbs") 
unlink("sendmail.vbs") 
} 
+2

Большое спасибо, это работает как сон! Это единственный подход, который я нашел для работы в R (в Windows). Как объясняется на веб-странице Пола, если вы используете gmail, вам нужно установить порт сервера на 465 и установить для параметра «Использовать SSL» значение «Истина». Для этого я использовал следующий код: 'SendMail (from =" [email protected] ", to =" [email protected] ", текст =" Hallo ", subject =" Sag Hallo ", smtp =" smtp.gmail.com ", user =" [email protected] ", pw =" ******** ")' Вставьте свой реальный пароль, конечно ... Кроме того, рабочий каталог R должен быть где-то на жестком диске (C :). –

+0

Это потрясающе! Можно ли добавить вложение? У меня очень ограниченный опыт VB ... так вот, вот почему я спрашиваю. – maloneypatr

+0

Любовь, чтобы помочь :-) ... jip, кажется возможным, хотя я никогда не пробовал это сам, см. Здесь: http://www.paulsadowski.com/wsh/cdo.htm под заголовком «Отправка текстового письма с прикрепленным file "... в эту функцию можно включить соответствующие строки. – petermeissner

2

Просто хочу, чтобы напомнить людям, кто хочет самостоятельно уведомляя особенность сервис под названием Twilio, они предоставляют бесплатный сервис для отправки смс на свой мобильный телефон. Проход через R можно найти здесь https://dreamtolearn.com/ryan/data_analytics_viz/78

Приведен пример кода, просто замените учетные данные своими собственными.

library(jsonlite) 
library(XML) 
library(httr) 
library(rjson) 
library(RCurl) 
options(RCurlOptions = list(cainfo = system.file("CurlSSL", "cacert.pem", package = "RCurl"))) 

authenticate_twilio <- "https://[ACCOUNT SID]:[AUTH TOKEN]@api.twilio.com/2010-04-01/Accounts" 
authenticate_response <- getURL(authenticate_twilio) 
print(authenticate_response) 

postForm("https://[ACCOUNT SID]:[AUTH TOKEN]@api.twilio.com/2010-04-01/Accounts/[ACCOUNT SID]/Messages.XML",.params = c(From = "+1[twilio phone#]", To = "+1[self phone#]",Body = "Hello from twilio")) 
12

Использование mailR - он работает с аутентификацией, вложение, он автоматически отправить сообщение текстового вместе с HTML и многим другим.

mailR требует rJava, который иногда может быть немного больно. На окнах у меня не было никаких проблем. На убунту это решается один вопрос я имел:

sudo apt-get install openjdk-jdk 

в R

install.packages("devtools", dep = T) 
library(devtools) 
install_github("rpremraj/mailR") 

(если у вас есть проблемы с rJava - попробовать sudo R CMD javareconf в терминале)

mailR легко работать с и хорошо документированы на странице github.

Пример из documentaion

library(mailR) 
send.mail(from = "[email protected]", 
      to = c("[email protected]", "[email protected]"), 
      subject = "Subject of the email", 
      body = "Body of the email", 
      smtp = list(host.name = "smtp.gmail.com", port = 465, user.name = "gmail_username", passwd = "password", ssl = TRUE), 
      authenticate = TRUE, 
      send = TRUE, 
      attach.files = c("./download.log", "upload.log", "https://dl.dropboxusercontent.com/u/5031586/How%20to%20use%20the%20Public%20folder.rtf"), 
      file.names = c("Download log.log", "Upload log.log", "DropBox File.rtf"), # optional parameter 
      file.descriptions = c("Description for download log", "Description for upload log", "DropBox File"), # optional parameter 
      debug = TRUE) 

Примечание: сервер SMTP может найти чрезмерное использование подозрительной. Это имеет место, например, GMail. Поэтому после отправки нескольких писем вы, вероятно, должны войти в gmail account и посмотреть, была ли временно отключена учетная запись. Также обратите внимание, что если вы используете учетную запись gmail с двухфакторной аутентификацией, вам необходимо использовать an application specific password.

+0

Возможно, вы могли бы включить пример из документации, чтобы продемонстрировать, как будет выглядеть код. Другие ответы успешно включали примеры. – BenBarnes

+0

downvotes? Интересно? – Andreas

+0

Не мои нисходящие. – BenBarnes

Смежные вопросы