版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、.:.;VC+編寫電子郵件程序 diybl時(shí)間:2021-08-27作者:佚名 編輯:本站 點(diǎn)擊:635 評(píng)論VC+編寫電子郵件程序 一、概述- 本文主要講述如何運(yùn)用Visual C+用MAPI編寫程序。MAPI是包含在Windows之中的,因此不需求安裝其他額外的部件。MAPI有以下三種方式:SMAPI,Simple MAPI,簡(jiǎn)單的MAPICMC,Common Messaging Calls,普統(tǒng)統(tǒng)訊調(diào)用完好的MAPI- SMAPI和CMC都包含在完好的MAPI中,當(dāng)用戶想執(zhí)行一些高級(jí)操作,比如編寫本人的效力器的時(shí)候,必需運(yùn)用完好的MAPI。本文主要論述如何編寫可以收發(fā)電子郵件的程序,因此
2、運(yùn)用SMAPI就足夠了。二、編寫電子郵件程序3-1 初始化MAPI- 要運(yùn)用MAPI,必需首先對(duì)它進(jìn)展初始化。初始化包括以下三個(gè)步驟:裝載MAPI32.DLL動(dòng)態(tài)鏈接庫(kù)找到想要調(diào)用的MAPI函數(shù)地址登錄到電子郵件對(duì)象3-1-1 裝載MAPI32.DLL- 要裝載MAPI,用戶必需程序運(yùn)轉(zhuǎn)時(shí)動(dòng)態(tài)的裝載一個(gè)動(dòng)態(tài)鏈接庫(kù)。LoadLibrary函數(shù)提供了此功能,它定位一個(gè)動(dòng)態(tài)鏈接庫(kù),并前往HINSTANCE局柄需求保管該句柄。LoadLibrary的語(yǔ)法如下:LoadLibrary ( lpLibFileName );其中l(wèi)pLibFileName為L(zhǎng)PCTSTR構(gòu)造變量,是所要調(diào)用的庫(kù)的途徑和稱號(hào)。
3、程序例如:/ 調(diào)用MAPI32.DLL并計(jì)算函數(shù)地址HINSTANCE hInstMail;hInstMail = :LoadLibrary ( “MAPI32.DLL );if ( hInstMail = NULL )/ 錯(cuò)誤處置/ 受篇幅限制,下面的錯(cuò)誤處置部分省略3-1-2 確定函數(shù)地址- 由于MAPI32.DLL是被動(dòng)態(tài)裝載的,因此不知道所要調(diào)用的函數(shù)地址,也就不能一開場(chǎng)就調(diào)用它們,而要經(jīng)過函數(shù)名獲得函數(shù)的地址,并在動(dòng)態(tài)鏈接庫(kù)中查找每一個(gè)函數(shù)并核實(shí)。因此首先必需為這些函數(shù)聲明指針程序例如:/ 為MAPI32.DLL中的函數(shù)聲明函數(shù)指針ULONG (PASCAL *lpfnMAPISen
4、dMail) (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
5、,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
6、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 lpszMessageTy
7、pe,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);- 為了決議每一個(gè)函數(shù)的地址,必需為每一個(gè)函數(shù)調(diào)用GetProcAddress。GetProcAddress的語(yǔ)法為:GetPr
8、ocAddress (hModule, lpProcName);其中,hModule為HMODULE構(gòu)造,是所調(diào)用DLL模塊的句柄;lpProcName為L(zhǎng)PCSTR構(gòu)造,是函數(shù)稱號(hào)。程序例如:/ 找到MAPI32.DLL函數(shù)的地址,并將它們保管在函數(shù)指針變量里(FARPROC&) lpfnMAPISendMail = GetProcAddress(hInstMail,“MAPISendMail);(FARPROC&) lpfnMAPIResolveName = GetProcAddress(hInstMail, “MAPIResolveName);(FARPROC&) lpfnMAPILog
9、on = GetProcAddress(hInstMail,“MAPILogon);(FARPROC&) lpfnMAPILogoff = GetProcAddress(hInstMail,“MAPILogoff);(FARPROC&) lpfnMAPIFreeBuffer = GetProcAddress(hInstMail, “MAPIFreeBuffer);(FARPROC&) lpfnMAPIAddress = GetProcAddress(hInstMail,“MAPIAddress);(FARPROC&) lpfnMAPIFindNext = GetProcAddress(hIns
10、tMail,“MAPIFindNext);(FARPROC&) lpfnMAPIReadMail = GetProcAddress(hInstMail,“MAPIReadMail);3-1-3 登錄到電子郵件對(duì)象- 用戶必需在電子郵件系統(tǒng)中登錄,才干實(shí)現(xiàn)MAPI的各種功能。MAPI提供了登錄的三種選擇:登錄到一個(gè)曾經(jīng)存在的對(duì)象。登錄到一個(gè)新對(duì)象,用編程的方法確定解釋新信息。運(yùn)用對(duì)話框提示用戶登錄。- 我們通常選擇登錄到一個(gè)曾經(jīng)存在的電子郵件對(duì)象,由于網(wǎng)絡(luò)協(xié)作用戶通常會(huì)堅(jiān)持本人的電子郵件程序處于激活形狀。登錄通常運(yùn)用MAPI提供的函數(shù)lpfnMAPILogon。lpfnMAPILogon的語(yǔ)法為
11、:lpfnMAPILogon (lpszProfileName, lpszPassword, flFlags,ulReserved, lplhSession );- 其中,lpszProfileName指向一個(gè)256字符以內(nèi)的登錄稱號(hào),lpszPassword指向密碼,它們均為L(zhǎng)PTSTR構(gòu)造。flFlags為FLAGS構(gòu)造,其值詳見表1。ulReserved必需為0。lplhSession為輸出SMAPI的句柄。表1:lpfnMAPILogon函數(shù)中flFlags的值值 意義MAPI_FORCE_DOWNLOAD在函數(shù)調(diào)用前往之前下載用戶的一切郵件。假設(shè)MAPI_FORCE_DOWNLOAD
12、沒有被設(shè)置,那么信件可以在函數(shù)調(diào)用前往后在后臺(tái)被下載。MAPI_NEW_SESSION 建立一個(gè)新會(huì)話,而不是獲得環(huán)境的共享會(huì)話。假設(shè)MAPI_NEW_SESSION沒有被設(shè)置,MAPILogon運(yùn)用現(xiàn)有的共享會(huì)話。MAPI_LOGON_UI 顯示一個(gè)登錄對(duì)話框來提示用戶輸入登錄信息。例如Outlook檢查用戶電子郵件時(shí)便是如此。MAPI_PASSWORD_UI MAPILogon只允許用戶輸入電子郵件的密碼,而不許改動(dòng)賬號(hào)。程序例如:LHANDLE lhSession;ULONG lResult = lpfnMAPILogon(0, NULL, NULL, 0, 0,&lhSession);
13、if (lResult != SUCCESS_SUCCESS)/SUCCESS_SUCCESS在MAPI.H中被定義/ 錯(cuò)誤處置3-2 閱讀電子郵件- MAPIFindNext和MAPIReadMail運(yùn)用與閱讀的兩個(gè)根本函數(shù)。MAPIFindNext用于定位第一封或下一封電子郵件并前往標(biāo)識(shí)號(hào),MAPIReadMail前往以該標(biāo)識(shí)號(hào)為根底的電子郵件的內(nèi)容。另外,一個(gè)常用的函數(shù)是MAPIFreeBuffer,用于釋放內(nèi)存。3-2-1 定位到第一封信- 要找到第一封信,需求運(yùn)用MAPIFindNext函數(shù),其函數(shù)聲明如下:ULONG FAR PASCAL MAPIFindNext(LHANDLE
14、lhSession,ULONG ulUIParam, LPTSTR lpszMessageType,LPTSTR lpszSeedMessageID, FLAGS flFlags,ULONG ulReserved, LPTSTR lpszMessageID )- 其中,lhSession為提交SMAPI的會(huì)話句柄 ;ulUIParam為父窗體的句柄;lpszMessageType指向一個(gè)字符串,用來鑒別郵件類型,并加以查找;lpszSeedMessageID為指向起始信息ID的指針,其值為0時(shí),MAPIFindNext獲得第一封電子郵件;flFlags的值見表2;ulReserved必需為0;
15、lpszMessageID為輸出值,它是指向信息ID地址的指針。- 表2:MAPIFindNext函數(shù)中flFlags的值值 意義MAPI_GUARANTEE_FIFO 按郵件發(fā)送的時(shí)間順序接受電子郵件。MAPI_LONG_MSGID 前往信件標(biāo)識(shí)符可達(dá)512字符。MAPI_UNREAD_ONLY 只列舉沒有閱讀過的電子郵件。程序例如:/ 找到第一條沒有閱讀的電子郵件char pMessageID 513;ULONG lResult = lpfnMAPIFindNext(lhSession, NULL, NULL,NULL, MAPI_LONG_MSGID | MAPI_UNREAD_ONLY
16、,0, pMessageID);3-2-2 閱讀信息當(dāng)信件ID被獲取后,就可以調(diào)用MAPIReadMail閱讀實(shí)踐的信息了。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ù)意義一
17、樣,flFlags參數(shù)的值見表3:表3:MAPIReadMail函數(shù)中flFlags的值:值 意義MAPI_BODY_AS_FILE 將郵件信息寫到一個(gè)暫時(shí)文件中,并且將它作為第一個(gè)附件添加到附件列表中。MAPI_ENVELOPE_ONLY 只讀取郵件標(biāo)題。MAPI_PEEK 讀完郵件之后不把它標(biāo)志為“已讀。MAPI_SUPPRESS_ATTACH MAPIReadMail函數(shù)不拷貝附件,但是將郵件文本寫入MapiMessage構(gòu)造中。程序例如:/ 讀取電子郵件long nFlags = MAPI_SUPPRESS_ATTACH;if (!bMarkAsRead)nFlags = nFlags
18、 | MAPI_PEEK;lResult = lpfnMAPIReadMail(lhSession, NULL, pMessageID,nFlags, 0, &pMessage);if (lResult != SUCCESS_SUCCESS);return false;假設(shè)調(diào)用勝利,就可以訪問MapiMessage構(gòu)造了運(yùn)用pMessage:pMessage- ulReserved:0pMessage- lpszSubject:郵件標(biāo)題pMessage- lpszNoteText:郵件信息pMessage- lpszMessageType:郵件類型pMessage- DateReceived:
19、接納時(shí)間pMessage- lpszConversationID:郵件所屬的會(huì)話線程IDpMessage- flFlags:其值見表4表4:MapiMessage構(gòu)造中的flFlags值 意義MAPI_RECEIPT_REQUESTED 接納通知被懇求??蛻舳诉\(yùn)用程序在發(fā)送音訊時(shí)設(shè)置該項(xiàng)。MAPI_SENT 郵件已被發(fā)送。MAPI_UNREAD 郵件是“未讀形狀。pMessage- lpOriginator:指向MapiRecipDesc構(gòu)造,包含發(fā)件人信息。pMessage- nRecipCount:信件者數(shù)目。pMessage- lpRecips:指向MapiRecipDesc構(gòu)造數(shù)組,包
20、含接納者信息。pMessage- nFileCount:附件數(shù)量。pMessage- lpFiles:指向MapiFileDesc構(gòu)造數(shù)組,每一個(gè)構(gòu)造包含一個(gè)文件附件。3-2-3 釋放內(nèi)存- 在訪問另一條信件以前該當(dāng)釋放內(nèi)存,否那么會(huì)出現(xiàn)內(nèi)存走漏。程序例如:/ 釋放內(nèi)存lpfnMAPIFreeBuffer(pMessage);3-2-4 定位到下一條信件定位到下一條信件依然運(yùn)用MAPIFindNext函數(shù),該函數(shù)聲明及參數(shù)意義詳見3-2-1節(jié)。下面示范如何定位到下一條信件。 程序例如:/ 定位到下一條沒有閱讀的信件ULONG lResult = lpfnMAPIFindNext(lhSessi
21、on, NULL, NULL,pMessageID, MAPI_LONG_MSGID|MAPI_UNREAD_ONLY,0, pMessageID);3-3 發(fā)送電子郵件- 發(fā)送電子郵件的普通步驟:- 1 建立MapiMessage構(gòu)造對(duì)象- 2 調(diào)用MAPIResolveName使發(fā)送者稱號(hào)合法- 3 添加附件- 4 調(diào)用MAPISendMail發(fā)送電子郵件- 5 調(diào)用MAPIFreeBuffer釋放內(nèi)存- 下面詳細(xì)分別詳細(xì)論述。3-3-1 建立MapiMessage構(gòu)造對(duì)象- 對(duì)于MapiMessage構(gòu)造,3-2-2節(jié)曾經(jīng)做過引見,下面一步步引見如何設(shè)置其中的值:- 1 為MapiMes
22、sage對(duì)象分配內(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è)置信件標(biāo)題lpszSubject:char subject512;strcpy(subject, sSubject);message.lpszSubject = subject;- 5 設(shè)置信件內(nèi)容:char text5000;strc
23、py(text, sMessage);message.lpszNoteText = text;- 6 設(shè)置flFlags標(biāo)識(shí),詳見3-2-2節(jié)中表4:message.flFlags = MAPI_SENT;- 7 用一個(gè)指向MapiRecipDesc構(gòu)造的指針設(shè)置發(fā)送者信息lpOriginator,或?qū)⑵湓O(shè)置為NULL:message.lpOriginator = N文章出處:DIY部落( HYPERLINK diybl/course/3_program/vc/vc_js/2021827/716.html diybl/course/3_program/vc/vc_js/2021827/716.
24、html)+ SMTP協(xié)議電子郵件傳送分析2002-11-19 18:05信息產(chǎn)業(yè)部電子第二十二研討所青出處:yesky責(zé)任編輯:方舟摘要:本文引見了一種采用SMTP協(xié)議規(guī)范并經(jīng)過直接運(yùn)用SMTP協(xié)議命令而在 HYPERLINK dev.yesky/ t _blank 程序中實(shí)現(xiàn)電子郵件傳送的方法。并在VC+開發(fā)環(huán)境下給出了部分關(guān)鍵的實(shí)現(xiàn)代碼。前言電子郵件效力作為Internet上運(yùn)用最多和最廣的效力工程得到了非常廣泛的運(yùn)用,在 HYPERLINK product.yesky/net/ t _blank 網(wǎng)絡(luò)運(yùn)用中也起到非常重要的作用。好像其他的網(wǎng)絡(luò)效力,電子郵件系統(tǒng)也有其運(yùn)用的傳輸協(xié)議,包括
25、SMTPSimple Mail Transfer Protocol,簡(jiǎn)單郵件傳輸協(xié)議、POPPost HYPERLINK soft.yesky/office/ t _blank Office Protocol,郵局協(xié)議和IMAPInternet Message Access Protocal,音訊訪問協(xié)議等,這些協(xié)議運(yùn)用于電子郵件的發(fā)送和接納。一些郵件處置 HYPERLINK product.yesky/software/ t _blank 軟件如OutLook Express和FoxMail等就是按照SMTP和POP3 協(xié)議結(jié)合Windows Sockets套接字進(jìn)展 HYPERLINK d
26、esign.yesky/ t _blank 設(shè)計(jì)來收發(fā)郵件的。本文以SMTP協(xié)議為研討對(duì)象,在Visual C+ 6.0編程環(huán)境下按照SMTP協(xié)議經(jīng)過套接字發(fā)送SMTP命令,接納并處置郵件效力器的反響信息,從而實(shí)現(xiàn)對(duì)電子郵件的發(fā)送。SMTP協(xié)議的通訊 HYPERLINK gamepic.yesky/gamepic/zhoubian/ t _blank 模型和會(huì)話流程SMTP協(xié)議通訊模型SMTP協(xié)議是TCP/IP協(xié)議族中的一員,主要對(duì)如何將電子郵件從發(fā)送方地址傳送到接納方地址,也即是對(duì)傳輸?shù)囊?guī)那么做了規(guī)定。SMTP協(xié)議的通訊模型并不復(fù)雜,主要任務(wù)集中在發(fā)送SMTP和接納SMTP上:首先針對(duì)用戶發(fā)
27、出的郵件懇求,由發(fā)送SMTP建立一條銜接到接納SMTP的雙工通訊鏈路,這里的接納SMTP是相對(duì)于發(fā)送SMTP而言的,實(shí)踐上它既可以是最終的接納者也可以是中間傳送者。發(fā)送SMTP擔(dān)任向接納SMTP發(fā)送SMTP命令,而接納SMTP那么擔(dān)任接納并反呼應(yīng)對(duì)??纱笾掠孟旅娴耐ㄓ嵞P捅硎緢D來表示:SMTP協(xié)議的命令和應(yīng)對(duì)從前面的通訊模型可以看出SMTP協(xié)議在發(fā)送SMTP和接納SMTP之間的會(huì)話是靠發(fā)送SMTP的 SMTP命令和接納SMTP反響的應(yīng)對(duì)來完成的。在通訊鏈路建立后,發(fā)送SMTP發(fā)送MAIL命令指令郵件發(fā)送者,假設(shè)接納SMTP此時(shí)可以接納郵件那么作出OK的應(yīng)對(duì),然后發(fā)送SMTP繼續(xù)發(fā)出RCPT命令
28、以確認(rèn)郵件能否收到,假設(shè)接納到就作出OK的應(yīng)對(duì),否那么就發(fā)出回絕接納應(yīng)對(duì),但這并不會(huì)對(duì)整個(gè)郵件操作呵斥影響。雙方如此反復(fù)多次,直至郵件處置終了。SMTP協(xié)議共包含10個(gè)SMTP命令,列表如下:SMTP命令命令闡明HELLO domain CRLF識(shí)別發(fā)送方到接納SMTP的一個(gè)HELLO命令MAIL FROM:reverse-pathCRLF reverse-path為發(fā)送者地址。此命令通知接納方一個(gè)新郵件發(fā)送的開場(chǎng),并對(duì)一切的形狀和緩沖區(qū)進(jìn)展初始化。此命令開場(chǎng)一個(gè)郵件傳輸處置,最終完成將郵件數(shù)據(jù)傳送到一個(gè)或多個(gè)郵箱中。RCPT TO:forward-pathCRLF forward-path標(biāo)
29、識(shí)各個(gè)郵件接納者的地址DATA CRLF 接納SMTP將把其后的行為看作郵件數(shù)據(jù)去處置,以CRLF.CRLF標(biāo)識(shí)數(shù)據(jù)的結(jié)尾。REST CRLF退出/復(fù)位當(dāng)前的郵件傳輸NOOP CRLF要求接納SMTP僅做OK應(yīng)對(duì)。用于測(cè)試QUIT CRLF要求接納SMTP前往一個(gè)OK應(yīng)對(duì)并封鎖傳輸。VRFY string CRLF 驗(yàn)證指定的郵箱能否存在,由于 HYPERLINK soft.yesky/security/ t _blank 平安要素,效力器多制止此命令。EXPN string CRLF 驗(yàn)證給定的郵箱列表能否存在,擴(kuò)展郵箱列表,也常制止運(yùn)用。HELP CRLF查詢效力器支持什么命令注:CRLF
30、為回車、換行,ASCII碼分別為13、10十進(jìn)制。SMTP協(xié)議的每一個(gè)命令都會(huì)前往一個(gè)應(yīng)對(duì)碼,應(yīng)對(duì)碼的每一個(gè)數(shù)字都是有特定含義的,如第一位數(shù)字為2時(shí)表示命令勝利;為5表失??;3表沒有完成。一些較復(fù)雜的郵件程序利用該特點(diǎn),首先檢查應(yīng)對(duì)碼的首數(shù)字,并根據(jù)其值來決議下一步的動(dòng)作。下面將SMTP的應(yīng)對(duì)碼列表如下:應(yīng)對(duì)碼闡明501 參數(shù)格式錯(cuò)誤502 命令不可實(shí)現(xiàn)503 錯(cuò)誤的命令序列504 命令參數(shù)不可實(shí)現(xiàn)211 系統(tǒng)形狀或系統(tǒng)協(xié)助 呼應(yīng)214 協(xié)助 信息220domain效力就緒221 domain效力封鎖421 domain效力未就緒,封鎖傳輸信道250要求的郵件操作完成251 用戶非本地,將轉(zhuǎn)發(fā)
31、向forward-path450 要求的郵件操作未完成,郵箱不可用550 要求的郵件操作未完成,郵箱不可用451 放棄要求的操作;處置過程中出錯(cuò)551 用戶非本地,請(qǐng)嘗試forward-path 452 系統(tǒng)存儲(chǔ)缺乏,要求的操作未執(zhí)行552 過量的存儲(chǔ)分配,要求的操作未執(zhí)行553 郵箱名不可用,要求的操作未執(zhí)行354 開場(chǎng)郵件輸入,以.終了554 操作失敗VC+ SMTP協(xié)議電子郵件傳送分析2002-11-19 18:05信息產(chǎn)業(yè)部電子第二十二研討所青出處:yesky責(zé)任編輯:方舟在運(yùn)用 HYPERLINK dev.yesky/ t _blank 程序中運(yùn)用SMTP協(xié)議SMTP協(xié)議的會(huì)話流程在
32、進(jìn)展程序 HYPERLINK design.yesky/ t _blank 設(shè)計(jì)之前有必要弄清SMTP協(xié)議的會(huì)話流程,其實(shí)前面引見的內(nèi)容曾經(jīng)可以大致勾勒出用SMTP發(fā)送郵件的框架了,對(duì)于一次普通的郵件發(fā)送,其過程大致為:先建立TCP銜接,隨后客戶端發(fā)出HELLO命令以標(biāo)識(shí)發(fā)件人本人的身份,并繼續(xù)由客戶端發(fā)送MAIL命令,如效力器應(yīng)對(duì)為OK,可繼續(xù)發(fā)送RCPT命令來標(biāo)識(shí)電子郵件的收件人,在這里可以有多個(gè)RCPT行,而效力器端那么表示能否情愿為收件人接受該郵件。在雙方協(xié)商終了后,用命令DATA將郵件發(fā)送出去,其中對(duì)表示終了的.也一并發(fā)送出去。隨后終了本次發(fā)送過程,以QUIT命令退出。下面經(jīng)過一個(gè)實(shí)
33、例,從langruisohu發(fā)送郵件到renpingsina來更詳細(xì)直觀地描畫此會(huì)話流程:R:220 sina Simple Mail Transfer Service ReadyS:HELLO sohuR:250 sinaS:MAIL FROM:langruisohuR:250 OKS:RCPT TO:renpingsinaR:250 OKS:DATAR:354 Start mail input;end with CRLF.CRLFS:R:250 OKS:QUITR:221 sina Service closing transmission channel郵件的格式化由于電子郵件構(gòu)造上的特殊
34、性,在傳輸時(shí)是不能當(dāng)作簡(jiǎn)單的文本來直接處置的,而必需按照一定的格式對(duì)郵件頭和郵件體進(jìn)展格式化處置之后才可以被發(fā)送。需求進(jìn)展格式化的部分主要有:發(fā)件人地址、收件人地址、主題和發(fā)送日期等。在RFC文檔的RFC 822里對(duì)郵件的格式化有詳盡的闡明,有關(guān)概略請(qǐng)參閱該文檔。下面經(jīng)過VC+6.0按照RFC 822文檔規(guī)定將格式化郵件的部分編寫如下部分代碼:/郵件頭預(yù)備strTemp = _T( From: ) + m_strFrom; file發(fā)件人地址add_header_line( (LPCTSTR)strTemp );strTemp = _T( To: ) + m_strTo; file收件人地址a
35、dd_header_line( (LPCTSTR)strTemp );m_tDateTime = m_tDateTime.GetCurrentTime();/發(fā)送時(shí)間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郵件頭終了m_strHead
36、er += _T( rn );file郵件體預(yù)備if( m_strBody.Right( 2 ) != _T( rn ) ) file確認(rèn)最后以回車換行終了m_strBody += _T( rn ); 其中add_header_line(LPCTSTR szHeaderLine)函數(shù)用于把szHeaderLine指向的字串追加到m_strHeader后面。其中,格式化后的郵件頭保管在m_strHeader里,格式化后的郵件體保管在m_strBody中。由Socket套接字為SMTP提供 HYPERLINK product.yesky/net/ t _blank 網(wǎng)絡(luò)通訊根底許多網(wǎng)絡(luò)程序都是采用
37、Socket套接字實(shí)現(xiàn)的,對(duì)于一些規(guī)范的網(wǎng)絡(luò)協(xié)議如HTTP、FTP和SMTP等協(xié)議的編程也是基于套接字程序的,只是端口號(hào)不再是隨意設(shè)定而要由協(xié)議來指定,比如HTTP端口在80、FTP是21,而SMTP那么是25。Socket只是提供在指定的端口上同指定的效力器從事網(wǎng)絡(luò)上的通訊才干,至于客戶和效力器之間是如何通訊的那么由網(wǎng)絡(luò)協(xié)議來規(guī)定,這對(duì)于套接字是完全透明的。因此可以運(yùn)用Socket套接字為程序提供網(wǎng)絡(luò)通訊的才干,而對(duì)于網(wǎng)絡(luò)通訊連路建立好之后采取什么樣的通訊應(yīng)對(duì)那么要按SMTP協(xié)議的規(guī)定去執(zhí)行了。Socket套接字網(wǎng)絡(luò)編程方面的文章資料非常豐富,限于本文篇幅,在此不再贅述,有關(guān)概略請(qǐng)參閱相關(guān)文
38、檔。為簡(jiǎn)便起見,沒有采用編寫較復(fù)雜的Windows Sockets API進(jìn)展編程,而是運(yùn)用經(jīng)過較好封裝的MFC 的CSocket類。在正式運(yùn)用套接字之前,也要先用AfxSocketInit()函數(shù)對(duì)套接字進(jìn)展初始化,然后用Create()創(chuàng)建套接字對(duì)象,并由該套接字經(jīng)過Connect建立同郵件效力器的銜接。假設(shè)一切正常,再后續(xù)的任務(wù)中就是遵照SMTP協(xié)議的商定來運(yùn)用Send、Receive()函數(shù)來發(fā)送SMTP命令和接納郵件效力器發(fā)來的應(yīng)對(duì)碼以完成對(duì)郵件的傳送。SMTP會(huì)話應(yīng)對(duì)的實(shí)現(xiàn)在同郵件效力器建立好鏈路銜接后就可以按前面引見過的會(huì)話流程進(jìn)展程序設(shè)計(jì)了,對(duì)于SMTP命令的發(fā)送,可按命令格式
39、將其組幀終了后用CSocket類的Send()函數(shù)將其發(fā)送到效力器,并經(jīng)過CSocket類的Receive()函數(shù)接納從郵件效力器發(fā)來的應(yīng)對(duì)碼,并根據(jù)SMTP協(xié)議的應(yīng)對(duì)碼表對(duì)其做出呼應(yīng)的處置。下面是用于接納應(yīng)對(duì)碼的函數(shù)get_response()的部分實(shí)現(xiàn)代碼:BOOL CSMTP:get_response( UINT response_expected )/輸入?yún)?shù)為希望的應(yīng)對(duì)碼/ m_wsSMTPServer為CSocket的類對(duì)象,調(diào)用Receive()將應(yīng)對(duì)碼接納到緩存/ response_buf中m_wsSMTPServer.Receive( response_buf, RESPON
40、SE_BUFFER_SIZE )sResponse = response_buf;sscanf( (LPCTSTR)sResponse.Left( 3 ), _T( %d ), &response );pResp = &response_table response_expected ;file檢驗(yàn)收到的應(yīng)對(duì)碼能否是所希望得到的if( response != pResp-nResponse )/不相等的話進(jìn)展錯(cuò)誤處置return FALSE;return TRUE;會(huì)話的各個(gè)部分比較類似,都是命令-應(yīng)對(duì)方式,而且均成對(duì)出現(xiàn),下面是本文的重點(diǎn)也是實(shí)現(xiàn)的關(guān)鍵部分-在程序控制下完成對(duì)SMTP命令的格
41、式化以及對(duì)命令的發(fā)送和對(duì)郵件效力器應(yīng)對(duì)碼的檢驗(yàn)處置:/格式化并發(fā)送HELLO命令,并接納、驗(yàn)證效力器應(yīng)對(duì)碼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àn)應(yīng)對(duì)碼能否為250return FALSE;file格式化并發(fā)送MAIL命令,并接納、驗(yàn)證效力器應(yīng)對(duì)碼sFrom.Format( _T( MAIL From: %srn ), (LPCTSTR)msg-m_strFrom );m_wsSMTPServer.Send( (LPCTSTR)sFrom, sFrom.GetLength() );if( !get_response( GENERIC_SUCCESS ) ) file檢驗(yàn)應(yīng)對(duì)碼能否為250return FALSE;file格式化并發(fā)送R
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年建筑師考試建筑構(gòu)造與材料試題集
- 2026年貴陽(yáng)康養(yǎng)職業(yè)大學(xué)單招綜合素質(zhì)筆試模擬試題含詳細(xì)答案解析
- 2026年鄭州電力職業(yè)技術(shù)學(xué)院?jiǎn)握芯C合素質(zhì)筆試模擬試題含詳細(xì)答案解析
- 2026年云南工貿(mào)職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能考試參考題庫(kù)含詳細(xì)答案解析
- 2026年保定電力職業(yè)技術(shù)學(xué)院?jiǎn)握芯C合素質(zhì)考試備考試題含詳細(xì)答案解析
- 2026年山西管理職業(yè)學(xué)院?jiǎn)握芯C合素質(zhì)考試參考題庫(kù)含詳細(xì)答案解析
- 2026中國(guó)科學(xué)院云南天文臺(tái)撫仙湖太陽(yáng)觀測(cè)和研究基地望遠(yuǎn)鏡工程師招聘1人考試重點(diǎn)試題及答案解析
- 2026年青島電影學(xué)院高職單招職業(yè)適應(yīng)性測(cè)試備考題庫(kù)及答案詳細(xì)解析
- 2026年云南體育運(yùn)動(dòng)職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測(cè)試備考題庫(kù)及答案詳細(xì)解析
- 2026年長(zhǎng)沙民政職業(yè)技術(shù)學(xué)院?jiǎn)握芯C合素質(zhì)筆試參考題庫(kù)含詳細(xì)答案解析
- 如何預(yù)防旅游陷阱
- 管理會(huì)計(jì)學(xué) 第10版 課件 第1、2章 管理會(huì)計(jì)概論、成本性態(tài)與變動(dòng)成本法
- 喪葬費(fèi)用補(bǔ)助申請(qǐng)的社保授權(quán)委托書
- 2024年度初會(huì)《經(jīng)濟(jì)法基礎(chǔ)》高頻真題匯編(含答案)
- 課例研究報(bào)告
- 啤酒營(yíng)銷促銷實(shí)戰(zhàn)技巧之經(jīng)銷商管理技巧知識(shí)培訓(xùn)
- 建筑工程各部門職能及各崗位職責(zé)201702
- 機(jī)柜端口對(duì)應(yīng)表
- GB/T 3934-2003普通螺紋量規(guī)技術(shù)條件
- 中考作文指導(dǎo)(北京市) 課件(92張PPT)
- 車輛贈(zèng)與協(xié)議模板
評(píng)論
0/150
提交評(píng)論