日本国产亚洲-日本国产一区-日本国产一区二区三区-日本韩国欧美一区-日本韩国欧美在线-日本韩国欧美在线观看

當前位置:雨林木風下載站 > 技術(shù)開發(fā)教程 > 詳細頁面

用Delphi編寫郵件特快專遞程序

用Delphi編寫郵件特快專遞程序

更新時間:2022-05-10 文章作者:未知 信息來源:網(wǎng)絡(luò) 閱讀次數(shù):

陳旭波

“郵件特快專遞”這個詞現(xiàn)在已經(jīng)是被廣大的網(wǎng)民所熟知了,它就好比是網(wǎng)絡(luò)上的EMS,能夠直接把郵件送到對方的郵箱中,郵件發(fā)送完畢后,對方就可以立刻收到。Foxmail在其最新的4.0版本中也特別新增了該功能,作為一名編程愛好者,你是不是也想知道如何編程實現(xiàn)該功能呢?那就隨本文一起揭開“郵件特快專遞”的神秘面紗:
一、實現(xiàn)原理
在Outlook Express中,可通過查看郵件的屬性得到該郵件的頭部資料。我們拿一封不是特快專遞的普通郵件來進行剖析,下面是筆者一封郵件的頭部資料:

Received: from sm1.163.com([202.108.44.203]) by peoplemail.com.cn(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 sm1.163.com (Postfix) with ESMTP id 99CF11C461061
for ; Thu, 29 Nov 2001 15:12:49 +0800 (CST)
……
從該頭部資料可以看出,郵件傳遞的路線是由xubo→sm1.163.com→peoplemail.com.cn,其中xubo是本人所在機器,郵件是經(jīng)由sm1.163.com這個中轉(zhuǎn)站才送到目的地的,而我們平常所說的郵件特快專遞,就是把郵件直接送到目的地而不需要中轉(zhuǎn)站。
如何才能知道目的地的地址呢?我們知道電子郵件的地址由用戶名(username)和郵箱域名(address.com)兩部分構(gòu)成的,給域名服務(wù)器發(fā)送針對“address.com”的MX指令查詢即可找到目的地的地址。被查出來的目的地可能不止一個,有時這些目的地是有優(yōu)先級別之分的,分別對應(yīng)著郵件的優(yōu)先級別,你可以根據(jù)郵件優(yōu)先級的不同對應(yīng)發(fā)送,也可以任意選擇其中一個發(fā)送,本文的示例將選擇反饋回來的第一個目的地發(fā)送,讀者可根據(jù)實際需要進行改進。

二、用到的核心組件
本文將采用Indy控件集進行域名查詢、郵件發(fā)送部分的編程。INDY的全名是Internet Direct(也叫Winshoes),是一套開放源代碼、跨平臺、優(yōu)秀的Internet控件集,它支持大部分流行的Internet協(xié)議。Delphi 6已經(jīng)包含了該控件集,如果你使用的是Delphi 6以前的版本,請先到Indy主頁http://www.nevrona.com/Indy/Download.html下載并安裝該控件集。

三、窗口設(shè)計
向窗體上放置三個TEdit組件,一個TMemo組件,四個Tlabel組件,用到的Indy組件為TIdDNSResolver、TIdAntiFreeze、TIdSMTP、TIdMessage。其中TIdDNSResolver是用來向域名服務(wù)器發(fā)出查詢請求并得到結(jié)果,TIdMessage用來構(gòu)建郵件,TIdSMTP用來發(fā)送郵件,TidAntiFreeze可以確保Indy在工作時程序能響應(yīng)來自外界的消息(注:Indy是以同步的方式進行工作的,在讀或?qū)懖僮魍瓿芍埃渌a無法執(zhí)行,加入TidAntiFreeze可以在每隔一段時間通過呼叫Application.ProcessMessage方法響應(yīng)來自外界的消息。)
程序的界面如下圖所示(箭頭所指向的文字標識了該組件的名字):

四、程序代碼(代碼中包含了詳細的說明)

……(前面一部分省略)
type
TForm1 = class(TForm)
IdDNSResolver: TIdDNSResolver;
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 }
procedure GetMxList(AMxList: TStringList; AQName: string);
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

{ 這個過程是用來得到郵件特快專遞目的地服務(wù)器名稱及優(yōu)先級別數(shù),參數(shù)AMXList是
用來接收結(jié)果值,AQName代表傳遞過來的域名 }
procedure TForm1.GetMxList(AMxList: TStringList; AQName: string);
var
i: Integer;
begin
with IdDNSResolver do
begin
Host := '202.101.107.55'; { Host屬性用來指定域名服務(wù)器的地址,此處為筆者所在地
的主域名服務(wù)器地址,你也可以指定任一可以快速訪問到的Internet上域名服務(wù)器
地址,要知道自己所在地的域名服務(wù)器地址,win98下通過winipcfg命令,win2000下
通過ipconfig /all即可查出。}
ReceiveTimeout := 10000; // 在指定的時間內(nèi)得不到域名服務(wù)器的反饋,則視為失敗。
ClearVars; // 清除前一次查詢所反饋回來的資源記錄

