《如何使用delphi编写邮件特快专递程序》由会员分享,可在线阅读,更多相关《如何使用delphi编写邮件特快专递程序(5页珍藏版)》请在金锄头文库上搜索。
1、如何使用如何使用 Delphi 编写邮件特快专递程序编写邮件特快专递程序“邮件特快专递”这个词现在已经是被广大的网民所熟知了,它就好比是网络上的 EMS,能够直接把邮件送到对方的邮箱中,邮件发送完毕后,对方就可以立刻收到。Foxmail 在其最新的 4.0 版本中也特别新增了该功能,作为一名编程爱好者,你是不是也想知道如何编程实现该功能呢?那就随本文一起揭开“邮件特快专递”的神秘面纱: 一、实现原理一、实现原理 在 OutLook Express 中,可通过查看邮件的属性得到该邮件的头部资料。我们拿一封不是特快专递的普通邮件来进行剖析,下面是笔者一封邮件的头部资料: Received: fro
2、m (202.108.44.203) by (JetMail 2.5.3.0) with SMTP id jm1ac3c063eec; Thu, 29 Nov 2001 07:20:25 -0000 Received: from xubo (unknown 61.154.94.146) by (Postfix) with ESMTP id 99CF11C461061 for ; Thu, 29 Nov 2001 15:12:49 +0800 (CST) 从该头部资料可以看出,邮件传递的路线是由 ,其中 xubo 是本人所在机器,邮件是经由 这个中转站才送到目的地的,而我们平常所说的邮件特快
3、专递,就是把邮件直接送到目的地而不需要中转站。 如何才能知道目的地的地址呢?我们知道电子邮件的地址由用户名(username)和邮箱域名()两部分构成的,给域名服务器发送针对“”的 MX指令查询即可找到目的地的地址。被查出来的目的地可能不止一个,有时这些目的地是有优先级别之分的,分别对应着邮件的优先级别,你可以根据邮件优先级的不同对应发送,也可以任意选择其中一个发送,本文的示例将选择反馈回来的第一个目的地发送,读者可根据实际需要进行改进。 二、用到的核心组件二、用到的核心组件 本文将采用 Indy 控件集进行域名查询、邮件发送部分的编程。INDY 的全名是 Internet Direct(也叫
4、 Winshoes),是一套开放源代码、跨平台、优秀的 Internet 控件集,它支持大部分流行的 Internet 协议。Delphi 6 已经包含了该控件集,如果你使用的是Delphi 6 以前的版本,请先到 Indy 主页 http:/ 下载并安装该控件集。 三、窗口设计三、窗口设计 向窗体上放置三个 TEdit 组件,一个 TMemo 组件,四个 Tlabel 组件,用到的 Indy组件为 TIdDNSResolver、TIdAntiFreeze、TIdSMTP、TIdMessage。其中 TIdDNSResolver 是用来向域名服务器发出查询请求并得到结果,TIdMessage
5、用来构建邮件,TIdSMTP 用来发送邮件,TidAntiFreeze 可以确保 Indy 在工作时程序能响应来自外界的消息(注:Indy 是以同步的方式进行工作的,在读或写操作完成之前,其它代码无法执行,加入 TidAntiFreeze 可以在每隔一段时间通过呼叫 Application.ProcessMessage 方法响应来自外界的消息。) 程序的界面如下图所示(箭头所指向的文字标识了该组件的名字): 四、程序代码四、程序代码(代码中包含了详细的说明代码中包含了详细的说明) (前面一部分省略) type TForm1 = class(TForm) IdDNSResolver: TIdDN
6、SResolver; IdAntiFreeze1: TIdAntiFreeze; btnSend: TButton; IdSMTP: TIdSMTP; IdMsgSend: TIdMessage; mmContent: TMemo; Label1: TLabel; edtTo: TEdit; Label4: TLabel; Label5: TLabel; edtFrom: TEdit; Label6: TLabel; edtSubject: TEdit; procedure btnSendClick(Sender: TObject); private Private declarations
7、procedure GetMxList(AMxList: TStringList; AQName: string); public Public declarations end; var Form1: TForm1; implementation $R *.dfm TForm1 这个过程是用来得到邮件特快专递目的地服务器名称 及优先级别数,参数 AMXList 是 用来接收结果值,AQName 代表传递过来的域名 procedure TForm1.GetMxList(AMxList: TStringList; AQName: string); var i: Integer; begin wi
8、th IdDNSResolver do begin Host := 202.101.107.55; Host 属性用来指定域名 服务器的地址,此处为笔者所在地 的主域名服务器地址,你也可以指定任一可以快速访问 到的 Internet 上域名服务器 地址,要知道自己所在地的域名服务器地址,win98 下通 过 winipcfg 命令,win2000 下 通过 ipconfig /all 即可查出。 ReceiveTimeout := 10000; / 在指定的时间内得不到 域名服务器的反馈,则视为失败。 ClearVars; / 清除前一次查询所反馈回来的资源记录 构建此次查询的头部结构 wit
9、h DNSHeader do begin Qr := False; / False 代表查询 Opcode := 0; / 0 代表标准域名查询 RD := True; /域名服务器可以进行递归查询 QDCount := 1; /查询的数量 end; 构建要查询的问题 DNSQDList.Clear; with DNSQDList.Add do begin QName := AQName; /要查询的域名 QType := cMX; /QTYPE 指定要查询的资源记录的种类, 值为 cMX 代表邮件交换记录 QClass := cIN; end; ResolveDNS; /向域名服务器发出请求
10、 从域名服务器接收反馈的结果,将反馈回来的邮件服 务器名称放在 AMXList 列表的 Name 部分, 邮件服务器的优先级别数放在 Value 部分。 for i := 0 to DNSAnList.Count - 1 do AMxList.Add(DNSAnListi.RData.MX.Exchange + = + IntToStr(DNSAnListi.RData.MX.Preference); end; end; 单击“发送“按钮时发送专递邮件 procedure TForm1.btnSendClick(Sender: TObject); var MxList: TStringList
11、; i: Integer; QName, ThoughAddress: string; begin 根据用户所填写的内容创建邮件 with IdMsgSend do begin Body.Assign(mmContent.Lines); /邮件正文 From.Address := Trim(edtFrom.Text); /发件人地址 Recipients.EMailAddresses := Trim(edtTo.Text); / 收件人地址 Subject := edtSubject.Text; /邮件主题 end; 从输入的收件人地址中取出邮箱域名,利用前面的 GetMxList 过程得到目
12、的地地址 QName := TrimRight(copy(edtTo.Text, Pos(, edtTo.Text) + 1, Length(edtTo.Text); MxList := TStringList.Create; try GetMxList(MxList, QName); ThoughAddress := MxList.Names0; 取反馈回来的第 一个服务器为目的地,读者可 根据实际需要改进,比如说考虑到信件的优先级或当你 选择的服务器因繁忙而暂时 不能处理你的信件时,换用其它服务器试试 finally MxList.Free; end; 发送邮件 with IdSMTP do begin Host := ThoughAddress; / 将 Host 赋值为目的地,这 就是特快专递与普通邮件的区别 Port := 25; / smtp 服务默认的端口为 25 Connect; /连接到服务器 try Send(IdMsgSend); /发送刚才创建的邮件 ShowMessage(发送完毕); /发送完毕后提示 finally Disconnect; /断开服务器连接 end; end; end; end.