分类: C/C++
2008-08-26 14:01:00
The CSmtp class allows to send emails from your program. The inspiration to write the CSmtp class was the article [1]. I have used the code of CFastSmtp and introduced the following changes:
After successfull connection to the SMTP server, our client starts the conversation between the remote SMTP server. Each line send by the client ought to be finished by "\r\n". If you want to know more details, check [2], [3], [4], [5], [6], [7], [8] and [9]. In [2] was described original SMTP protocol (1982),in [4] were discussed SMTP extensions for authentication and MIME specification was improved in [5]-[9]. Example 3 failed becouse no TLS procedures were implemented in the CSmtp class. If you want to add TLS see . I have introduced the following notation: S - is a remote server, C - is our client, xxx - means information censured.
Example 1 - Connecting to smtp.wp.pl and using incorrect login or password
S: 220 smtp.wp.pl ESMTP
C: EHLO: mydomain.com
S: 250-smtp.wp.pl
250-PIPELINING
250-AUTH=LOGIN PLAIN
250-AUTH LOGIN PLAIN
250-STARTTLS
250-SIZE
250-X-RCPTLIMIT 100
250-8BITMIME
C: AUTH LOGIN
S: 334 VXNlcm5hbWU6
C: Kioq
S: 334 UGFzc3dvcmQ6
C: Kioq
S: 535 blad autoryzacji, niepoprawny login lub haslo / auth failure
Example 2 - Connecting to smtp.wp.pl and using correct login and password
S: 220 smtp.wp.pl ESMTP
C: EHLO: mydomain.com
S: 250-smtp.wp.pl
250-PIPELINING
250-AUTH=LOGIN PLAIN
250-AUTH LOGIN PLAIN
250-STARTTLS
250-SIZE
250-X-RCPTLIMIT 100
250-8BITMIME
C: AUTH LOGIN
S: 334 VXNlcm5hbWU6
C: xxx
S: 334 UGFzc3dvcmQ6
C: xxx
S: 235 go ahead
C: MAIL FROM:
S: 250 ok
C: RCPR TO:
S: 250 ok
C: DATA
S: 234 go ahead
C: Date: Sun, 24 Aug 2008 22:43:45
From: JP
X-Mailer: The Bat! (v3.02) Professional
Replay-to:mail@domain.com
X-Priority: 3 (Normal)
To:
Subject: The message
MIME Version 1.0
Content-Type: multipart/mixed; boundary="__MESSAGE__ID__54yg6f6h6y456345"
--__MESSAGE__ID__54yg6f6h6y456345
Content-type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit
This is my message.
--__MESSAGE__ID__54yg6f6h6y456345
Content-Type: application/x-msdownload; name="test.exe"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="test.exe"
TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
(...)
SU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWA==
--__MESSAGE__ID__54yg6f6h6y456345
Content-Type: application/x-msdownload; name="test2.jpg"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="test2.jpg"
/9j/4Sv+RXhpZgAASUkqAAgAAAAJAA8BAgAGAAAAegAAABABAgAWAAAAgAAAABIBAwABAAAA
(...)
A6YxR5YJJ5zUu6ZW4+NjC24E4q5Dcox5I+lRI0iWAAV9aay+lTctoYTjrml+9irRmz//2Q==
--__MESSAGE__ID__54yg6f6h6y456345--
.
S: 250 ok xxx qp xxx
C: QUIT
S: 221 smtp.wp.pl
Example 3 - Connecting to smtp.gmail.com
S: 220 mx.google.com ESMTP
w28sm1561195uge.4
C: EHLO: mydomain.com
S: 250-mx.google.com at your service [xxx.xxx.xxx.xxx],
250-SIZE 28311552
250-8BITMIME
250-STARTTLS
250 ENHANCEDSTATUSCODES
C: AUTH LOGIN
S: 530 5.7.0 Must issue a STARTTLS command first. w28sm1561195uge.4
Example 4 - Connecting to smtp.bizmail.yahoo.com and using incorrect login or password
S: 220 smtp103.biz.mail.re2.yahoo.com ESMTP
C: EHLO: mydomain.com
S: 250-smtp103.biz.mail.re2.yahoo.com
250-AUTH LOGIN PLAIN XYMCOOKIE
250-PIPELINING
250-8BITMIME
C: AUTH LOGIN
S: 334 VXNlcm5hbWU6
C: dG9t
S: 334 UGFzc3dvcmQ6
C: bmVyb24xMg==
S: 535 authorization failed (#5.7.0)
#include "CSmtp.h"
#include <conio.h>
int main()
{
CSmtp mail;
if(mail.GetLastError() != CSMTP_NO_ERROR)
{
printf("Unable to initialise winsock2.\n");
return -1;
}
mail.SetLogin("***");
mail.SetPassword("***");
mail.SetSenderName("JP");
mail.SetSenderMail("mail@domain.com");
mail.SetReplyTo("mail@domain.com");
mail.SetSubject("The message");
mail.AddRecipient("friend@domain.com");
mail.SetXPriority(XPRIORITY_NORMAL);
mail.SetXMailer("The Bat! (v3.02) Professional");
mail.SetMessageBody("This is my message.");
mail.AddAttachment("c:\\test.exe");
mail.AddAttachment("c:\\test2.jpg");
if( !mail.ConnectServer("smtp.wp.pl",25) )
{
printf("Unable to connect to the server.\n");
return -1;
}
if( mail.Send() )
printf("The mail was send successfully.\n");
else
printf("Unable to send the mail.\n");
mail.Disconnect();
return 0;
}