/*
Email POP3 client sketch for WiFi shield
Posted 24 May 2015 by SurferTim
*/
#include <SPI.h>
#include <WiFi.h>
WiFiClient client;
char ssid[] = "MySSID"; // the name of your network
char pass[] = "MyPassphrase"; // your network password
int status = WL_IDLE_STATUS; // the Wifi radio's status
// change server to your email server ip or domain
IPAddress server( 1,2,3,4 );
// char server[] = "myemailserver.com";
int port = 110;
char subjectLine[] = "Arduino";
char userName[] = "myuser";
char passWord[] = "mypassword";
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);
// check for the presence of the shield:
if (WiFi.status() == WL_NO_SHIELD) {
Serial.println(F("WiFi shield not present"));
// don't continue:
while(true);
}
// check firmware version
Serial.print(F("Firmware version: "));
Serial.println(WiFi.firmwareVersion());
// attempt to connect to Wifi network:
while ( status != WL_CONNECTED) {
Serial.print(F("Attempting to connect to SSID: "));
Serial.println(ssid);
status = WiFi.begin(ssid,pass);
// wait 10 seconds for connection:
delay(10000);
}
// you're connected now, so print out the data:
Serial.print(F("You're connected to the network"));
printCurrentNet();
printWifiData();
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();
}
}
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 {
client.stop();
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"));
}
void printCurrentNet() {
// print the SSID of the network you're attached to:
Serial.print(F("SSID: "));
Serial.println(WiFi.SSID());
// print the MAC address of the router you're attached to:
byte bssid[6];
WiFi.BSSID(bssid);
Serial.print(F("BSSID: "));
Serial.print(bssid[5],HEX);
Serial.print(F(":"));
Serial.print(bssid[4],HEX);
Serial.print(F(":"));
Serial.print(bssid[3],HEX);
Serial.print(F(":"));
Serial.print(bssid[2],HEX);
Serial.print(F(":"));
Serial.print(bssid[1],HEX);
Serial.print(F(":"));
Serial.println(bssid[0],HEX);
// print the received signal strength:
long rssi = WiFi.RSSI();
Serial.print(F("signal strength (RSSI):"));
Serial.println(rssi);
// print the encryption type:
byte encryption = WiFi.encryptionType();
Serial.print(F("Encryption Type:"));
Serial.println(encryption,HEX);
}
void printWifiData() {
// print your WiFi shield's IP address:
IPAddress ip = WiFi.localIP();
Serial.print(F("IP Address: "));
Serial.println(ip);
Serial.println(ip);
// print your MAC address:
byte mac[6];
WiFi.macAddress(mac);
Serial.print(F("MAC address: "));
Serial.print(mac[5],HEX);
Serial.print(F(":"));
Serial.print(mac[4],HEX);
Serial.print(F(":"));
Serial.print(mac[3],HEX);
Serial.print(F(":"));
Serial.print(mac[2],HEX);
Serial.print(F(":"));
Serial.print(mac[1],HEX);
Serial.print(F(":"));
Serial.println(mac[0],HEX);
// print your subnet mask:
IPAddress subnet = WiFi.subnetMask();
Serial.print(F("NetMask: "));
Serial.println(subnet);
// print your gateway address:
IPAddress gateway = WiFi.gatewayIP();
Serial.print(F("Gateway: "));
Serial.println(gateway);
}