首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 软件教学-> 办公软件
用c++ builder实现电子邮件群发_邮件服务器
作者:网友供稿 点击:0
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 
摘 要:本文简单阐述了发送电子邮件的原理,提出了一种基于C++ Builder和Access2000数据库来实现电子邮件群发的方法,详细介绍了C++ Builder 中TIdSMTP组件的使用,并给出了用TIdSMTP组件实现群发的核心示例代码。

  关键词:电子邮件群发;认证;TIdSMTP;TIdMessage;ADO

  引言

   邮件群发这一手段被广泛应用于电子商务、网络营销中,例如我们现在能够通过chnia-pub.com(互动出版网)的书讯群发邮件了解到当前新书的资讯,据统计在美国有超过70%的Internet用户的在线购物行为要归功于Email营销,另外那些建设了局域网的单位也可以通过邮件群发来发送通知或传达文件,这样能够节省大量的人力物力而且方便迅速。本文简单介绍了发送电子邮件的原理,提出了一种基于C++Builder和Access2000数据库实现电子邮件群发的方法,详细介绍了C++Builder 中TIdSMTP组件的使用,并给出了用TIdSMTP组件实现群发的核心示例代码。

  发送电子邮件的原理

   1、SMTP协议

   SMTP协议是IETF(Internet Engineering Task Force)制订的有关电子邮件系统的标准协议组中的一员,它的目的就是实现有效(efficiently)和可靠的(reliably)邮件传输,主要对怎样将电子邮件从发送方地址传送到接收方地址,也就是对传输的规则做了规定。SMTP协议中的主要角色是SMTP发信机和SMTP收信机,但是一个SMTP服务器可能兼有两种角色。SMTP协议采用了一组简单的命令来建立连接并在主机之间传送命令和数据。SMTP发信机向SMTP收信机发出SMTP命令,如:"MAIL FROM: "就是告知SMTP收信机邮件的来源,待收到命令后SMTP收信机则会响应应答SMTP命令,即会返回一个应答码,应答码一般为一个三位的十进制数,而且每一个数都有特定含义的,例如返回"250"表示要求的邮件操作完成。其他的SMTP命令和应答码在RFC821中有详细的描述,此处不再赘述。

   2、ESMTP协议
 
   目前,为了防止网络上垃圾邮件的泛滥,几乎所有的邮件服务提供商都在原来的SMTP服务器上追加了认证功能,但实际上SMTP协议本身并不具有认证的功能,在1999年3月出台的SMTP服务认证功能扩展(SMTP Service Extension for Authentication,RFC2544),即ESMTP中才定义了怎样在SMTP客户端与服务器之间来建立一种认证机制,执行认证协议的交换,同时扩展也为以后的协议交互进行了安全层的协商。该扩展是简单认证和安全层(Simple Authentication and Security Layer,SASL)的一个方面。

   SMTP认证功能的扩展实际实际上是增加了AUTH命令,AUTH命令的认证方式主要有LOGIN、CRAM-MD5和PLAIN等几种,我国目前使用得比较多的是LOGIN方式认证。SMTP认证一般是在发送邮件之前进行一次,采用口令-应答(Challenge-Response)方式,即由服务器发送命令要求客户端回答,客户端根据服务器发送信息进行回答,如果应答通过了,则认证成功,即可继续下一步处理。

  用C++Builder实现邮件群发

   1、总体设计

   要实现邮件群发,我们首先需要实现与SMTP服务器连接,然后才能通过SMTP服务器发送邮件,由于SMTP服务器可能需要身份认证所以我们要编写实用的邮件群发软件还必须使其具有SMTP认证的功能。我们可以通过C++Builder中的TIdSMTP组件来实现与SMTP服务器的认证、连接和邮件的发送。通过编写代码循环读取邮件地址列表(Mail List)中的邮件地址并发送邮件从而实现群发。考虑到管理和获取邮件地址的方便性,地址列表存储的安全性以及基于该邮件地址列表的其他相关应用程序的开发我们可以采用Access2000数据库来存储邮件地址列表,利用C++Builder中的TADOTable组件我们可以使用ADO方式轻松的实现对Access2000数据库的直接访问和各种操作。

   2、邮件地址数据库ADO方式访问示例

   C++Builder在数据库处理方面向来是具有自己的优势,一般我们都采用Borland的强大的BDE数据库引擎来访问和维护数据库,但是使用BDE引擎有一个非常不方便的地方就是不能在程序运行阶段动态指定数据源,而采用ADO(ActiveX Data Objects)方式具有高性能、高兼容性和高灵活性的特点。采用ADO方式我们既可以在程序设计阶段指定数据源也可以在运行时动态修改数据源,而在实际应用中用户可能会要动态的指定存储邮件地址的数据库,为了使编写的群发程序具有更好得实用性,所以我选择使用C++Builder中的ADO组件TADOTable来访问和操作Access2000数据库,具体示例代码如下:

