How to access smtp.gmail.com or other to send email

That's what I did too, works perfectly every time.

hi , I am testing your propose but when you try from cmd command ( telnet port 2525 ) with an account smtp2go do not works.

thanks for your comments

EJTR:
hi , I am testing your propose but when you try from cmd command ( telnet port 2525 ) with an account smtp2go do not works.

thanks for your comments

sounds like a replay of the below:

I followed your advice , I have an email account in smtp2go and this is my code but it do not works even not connects. I tested with cmd command from my pc with my smtp2go account and I had not a problem but with arduino does no connect.

thanks for your comments and sorry my english is not good.

#include <Dhcp.h>
#include <Dns.h>
#include <Ethernet.h>
#include <EthernetClient.h>
#include <EthernetServer.h>
#include <EthernetUdp.h>
#include <util.h>
#include <SPI.h>

byte mac[] = {0x90, 0xA2, 0xDA, 0x0D, 0x5C, 0x16};
IPAddress ip(192,168,1,5);
byte gateway  [] = {192,168,1,1};
byte subnet   [] = {255, 255, 255, 0};
byte smtp[] = {186,47,174,186};//{ 207,58,147,66 }; // I tried with two ip
EthernetServer server(80);                          //nslookup to smtpcorp.com

//IPAddress server(207,58,147,66); // conflicting declaration 'IPAddress server' -- and I do not why.
EthernetClient client;

void setup()
{
  Ethernet.begin(mac, ip,gateway,subnet);
  Serial.begin(9600);
  delay(1000);
  Serial.println("connecting...");
  if (client.connect(smtp,8025)) //2525/25/8025/587/465/8465 // I tried with all ports
  {
    delay(500);
    client.println("ehlo");
    delay(500);
    client.println("auth login");     
    delay(500);
    client.println(" name account base 64");  //mail account with smtp2go         
    delay(500);
    client.println("password base 64"); 
    delay(500);    
    client.println("mail from: mail account with gmail");  //This is related to smtp2go
    delay(500);
    client.println("rcpt to: xxxxxxxxxx");
    delay(500);
    client.println("data");
    delay(500);
    client.println("To: xxxxx");
    delay(500);
    client.println("From: xxxxx");
    delay(500);
    client.println("Subject: MENSAJE DE PRUEBA");
    delay(500);
    client.println();
    delay(500);
    client.println("ESTE ES UN MENSAJE DE PRUEBA DESDE ARDUINO");
    delay(500);
    client.println(".");
    delay(500);
    client.println("quit");
  } 
  else {
    Serial.println("connection failed");
  } 
}

void loop()
{
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }
  while (Serial.available() > 0) {
    char inChar = Serial.read();
    if (client.connected()) {
      client.print(inChar); 
    }
  }
  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
    while(true);
  }
}

I will point out one the first of many problems with this code. This is incorrect.

  Ethernet.begin(mac, ip,gateway,subnet);

Of course, you won't know why the rest fails. You are not reading the response from the email server. I posted a link to the code I use a few posts ago.

Murmlgrmpf:
Thank you so much! The following steps got me sending emails via my arduino and a wifly ethernet shield when the washing machine has finished:
register on http://www.smtp2go.com/
get the encoded version of your username and password from http://base64-encoder-online.waraxe.us/ or any other base64 encoder you prefer.
Then alter the web client example to send an email as shown above.

regards

Thomas

Could you share your code please?

Thx!

It is the second example on this page.
http://playground.arduino.cc/Code/Email

SurferTim:
It is the second example on this page.
Arduino Playground - Email

Thank You!
I found some examples in the meantime.
The examples use the

char server[] = "smtpcorp.com";

smtp adress. But I saw the webpage of the gmail that is about the smtp. Send email from a printer, scanner, or app - Google Workspace Admin Help And it doesn't contain "smtpcorp.com" adress. It mentioned 3 possibiliy 1.: "smtp-relay.gmail.com" 2.: "smtp.gmail.com" 3.: "aspmx.l.google.com". Should I change the smtpcorp.com to one of them?
And now I find a webpage that say use mail.smtp2go.com like SMTP server. https://support.smtp2go.com/hc/en-gb/articles/223087627-SMTP-Server-Settings What the hell?
I will try this: mail.smtp2go.com :slight_smile:

You can't send through Gmail. It requires security that the Wiznet ICs and libraries do not support.

SmtpToGo is the best alternative. You must use smtpcorp.corp as the email server domain name of you will not be able to connect. I just tried it and it works.

I found another sketch.
A simple burglar Alarm: Ethernet shield connection - Arduino: projects Why don't have to use it IPAddress, IPAddress gateway, and IPAddress subnet ? And what is the deficiency of this example? Why is it much easier than your example? Ex cuse me for my questions! I would like to understand the differences.

katonafull,

I have been following your dialog for some time, now. The reason being that I have exactly your same problem. Today, I was able for the first time to communicate and send my first email using the simple burglar alarm sketch that you mention. I just wanted to thank you, because I was not successful with your referenced topic either.

The only changes that have to be made to the burglar alarm sketch is to limit to one or two emails per event because as is, it sends a train of emails without holding to comply with the SMTP2GO server limits.

Thank you again.

