Кто-нибудь знает, можно ли отправлять электронные письма в R через Outlook. Весь пример sendmailR использует сервер gmail. Я не могу сделать это. Любые идеи?
Спасибо!
Кто-нибудь знает, можно ли отправлять электронные письма в R через Outlook. Весь пример sendmailR использует сервер gmail. Я не могу сделать это. Любые идеи?
Спасибо!
Вы можете использовать пакет RDCOMClient
для доступа к COM-объектам из R. Вы можете легко получить доступ к Application Object (Outlook) и настроить его для отправки ваших электронных писем. Вот простой пример, который показывает, как отправить и по электронной почте:
library(RDCOMClient)
## init com api
OutApp <- COMCreate("Outlook.Application")
## create an email
outMail = OutApp$CreateItem(0)
## configure email parameter
outMail[["To"]] = "[email protected]"
outMail[["subject"]] = "some subject"
outMail[["body"]] = "some body"
## send it
outMail$Send()
Конечно, это предполагает, что вы уже установили Outlook и настроили его для отправки/получения ваших писем. Кроме того, вы можете расширить это, чтобы добавить вложения.
outMail[["Attachments"]]$Add(path_to_attch_file)
outMail[["SentOnBehalfOfName"]] = "[email protected]"
Можно отправлять электронные письма в R через Outlook. sendmailR работает для меня в Windows 7 и Outlook 2010. Я ссылался на 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 <- "recipie[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 в список msg следующим образом (я также сократил его):
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)
Вы также можете использовать vbscript, чтобы раскрыть все функции Outlook
Ссылка: члены MailItem (Outlook) - MSDN - Microsoft
################################################
#Outlook Enumerations
################################################
#OlMailRecipientType Enumeration (Outlook)
OlMailRecipientType <- c(olBCC=3, olCC=2, olOriginator=0, olTo=1)
#OlBodyFormat Enumeration (Outlook)
OlBodyFormat <- c(olFormatHTML=2, olFormatPlain=1, olFormatRichText=3, olFormatUnspecified=0)
#OlImportance Enumeration (Outlook)
OlImportance <- c(olImportanceHigh=2, olImportanceLow=0, olImportanceNormal=1)
#OlSensitivity Enumeration (Outlook)
OlSensitivity <- c(olConfidential=3, olNormal=0, olPersonal=1, olPrivate=2)
#OlDefaultFolders Enumeration (Outlook)
OlDefaultFolders <- c(olFolderCalendar=9, olFolderConflicts=19, olFolderContacts=10, olFolderDeletedItems=3,
olFolderDrafts=16, olFolderInbox=6, olFolderJournal=11, olFolderJunk=23,
olFolderLocalFailures=21, olFolderManagedEmail=29, olFolderNotes=12, olFolderOutbox=4,
olFolderSentMail=5, olFolderServerFailures=22, olFolderSyncIssues=20,
olFolderTasks=13, olFolderToDo=28, olPublicFoldersAllPublicFolders=18, olFolderRssFeeds=25)
################################################
#function to send email using Outlook
################################################
outlookSend <- function(To, Subject='', CC=NULL, BCC=NULL,
HTMLBodyFile=NULL, HTMLBody=NULL, Body='', Attachments=NULL,
DeferredDeliveryTime=NULL, OriginatorDeliveryReportRequested=NULL, ReadReceiptRequested=NULL,
FlagRequest=NULL, Importance=NULL, Sensitivity=NULL,
SentOnBehalfOfName=NULL)
{
vbscript <- c('Dim objOutlook',
'Dim objMailItem',
'Dim objFileSystem',
'Dim objNamespace',
'Dim objSentFolder',
'Set objOutlook = CreateObject("Outlook.Application")',
'Set objMailItem = objOutlook.CreateItem(0)',
'With objMailItem',
paste0('\t.Subject = "', Subject, '"'),
#Add recipients
unlist(lapply(To, function(recip) c(
paste0('\tSet recip = .Recipients.Add ("',recip,'")'),
paste('\trecip.Type =',OlMailRecipientType['olTo'])))),
if (!is.null(CC)) {
unlist(lapply(To, function(recip) c(
paste0('\tSet recip = .Recipients.Add ("',recip,'")'),
paste('\trecip.Type =',OlMailRecipientType['olCC']))))
},
if (!is.null(BCC)) {
unlist(lapply(To, function(recip) c(
paste0('\tSet recip = .Recipients.Add ("',recip,'")'),
paste('\trecip.Type =',OlMailRecipientType['olBCC']))))
},
'\t.Recipients.ResolveAll',
#Insert email body
if (!is.null(HTMLBodyFile)) {
c(paste('\t.BodyFormat =', OlBodyFormat['olFormatHTML']),
'\tSet objFileSystem = CreateObject("Scripting.FileSystemObject")',
paste0('\tSet file = objFileSystem.OpenTextFile("',HTMLBodyFile,'", 1)'),
'\t.HTMLBody = file.ReadAll')
} else if (!is.null(HTMLBody)) {
c(paste('\t.BodyFormat =', OlBodyFormat['olFormatHTML']),
paste0('\t.HTMLBody = "',HTMLBody,'"'))
} else {
c(paste('\t.BodyFormat =', OlBodyFormat['olFormatPlain']),
paste0('\t.Body = "', Body, '"'))
},
#Add attachments
if (!is.null(Attachments)) {
vapply(Attachments, function(x) paste0('\t.Attachments.Add "',x,'"'), character(1))
},
#copy of the mail message is saved down
'\t.DeleteAfterSubmit = False',
#Delay delivery in minutes
if (!is.null(DeferredDeliveryTime)) {
paste0('\t.DeferredDeliveryTime = dateadd("n", ',DeferredDeliveryTime,', Now)')
},
#Indicates the requested action for a mail item
if (!is.null(FlagRequest)) {
'\t.FlagRequest = "Follow up"'
},
#Indicates the relative importance level for the mail item
if (!is.null(Importance)) {
paste('\t.Importance =', OlImportance[Importance])
},
#OriginatorDeliveryReportRequested of type logical: whether to receive delivery report
if (!is.null(OriginatorDeliveryReportRequested) && OriginatorDeliveryReportRequested) {
'\t.OriginatorDeliveryReportRequested = True'
},
#ReadReceiptRequested of type logical: request read receipt
if (!is.null(ReadReceiptRequested) && ReadReceiptRequested) {
'\t.ReadReceiptRequested = True'
},
#Indicates the the display name for the intended sender of the mail message
if (!is.null(SentOnBehalfOfName)) {
paste('\t.SentOnBehalfOfName =', SentOnBehalfOfName)
},
#Indicates the sensitivity for the Outlook item
if (!is.null(Sensitivity)) {
paste('\t.Sensitivity =', OlSensitivity[Sensitivity])
},
'End With',
'objMailItem.Send',
'Set objFileSystem = Nothing',
'Set objMailItem = Nothing',
'Set objOutlook = Nothing')
vbsfile <- tempfile('vbs',getwd(),'.vbs')
write(vbscript, vbsfile)
shell(paste('cscript /NOLOGO', vbsfile))
unlink(vbsfile)
} #outlookSend
#Examples Usage:
outlookSend(To=c("[email protected]","[email protected]"),
Subject="XXX", HTMLBodyFile='C:/Users/XXX/Documents/XXX.html',
Attachments=c('C:/Users/XXX/Documents/XXX.html', 'C:/Users/XXX/Documents/XXX.txt'))
Это решение будет полезно, когда вам запрещено отправлять электронные письма напрямую через SMTP-сервер.
Старый вопрос, но если кто-то захочет использовать mailR для этой задачи, взгляните на "Настройки" (в outlook), затем нажмите "E-Mail" (ниже "Настройки вашего приложения") и перейдите к "POP and IMAP".. вы найдете имя хоста и порт для SMTP здесь.