/*
Email POP3 client sketch for w5100/w5200
Posted 24 May 2015 by SurferTim
*/
#include <SPI.h>
#include <Ethernet.h>
// this must be unique
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x59, 0x67 };
// change network settings to yours
IPAddress ip( 192, 168, 2, 2 );
IPAddress gateway( 192, 168, 2, 1 );
IPAddress subnet( 255, 255, 255, 0 );
// change server to your email server ip or domain
// IPAddress server( 1,2,3,4 );
char server[] = "my.inbox.com";
int port = 110;
char subjectLine[] = "Arduino";
char userName[] = "myusername";
char passWord[] = "mypassword";
EthernetClient client;
char rtnBuf[100];
unsigned long currentMillis;
unsigned long lastMillis;
// check every 10 minutes
unsigned long checkMillis = 600000UL;
void setup()
{
delay(2000);
Serial.begin(115200);
pinMode(4,OUTPUT);
digitalWrite(4,HIGH);
pinMode(6,OUTPUT);
pinMode(8,OUTPUT);
// Ethernet.begin(mac, ip, gateway, gateway, subnet);
while(!Ethernet.begin(mac)) {
Serial.println("DHCP failed. Retry in 5 seconds");
delay(5000);
}
Serial.println(Ethernet.localIP());
delay(5000);
Serial.println(F("Ready. Press 'e' to receive."));
if(getEmail()) Serial.println(F("Email received"));
else Serial.println(F("Email failed"));
currentMillis = millis();
lastMillis = currentMillis;
}
void loop()
{
byte inChar;
inChar = Serial.read();
if(inChar == 'e')
{
if(getEmail()) Serial.println(F("Email received"));
else Serial.println(F("Email failed"));
}
currentMillis = millis();
if(currentMillis - lastMillis > checkMillis) {
if(getEmail()) Serial.println(F("Email received"));
else Serial.println(F("Email failed"));
lastMillis = millis();
}
Ethernet.maintain();
}
byte getEmail()
{
byte thisByte = 0;
byte respCode;
char rtnVal[64];
int mailCount,mailSize;
char tBuf[64];
if(client.connect(server,port) == 1) {
Serial.println(F("connected"));
} else {
Serial.println(F("connection failed"));
return 0;
}
if(!eRcv()) return 0;
Serial.println(rtnBuf);
Serial.println(F("Sending User"));
strcpy_P(tBuf,PSTR("USER "));
strcat(tBuf,userName);
strcat_P(tBuf,PSTR("\r\n"));
client.write(tBuf);
if(!eRcv()) return 0;
Serial.println(rtnBuf);
Serial.println(F("Sending Password"));
strcpy_P(tBuf,PSTR("PASS "));
strcat(tBuf,passWord);
strcat_P(tBuf,PSTR("\r\n"));
client.write(tBuf);
if(!eRcv()) return 0;
Serial.println(rtnBuf);
Serial.println(F("Sending STAT"));
strcpy_P(tBuf,PSTR("STAT\r\n"));
client.write(tBuf);
if(!eRcv()) return 0;
Serial.println(rtnBuf);
sscanf(rtnBuf,"%s %u %u",rtnVal,&mailCount,&mailSize);
Serial.print(F("mail count: "));
Serial.println(mailCount);
for(int i = 1;i<=mailCount;i++) {
strcpy_P(tBuf,PSTR("RETR "));
itoa(i,rtnBuf,10);
strcat(tBuf,rtnBuf);
strcat(tBuf,"\r\n");
client.write(tBuf);
if(ePrint() == 2) {
strcpy(tBuf,"DELE ");
itoa(i,rtnBuf,10);
strcat(tBuf,rtnBuf);
strcat(tBuf,"\r\n");
client.write(tBuf);
if(!eRcv) Serial.println("Not deleted");
else Serial.println("Deleted");
}
Serial.println(F("\r\nEND"));
}
Serial.println(F("Sending QUIT"));
strcpy_P(tBuf,PSTR("QUIT\r\n"));
client.write(tBuf);
if(!eRcv()) return 0;
Serial.println(rtnBuf);
client.stop();
Serial.println(F("disconnected"));
return 1;
}
byte eRcv()
{
byte respCode;
byte thisByte;
int loopCount = 0;
byte rtnCount = 0;
while(!client.available()) {
delay(1);
loopCount++;
// if nothing received for 10 seconds, timeout
if(loopCount > 10000) {
client.stop();
Serial.println(F("\r\nTimeout"));
return 0;
}
}
while(client.available())
{
thisByte = client.read();
// Serial.write(thisByte);
if(rtnCount < 99) {
rtnBuf[rtnCount]=thisByte;
rtnCount++;
rtnBuf[rtnCount]=0;
}
}
if(rtnBuf[0] == '-') return 0;
return 1;
}
byte ePrint()
{
byte respCode;
byte thisByte;
int loopCount = 0;
byte rtnCount = 0;
byte lineLength = 0;
bool endMsg = false;
bool msgBody = false;
bool forArduino = false;
char lineBuf[64];
byte pinNo;
char pinState[8];
while(!client.available()) {
delay(1);
loopCount++;
// if nothing received for 10 seconds, timeout
if(loopCount > 10000) {
client.stop();
Serial.println(F("\r\nTimeout"));
return 0;
}
}
while(!endMsg) {
while(client.available())
{
thisByte = client.read();
// if it is for the Arduino and past the header
if(forArduino && msgBody) Serial.write(thisByte);
if(thisByte == '\n') {
// end of line
if(strlen(lineBuf) == 0) {
if(!msgBody) Serial.println("Message body");
msgBody = true;
}
if(strcmp(lineBuf,".") == 0) {
// end of message
endMsg = true;
}
if(!msgBody && (strncmp(lineBuf,"From:",5) == 0)) {
// from
Serial.println(lineBuf);
}
if(!msgBody && (strncmp(lineBuf,"Subject:",8) == 0)) {
// subject
Serial.println(lineBuf);
if(strcmp(&lineBuf[9],subjectLine) == 0) {
Serial.println("For my Arduino!");
forArduino= true;
}
}
if(msgBody && strncmp(lineBuf,"command ",8) == 0) {
Serial.print("Command! D");
sscanf(lineBuf,"%*s %u %s",&pinNo,pinState);
Serial.print(pinNo);
Serial.print(" ");
Serial.println(pinState);
if(strcmp(pinState,"on") == 0) digitalWrite(pinNo,HIGH);
if(strcmp(pinState,"off") == 0) digitalWrite(pinNo,LOW);
}
lineLength = 0;
lineBuf[0] = 0;
}
else if(thisByte != '\r') {
// another character
if(lineLength < 63) {
lineBuf[lineLength] = thisByte;
lineLength++;
lineBuf[lineLength] = 0;
}
}
}
}
if(forArduino) return 2;
return 1;
}
void efail()
{
byte thisByte = 0;
int loopCount = 0;
client.println("QUIT");
while(!client.available()) {
delay(1);
loopCount++;
// if nothing received for 10 seconds, timeout
if(loopCount > 10000) {
client.stop();
Serial.println(F("\r\nTimeout"));
return;
}
}
while(client.available())
{
thisByte = client.read();
Serial.write(thisByte);
}
client.stop();
Serial.println(F("disconnected"));
}