简单邮件传输协议SMTP封装类

  在Internet上,Email是最流行的传输媒体。这篇文章包括两个协议:. POP 3 协议: POP3协议(邮政传输协议)就是指从Email服务器接收信件。我已经提交了一个封装POP3协议的类。该协议官方的描述你可查阅RFC1225。 SMTP协议: SMTP (简单邮件传输协议) 指发送邮件到它的目的地。 有关SMTP 协议的细节你可参考RCF 821 .我最新地贡献是封装了SMTP协议。我不能完全实现 SMTP协议但你可用它在许多应用场合发送邮件。该类有若干方法,我选方法名同SMTP命令, 所以你很容易理解。 在该类中,我再一次使用了CSocket作为类成员,所以我能在线程中使用它. 下面是该类的编码及注释:

//////////////////////////////////////////////////////////////////////
// SMTP.h: interface for the CSMTP class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_SMTP_H__617F7E82_7F4D_11D1_88A0_00001C302581__INCLUDED_)
#define AFX_SMTP_H__617F7E82_7F4D_11D1_88A0_00001C302581__INCLUDED_
#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
#define CONNECTION_CHECK 0
#define HELLO_CHECK 1
#define MAIL_CHECK 2
#define RCPT_CHECK 3
#define DATA_START_CHECK 4
#define DATA_END_CHECK 5
#define QUIT_CHECK 6
#define DATA_CHECK 7
 
class CSMTP
{
public:
BOOL Mail(); //
CString GetErrorMessage();
BOOL Data(CString Subject, CString Body);
CString GetTo();
BOOL SetTo(CString to);
CString GetFrom();
void SetFrom(CString from);
BOOL Mail(CString from);
BOOL Disconnect();
CString GetHost();
void SetHost(CString Host);
BOOL Connect(CString Host, CString Me);
BOOL Connect();
CSMTP();
virtual ~CSMTP();
 
private:
CString GetError(CString Response);
CString m_ErrorMessage;
BOOL CheckResponse(int Type);
int m_NoOfTo;
CStringArray m_To;
CString m_From;
CSocket m_SMTPServer;
CString m_Host;
};
#endif // !defined(AFX_SMTP_H__617F7E82_7F4D_11D1_88A0_00001C302581__INCLUDED_)
 