Void __fast call TForm1: N_OpenClick (TObject *Sender)
{
  AnsiString ConnStr;
  Try {ADOTable1->Active = false;
  OpenDialog1->InitialDir =".\\" ; //初始化打开对话框
  OpenDialog1->Filter = "MDB邮件列表文件 (*.mdb)|*.mdb|所有文件 (*.*)|*.*";
  OpenDialog1->DefaultExt = String("mdb");
  if(OpenDialog1->Execute ())//动态指定数据源
  {
   ConnStr=" Provider=Microsoft.Jet.OLEDB.4.0; Jet OLEDB: Database Password =" + MaskEdit1->Text. Trim () + "; Data Source = " + OpenDialog1-> Filename. Trim () +"; Persist Security Info=True";

   ADOTable1->Connection String =ConnStr.Trim ();
   ADOTable1->Active=true;
  }
  Catch (Exception %26amp;exception)
  {
   Application->Show Exception (%26amp;exception);
  }
}


   注意代码中加粗的部分是必须的,在访问有密码保护的Access2000数据库时必须以独占方式打开,如果没有加粗部分的代码,则连接数据库时会提示错误。
 3、使用TIdSMTP组件实现群发

   在C++Builder6.0中新增加了一套INDY组件,这是一套开放源代码、功能强大的Internet组件,目前该套组件的最新版本是INDY10, 虽然在6.0以前的C++Builder版本中未集成这套组件,但是可以到INDY的网站http://www.indyproject.org/ 上下载源代码进行安装。INDY中的TIdSMTP组件符合RFC821、RFC1869和RFC2544的规范,利用TIdSMTP组件我们能够轻松的实现与SMTP服务器的认证连接、邮件的发送和回执请求。下表是要实现邮件群发,将使用到TIdSMTP组件的基本属性和方法:

   表1 TIdSMTP组件的基本属性和方法

属性名功能描述
HostSMTP服务器地址,可以使用IP地址或域名,如:Smtp.sohu.com
Port与SMTP服务器建立TCP连接使用的端口,一般为25
Authentication Type 与SMTP服务器认证的类型,目前版本只提供LOGIN方式
UserID邮箱用户名
Password 邮箱密码

方法名功能描述
Connect ()连接SMTP服务器
Disconnect () 关闭SMTP会话
Send (Amsg: IdMessage)发送邮件
Connected ()判断是否与SMTP服务器连接
Disconnected ()判断是否与SMTP服务器断开连接

   在TIdSMTP中执行邮件发送的是Send()方法,它的参数是一个TIdMessage类的实例,所以要实现完整的邮件发送TIdSMTP组件还必须配合INDY中的TIdMessage组件使用。 TIdMessage组件封装了一个完整的符合RFC822和RFC1036规范的Internet消息,实际上TIdSMTP组件是用来实现连接SMTP服务器、认证及邮件的发送,而TIdMessage则负责创建邮件的内容(如:主题、正文、收件人等),以下是TIdMessage组件与实现邮件群发相关的基本属性列表:

   表2 TIdMessage组件与实现邮件群发相关的基本属性

属性名功能描述
Content Type邮件内容的类型,如:text/html等
Subject 邮件主题
ody B邮件正文
From->Name发件人姓名
Recipients->EmailAddresses 收件人EMAIL地址

   需要说明的是在实际编写代码时对TIdMessage组件的Content Type属性需要赋值,指明消息正文的类型,例如我们群发邮件时,邮件的正文一般为文本,那么我们就必须将Content Type属性赋值为text/html,否则邮件的正文在接收浏览邮件时将会变为邮件附件的形式。下面给出实现邮件群发的示例代码:

Void __fast call TForm1: SEND_BTNClick (TObject *Sender)
{
  Int recnum, k; AnsiString addr;
  IdSMTP1->Host = ComboBoxaddr->Text. Trim ();//设定SMTP服务器地址和端口号
  IdSMTP1->Port =25;
  if(CheckBox_AUTH->Checked ==true) //判断并设置SMTP服务器是否需要认证
  {
   IdSMTP1->Authentication Type = at Login;
   IdSMTP1->UserId = Edit name->Text. Trim ();
   IdSMTP1->Password=MaskEdit_pass->Text. Trim ();}
   IdMessage1->Content Type = "text/html"; //根据用户填写的信息创建邮件
   IdMessage1->Subject =Edit3->Text. Trim ();0
   … …
   ADOTable1->First(); //循环读取邮件地址并发送实现群发
   Recnum= ADOTable1->Record Count;
   For (k=0;k<=recnum-1; k++)
   {
    Addr=Trim (ADOTable1->Field Byname ("Email")->AsString) ;
    IdMessage1->Recipients->Email Addresses =addr
    If (! IdSMTP1->Connected ())
    {
     Try
      {IdSMTP1->Connect ();}
     Catch (Exception %26amp;e)
      {Application->Message Box(e.Message, "连接SMTP服务器失败", MB_ICONWARNING); }
    }
    If (IdSMTP1->Connected ())
    {
     Try
      {IdSMTP1->Send (IdMessage1);}
     Catch (Exception %26amp;e)
      {Application->Message Box(e.Message, "发送失败", MB_ICONWARNING); }
    }
    ADOTable1->Next ();}
    Application->Message Box ("发送完成!","邮件系统",MB_OK);
   …
  }

  结束语

   虽然以上的示例代码基本实现了邮件群发功能,我们实现的是LOGIN认证方式,LOGIN方式对用户名和密码的BASE64编码是一种公共的编码标准,其实并不安全。同时并不是所有的邮件服务器都只支持LOGIN方式,例如新浪还支持CRAM-MD5认证方式,如果我们要实现其他的认证方式我们可以到http://www.ararat.cz/synapse/ 这个网站上下载一套synapse的TCP/IP类库利用它可以实现SMTP的多种认证方式。另外,根据RFC821描述,实际上我们邮件的转发路径(forward-path)可以包含多个邮箱地址,所以当需群发的邮箱地址不是太多的情况下,就不必在邮箱地址列表每取得一个地址就发送一次,而是可以将多个邮件地址连接起来(每个邮箱之间用逗号分隔)作为一个地址发送,同样能够实现群发邮件,例如:IdMessage1 ->Recipients -> Email Addresses ="mailbox1,mailbox2" 但是如果需群发的邮箱地址比较多的情况下,作者建议分多次来发送,因为如果邮件的转寄路径包含邮箱地址过多的话会使邮件变得过大,增加邮件发送时延。

,

文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·ASP.NET2.0连接SQL Server数据库详解-.NET教程,Asp.Net开发
·在.net中轻松掌握Windows窗体间的数据交互-.NET教程,.NET Framework
·Java中的类反射机制-JSP教程,Java技巧及代码
·小技巧让pdf文件与word文档之间自由地转换
·j2ee程序员应该掌握的linux知识-JSP教程,J2EE/EJB/服务器
·通过WMI获得硬盘和CPU的物理序列号(VB.net)-.NET教程,VB.Net语言
·firfox浏览器开发人公开firfox2.0开发计划
·VB.net入门(10):补充:类~属性-.NET教程,VB.Net语言
·office2003实战秘笈之excel轻松制胜招
·C#编码规范.doc-.NET教程,C#语言
最新文章
·天涯试水网络口碑营销 邢明:希望与"关键词"媲美_站长访谈
·美梨网站长冰寒的商务之道_站长访谈
·白手起家 新网站流量快速提高之道_站长心得
·照片处理 photoshop简单制作照片柔光效果_photoshop教程
·网络百戒 ---网页外观_站长心得
·utf-8转换gb2312编码,解决统计google搜索来源关键字乱_google推广
·googleadsense作弊不是技术的较量_google推广
·google改进搜索服务 企业可在local更新资料_google推广
·rss订阅对你的网站搜索表现有好处吗?_站长心得
·15种简洁有效的网站推广方法_站长心得
相关主题
西部数码虚拟主机

友情链接
CNNIC 西部数码
万网 自助建站
虚拟主机 asp空间
域名注册 域名
域名申请 主页空间
论坛空间 网站空间
国际域名 虚拟空间
空间租用 DDOS防火墙
成都主机托管 四川主机托管
主机租用 服务器租用
网站目录 自助建站
虚拟主机 网址大全
软件下载
自助链接
虚拟主机资讯 特价虚拟主机
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
发表评论 打印  刷新     关闭