• <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

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

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

        更新時間:2022-05-10 文章作者:未知 信息來源:網絡 閱讀次數:

        陳旭波

        “郵件特快專遞”這個詞現在已經是被廣大的網民所熟知了,它就好比是網絡上的EMS,能夠直接把郵件送到對方的郵箱中,郵件發送完畢后,對方就可以立刻收到。Foxmail在其最新的4.0版本中也特別新增了該功能,作為一名編程愛好者,你是不是也想知道如何編程實現該功能呢?那就隨本文一起揭開“郵件特快專遞”的神秘面紗:
        一、實現原理
        在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是本人所在機器,郵件是經由sm1.163.com這個中轉站才送到目的地的,而我們平常所說的郵件特快專遞,就是把郵件直接送到目的地而不需要中轉站。
        如何才能知道目的地的地址呢?我們知道電子郵件的地址由用戶名(username)和郵箱域名(address.com)兩部分構成的,給域名服務器發送針對“address.com”的MX指令查詢即可找到目的地的地址。被查出來的目的地可能不止一個,有時這些目的地是有優先級別之分的,分別對應著郵件的優先級別,你可以根據郵件優先級的不同對應發送,也可以任意選擇其中一個發送,本文的示例將選擇反饋回來的第一個目的地發送,讀者可根據實際需要進行改進。

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

        三、窗口設計
        向窗體上放置三個TEdit組件,一個TMemo組件,四個Tlabel組件,用到的Indy組件為TIdDNSResolver、TIdAntiFreeze、TIdSMTP、TIdMessage。其中TIdDNSResolver是用來向域名服務器發出查詢請求并得到結果,TIdMessage用來構建郵件,TIdSMTP用來發送郵件,TidAntiFreeze可以確保Indy在工作時程序能響應來自外界的消息(注:Indy是以同步的方式進行工作的,在讀或寫操作完成之前,其它代碼無法執行,加入TidAntiFreeze可以在每隔一段時間通過呼叫Application.ProcessMessage方法響應來自外界的消息。)
        程序的界面如下圖所示(箭頭所指向的文字標識了該組件的名字):

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

        ……(前面一部分省略)
        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 }

        { 這個過程是用來得到郵件特快專遞目的地服務器名稱及優先級別數,參數AMXList是
        用來接收結果值,AQName代表傳遞過來的域名 }
        procedure TForm1.GetMxList(AMxList: TStringList; AQName: string);
        var
        i: Integer;
        begin
        with IdDNSResolver do
        begin
        Host := '202.101.107.55'; { Host屬性用來指定域名服務器的地址,此處為筆者所在地
        的主域名服務器地址,你也可以指定任一可以快速訪問到的Internet上域名服務器
        地址,要知道自己所在地的域名服務器地址,win98下通過winipcfg命令,win2000下
        通過ipconfig /all即可查出。}
        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; //向域名服務器發出請求

        { 從域名服務器接收反饋的結果,將反饋回來的郵件服務器名稱放在AMXList列表的Name部分,
        郵件服務器的優先級別數放在Value部分。 }
        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);
        var
        MxList: 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;

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

        本程序在Windows 2000 + Delphi 6 下調試通過。

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

        本類教程下載

        系統下載排行

        主站蜘蛛池模板: 一个人看的免费观看日本视频www 一个人看的免费视频www在线高清动漫 | 91精品国产免费久久国语麻豆| 国产免费AV片无码永久免费| 亚洲性线免费观看视频成熟| AV无码免费永久在线观看| 亚洲男人第一av网站| 国产成人久久AV免费| 亚洲AV永久青草无码精品| 黄视频在线观看免费| 亚洲熟妇无码另类久久久| a级毛片免费在线观看| 亚洲日韩国产精品第一页一区| 99久久免费国产精品热| 亚洲人成人网站色www| 无码国产精品一区二区免费3p| 亚洲AV无码一区二区三区DV| a级毛片在线视频免费观看| 亚洲丁香色婷婷综合欲色啪| 8x8x华人永久免费视频| 亚洲日本人成中文字幕| 国产成人无码区免费A∨视频网站| 亚洲国产成人久久一区二区三区| 国产色婷婷精品免费视频| 免费国产黄网站在线观看动图 | 国产亚洲美女精品久久久| 国产中文字幕在线免费观看 | 69天堂人成无码麻豆免费视频| 亚洲人妖女同在线播放| 免费高清在线爱做视频| 一级毛片免费全部播放| 亚洲国产综合专区在线电影| 两个人的视频高清在线观看免费| 亚洲精品欧美综合四区| 久久久久亚洲精品中文字幕| 久久免费线看线看| 亚洲砖码砖专无区2023| 国产亚洲精久久久久久无码77777 国产亚洲精品成人AA片新蒲金 | 亚洲国产精品成人精品无码区在线| 99爱免费观看视频在线| 亚洲老熟女五十路老熟女bbw| 亚洲日韩精品无码专区网站|