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

2021-04-19 02:42:46 字數 3566 閱讀 7499

「郵件特快專遞」這個詞現在已經是被廣大的網民所熟知了,它就好比是網路上的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等工具軟體來製作安裝程式的方法,這種辦法可以很快...