「郵件特快專遞」這個詞現在已經是被廣大的網民所熟知了,它就好比是網路上的ems,能夠直接把郵件送到對方的郵箱中,郵件傳送完畢後,對方就可以立刻收到。foxmail在其最新的4.0版本中也特別新增了該功能,作為一名程式設計愛好者,你是不是也想知道如何程式設計實現該功能呢?那就隨本文一起揭開「郵件特快專遞」的神秘面紗:
一、實現原理
在outlook express中,可通過檢視郵件的屬性得到該郵件的頭部資料。我們拿一封不是特快專遞的普通郵件來進行剖析,下面是筆者一封郵件的頭部資料:
received: from **1.163.com([202.108.44.203]) by peoplemail.com.cn(jetmail 2.5.3.0)
with **tp id jm1ac3c063eec; thu, 29 nov 2001 07:20:25 -0000
received: from xubo (unknown [61.154.94.146])
by **1.163.com (postfix) with e**tp id 99cf11c461061
for ; thu, 29 nov 2001 15:12:49 +0800 (cst) ……
從該頭部資料可以看出,郵件傳遞的路線是由xubo→**1.163.com→peoplemail.com.cn,其中xubo是本人所在機器,郵件是經由**1.163.com這個中轉站才送到目的地的,而我們平常所說的郵件特快專遞,就是把郵件直接送到目的地而不需要中轉站。
如何才能知道目的地的位址呢?我們知道電子郵件的位址由使用者名稱(username)和郵箱網域名稱(address.com)兩部分構成的,給網域名稱伺服器傳送針對「address.com」的mx指令查詢即可找到目的地的位址。被查出來的目的地可能不止乙個,有時這些目的地是有優先級別之分的,分別對應著郵件的優先級別,你可以根據郵件優先順序的不同對應傳送,也可以任意選擇其中乙個傳送,本文的示例將選擇反饋回來的第乙個目的地傳送,讀者可根據實際需要進行改進。
二、用到的核心元件
三、視窗設計
程式的介面如下圖所示(箭頭所指向的文字標識了該元件的名字):
四、程式**(**中包含了詳細的說明)
……(前面一部分省略)
type
tform1 = class(tform)
iddnsresolver: tiddnsresolver;
idantifreeze1: tidantifreeze;
btnsend: tbutton;
id**tp: tid**tp;
idmsgsend: tidmessage;
mmcontent: tmemo;
label1: tlabel;
edtto: tedit;
label4: tlabel;
label5: tlabel;
edtfrom: tedit;
label6: tlabel;
edtsubject: tedit;
procedure btnsendclick(sender: tobject);
private
procedure getmxlist(amxlist: tstringlist; aqname: string);
public
end;
var
form1: tform1;
implementation
procedure tform1.getmxlist(amxlist: tstringlist; aqname: string);
vari: integer;
begin
with iddnsresolver do
begin
host := '202.101.107.55';
receivetimeout := 10000; // 在指定的時間內得不到網域名稱伺服器的反饋,則視為失敗。
clearvars; // 清除前一次查詢所反饋回來的資源記錄
with 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; //向網域名稱伺服器發出請求
for i := 0 to dnsanlist.count - 1 do
amxlist.add(dnsanlist[i].rdata.mx.exchange + '=' +
inttostr(dnsanlist[i].rdata.mx.preference));
end;
end;
procedure tform1.btnsendclick(sender: tobject);
varmxlist: tstringlist;
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;
qname := trimright(copy(edtto.text, pos('@', edtto.text) + 1, length(edtto.text)));
mxlist := tstringlist.create;
trygetmxlist(mxlist, qname);
thoughaddress := mxlist.names[0];
finally
mxlist.free;
end;
with id**tp do
begin
host := thoughaddress; // 將host賦值為目的地,這就是特快專遞與普通郵件的區別
port := 25; // **tp服務預設的埠為25
connect; //連線到伺服器
trysend(idmsgsend); //傳送剛才建立的郵件
showmessage('傳送完畢'); //傳送完畢後提示
finally
disconnect; //斷開伺服器連線
end;
end;
end;
end.
用Delphi發郵件
用delphi發郵件 控制項idsmtp1 tidsmtp idmessage1 tidmessage idsmtp1.host smtp.163.com idsmtp1.port 25 idsmtp1.username 發信人名稱 idsmtp1.password 發信人郵箱密碼 idsmtp1....
delphi 7郵件傳送程式編寫
delphi 7傳送個郵件一般用到tidsmtp與tidmessage這兩個元件,他們分別在indy clients和indy misc兩個面板元件頁內,或者通過選單 view component list裡面直接輸入控制項名字查詢控制項。一般的郵件傳送用到前兩個控制項就可以了,但是現在許多郵箱需要...
用Delphi編寫安裝程式 1
用delphi編寫安裝程式 1 當你完成乙個應用軟體的開發後,那麼你還需要為該軟體做乙個規範化的安裝程式,這是程式設計的最後一步,同時也是很重要的一步,因為執行安裝程式往往是使用者做的第一步操作。很多報刊文章介紹了許多如何利用installshield等工具軟體來製作安裝程式的方法,這種辦法可以很快...