2017-08-30 61 views
0

我一直在用mailR軟件包來從我的Gmail帳戶發送郵件,但到目前爲止我一直無法使它工作。其代碼如下(與隱私/安全「AAAA」取代電子郵件和密碼):R mailR包發送消息給STMP服務器(gmail)

library(mailR) 

sender <- '[email protected]' 
recipients <- c('[email protected]') 
send.mail(from = sender, 
       to = recipients, 
       subject = 'My bot sent this', 
       body = 'Test Successful', 
       smtp = list(host.name = 'stmp.gmail.com', port= 587, 
           user.name = '[email protected]', 
           passwd = 'aaaa', tls= TRUE), 
       authenticate = TRUE, 
       send = TRUE) 

從我的理解,這似乎是一個適當的設置爲這個包。此外,我已確保雙重登錄已關閉,並且已啓用「允許訪問不太安全的應用程序」。我也用tls和ssl(完成適當的端口)嘗試了這一點,這沒有什麼區別。

當我運行代碼,我得到了以下錯誤:

org.apache.commons.mail.EmailException: Sending the email to the following server failed : stmp.gmail.com:587 
    at org.apache.commons.mail.Email.sendMimeMessage(Email.java:1410) 
    at org.apache.commons.mail.Email.send(Email.java:1437) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at RJavaTools.invokeMethod(RJavaTools.java:386) 
Caused by: com.sun.mail.util.MailConnectException: Couldn't connect to host, port: stmp.gmail.com, 587; timeout 60000; 
    nested exception is: 
    java.net.UnknownHostException: stmp.gmail.com 
    at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:2053) 
    at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:697) 
    at javax.mail.Service.connect(Service.java:386) 
    at javax.mail.Service.connect(Service.java:245) 
    at javax.mail.Service.connect(Service.java:194) 
    at javax.mail.Transport.send0(Transport.java:253) 
    at javax.mail.Transport.send(Transport.java:124) 
    at org.apache.commons.mail.Email.sendMimeMessage(Email.java:1400) 
    ... 6 more 
Caused by: java.net.UnknownHostException: stmp.gmail.com 
    at java.net.AbstractPlainSocketImpl.connect(Unknown Source) 
    at java.net.PlainSocketImpl.connect(Unknown Source) 
    at java.net.SocksSocketImpl.connect(Unknown Source) 
    at java.net.Socket.connect(Unknown Source) 
    at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:310) 
    at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:236) 
    at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:2019) 
    ... 13 more 
NULL 
Error: EmailException (Java): Sending the email to the following server failed : stmp.gmail.com:587 

爲了記錄在案,這裏是回溯輸出,以及:

> traceback() 
10: stop(list(message = "org.apache.commons.mail.EmailException: Sending the email to the following server failed : stmp.gmail.com:587", 
     call = .jcall("RJavaTools", "Ljava/lang/Object;", "invokeMethod", 
      cl, .jcast(if (inherits(o, "jobjRef") || inherits(o, 
       "jarrayRef")) o else cl, "java/lang/Object"), .jnew("java/lang/String", 
       method), j_p, j_pc, use.true.class = TRUE, evalString = simplify, 
      evalArray = FALSE), jobj = <S4 object of class "jobjRef">)) 
9: .Call(RJavaCheckExceptions, silent) 
8: .jcheck(silent = FALSE) 
7: .jcall("RJavaTools", "Ljava/lang/Object;", "invokeMethod", cl, 
     .jcast(if (inherits(o, "jobjRef") || inherits(o, "jarrayRef")) o else cl, 
      "java/lang/Object"), .jnew("java/lang/String", method), 
     j_p, j_pc, use.true.class = TRUE, evalString = simplify, 
     evalArray = FALSE) 
6: .jrcall(x, name, ...) 
5: email$send() at MessageBot.R#15 
4: eval(expr, envir, enclos) 
3: eval(ei, envir) 
2: withVisible(eval(ei, envir)) 
1: source("MessageBot.R") 

任何想法是怎麼回事?

回答

0

由於您要求使用mailr軟件包提供故障排除解決方案,因此如果您打算嘗試使用其他軟件包,請使用gmailr

install.packages('gmailr') 
library(gmailr) 
setwd() #set to desired working directory 
gmail_auth() 

mail <- mime(
    To = "[email protected]", 
    From = "[email protected]", 
    Subject = "My bot sent this", 
    body = "Test successful") 
send_message(mail) 

當您使用gmail_auth功能,如果你想連接到您的Gmail帳戶,將交互詢問。請注意,使用通過公共應用程序連接的gmailR軟件包。

通過在終端中輸入'yes'並單擊瀏覽器中的'接受',您將在當前工作目錄(爲什麼我們將開始設置工作目錄)中存儲一個.httr-auth標記(加密用戶名和密碼)。您可以通過在終端中運行list.files(all = T)來查看文件。這允許您重新運行代碼,而無需執行。)將物理代碼中的密碼存儲在您的用戶名中,並b)以交互方式「重新接受」連接。

+0

我會給一個鏡頭,但我對如何使這項工作在mailR答案仍然打開! –

0

您插入錯誤的主機名:host.name = 'stmp.gmail.com' 該協議是SMTP,所以host.name = 'smtp.gmail.com'