首页 | 邮件资讯 | 技术教程 | 解决方案 | 产品评测 | 邮件人才 | 邮件博客 | 邮件系统论坛 | 软件下载 | 邮件周刊 | 热点专题 | 工具
网络技术 | 操作系统 | 邮件系统 | 客户端 | 电子邮箱 | 反垃圾邮件 | 邮件安全 | 邮件营销 | 移动电邮 | 邮件软件下载 | 电子书下载

网络技术

邮件原理 | 硬件设备 | CISCO | 网络协议 | 网络管理 | 传输介质 | 线路接入 | 路由接口 | 邮件存储 | 华为3Com |
首页 > 网络技术 > 电子邮件原理及协议 > 简单邮件传输协议SMTP封装类 > 正文

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

出处:http://www.asfocus.com 作者:作者:Asif Rasheed 翻译:刘建强 时间:2005-7-12 13:16:00
在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\r\n", (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 \r\n"); 
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>\r\n", (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>\r\n", (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\r\n"); 

m_SMTPServer.Send(buf, strlen (buf)); 
if (CheckResponse(DATA_CHECK)==FALSE) 
return FALSE; 
else 

wsprintf (buf, "SUBJECT:%s\r\n", (LPCSTR) Subject); 
m_SMTPServer.Send(buf, strlen (buf)); 

wsprintf (buf, "%s\r\n", (LPCSTR) Body); 
m_SMTPServer.Send(buf, strlen (buf)); 

wsprintf (buf, ".\r\n"); 
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); 
}  
这是该类一个小的实现:  

CSMTP m_smtp; 
m_smtp.Connect("khi.compol.com","aasif@khi.compol.com"); 
m_smtp.Mail("aasif@khi.compol.com"); 
m_smtp.SetTo("zafir@home.com"); 
m_smtp.Data("test message","This is a test message ... "); 
m_smtp.Disconnect(); 
,
相关文章 热门文章
  • MIME协议的简单介绍和分析
  • IMAP4协议标准的全面分析
  • 新版Hotmail支持Exchange ActiveSync协议
  • 欧盟与微软达成协议 10年反垄断纠纷终结
  • 基于通信协议的反垃圾策略——Coremail XT V2.0
  • Coremail XT V2.0发布独家通信协议 携手网易提速过半邮件市场
  • 电子邮件安全与S/MIME协议
  • 微软Hotmail停止支持WebDAV协议
  • 使用 LDAP 目录协议实现 Domino 邮件路由
  • 19.2.4 用户收信时服务器端所提供的相关协议
  • 19.2.3 邮件传输所需组件及相关协议
  • 微软Hotmail自9月1日起不支持WebDAV协议
  • 中文RFC文档目录
  • 手把手教你玩转免费顶级域名
  • 浅谈Base64编码
  • 手把手教你如何免费注册国际顶级域名
  • 电子邮件原理
  • 邮件-域名-DNS相关知识
  • 全面剖析E-mail收发失败的原因(一)
  • SMTP结构及原理
  • 关于邮件系统域名(DNS)设置的小常识
  • 电子邮件的工作原理
  • 邮件原文详细介绍(一)--神奇的MIME
  • 发送邮件常见出错代码
  • 自由广告区
     
    最新软件下载
  • SharePoint Server 2010 部署文档
  • Exchange 2010 RTM升级至SP1 教程
  • Exchange 2010 OWA下RBAC实现的组功能...
  • Lync Server 2010 Standard Edition 标..
  • Lync Server 2010 Enterprise Edition...
  • Forefront Endpoint Protection 2010 ...
  • Lync Server 2010 Edge 服务器部署文档
  • 《Exchange 2003专家指南》
  • Mastering Hyper-V Deployment
  • Windows Server 2008 R2 Hyper-V
  • Microsoft Lync Server 2010 Unleashed
  • Windows Server 2008 R2 Unleashed
  • 今日邮件技术文章
  • 腾讯,在创新中演绎互联网“进化论”
  • 华科人 张小龙 (中国第二代程序员 QQ...
  • 微软推出新功能 提高Hotmail密码安全性
  • 快压技巧分享:秒传邮件超大附件
  • 不容忽视的邮件营销数据分析过程中的算..
  • 国内手机邮箱的现状与未来发展——访尚..
  • 易观数据:2011Q2中国手机邮箱市场收入..
  • 穿越时空的爱恋 QQ邮箱音视频及贺卡邮件
  • Hotmail新功能:“我的朋友可能被黑了”
  • 入侵邻居网络发骚扰邮件 美国男子被重..
  • 网易邮箱莫子睿:《非你莫属》招聘多过..
  • 中国电信推广189邮箱绿色账单
  • 最新专题
  • 鸟哥的Linux私房菜之Mail服务器
  • Exchange Server 2010技术专题
  • Windows 7 技术专题
  • Sendmail 邮件系统配置
  • 组建Exchange 2003邮件系统
  • Windows Server 2008 专题
  • ORF 反垃圾邮件系统
  • Exchange Server 2007 专题
  • ISA Server 2006 教程专题
  • Windows Vista 技术专题
  • “黑莓”(BlackBerry)专题
  • Apache James 专题
  • 分类导航
    邮件新闻资讯:
    IT业界 | 邮件服务器 | 邮件趣闻 | 移动电邮
    电子邮箱 | 反垃圾邮件|邮件客户端|网络安全
    行业数据 | 邮件人物 | 网站公告 | 行业法规
    网络技术:
    邮件原理 | 网络协议 | 网络管理 | 传输介质
    线路接入 | 路由接口 | 邮件存储 | 华为3Com
    CISCO技术 | 网络与服务器硬件
    操作系统:
    Windows 9X | Linux&Uinx | Windows NT
    Windows Vista | FreeBSD | 其它操作系统
    邮件服务器:
    程序与开发 | Exchange | Qmail | Postfix
    Sendmail | MDaemon | Domino | Foxmail
    KerioMail | JavaMail | Winwebmail |James
    Merak&VisNetic | CMailServer | WinMail
    金笛邮件系统 | 其它 |
    反垃圾邮件:
    综述| 客户端反垃圾邮件|服务器端反垃圾邮件
    邮件客户端软件:
    Outlook | Foxmail | DreamMail| KooMail
    The bat | 雷鸟 | Eudora |Becky! |Pegasus
    IncrediMail |其它
    电子邮箱: 个人邮箱 | 企业邮箱 |Gmail
    移动电子邮件:服务器 | 客户端 | 技术前沿
    邮件网络安全:
    软件漏洞 | 安全知识 | 病毒公告 |防火墙
    攻防技术 | 病毒查杀| ISA | 数字签名
    邮件营销:
    Email营销 | 网络营销 | 营销技巧 |营销案例
    邮件人才:招聘 | 职场 | 培训 | 指南 | 职场
    解决方案:
    邮件系统|反垃圾邮件 |安全 |移动电邮 |招标
    产品评测:
    邮件系统 |反垃圾邮件 |邮箱 |安全 |客户端
    广告联系 | 合作联系 | 关于我们 | 联系我们 | 繁體中文
    版权所有:邮件技术资讯网©2003-2010 www.5dmail.net, All Rights Reserved
    www.5Dmail.net Web Team   粤ICP备05009143号