Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I send/receive (SMTP/POP3) email using R?

Tags:

email

r

I strongly suspect the most upvoted answer will be "that is the wrong tool for the job". I acknowledge that R may not be particularly well suited for sending and receiving email but it is the scripting language I know best. I am hoping to find a way to send and receive short emails in R. Does anybody know an established way to do this on a Windows platform? I might be able to use a combination of BLAT and GetMail but a native R solution would be preferred.

Edit: An acceptable solution should be able to interface with servers that require SSL.

Edit 2: I provide my stab at a 80% answer. Sadly an R native way is not demonstrated. Instead I use an unholy combination of system calls and command line programs that is likely to not be compatible across platforms. R native calls will require digging into the way POP3 servers like to talk to connected clients and an understanding of SSL that I don't currently have. Other answers are still encouraged.

##Note: Other programs are wrapped in R functions and system calls.
#They each have their own licenses which may or may not allow the use suggested here
#Programs used here:
#STunnel: http://www.stunnel.org/; Provides an SSL tunnel but requires OpenSSL 
#OpenSSL: http://www.openssl.org/; OpenSSL to actually provide SSL
#   Note that these .dlls should be placed with the stunnel exe.
#   Also note that libssl32.dll may need to be renamed from ssleay32.dll
#Microsoft Visual C++ 2008 Redistributable (may be required for the SSL .dlls to work correctly)
#Blat: http://www.blat.net; a public domain SMTP sending program
#Getmail is free for non-commercial use. If you use it in a business environment, then a fee of $50 USD is payable to Tim Charron. 

#Stunnel is a TSR, so it will need to be killed from the task manager if there is an issue.  If you are willing to install it as a service you may be able to tweak my code to start and stop the service.  
#My current code does not create .conf file for stunnel the way a full version ought.  Check http://spampal.sanesecurity.com/manual_eng/servers/stunnel/stunnel.htm#sconfig21 to create the appropriate configuration file.

#Set the config values as appropriate
##Config##
BLAT.loc <- "c:/Programming/R/Rmail/blat262/full/blat.exe"
GetMail.loc <- "C:/Programming/R/RMail/getmail133/getmail.exe"
stunnel.loc <- "C:/Programming/R/RMail/stunnel/stunnel-4.11.exe"

#The set mail function assigns the username and password to be used as well as the smtp and pop3 servers it starts stunnel (and assumes that the stunnel.conf file is present and set correctly).
setMail <- function(user,pw,SSL=FALSE,smtp="127.0.0.1:259",pop3="127.0.0.1:1109")
{
    if (SSL==TRUE)
    {
        print("Starting stunnel; you will need to kill this from the task-manager")
        system(stunnel.loc,wait=FALSE)
        Sys.sleep(2) #Give it time to start 
    }
    return(list(user=user,pw=pw,smtp=smtp,pop3=pop3,SSL=SSL))
}

#function to send mail, myMail is the resulting list from setMail
sendmail <- function(myMail, to, subject, msg,VERBOSE=FALSE)
{
    writeLines(msg, "out.txt", sep = "\n", useBytes = FALSE)
      targ <- paste(getwd(),"/out.txt",sep="")
    call <- paste(BLAT.loc, ' "',targ,'" -subject "',subject,'" -to ',to," -u ",myMail$user," -pw ",myMail$pw, " -f ",myMail$user, " -debug -server ",myMail$smtp,sep="")
    res <- system(call,intern=TRUE)
    if (VERBOSE) {return(res)}
}

#function to get mail, myMail is the resulting list from setMail; it returns a list with one element that contains everything unparsed, another list provides the number of messages remaining on the server.
getmail <- function(myMail,VERBOSE=FALSE)
{      
    unlink("MSG1.txt") #drop previous get
    #download next message
    call <- paste(GetMail.loc," -u ",myMail$user," -pw ",myMail$pw," -s ",strsplit(myMail$pop3,":")[[1]][1],
        " -port ",strsplit(myMail$pop3,":")[[1]][2]," -n 1",sep="")
    res <- system(call,intern=TRUE)
    if (VERBOSE) {print(res)}
    nmsgtxt <- res[grep("messages on the server.",res)]
    nstart <- regexpr("There are",nmsgtxt)
    nend <- regexpr("messages on the server.",nmsgtxt)
    nmess <- as.numeric(substr(nmsgtxt,10,nend-1))-1
      x <- readLines("MSG1.txt",-1)
    return(list(message=x,remaining=nmess))
}

Usage case: Simply put, I need to have R be able to send a message whose content is determined elsewhere in the R script to an SMTP server. Participants will receive the email and respond to it. I need to retrieve their response from my POP3 server and store it in an R data structure so that I can perform post processing on it. In practice, I'm establishing a way to do experience sampling via R. That is, R can email a participant "How are you today (1 = Bad; 7 = Great)?" The participant can respond "4", and I can match the question asked, the response, and so on in a database for statistical analysis.

like image 943
russellpierce Avatar asked Nov 22 '10 02:11

russellpierce


People also ask

Can I use SMTP to receive email?

The Simple Mail Transfer Protocol (SMTP) is used for sending and receiving e-mail between e-mail clients and servers.

Can you send emails from R?

In R, there is a package named mailR that allows you to send emails from R. In this tutorial, I will show you how to send email using gmail and MS Outlook. In "from =" option, you can enter email address using which you want to send email. In "to=" option, you need to specify email address of the recipient.

Does Pop use SMTP?

SMTP (“Simple Mail Transfer Protocol”) is used for sending and delivering from a client to a server via port 25: it's the outgoing server. On the contrary, POP (“Post Office Protocol”) allows the user to pick up the message and download it into his own inbox: it's the incoming server.


1 Answers

Look at the sendmailR package on CRAN.

like image 177
Dirk Eddelbuettel Avatar answered Oct 20 '22 08:10

Dirk Eddelbuettel