//////////////////////////////////////////////////////////////////////////
// SMTP.cpp: implementation of the CSMTP class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "MailSend.h"
#include "SMTP.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CSMTP::CSMTP()
{
m_NoOfTo = 0;
m_SMTPServer.Create();
}
CSMTP::~CSMTP()
{
m_SMTPServer.Close();
}
// Connect to the SMTP Server
BOOL CSMTP::Connect()
{
return Connect(m_Host,m_From);
}
// Connect to the SMTP Server
BOOL CSMTP::Connect(CString Host,CString From)
{
if (!m_SMTPServer.Connect(Host,25)) // 25 for SMTP Port
{
m_ErrorMessage = _T("Server cannot be connected");
return FALSE;
}
else
{
if(CheckResponse(CONNECTION_CHECK)==FALSE)
return FALSE;
 
char buf [512];
 
wsprintf (buf, "HELO %s", (LPCSTR) From);
m_SMTPServer.Send(buf, strlen (buf));
if (CheckResponse(HELLO_CHECK)==FALSE)
return FALSE;
else
return TRUE;
 
return TRUE;
}
}
// Setting the Host String
void CSMTP::SetHost(CString Host)
{
m_Host = Host;
}
// Returing the Host String
CString CSMTP::GetHost()
{
return m_Host;
}
// 发送"QUIT"命令到SMTP服务器:
BOOL CSMTP::Disconnect()
{
char buf[256];
 
wsprintf (buf, "QUIT ");
m_SMTPServer.Send(buf, strlen (buf));
if (CheckResponse(QUIT_CHECK)==FALSE)
return FALSE;
else
return TRUE;
}
// 发送"MAIL" 命令到SMTP服务器:
BOOL CSMTP::Mail(CString from)
{
char buf[256];
 
wsprintf (buf, "MAIL From:<%s>", (LPCSTR) from);
m_SMTPServer.Send(buf, strlen (buf));
if (CheckResponse(MAIL_CHECK)==FALSE)
return FALSE;
else
return TRUE;
}
// Setting the From string
void CSMTP::SetFrom(CString from)
{
m_From = from;
}
// Returing the From string
CString CSMTP::GetFrom()
{
return m_From;
}
// Setting the TO string
BOOL CSMTP::SetTo(CString to)
{
char buf[256];
m_To.Add(to); // Saving vale of to
 
wsprintf (buf, "RCPT TO:<%s>", (LPCSTR) to);
m_SMTPServer.Send(buf, strlen (buf));
if (CheckResponse(RCPT_CHECK)==FALSE)
return FALSE;
else
return TRUE;
 
}
// Returing the TO string
CString CSMTP::GetTo()
{
if(m_To.GetSize()>=m_NoOfTo)
{
m_NoOfTo++;
return m_To[m_NoOfTo-1];
}
else
return _T("No more To available");
}
// 发送"DATA" 命令到 SMTP 服务器:
BOOL CSMTP::Data(CString Subject, CString Body)
{
char buf[256];
 
wsprintf (buf, "DATA");
 
m_SMTPServer.Send(buf, strlen (buf));
if (CheckResponse(DATA_CHECK)==FALSE)
return FALSE;
else
{
wsprintf (buf, "SUBJECT:%s", (LPCSTR) Subject);
m_SMTPServer.Send(buf, strlen (buf));
 
wsprintf (buf, "%s", (LPCSTR) Body);
m_SMTPServer.Send(buf, strlen (buf));
 
wsprintf (buf, ".");
m_SMTPServer.Send(buf, strlen (buf));
 
return TRUE;
}
}
//本方法检查服务器的响应:
BOOL CSMTP::CheckResponse(int Type)
{
char buf [1000];
char temp[3];
 
for (int i=0;i < 512;i++)
buf[i]='0';
 
//从服务器接收数据
m_SMTPServer.Receive(buf, sizeof(buf));
strncpy(temp,buf,3);
int temp2 = atoi(temp);
switch (Type)
{
case CONNECTION_CHECK:
if (temp2 != 220)
{
m_ErrorMessage = GetError((LPCTSTR)buf);
return FALSE;
}
break;
 
case HELLO_CHECK:
if (temp2 != 250)
{
m_ErrorMessage = GetError((LPCTSTR)buf);
return FALSE;
}
break;
case MAIL_CHECK:
if (temp2 != 250)
{
m_ErrorMessage = GetError((LPCTSTR)buf);
return FALSE;
}
break;
case RCPT_CHECK:
if (temp2 != 250)
{
m_ErrorMessage = GetError((LPCTSTR)buf);
return FALSE;
}
break;
case DATA_START_CHECK:
if (temp2 != 354)
{
m_ErrorMessage = GetError((LPCTSTR)buf);
return FALSE;
}
break;
case DATA_END_CHECK:
if (temp2 != 250)
{
m_ErrorMessage = GetError((LPCTSTR)buf);
return FALSE;
}
break;
case QUIT_CHECK:
if (temp2 != 221)
{
m_ErrorMessage = GetError((LPCTSTR)buf);
return FALSE;
}
break;
case DATA_CHECK:
if (temp2 != 354)
{
m_ErrorMessage = GetError((LPCTSTR)buf);
return FALSE;
}
break;
 
}
return TRUE;
}
// 返回错误消息
CString CSMTP::GetErrorMessage()
{
return m_ErrorMessage;
}
// 按照错误号准备错误信息
CString CSMTP::GetError(CString Response)
{
if(Response.Find("211"))
return _T("System status or system help reply");
if(Response.Find("214"))
return _T("Help Message");
if(Response.Find("220"))
return _T("Service is ready");
if(Response.Find("221"))
return _T("Service closing transmission channel");
if(Response.Find("250"))
return _T("Requested mail action okay, completed");
if(Response.Find("251"))
return _T("user not local: will forward to forward path");
if(Response.Find("354"))
return _T("Start mail input; end with .");
 
return _T("No Error Number is matched with ")+Response;
}
// Just overloading of the Mail method
BOOL CSMTP::Mail()
{
return Mail(m_From);
} 

  这是该类一个小的实现: 

时间: 2024-09-05 11:15:22

简单邮件传输协议SMTP封装类的相关文章

SMTP简单邮件传输协议

SMTP:简单邮件传输协议(Simple Mail Transfer Protocol) SMTP 是一种提供可靠且有效电子邮件传输的协议. SMTP 是建模在 FTP 文件传输服务上的一种邮件服务,主要用于传输系统之间的邮件信息并提供来信有关的通知. SMTP 独立于特定的传输子系统,且只需要可靠有序的数据流信道支持. SMTP 重要特性之一是其能跨越网络传输邮件,即"SMTP 邮件中继".通常,一个网络可以由公用互联网上 TCP 可相互访问的主机.防火墙分隔的 TCP/IP 网络上

RFC821-简单邮件传输协议(SMTP)中文版 - 0

