Friday, October 29, 2010

Sending an email using gmail smtp server from telnet (using stunnel) in windows.



This article explains how to send an email from gmail smtp server using telnet and stunnel on a windows operating system.

Sometimes you may want to test how an email is sent in telnet, maybe in order to create a program that will send and receive emails.

For example, developers who use J2ME to write mobile applications know that there is no existent library or API that allow you to send or receive an email through smtp servers that requires authentication and SSL, and in order to implement such an application, the developer must use SecureSocket and Inputsteam and Outputstream and must know how the smtp server (or pop3 in case of receiving an email) works and how is it gonna respond to commands.

By default, Telnet doesn't support secure connections or SSL, for that we're gonna have to redirect (tunnel) the telnet commands to the stunnel to encrypt them and send them to the gmail smtp server.

First, we're gonna need stunnel which can be downloaded from http://www.stunnel.org

After downloading and installing stunnel, we have to configure the stunnel.conf file located in stunnel directory.

in the stunnel.conf, every line that start with a semicolon is a comment,
Make sure to uncomment  client = yes
and edit(or create) the smtps part as following:
[smtps]
accept  = 2301
connect = smtp.gmail.com:465

- smtps is for secure smtp servers, (Note: If [smtps] doesn't work, try to use [ssmtp] instead)
- Accept indicates the port that you want to use for tunneling,
- Connect indicates the server we're connecting to, in our case, its the gmail smtp server, with port 465.
- Port 465 is the port for smtps, while port 587 is for TLS/STARTTLS.


the stunnel.conf file should now look like the following:
socket = l:TCP_NODELAY=1
socket = r:TCP_NODELAY=1

client = yes

[smtps]
accept  = 2301
connect = smtp.gmail.com:465

Save the stunnel.conf file and in stunnel program click on configuration=>Reload.


Now it's time to send the email.

In windows, go to start=>run=>cmd
Once the command line is opened write the following: telnet localhost 2301

you should see the following:
220 mx.google.com ESMTP f14sm1400408wbe.2

we send a hello message:
helo google
250 mx.google.com at your service
ehlo google
250-mx.google.com at your service, [212.28.228.49]
250-SIZE 35651584
250-8BITMIME
250-AUTH LOGIN PLAIN XOAUTH
250 ENHANCEDSTATUSCODES

Then the authentication request:
 AUTH LOGIN
334 VXNlcm5hbWU6

Now we have to authenticate by using our gmail address and password.
However since this is an encrypted session, we're gonna have to send the email and password encrypted in base64. To encrypt your email and password, you can use a program or an online website to encrypt it (search on google for: base64 online encryption).
For example the sentence "my email address" in base64 will become: bXkgZW1haWwgYWRkcmVzcw==
and the word "password" will become: cGFzc3dvcmQ=

Now you should have your email address and password encrypted in base64, go back to the command line and write your base64 email first, (I will use "my email address" as my email address and "password" as my password for this example):
bXkgZW1haWwgYWRkcmVzcw==
334 UGFzc3dvcmQ6

Enter your password:
cGFzc3dvcmQ=
235 2.7.0 Accepted

Enter your email:
MAIL FROM:<etienne.rached@gmail.com>
250 2.1.0 OK x23sm1104292weq.10

Enter the recipient email (I'll email myself for testing):
RCPT TO:<etienne.rached@gmail.com>
250 2.1.5 OK x23sm1104292weq.10
 
Now comes the message part:
DATA
354  Go ahead x23sm1104292weq.10
From: Etienne <etienne.rached@gmail.com>
To: Meeeeeeee <etienne.rached@gmail.com>
Subject: Testing email from telnet
This is the body

Adding more lines to the body message.
Finish the DATA with a dot:
.
250 2.0.0 OK 1288307376 x23sm1104292weq.10


And quit:

QUIT
221 2.0.0 closing connection x23sm1104292weq.10
Connection to host lost.

The email should now be sent and you can find it in your "sent mail" in your gmail.


Using Telnet with stunnel is very easy, I will try and show how to receive an email with pop3 using telnet, and how to send an email using TLS in my future posts.

Hope you enjoyed this one :)