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

Can anyone help me on how to access to gmail smtp server and make changes to the following. Appreciate thanks to any suggestion and help.

I've tried my following setup code without any problem to send out email automatically to my gmail mailbox under my local smtp domain server.

My main purpose would liked to use public smtp server for sending out email but not involved local setup smtp mail's server because I'll create a device which is not rely on local setup email server but connect solely direct to Internet for automatically send out email by interact to public smtp server only.

#include <Ethernet.h>

#include <SPI.h>

//byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
//byte ip[] = { 192, 168, 9, 177 };
//byte server[] = { 192, 168, 9, 6 }; // Mail server address MODIFY THIS FOR THE TARGET DOMAIN's MAIL SERVER

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address
byte ip[] = { 192, 168, 9, 177 }; // ip in lan
byte gateway[] = { 192, 168, 9, 3 }; // internet access via router
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask
byte smtp[] = { 192,168,9,6 };

EthernetClient client;
//EthernetServer server(25);
//Client client(server, 25);
//Client client;
void setup()
{
Ethernet.begin(mac, ip,gateway,subnet);
//server.begin();
Serial.begin(9600);

delay(1000);

Serial.println("connecting...");

// EthernetClient client = server.available();

if (client.connect(smtp,25)) {
Serial.println("connected");
client.println("EHLO kltan");
client.println("AUTH LOGIN"); //see "http://base64-encoder-online.waraxe.us/"
client.println("a2x0YW5AcHBoLmNvbS5teQ=="); //Type kltan@pph.com.my and encode it
client.println("MTIzNDU2"); //This line is password
client.println("MAIL FROM:someone@hotmail.com");
client.println("RCPT TO:someone@gmail.com");
client.println("DATA");
client.println("from:someone@hotmail.com");
client.println("to:someone@gmail.com");
client.println("SUBJECT: Testing subject to arduino ethernet shield");
client.println();
client.println("This is the line body.");
client.println("This is another line of the body.");
client.println(".");
client.println(".");
client.println("QUIT");
} else {
Serial.println("connection failed");
}
}

void loop()
{
if (client.available()) {
char c = client.read();
Serial.print(c);
}
;;
if (!client.connected()) {
Serial.println();
Serial.println("disconnecting.");
client.stop();
for( ;; )
;
}
}

This link has the code I use.

It reads and displays the email server response after each send so you will know if it is working, and why if not.

edit: If you do not have a commercial account with a static ip, you may be blocked by the gmail server.

I've already tried your previous post coding test, but it still happened to have the same problem where I can't pass through STARTTLS.
How can i do to pass over STARTTLS?

The ethernet library does not support TLS. You can't send a user and password.

If you are using port 25, it should not want to start TLS. It does not need a user/password. Gmail is a bit picky about the sender ip range. Try using nslookup to resolve the correct server ip for your area.

You can use this instead of Gmail, it's Free:

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

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