本文出自: 作者: (2001-11-23 07:08:00) 1. 介绍 简单邮件传输协议(SMTP)的目标是可靠高效地传送邮件,它独立于传 送子系统而且仅要求一条可以保证传送数据单元顺序的通道.附录A,B,C 和D描述了不同传送服务下SMTP的使用.在名词表中还定义了本文档中使用 的术语. SMTP的一个重要特点是它能够在传送中接力传送邮件,传送服务提供了 进程间通信环境(IPCE),此环境可以包括一个网络,几个网络或一个网络 的子网.理解到传送系统(或IPCE)不是一对一的是很重要的.进程

本地邮件传输协议:SMTP和LMTP

SMTP需要管理一个队列,一个邮件操作可以把一封邮件发送向不同的接收者,而一个SMTP命令却只有一个返回码,这就带来的问题,如果服务器需要把一个邮件发向两个接收者,发送第一个的时候成功了,而发送第二个时候暂时失败了,服务器必须把这封邮件放入队列,以后再发送,而发送方却不可能知道这一切.SMTP的这种队列机制在最初设计时是为了考虑到转发的需要,但在有些时候,并不需要 服务器管理这个队列,而需要由客户进行队列的管理,我们看一下下面这个例子:上图中有三个独立的通信系统,三个方框内的就是,第一个是 队列

SMTP4PHP 2011, 2nd release发布 邮件传输协议PHP类

SMTP4PHP 是一套邮件传输协议的PHP类,采用OOP风格编写,支持异常处理,能够快速地发送附加图像或附件的多重/混合电子邮件. SMTP4PHP 2011, 2nd release该版本修复了一个"通话时间"过时的错误. 下载地址:http://sourceforge.net/projects/smtp4php/files/SMTP4PHP/SMTP4PHP-2011-2nd-release.zip/download

RFC821-简单邮件传输协议(SMTP)中文版 - 1

3.7. 域     域是最近被引入ARPA Internet邮件系统的.使用域可以使地址空间从一 个平面的普通字符串主机名变成全局地址的一个层次结构.主机由一个域名取 代,起始主机是由一系列元串组成,它们由逗号按最特殊到一般的顺序排列. 例如,"USC-ISIF.ARPA","Fred.Cambridge.UK"和"PC7.LCS.MIT.ARPA"可 能是主机-域标识符. 无论域名在SMTP中如何使用,只有正式的名称才可以被使用,不可以使用

RFC821-简单邮件传输协议(SMTP)中文版 - 2

本文出自: 作者: (2001-11-23 08:08:00) 4.1.2. COMMAND语法格式 命令是由命令码和其后的参数域组成的.命令码是四个字母组成的,不区别 大小写.因为下面的命令的作用是相同的: MAIL Mail mail MaIl mAIl 这对于引导任何参数值的标记也是适用的,如TO和to就是一样的.命令码和 参数由一个或多个空格分开.然而在回复路径和转发路径中的参数是区别大小写 的.特别是在一些主机上,"smith"和"Smith"就根本不是一

RFC821-简单邮件传输协议(SMTP)中文版 - 3

本文出自: 作者: (2001-11-23 09:08:00) 第二步:转发主机到目的主机 R: 220 BBN-VAX.ARPA Simple Mail Transfer Service Ready S: HELO USC-ISIE.ARPA R: 250 BBN-VAX.ARPA S: MAIL FROM:<@USC-ISIE.ARPA:JQP@MIT-AI.ARPA> R: 250 OK S: RCPT TO:<Jones@BBN-VAX.ARPA> R: 250 OK S:

JavaMail邮件传输(SMTP) 门户网站SMTP服务器

1.在编程中,我们可以使用JavaMail来进行邮件传输. 我们可以在自己的电脑上安装安装邮件服务器apache-james-2.3.2,或者直接使用门户网站的邮件服务器来进行邮件传输. 本篇讲述使用门户网站的邮件服务器,用java程序来进行邮件传输. 2.邮件传输的协议有SMTP(简单邮件传输协议)和POP3(邮局协议). 并不是所有的提供邮箱的网站都会对用户开通SMTP服务器.可以使用的SMTP服务器都需要身份验证的,当然是不可以匿名发邮件的啦.下面给出了腾讯和网易公布的SMTP和POP3服

邮件传输代理程序sendmail-基本配置 证书 邮件加密 认证

sendmail是最重要的邮件传输代理程序.Sendmail作为一种免费的邮件服务器软件,已被广泛的应用于各种服务器中,它在稳定性.可移植性.及确保没有bug等方面具有一定的特色,且可以在网络中搜索到大量的使用资料.一般情况下,我们把电子邮件程序分解成用户代理,传输代理和投递代理. 用户代理用来接受用户的指令,将用户的信件传送至信件传输代理.而投递代理则从信件传输代理取得信件传送至最终用户的邮箱.邮件传输是从服务器到服务器的,而且每个用户必须拥有服务器上存储信息的空间(称为信箱)才能接受邮件(发