The "simple" burglar alarm sketch does no error checking. It retrieves the response but doesn't display it. If something goes wrong, it is almost impossible to determine where the problem is.

edit: It simple sketch will also return success even if the send failed for any reason, like user/password incorrect, TO or FROM address errors, etc.

I compile the codes and there is no error.
I run the serial monitor. Connection OK but email failed.

What can I do to test email send from arduino? I am using the ethernet shield W5100.

If your email client sketch had error checking, you would know why it failed. This example in the playground has error checking.
http://playground.arduino.cc/Code/Email

Hi surfertim

the smtp2go user is the gmail( hanluu@gmail.com) address or just user name, because i saw my smtp2go account show the user name (hanluu).thanks

I use the email address I registered with, but it must be base64 encoded.

Same with the password. Base64 encoded.

email sent.
thank you very much
i just change my user name ''hanluu'' into email address then BOOM. I GOT MAIL. THANKS AGAIN.

can you show me how to add a float switch to trigger the email? thank you.

I suppose you got the code here.
http://playground.arduino.cc/Code/Email

If so, in the second example at line 37

// replace this
  if(inChar == 'e')

// with something like this
  if(triggerPin == HIGH)

Hi.

Can you fix this code to send only 1 email when it trigger the sensor,right now when sensor trigger it send alot of mail. thank you.

#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
int LED = 13;                // choose the pin for the LED
int SENSOR = 2;               // choose the input pin (for SENSOR sensor)
int VAL =digitalRead(SENSOR);                    // variable for reading the pin status
int SENSORS = LOW;           

// this must be unique
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x59, 0x67 }; 
// change network settings to yours
IPAddress ip( 192, 168, 0, 32 ); 
IPAddress gateway( 192, 168, 0, 1 );
IPAddress subnet( 255, 255, 255, 0 );

char server[] = "mail.smtp2go.com"; 
int port = 2525; // You can also try using Port Number 25, 8025 or 587.

File myFile;

EthernetClient client;

void setup()
{

  Serial.begin(9600);
  pinMode(LED, OUTPUT);      // declare LED as output
  pinMode(SENSOR, INPUT);     // declare sensor as input
  digitalWrite(LED, LOW);
  
Ethernet.begin(mac);
delay(2000);
Serial.println(Ethernet.localIP());
Serial.println(F("Ready. Press 'e' to send."));

}


void loop(){

 if (digitalRead(SENSOR) == HIGH) {            
    digitalWrite(LED, HIGH);  // turn LED ON
  ////delay (300);
    
    if (SENSORS == LOW) {
      Serial.println("Motion detected!");
    SENSORS = HIGH;
    }
  } 
  else {
      digitalWrite(LED, LOW); // turn LED OFF
 
      if (SENSORS == HIGH){
      Serial.println("Motion ended!");
      SENSORS = LOW;
    }
  }
  
byte inChar;

inChar =  digitalRead(SENSOR);               /// Serial.read();  

if(inChar == HIGH  )
{
if(sendEmail()) Serial.println(F("Email sent"));
else Serial.println(F("Email failed"));
}
}

byte sendEmail()
{
byte thisByte = 0;
byte respCode;

if(client.connect(server,port) == 1) {
Serial.println(F("connected"));
} else {
Serial.println(F("connection failed"));
return 0;
}

if(!eRcv()) return 0;

Serial.println(F("Sending hello"));
// replace 1.2.3.4 with your Arduino's ip
client.println("EHLO 192.168.0.31 ");
if(!eRcv()) return 0;

Serial.println(F("Sending auth login"));
client.println("auth login");
if(!eRcv()) return 0;

Serial.println(F("Sending User"));
// Change to your base64 encoded user
client.println(F("yyyyyyyyyyyyyyyyy")); 


if(!eRcv()) return 0;

Serial.println(F("Sending Password"));
// change to your base64 encoded password
client.println(F("xxxxxxxxxxx")); 


if(!eRcv()) return 0;

// change to your email address (sender)
Serial.println(F("Sending From"));
client.println("MAIL From: <hanluu@hotmail.com>");
if(!eRcv()) return 0;

// change to recipient address
Serial.println(F("Sending To"));
client.println("RCPT To: <hanluu@gmail.com>");
if(!eRcv()) return 0;

Serial.println(F("Sending DATA"));
client.println("DATA");
if(!eRcv()) return 0;

Serial.println(F("Sending email"));

// change to recipient address
client.println("To: <hanluu@gmail.com>");

// change to your address
client.println("From: <hanluu@hotmail.com>");

client.println("Subject: Your Subject"); 

client.println("Hi! Simple test message");

client.println(".");

if(!eRcv()) return 0;

Serial.println(F("Sending QUIT"));
client.println("QUIT");
if(!eRcv()) return 0;

client.stop();

Serial.println(F("disconnected"));

return 1;
}

byte eRcv()
{
byte respCode;
byte thisByte;
int loopCount = 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;
}
}

respCode = client.peek();

while(client.available())
{ 
thisByte = client.read(); 
Serial.write(thisByte);
}

if(respCode >= '4')
{
efail();
return 0; 
}

return 1;
}


void efail()
{
byte thisByte = 0;
int loopCount = 0;

client.println(F("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"));
}