用C++ Builder实现电子邮件群发
当前位置:以往代写 > C/C++ 教程 >用C++ Builder实现电子邮件群发
2019-06-13

用C++ Builder实现电子邮件群发

用C++ Builder实现电子邮件群发

副标题#e#

摘 要:本文简朴叙述了发送电子邮件的道理,提出了一种基于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: <[email protected]&gt;"就是奉告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数据库的直接会见和各类操纵。


#p#副标题#e#

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 &exception)
 {
  Application->Show Exception (&exception);
 }
}

#p#分页标题#e#

留意代码中加粗的部门是必需的,在会见有暗码掩护的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组件的根基属性和要领

要领名 成果描写
Connect () 毗连SMTP处事器
Disconnect () 封锁SMTP会话
Send (Amsg: IdMessage) 发送邮件
Connected () 判定是否与SMTP处事器毗连
Disconnected () 判定是否与SMTP处事器断开毗连
属性名 成果描写
Host SMTP处事器地点,可以利用IP地点或域名,如:Smtp.sohu.com
Port 与SMTP处事器成立TCP毗连利用的端口,一般为25
Authentication Type 与SMTP处事器认证的范例,今朝版本只提供LOGIN方法
UserID 邮箱用户名
Password 邮箱暗码

在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->Email Addresses 收件人EMAIL地点

#p#副标题#e#

需要说明的是在实际编写代码时对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 &e)
     {Application->Message Box(e.Message, "毗连SMTP处事器失败", MB_ICONWARNING); }
   }
   If (IdSMTP1->Connected ())
   {
    Try
     {IdSMTP1->Send (IdMessage1);}
    Catch (Exception &e)
     {Application->Message Box(e.Message, "发送失败", MB_ICONWARNING); }
   }
   ADOTable1->Next ();}
   Application->Message Box ("发送完成!","邮件系统",MB_OK);
  …
 }

竣事语

#p#分页标题#e#

固然以上的示例代码根基实现了邮件群发成果,我们实现的是LOGIN认证方法,LOGIN方法对用户名和暗码的BASE64编码是一种民众的编码尺度,其实并不安详。同时并不是所有的邮件处事器都只支持LOGIN方法,譬喻新浪还支持CRAM-MD5认证方法,假如我们要实现其他的认证方法我们可以到http://www.ararat.cz/synapse/ 这个网站上下载一套synapse的TCP/IP类库操作它可以实现SMTP的多种认证方法。别的,按照RFC821描写,实际上我们邮件的转发路径(forward-path)可以包括多个邮箱地点,所以当需群发的邮箱地点不是太多的环境下,就不必在邮箱地点列表每取得一个地点就发送一次,而是可以将多个邮件地点毗连起来(每个邮箱之间用逗号脱离)作为一个地点发送,同样可以或许实现群发邮件,譬喻:IdMessage1 ->Recipients -> Email Addresses ="mailbox1,mailbox2" 可是假如需群发的邮箱地点较量多的环境下,作者发起分多次来发送,因为假如邮件的转寄路径包括邮箱地点过多的话会使邮件变得过大,增加邮件发送时延。

    关键字:

在线提交作业