{ 構(gòu)建此次查詢的頭部結(jié)構(gòu) }
with DNSHeader do
begin
Qr := False; // False 代表查詢
Opcode := 0; // 0代表標準域名查詢
RD := True; //域名服務(wù)器可以進行遞歸查詢
QDCount := 1; //查詢的數(shù)量
end;

{ 構(gòu)建要查詢的問題 }
DNSQDList.Clear;
with DNSQDList.Add do
begin
QName := AQName; //要查詢的域名
QType := cMX; //QTYPE指定要查詢的資源記錄的種類,值為cMX代表郵件交換記錄
QClass := cIN;
end;

ResolveDNS; //向域名服務(wù)器發(fā)出請求

{ 從域名服務(wù)器接收反饋的結(jié)果,將反饋回來的郵件服務(wù)器名稱放在AMXList列表的Name部分,
郵件服務(wù)器的優(yōu)先級別數(shù)放在Value部分。 }
for i := 0 to DNSAnList.Count - 1 do
AMxList.Add(DNSAnList[i].RData.MX.Exchange + '=' +
IntToStr(DNSAnList[i].RData.MX.Preference));
end;
end;

{ 單擊"發(fā)送"按鈕時發(fā)送專遞郵件 }
procedure TForm1.btnSendClick(Sender: TObject);
var
MxList: TStringList;
i: Integer;
QName, ThoughAddress: string;
begin
{ 根據(jù)用戶所填寫的內(nèi)容創(chuàng)建郵件 }
with IdMsgSend do
begin
Body.Assign(mmContent.Lines); //郵件正文
From.Address := Trim(edtFrom.Text); //發(fā)件人地址
Recipients.EMailAddresses := Trim(edtTo.Text); //收件人地址
Subject := edtSubject.Text; //郵件主題
end;

{ 從輸入的收件人地址中取出郵箱域名,利用前面的GetMxList過程得到目的地地址 }
QName := TrimRight(copy(edtTo.Text, Pos('@', edtTo.Text) + 1, Length(edtTo.Text)));
MxList := TStringList.Create;
try
GetMxList(MxList, QName);
ThoughAddress := MxList.Names[0]; {取反饋回來的第一個服務(wù)器為目的地,讀者可
根據(jù)實際需要改進,比如說考慮到信件的優(yōu)先級或當你選擇的服務(wù)器因繁忙而暫時
不能處理你的信件時,換用其它服務(wù)器試試 }
finally
MxList.Free;
end;

{ 發(fā)送郵件 }
with IdSMTP do
begin
Host := ThoughAddress; // 將Host賦值為目的地,這就是特快專遞與普通郵件的區(qū)別
Port := 25; // smtp服務(wù)默認的端口為25
Connect; //連接到服務(wù)器
try
Send(IdMsgSend); //發(fā)送剛才創(chuàng)建的郵件
ShowMessage('發(fā)送完畢'); //發(fā)送完畢后提示
finally
Disconnect; //斷開服務(wù)器連接
end;
end;
end;

end.

本程序在Windows 2000 + Delphi 6 下調(diào)試通過。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統(tǒng)下載排行

主站蜘蛛池模板: 四虎精品视频 | 色老头成人免费视频天天综合 | 国产精品欧美日韩视频一区 | 狠狠色狠狠色综合日日不卡 | 日本特黄特色aaa大片免费 | 男女福利视频 | 精品国产免费久久久久久 | 久久久久久久一线毛片 | 久操综合| 中文字幕三区 | 天天噜天天干 | 永久网站色视频在线观看免费 | 日韩不卡中文字幕 | 成人免费观看国产高清 | 中文在线1区二区六区 | 久久大| 日韩爽爽爽视频免费播放 | 日韩欧美国产高清 | 亚洲ts贴图 | 天天干天天射天天爽 | 久操中文在线 | 欧美国产日韩在线 | 亚洲黄a | 中国xxxxxx片免费播放 | 国产啪视频 | 七次郎在线华人最新首页 | 偷拍按摩bbbbbxxxxx | 欧美在线一级视频 | 久久精品国产久精国产80cm | 欧美三级在线观看视频 | 亚洲成人小视频 | 国模大尺度福利视频在线 | 国产一区二区三区高清 | 亚洲视频91| 日日摸夜夜爽夜夜爽出水 | 久久久精品 | 美女互操 | 色天天天综合色天天碰 | 日本做a视频| 亚洲人jizz日本人 | 你懂的国产高清在线播放视频 |