




已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
VC+編寫電子郵件程序 時間:2008-08-27作者:佚名 編輯:本站 點擊:635 評論VC+編寫電子郵件程序 一、概述- 本文主要講述如何使用Visual C+用MAPI編寫E-mail程序。MAPI是包含在Windows之中的,因此不需要安裝其他額外的部件。MAPI有以下三種形式:SMAPI,Simple MAPI,簡單的MAPICMC,Common Messaging Calls,一般通訊調(diào)用完整的MAPI- SMAPI和CMC都包含在完整的MAPI中,當用戶想執(zhí)行一些高級操作,比如編寫自己的E-mail服務(wù)器的時候,必須使用完整的MAPI。本文主要闡述如何編寫能夠收發(fā)電子郵件的程序,因此使用SMAPI就足夠了。二、編寫電子郵件程序3-1 初始化MAPI- 要使用MAPI,必須首先對它進行初始化。初始化包括以下三個步驟:裝載MAPI32.DLL動態(tài)鏈接庫找到想要調(diào)用的MAPI函數(shù)地址登錄到電子郵件對象3-1-1 裝載MAPI32.DLL- 要裝載MAPI,用戶必須程序運行時動態(tài)的裝載一個動態(tài)鏈接庫。LoadLibrary函數(shù)提供了此功能,它定位一個動態(tài)鏈接庫,并返回HINSTANCE局柄(需要保存該句柄)。LoadLibrary的語法如下:LoadLibrary ( lpLibFileName );其中l(wèi)pLibFileName為LPCTSTR結(jié)構(gòu)變量,是所要調(diào)用的庫的路徑和名稱。程序示例:/ 調(diào)用MAPI32.DLL并計算函數(shù)地址HINSTANCE hInstMail;hInstMail = :LoadLibrary ( “MAPI32.DLL” );if ( hInstMail = NULL )/ 錯誤處理/ 受篇幅限制,下面的錯誤處理部分省略3-1-2 確定函數(shù)地址- 由于MAPI32.DLL是被動態(tài)裝載的,因此不知道所要調(diào)用的函數(shù)地址,也就不能一開始就調(diào)用它們,而要通過函數(shù)名獲得函數(shù)的地址,并在動態(tài)鏈接庫中查找每一個函數(shù)并核實。因此首先必須為這些函數(shù)聲明指針程序示例:/ 為MAPI32.DLL中的函數(shù)聲明函數(shù)指針ULONG (PASCAL *lpfnMAPISendMail) (LHANDLE lhSession,ULONG ulUIParam, lpMapiMessage lpMessage,FLAGS flFlags, ULONG ulReserved);ULONG (PASCAL *lpfnMAPIResolveName) (LHANDLE lhSession,ULONG ulUIParam, LPTSTR lpszName,FLAGS ulFlags, ULONG ulReserved,lpMapiRecipDesc FAR *lppRecip);ULONG (FAR PASCAL *lpfnMAPILogon)(ULONG ulUIParam,LPSTR lpszProfileName, LPSTR lpszPassword,FLAGS flFlags, ULONG ulReserved,LPLHANDLE lplhSession);ULONG (FAR PASCAL *lpfnMAPILogoff)(LHANDLE lhSession,ULONG ulUIParam, FLAGS flFlags,ULONG ulReserved);ULONG (FAR PASCAL *lpfnMAPIFreeBuffer)(LPVOID lpBuffer);ULONG (FAR PASCAL *lpfnMAPIAddress)(LHANDLE lhSession,ULONG ulUIParam, LPSTR lpszCaption,ULONG nEditFields, LPSTR lpszLabels,ULONG nRecips, lpMapiRecipDesc lpRecips,FLAGS flFlags, ULONG ulReserved,LPULONG lpnNewRecips,lpMapiRecipDesc FAR *lppNewRecips);ULONG (FAR PASCAL *lpfnMAPIFindNext)(LHANDLE lhSession,ULONG ulUIParam, LPSTR lpszMessageType,LPSTR lpszSeedMessageID, FLAGS flFlags,ULONG ulReserved, LPSTR lpszMessageID);ULONG (FAR PASCAL *lpfnMAPIReadMail)(LHANDLE lhSession,ULONG ulUIParam, LPSTR lpszMessageID,FLAGS flFlags, ULONG ulReserved,lpMapiMessage FAR *lppMessage);- 為了決定每一個函數(shù)的地址,必須為每一個函數(shù)調(diào)用GetProcAddress。GetProcAddress的語法為:GetProcAddress (hModule, lpProcName);其中,hModule為HMODULE結(jié)構(gòu),是所調(diào)用DLL模塊的句柄;lpProcName為LPCSTR結(jié)構(gòu),是函數(shù)名稱。程序示例:/ 找到MAPI32.DLL函數(shù)的地址,并將它們保存在函數(shù)指針變量里(FARPROC&) lpfnMAPISendMail = GetProcAddress(hInstMail,“MAPISendMail”);(FARPROC&) lpfnMAPIResolveName = GetProcAddress(hInstMail, “MAPIResolveName”);(FARPROC&) lpfnMAPILogon = GetProcAddress(hInstMail,“MAPILogon”);(FARPROC&) lpfnMAPILogoff = GetProcAddress(hInstMail,“MAPILogoff”);(FARPROC&) lpfnMAPIFreeBuffer = GetProcAddress(hInstMail, “MAPIFreeBuffer”);(FARPROC&) lpfnMAPIAddress = GetProcAddress(hInstMail,“MAPIAddress”);(FARPROC&) lpfnMAPIFindNext = GetProcAddress(hInstMail,“MAPIFindNext”);(FARPROC&) lpfnMAPIReadMail = GetProcAddress(hInstMail,“MAPIReadMail”);3-1-3 登錄到電子郵件對象- 用戶必須在電子郵件系統(tǒng)中登錄,才能實現(xiàn)MAPI的各種功能。MAPI提供了登錄的三種選擇:登錄到一個已經(jīng)存在的對象。登錄到一個新對象,用編程的方法確定解釋新信息。使用對話框提示用戶登錄。- 我們通常選擇登錄到一個已經(jīng)存在的電子郵件對象,因為網(wǎng)絡(luò)合作用戶通常會保持自己的電子郵件程序處于激活狀態(tài)。登錄通常使用MAPI提供的函數(shù)lpfnMAPILogon。lpfnMAPILogon的語法為:lpfnMAPILogon (lpszProfileName, lpszPassword, flFlags,ulReserved, lplhSession );- 其中,lpszProfileName指向一個256字符以內(nèi)的登錄名稱,lpszPassword指向密碼,它們均為LPTSTR結(jié)構(gòu)。flFlags為FLAGS結(jié)構(gòu),其值詳見表1。ulReserved必須為0。lplhSession為輸出SMAPI的句柄。表1:lpfnMAPILogon函數(shù)中flFlags的值值 意義MAPI_FORCE_DOWNLOAD在函數(shù)調(diào)用返回之前下載用戶的所有郵件。如果MAPI_FORCE_DOWNLOAD沒有被設(shè)置,那么信件能夠在函數(shù)調(diào)用返回后在后臺被下載。MAPI_NEW_SESSION 建立一個新會話,而不是獲得環(huán)境的共享會話。如果MAPI_NEW_SESSION沒有被設(shè)置,MAPILogon使用現(xiàn)有的共享會話。MAPI_LOGON_UI 顯示一個登錄對話框來提示用戶輸入登錄信息。例如Outlook檢查用戶電子郵件時便是如此。MAPI_PASSWORD_UI MAPILogon只允許用戶輸入電子郵件的密碼,而不許改動賬號。程序示例:LHANDLE lhSession;ULONG lResult = lpfnMAPILogon(0, NULL, NULL, 0, 0,&lhSession);if (lResult != SUCCESS_SUCCESS)/SUCCESS_SUCCESS在MAPI.H中被定義/ 錯誤處理3-2 閱讀電子郵件- MAPIFindNext和MAPIReadMail使用與閱讀E-mail的兩個基本函數(shù)。MAPIFindNext用于定位第一封或下一封電子郵件并返回標識號,MAPIReadMail返回以該標識號為基礎(chǔ)的電子郵件的內(nèi)容。另外,一個常用的函數(shù)是MAPIFreeBuffer,用于釋放內(nèi)存。3-2-1 定位到第一封信- 要找到第一封信,需要使用MAPIFindNext函數(shù),其函數(shù)聲明如下:ULONG FAR PASCAL MAPIFindNext(LHANDLE lhSession,ULONG ulUIParam, LPTSTR lpszMessageType,LPTSTR lpszSeedMessageID, FLAGS flFlags,ULONG ulReserved, LPTSTR lpszMessageID )- 其中,lhSession為提交SMAPI的會話句柄 ;ulUIParam為父窗體的句柄;lpszMessageType指向一個字符串,用來鑒別郵件類型,并加以查找;lpszSeedMessageID為指向起始信息ID的指針,其值為0時,MAPIFindNext獲得第一封電子郵件;flFlags的值見表2;ulReserved必須為0;lpszMessageID為輸出值,它是指向信息ID地址的指針。- 表2:MAPIFindNext函數(shù)中flFlags的值值 意義MAPI_GUARANTEE_FIFO 按郵件發(fā)送的時間順序接受電子郵件。MAPI_LONG_MSGID 返回信件標識符可達512字符。MAPI_UNREAD_ONLY 只列舉沒有閱讀過的電子郵件。程序示例:/ 找到第一條沒有閱讀的電子郵件char pMessageID 513;ULONG lResult = lpfnMAPIFindNext(lhSession, NULL, NULL,NULL, MAPI_LONG_MSGID | MAPI_UNREAD_ONLY,0, pMessageID);3-2-2 閱讀信息當信件ID被獲取后,就可以調(diào)用MAPIReadMail閱讀實際的E-mail信息了。MAPIReadMail的函數(shù)聲明如下:ULONG FAR PASCAL MAPIReadMail(LHANDLE lhSession,ULONG ulUIParam, LPTSTR lpszMessageID,FLAGS flFlags, ULONG ulReserved,lpMapiMessage FAR * lppMessage);其中,lppMessage為指向MapiMessage的指針;除flFlags外的其他參數(shù)與lpfnFindNext函數(shù)的同名參數(shù)意義相同,flFlags參數(shù)的值見表3:表3:MAPIReadMail函數(shù)中flFlags的值:值 意義MAPI_BODY_AS_FILE 將郵件信息寫到一個臨時文件中,并且將它作為第一個附件添加到附件列表中。MAPI_ENVELOPE_ONLY 只讀取郵件標題。MAPI_PEEK 讀完郵件之后不把它標記為“已讀”。MAPI_SUPPRESS_ATTACH MAPIReadMail函數(shù)不拷貝附件,但是將郵件文本寫入MapiMessage結(jié)構(gòu)中。程序示例:/ 讀取電子郵件long nFlags = MAPI_SUPPRESS_ATTACH;if (!bMarkAsRead)nFlags = nFlags | MAPI_PEEK;lResult = lpfnMAPIReadMail(lhSession, NULL, pMessageID,nFlags, 0, &pMessage);if (lResult != SUCCESS_SUCCESS);return false;如果調(diào)用成功,就可以訪問MapiMessage結(jié)構(gòu)了(使用pMessage):pMessage- ulReserved:0pMessage- lpszSubject:郵件標題pMessage- lpszNoteText:郵件信息pMessage- lpszMessageType:郵件類型pMessage- DateReceived:接收時間pMessage- lpszConversationID:郵件所屬的會話線程IDpMessage- flFlags:其值見表4表4:MapiMessage結(jié)構(gòu)中的flFlags值 意義MAPI_RECEIPT_REQUESTED 接收通知被申請。客戶端應(yīng)用程序在發(fā)送消息時設(shè)置該項。MAPI_SENT 郵件已被發(fā)送。MAPI_UNREAD 郵件是“未讀”狀態(tài)。pMessage- lpOriginator:指向MapiRecipDesc結(jié)構(gòu),包含發(fā)件人信息。pMessage- nRecipCount:信件者數(shù)目。pMessage- lpRecips:指向MapiRecipDesc結(jié)構(gòu)數(shù)組,包含接收者信息。pMessage- nFileCount:附件數(shù)量。pMessage- lpFiles:指向MapiFileDesc結(jié)構(gòu)數(shù)組,每一個結(jié)構(gòu)包含一個文件附件。3-2-3 釋放內(nèi)存- 在訪問另一條信件以前應(yīng)當釋放內(nèi)存,否則會出現(xiàn)內(nèi)存泄漏。程序示例:/ 釋放內(nèi)存lpfnMAPIFreeBuffer(pMessage);3-2-4 定位到下一條信件定位到下一條信件依然使用MAPIFindNext函數(shù),該函數(shù)聲明及參數(shù)意義詳見3-2-1節(jié)。下面示范如何定位到下一條信件。 程序示例:/ 定位到下一條沒有閱讀的信件ULONG lResult = lpfnMAPIFindNext(lhSession, NULL, NULL,pMessageID, MAPI_LONG_MSGID|MAPI_UNREAD_ONLY,0, pMessageID);3-3 發(fā)送電子郵件- 發(fā)送電子郵件的一般步驟:- 1 建立MapiMessage結(jié)構(gòu)對象- 2 調(diào)用MAPIResolveName使發(fā)送者名稱合法- 3 添加附件- 4 調(diào)用MAPISendMail發(fā)送電子郵件- 5 調(diào)用MAPIFreeBuffer釋放內(nèi)存- 下面詳細分別詳細闡述。3-3-1 建立MapiMessage結(jié)構(gòu)對象- 對于MapiMessage結(jié)構(gòu),3-2-2節(jié)已經(jīng)做過介紹,下面一步步介紹如何設(shè)置其中的值:- 1 為MapiMessage對象分配內(nèi)存:MapiMessage message;Memset(&message, 0, sizeof(message);- 2 將ulReserved設(shè)置為0:message.ulReserved = 0;- 3 設(shè)置信息類型指針lpszMessageType,可以為NULL:message.lpszMessageType = NULL;- 4 設(shè)置信件標題(lpszSubject):char subject512;strcpy(subject, sSubject);message.lpszSubject = subject;- 5 設(shè)置信件內(nèi)容:char text5000;strcpy(text, sMessage);message.lpszNoteText = text;- 6 設(shè)置flFlags標識,詳見3-2-2節(jié)中表4:message.flFlags = MAPI_SENT;- 7 用一個指向MapiRecipDesc結(jié)構(gòu)的指針設(shè)置發(fā)送者信息(lpOriginator),或?qū)⑵湓O(shè)置為NULL:message.lpOriginator = N文章出處:DIY部落(/course/3_program/vc/vc_js/2008827/137716.html)+ SMTP協(xié)議電子郵件傳送剖析2002-11-19 18:05作者:信息產(chǎn)業(yè)部電子第二十二研究所青出處:yesky責任編輯:方舟摘要:本文介紹了一種采用SMTP協(xié)議規(guī)范并通過直接使用SMTP協(xié)議命令而在程序中實現(xiàn)電子郵件傳送的方法。并在VC+開發(fā)環(huán)境下給出了部分關(guān)鍵的實現(xiàn)代碼。前言電子郵件服務(wù)作為Internet上應(yīng)用最多和最廣的服務(wù)項目得到了非常廣泛的應(yīng)用,在網(wǎng)絡(luò)應(yīng)用中也起到非常重要的作用。如同其他的網(wǎng)絡(luò)服務(wù),電子郵件系統(tǒng)也有其使用的傳輸協(xié)議,包括SMTP(Simple Mail Transfer Protocol,簡單郵件傳輸協(xié)議)、POP(Post Office Protocol,郵局協(xié)議)和IMAP(Internet Message Access Protocal,消息訪問協(xié)議)等,這些協(xié)議應(yīng)用于電子郵件的發(fā)送和接收。一些郵件處理軟件如OutLook Express和FoxMail等就是按照SMTP和POP3 協(xié)議結(jié)合Windows Sockets套接字進行設(shè)計來收發(fā)郵件的。本文以SMTP協(xié)議為研究對象,在Visual C+ 6.0編程環(huán)境下按照SMTP協(xié)議通過套接字發(fā)送SMTP命令,接收并處理郵件服務(wù)器的反饋信息,從而實現(xiàn)對電子郵件的發(fā)送。SMTP協(xié)議的通訊模型和會話流程SMTP協(xié)議通訊模型SMTP協(xié)議是TCP/IP協(xié)議族中的一員,主要對如何將電子郵件從發(fā)送方地址傳送到接收方地址,也即是對傳輸?shù)囊?guī)則做了規(guī)定。SMTP協(xié)議的通信模型并不復雜,主要工作集中在發(fā)送SMTP和接收SMTP上:首先針對用戶發(fā)出的郵件請求,由發(fā)送SMTP建立一條連接到接收SMTP的雙工通訊鏈路,這里的接收SMTP是相對于發(fā)送SMTP而言的,實際上它既可以是最終的接收者也可以是中間傳送者。發(fā)送SMTP負責向接收SMTP發(fā)送SMTP命令,而接收SMTP則負責接收并反饋應(yīng)答??纱笾掠孟旅娴耐ㄓ嵞P褪疽鈭D來表示:SMTP協(xié)議的命令和應(yīng)答從前面的通訊模型可以看出SMTP協(xié)議在發(fā)送SMTP和接收SMTP之間的會話是靠發(fā)送SMTP的 SMTP命令和接收SMTP反饋的應(yīng)答來完成的。在通訊鏈路建立后,發(fā)送SMTP發(fā)送MAIL命令指令郵件發(fā)送者,若接收SMTP此時可以接收郵件則作出OK的應(yīng)答,然后發(fā)送SMTP繼續(xù)發(fā)出RCPT命令以確認郵件是否收到,如果接收到就作出OK的應(yīng)答,否則就發(fā)出拒絕接收應(yīng)答,但這并不會對整個郵件操作造成影響。雙方如此反復多次,直至郵件處理完畢。SMTP協(xié)議共包含10個SMTP命令,列表如下:SMTP命令命令說明HELLO domain CRLF識別發(fā)送方到接收SMTP的一個HELLO命令MAIL FROM:reverse-pathCRLF reverse-path為發(fā)送者地址。此命令告訴接收方一個新郵件發(fā)送的開始,并對所有的狀態(tài)和緩沖區(qū)進行初始化。此命令開始一個郵件傳輸處理,最終完成將郵件數(shù)據(jù)傳送到一個或多個郵箱中。RCPT TO:forward-pathCRLF forward-path標識各個郵件接收者的地址DATA CRLF 接收SMTP將把其后的行為看作郵件數(shù)據(jù)去處理,以CRLF.CRLF標識數(shù)據(jù)的結(jié)尾。REST CRLF退出/復位當前的郵件傳輸NOOP CRLF要求接收SMTP僅做OK應(yīng)答。(用于測試)QUIT CRLF要求接收SMTP返回一個OK應(yīng)答并關(guān)閉傳輸。VRFY string CRLF 驗證指定的郵箱是否存在,由于安全因素,服務(wù)器多禁止此命令。EXPN string CRLF 驗證給定的郵箱列表是否存在,擴充郵箱列表,也常禁止使用。HELP CRLF查詢服務(wù)器支持什么命令注:CRLF為回車、換行,ASCII碼分別為13、10(十進制)。SMTP協(xié)議的每一個命令都會返回一個應(yīng)答碼,應(yīng)答碼的每一個數(shù)字都是有特定含義的,如第一位數(shù)字為2時表示命令成功;為5表失?。?表沒有完成。一些較復雜的郵件程序利用該特點,首先檢查應(yīng)答碼的首數(shù)字,并根據(jù)其值來決定下一步的動作。下面將SMTP的應(yīng)答碼列表如下:應(yīng)答碼說明501 參數(shù)格式錯誤502 命令不可實現(xiàn)503 錯誤的命令序列504 命令參數(shù)不可實現(xiàn)211 系統(tǒng)狀態(tài)或系統(tǒng)幫助響應(yīng)214 幫助信息220domain服務(wù)就緒221 domain服務(wù)關(guān)閉421 domain服務(wù)未就緒,關(guān)閉傳輸信道250要求的郵件操作完成251 用戶非本地,將轉(zhuǎn)發(fā)向forward-path450 要求的郵件操作未完成,郵箱不可用550 要求的郵件操作未完成,郵箱不可用451 放棄要求的操作;處理過程中出錯551 用戶非本地,請嘗試forward-path 452 系統(tǒng)存儲不足,要求的操作未執(zhí)行552 過量的存儲分配,要求的操作未執(zhí)行553 郵箱名不可用,要求的操作未執(zhí)行354 開始郵件輸入,以.結(jié)束554 操作失敗VC+ SMTP協(xié)議電子郵件傳送剖析2002-11-19 18:05作者:信息產(chǎn)業(yè)部電子第二十二研究所青出處:yesky責任編輯:方舟在應(yīng)用程序中使用SMTP協(xié)議SMTP協(xié)議的會話流程在進行程序設(shè)計之前有必要弄清SMTP協(xié)議的會話流程,其實前面介紹的內(nèi)容已經(jīng)可以大致勾勒出用SMTP發(fā)送郵件的框架了,對于一次普通的郵件發(fā)送,其過程大致為:先建立TCP連接,隨后客戶端發(fā)出HELLO命令以標識發(fā)件人自己的身份,并繼續(xù)由客戶端發(fā)送MAIL命令,如服務(wù)器應(yīng)答為OK,可繼續(xù)發(fā)送RCPT命令來標識電子郵件的收件人,在這里可以有多個RCPT行,而服務(wù)器端則表示是否愿意為收件人接受該郵件。在雙方協(xié)商結(jié)束后,用命令DATA將郵件發(fā)送出去,其中對表示結(jié)束的.也一并發(fā)送出去。隨后結(jié)束本次發(fā)送過程,以QUIT命令退出。下面通過一個實例,從發(fā)送郵件到來更詳細直觀地描述此會話流程:R:220 Simple Mail Transfer Service ReadyS:HELLO R:250 S:MAIL FROM:R:250 OKS:RCPT TO:R:250 OKS:DATAR:354 Start mail input;end with CRLF.CRLFS:R:250 OKS:QUITR:221 Service closing transmission channel郵件的格式化由于電子郵件結(jié)構(gòu)上的特殊性,在傳輸時是不能當作簡單的文本來直接處理的,而必須按照一定的格式對郵件頭和郵件體進行格式化處理之后才可以被發(fā)送。需要進行格式化的部分主要有:發(fā)件人地址、收件人地址、主題和發(fā)送日期等。在RFC文檔的RFC 822里對郵件的格式化有詳盡的說明,有關(guān)詳情請參閱該文檔。下面通過VC+6.0按照RFC 822文檔規(guī)定將格式化郵件的部分編寫如下(部分代碼):/郵件頭準備strTemp = _T( From: ) + m_strFrom; file:/發(fā)件人地址add_header_line( (LPCTSTR)strTemp );strTemp = _T( To: ) + m_strTo; file:/收件人地址add_header_line( (LPCTSTR)strTemp );m_tDateTime = m_tDateTime.GetCurrentTime();/發(fā)送時間strTemp = _T( Data: );strTemp += m_tDateTime.Format( %a, %d %b %y %H:%M:%S %Z );add_header_line( (LPCTSTR)strTemp );strTemp = _T( Subject: ) + m_strSubject; file:/主題add_header_line( (LPCTSTR)strTemp );file:/郵件頭結(jié)束m_strHeader += _T( rn );file:/郵件體準備if( m_strBody.Right( 2 ) != _T( rn ) ) file:/確認最后以回車換行結(jié)束m_strBody += _T( rn ); 其中add_header_line(LPCTSTR szHeaderLine)函數(shù)用于把szHeaderLine指向的字串追加到m_strHeader后面。其中,格式化后的郵件頭保存在m_strHeader里,格式化后的郵件體保存在m_strBody中。由Socket套接字為SMTP提供網(wǎng)絡(luò)通訊基礎(chǔ)許多網(wǎng)絡(luò)程序都是采用Socket套接字實現(xiàn)的,對于一些標準的網(wǎng)絡(luò)協(xié)議如HTTP、FTP和SMTP等協(xié)議的編程也是基于套接字程序的,只是端口號不再是隨意設(shè)定而要由協(xié)議來指定,比如HTTP端口在80、FTP是21,而SMTP則是25。Socket只是提供在指定的端口上同指定的服務(wù)器從事網(wǎng)絡(luò)上的通訊能力,至于客戶和服務(wù)器之間是如何通訊的則由網(wǎng)絡(luò)協(xié)議來規(guī)定,這對于套接字是完全透明的。因此可以使用Socket套接字為程序提供網(wǎng)絡(luò)通訊的能力,而對于網(wǎng)絡(luò)通訊連路建立好之后采取什么樣的通訊應(yīng)答則要按SMTP協(xié)議的規(guī)定去執(zhí)行了。Socket套接字網(wǎng)絡(luò)編程方面的文章資料非常豐富,限于本文篇幅,在此不再贅述,有關(guān)詳情請參閱相關(guān)文檔。為簡便起見,沒有采用編寫較復雜的Windows Sockets API進行編程,而是使用經(jīng)過較好封裝的MFC 的CSocket類。在正式使用套接字之前,也要先用AfxSocketInit()函數(shù)對套接字進行初始化,然后用Create()創(chuàng)建套接字對象,并由該套接字通過Connect()建立同郵件服務(wù)器的連接。如果一切正常,再后續(xù)的工作中就是遵循SMTP協(xié)議的約定來使用Send()、Receive()函數(shù)來發(fā)送SMTP命令和接收郵件服務(wù)器發(fā)來的應(yīng)答碼以完成對郵件的傳送。SMTP會話應(yīng)答的實現(xiàn)在同郵件服務(wù)器建立好鏈路連接后就可以按前面介紹過的會話流程進行程序設(shè)計了,對于SMTP命令的發(fā)送,可按命令格式將其組幀完畢后用CSocket類的Send()函數(shù)將其發(fā)送到服務(wù)器,并通過CSocket類的Receive()函數(shù)接收從郵件服務(wù)器發(fā)來的應(yīng)答碼,并根據(jù)SMTP協(xié)議的應(yīng)答碼表對其做出響應(yīng)的處理。下面是用于接收應(yīng)答碼的函數(shù)get_response()的部分實現(xiàn)代碼:BOOL CSMTP:get_response( UINT response_expected )/輸入?yún)?shù)為希望的應(yīng)答碼/ m_wsSMTPServer為CSocket的類對象,調(diào)用Receive()將應(yīng)答碼接收到緩存/ response_buf中m_wsSMTPServer.Receive( response_buf, RESPONSE_BUFFER_SIZE )sResponse = response_buf;sscanf( (LPCTSTR)sResponse.Left( 3 ), _T( %d ), &response );pResp = &response_table response_expected ;file:/檢驗收到的應(yīng)答碼是否是所希望得到的if( response != pResp-nResponse )/不相等的話進行錯誤處理return FALSE;return TRUE;會話的各個部分比較類似,都是命令-應(yīng)答方式,而且均成對出現(xiàn),下面是本文的重點也是實現(xiàn)的關(guān)鍵部分-在程序控制下完成對SMTP命令的格式化以及對命令的發(fā)送和對郵件服務(wù)器應(yīng)答碼的檢驗處理:/格式化并發(fā)送HELLO命令,并接收、驗證服務(wù)器應(yīng)答碼gethostname( local_host, 80 );sHello.Format( _T( HELO %srn ), local_host );m_wsSMTPServer.Send( (LPCTSTR)sHello, sHello.GetLength() );if( !get_response( GENERIC_SUCCESS ) ) file:/檢驗應(yīng)答碼是否為250return FALSE;file:/格式化并發(fā)送MAIL命令,并接收、驗證服務(wù)器應(yīng)答碼sFrom.Format( _T( MAIL From: %srn ), (LPCTSTR)msg-m_strFrom );m_wsSMTPServer.Send( (LPCTSTR)sFrom, sFrom.GetLength() );if( !get_response( GENERIC_SUCCESS ) ) file:/檢驗應(yīng)答碼是否為250return FALSE;file:/格式化并發(fā)送RCPT命令,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 行政管理學中現(xiàn)代管理的典型試題及答案
- 建筑工程考試深入分析試題及答案
- 行政管理中的心理學影響力探究試題及答案
- 2025關(guān)于旅游服務(wù)合同
- 2025化工原料采購合同
- 2025家居用品購銷合同家居用品購銷合同電子版
- 2025供暖系統(tǒng)安裝合同
- 公文寫作中的風格辨析試題及答案
- 2025年公文寫作與處理的基礎(chǔ)知識及答案
- 2025廣州個人租房合同書
- 醫(yī)療糾紛和解協(xié)議書(6篇)
- Q∕GDW 10799.7-2020 國家電網(wǎng)有限公司電力安全工作規(guī)程 第7部分:調(diào)相機部分
- 新設(shè)備驗收標準
- 屋面掛瓦技術(shù)交底鋼掛瓦條
- 農(nóng)村不動產(chǎn)權(quán)籍調(diào)查工作指南
- 氧氣安全標簽
- 毫針基本操作技術(shù).ppt課件
- 管道天然氣改造普及工程(PE管)定向鉆專項施工方案
- 血清學反應(yīng)PPT課件
- 長沙生態(tài)動物園詳細規(guī)劃設(shè)計文本目錄
- TB公式編程官方基礎(chǔ)教程1
評論
0/150
提交評論