发送电子邮件的程序实例(共28页)

上传人:txadgkn****dgknqu... 文档编号:46795885 上传时间:2021-12-15 格式:DOC 页数:28 大小:128.50KB
收藏 版权申诉 举报 下载
发送电子邮件的程序实例(共28页)_第1页
第1页 / 共28页
发送电子邮件的程序实例(共28页)_第2页
第2页 / 共28页
发送电子邮件的程序实例(共28页)_第3页
第3页 / 共28页
资源描述:

《发送电子邮件的程序实例(共28页)》由会员分享,可在线阅读,更多相关《发送电子邮件的程序实例(共28页)(28页珍藏版)》请在装配图网上搜索。

1、精选优质文档-倾情为你奉上发送电子邮件的程序一、程序界面设计smtp电子邮件发送程序的用户界面填入smtp服务器地址、邮箱用户名和口令,端口号是25,并填入发信人,发信地址填入你在该网站的免费邮箱地址。在对话框的右面填入发送电子邮件的相关信息,选择一个附件,然后点击“发送”按钮,程序会与服务器建立TCP连接,然后按照ESMTP协议发送ELHO命令,然后发送用户名和口令,经过验证,进入SMTP会话。通过命令交互,将邮件和附件发送出去,然后断开连接。在此过程中,右下方的多文本列表框(RichTextBox)会显示全部的会话信息。现在的SMTP服务器与以前不一样,一般都要经过验证身份后,才为你提供传

2、输邮件的服务,验证的方法有很多种,这里只实现了一种,仅仅为了说明问题。程序实现的技术要点是:1运用Windows的消息驱动机制2通过状态转换来控制会话命令的发布顺序3实现了base64编码和译码。二、创建应用程序的过程1使用MFC AppWizard创建应用程序框架工程名是Smtp,应用程序的类型是基于对话框的,对话框的标题是“电子邮件发送客户端程序”,需要Windows Sockets的支持,其它部分接受系统的默认设置就可以。向导自动为应用程序创建了两个类:应用程序类:CSmtpApp,基类是CWinApp,对应的文件是Smtp.h和Smtp.cpp。对话框类:CSmtpDlg,基类是CDi

3、alog,对应的文件是SmtpDlg.h和SmtpDlg.cpp。2为对话框添加控件在程序的主对话框界面中添加相应的控件对象,并按照下表修改控件的属性。 对话框中的控件属性控件类型控件IDCaption静态文本 static textIDC_STATIC发信人静态文本 static textIDC_STATIC发信地址静态文本 static textIDC_STATICSMTP服务器静态文本 static textIDC_STATIC端口静态文本 static textIDC_STATIC用户名静态文本 static textIDC_STATIC口令编辑框 edit boxIDC_EDIT_S

4、ENDER编辑框 edit boxIDC_EDIT_ADDRESS编辑框 edit boxIDC_EDIT_SERVNAME编辑框 edit boxIDC_EDIT_SERVPORT编辑框 edit boxIDC_EDIT_USERNAME编辑框 edit boxIDC_EDIT_PASSWORD静态文本 static textIDC_STATIC收信静态文本 static textIDC_STATIC主题静态文本 static textIDC_STATIC抄送静态文本 static textIDC_STATIC暗送静态文本 static textIDC_STATIC附件静态文本 static

5、 textIDC_STATIC信件内容编辑框 edit boxIDC_EDIT_RECEIVER编辑框 edit boxIDC_EDIT_TITLE编辑框 edit boxIDC_EDIT_CC编辑框 edit boxIDC_EDIT_BCC编辑框 edit boxIDC_EDIT_ATTACH编辑框 edit boxIDC_EDIT_LETTER命令按钮 buttonIDC_BUTTON_VIEW浏览静态文本 static textIDC_STATICsmtp 会话的状态信息多文本框 RichEdit BoxIDC_RICH_LIST命令按钮 buttonIDOK发送命令按钮 buttonI

6、DCANCEL取消3定义控件的成员变量为对话框中的控件对象定义相应的成员变量。 控件对象的成员变量控件IDControl IDs变量名称Member Variable Name变量类别Category变量类型Variable TypeIDC_EDIT_SENDERm_strSenderValueCStringIDC_EDIT_ADDRESSm_strAddrValueCStringIDC_EDIT_SERVNAMEm_strServNameValueCStringIDC_EDIT_SERVPORTm_nServPortValueUINTIDC_EDIT_USERNAMEm_strUserNam

7、eValueCStringIDC_EDIT_PASSWORDm_strPasswordValueCStringIDC_EDIT_RECEIVERm_strReceiverValueCStringIDC_EDIT_TITLEm_strTitleValueCStringIDC_EDIT_CCm_strCCValueCStringIDC_EDIT_BCCm_strBCCValueCStringIDC_EDIT_ATTACHm_strAttachValueCStringIDC_EDIT_LETTERm_strLetterValueCStringIDC_RICH_INFOm_strInfoValueCS

8、tring4为控件对象添加事件响应函数为对话框中的控件对象添加事件响应函数。 控件类型对象标识 ObjectID消息 Message函数Member functions命令按钮IDC_BUTTON_VIEWBN_CLICKEDOnButtonView命令按钮IDOKBN_CLICKEDOnIDOK5Base64编码和解码创建一个普通的类,用来实现base64编码和解码。6创建CMySocket类为了能够捕获并响应socket事件,应创建用户自己的套接字类,可利用类向导添加。Class Type选择MFC Class,类名为CMySocket,基类是CAsyncSocket类,创建后对应的文件是

9、MySocket.h和MySocket.cpp。在利用类向导为CMySocket类添加OnConnect,OnClose和OnReceive三个事件处理函数,并为它添加一般的成员函数和变量。可参看下一小节的程序代码。7手工添加包含语句以及事件函数和成员函数的代码8分阶段编译执行,进行测试三、程序清单1CSmtpApp应用程序类Smtp.hSmtp.cpp/CSmtpApp:InitInstance()添加一句初始化多文本框控件的函数。BOOL CSmtpApp:InitInstance()if (!AfxSocketInit()AfxMessageBox(IDP_SOCKETS_INIT_FA

10、ILED);return FALSE;AfxEnableControlContainer(); /MFC自动创建的代码AfxInitRichEdit(); /用户自己添加的.2CSmtpDlg对话框类SmtpDlg.h.#include MySocket.h /自己添加的包含语句#include Base64.h /自己添加的包含语句.class CSmtpDlg : public CDialog/ Constructionpublic:void Display(LONG flag); /显示信息void GetHeader(); /创建电子邮件的头部CMySocket smtpSocket;

11、 /套接字类对象CSmtpDlg(CWnd* pParent = NULL); / standard constructor/类向导自动产生的窗口控件变量的声明/ Dialog Data/AFX_DATA(CSmtpDlg)enum IDD = IDD_SMTP_DIALOG ;CString m_strAddr; /发信地址CString m_strAttach; /附件CString m_strBCC; /暗送CString m_strCC; /抄送CString m_strLetter; /信件内容CString m_strSender; /发信人CString m_strPasswor

12、d; /口令UINT m_nServPort; /端口CString m_strReceiver; /收信CString m_strServName; / SMTP服务器CString m_strTitle; /主题CString m_strUserName; /用户名CString m_strInfo; /会话状态信息/AFX_DATA./类向导自动生成的消息映射函数声明/AFX_MSG(CSmtpDlg)virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void On

13、Paint();afx_msg HCURSOR OnQueryDragIcon();afx_msg void OnButtonView(); /点击“浏览”按钮时执行virtual void OnOK(); /点击“发送“按钮时执行/AFX_MSGDECLARE_MESSAGE_MAP()private:CBase64 coder; /进行Base64编码的变量BOOL GetBody(LPSTR& pszBody, int& nBodySize);/构造邮件体;.SmtpDlg.cpp#include stdafx.h#include smtp.h#include smtpDlg.h#inc

14、lude MySocket.h /自己添加的包含语句#include Base64.h /自己添加的包含语句#define SMTP_MAXLINE 76./ CSmtpDlg dialog/CSmtpDlg:CSmtpDlg()CSmtpDlg:CSmtpDlg(CWnd* pParent /*=NULL*/): CDialog(CSmtpDlg:IDD, pParent)/AFX_DATA_INIT(CSmtpDlg)m_strAddr = _T(); /这一部分是由类向导自动添加的变量初始化代码m_strAttach = _T();m_strBCC = _T();m_strCC = _T

15、();m_strLetter = _T();m_strSender = _T();m_strPassword = _T();m_nServPort = 0;m_strReceiver = _T();m_strServName = _T();m_strTitle = _T();m_strUserName = _T();m_strInfo = _T();/AFX_DATA_INIT/ Note that LoadIcon does not require a subsequent DestroyIcon in Win32m_hIcon = AfxGetApp()-LoadIcon(IDR_MAIN

16、FRAME);/类向导自动添加的窗口控件与相应控件变量的映射关系/CSmtpDlg:DoDataExchange()void CSmtpDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CSmtpDlg)DDX_Text(pDX, IDC_EDIT_ADDRESS, m_strAddr);DDX_Text(pDX, IDC_EDIT_ATTACH, m_strAttach);DDX_Text(pDX, IDC_EDIT_BCC, m_strBCC);DDX_Text(pDX, IDC_

17、EDIT_CC, m_strCC);DDX_Text(pDX, IDC_EDIT_LETTER, m_strLetter);DDX_Text(pDX, IDC_EDIT_SENDER, m_strSender);DDX_Text(pDX, IDC_EDIT_PASSWORD, m_strPassword);DDX_Text(pDX, IDC_EDIT_SERVPORT, m_nServPort);DDX_Text(pDX, IDC_EDIT_RECEIVER, m_strReceiver);DDX_Text(pDX, IDC_EDIT_SERVNAME, m_strServName);DDX_

18、Text(pDX, IDC_EDIT_TITLE, m_strTitle);DDX_Text(pDX, IDC_EDIT_USERNAME, m_strUserName);DDX_Text(pDX, IDC_RICH_LIST, m_strInfo);/AFX_DATA_MAP/类向导自动添加的消息映射BEGIN_MESSAGE_MAP(CSmtpDlg, CDialog)/AFX_MSG_MAP(CSmtpDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON_VIEW, OnButto

19、nView)/AFX_MSG_MAPEND_MESSAGE_MAP()/ CSmtpDlg message handlers/CSmtpDlg:OnInitDialog()BOOL CSmtpDlg:OnInitDialog()./手工添加的初始化代码/ TODO: Add extra initialization herem_strSender = _T(wang); /发信人m_strAddr = _T(jia); /发信地址m_strServName = _T(); /smtp服务器m_nServPort = 25; /smtp的保留端口m_strUserName = _T(EXAMPL

20、E); /用户名m_strPassword = _T(); /口令m_strReceiver = _T(yi); /收信人地址m_strTitle = _T(); /主题m_strCC = _T(); /抄送m_strBCC = _T(); /暗送m_strLetter = _T(); /信件内容m_strAttach = _T(); /附件UpdateData(FALSE); /更新用户界面return TRUE; / return TRUE unless you set the focus to a control./以下函数的代码都要手工添加/当用户点击“发送”按钮时,执行此函数/CSm

21、tpDlg:OnOK() void CSmtpDlg:OnOK() /设定smtp类的变量,使之指向本对话框,以便传递信息smtpSocket.SetParent(this); UpdateData(TRUE); /取来用户在对话框中输入的数据smtpSocket.Create(); /创建套接字对象的底层套接字smtpSocket.Connect(LPCSTR)m_strServName,m_nServPort); /连接pop3服务器/列表框清空/while (m_listInfo.GetCount()!=0)/ m_listInfo.DeleteString(0);UpdateData(

22、FALSE); /更新用户界面/当用户点击“浏览”按钮,寻找附件时,执行此函数/CSmtpDlg:OnButtonView()void CSmtpDlg:OnButtonView() UpdateData(TRUE); CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T(All Files (*.*)|*.*|);if (dlg.DoModal() = IDOK) CString sNewFile = dlg.GetPathName();if (m_strAttach.GetLength()m

23、_strAttach += _T(, );m_strAttach += sNewFile; else m_strAttach = sNewFile;UpdateData(FALSE);LPSTR pszBody = NULL;int nBodySize = 0;if (!GetBody(pszBody, nBodySize)TRACE(_T(Failed in call to send body parts body, GetLastError returns: %dn), GetLastError();CString s;s = pszBody;m_strInfo += s;UpdateDa

24、ta(FALSE);/根据不同的情况,向用户显示不同的信息/CSmtpDlg:Display()void CSmtpDlg:Display(LONG flag)CString s;switch(flag)case S_CONNECT: /已连接到服务器,显示信息s = 已经连接到+m_strServName+服务器rn;m_strInfo += s;break;case S_RECEIVE: /收到服务器发来的数据,显示该数据m_strInfo += smtpSocket.lastMsg;break; case S_CLOSE: /显示关闭连接的信息m_strInfo += smtpSocke

25、t.error;s = 连接已经关闭rn;m_strInfo += s;break;UpdateData(FALSE); /更新用户界面/创建电子邮件的头部/CSmtpDlg:GetHeader()void CSmtpDlg:GetHeader()UpdateData(TRUE);CString sepa;CString sReply;sReply = _T();/创建 Date: 标题行内容CTime now(CTime:GetCurrentTime();CString sDate(now.Format(_T(%a, %d %b %Y %H:%M:%S );sDate +=+0800 (CS

26、T);CString sBuf(sReply);if (m_strAttach.GetLength()sReply.Format(_T(MIME-Version: 1.0rn);sBuf += sReply;/添加 From 和 to 字段,From字段进行了编码coder.Encode(m_strAddr);sReply.Format(_T(From: =?gb2312?B?%s?=rn), coder.EncodedMessage();sBuf += sReply;sReply.Format(_T(To: %srn),m_strReceiver);sBuf += sReply;/添加 Da

27、te字段sReply.Format(_T(Date: %srn),sDate);sBuf += sReply;/添加 subject字段,进行了编码/Subject: =?GB2312?B?XXXXXX=?= / 主题,进行了编码coder.Encode(m_strTitle);sReply.Format(_T(Subject: =?gb2312?B?%s?=rn),coder.EncodedMessage();sBuf += sReply;/如果有,添加 Cc 字段if (m_strCC.GetLength()sReply.Format(_T(Cc: %srn), m_strCC);sBuf

28、 += sReply;/如果有,添加Bcc 字段if (m_strBCC.GetLength()sReply.Format(_T(Bcc: %srn), m_strBCC);sBuf += sReply;/如果需要,添加 Mime 字段/MIME-Version: 1.0 / MIME版本/Content-type: multipart/mixed; / 内容类型是多部分/混合型/boundary = NextPart_000_00A / 指定一级边界特征字符串sepa= _T(Boundary-=_HfNFaIwtPvzJDUQrvChaEKIMklNx);if (m_strAttach.G

29、etLength()sReply.Format(_T(MIME-Version: 1.0rn);sBuf += sReply;sReply.Format(Content-Type:Multipart/mixed;boundary=%srn,sepa);sBuf += sReply;sBuf += _T(rn); else sBuf += _T(rn);sReply.Format(_T( %srn), m_strLetter);sBuf += sReply;sReply.Format(_T(%c%c.%c%c),13,10,13,10);sBuf += sReply;smtpSocket.Sen

30、d(LPCSTR)sBuf,sBuf.GetLength();m_strInfo+=sBuf;if (m_strAttach.GetLength()sReply.Format(_T(-%srn),sepa);sBuf = sReply;sBuf += _T(Content-Type: text/plain; charset=gb2312rn);sBuf += _T(Content-Transfer-Encoding: base64rn);sBuf += _T(rn);coder.Encode(m_strLetter);sReply.Format(_T(%srn),coder.EncodedMe

31、ssage();sBuf += sReply;sReply.Format(_T(-%srn), sepa);sBuf += sReply;sBuf += _T(Content-Type: text/plain; charset=gb2312rn);sBuf += _T(Content-Transfer-Encoding: base64rn);sBuf += _T(rn);/add LetterLPSTR pszBody = NULL;int nBodySize = 0;if (!GetBody(pszBody, nBodySize)TRACE(_T(Failed in call to send

32、 body parts body, GetLastError returns: %dn), GetLastError();sReply = pszBody;sBuf += sReply;sReply.Format(_T(-%srn), sepa);sBuf += sReply;sReply.Format(_T(%c%c.%c%c),13,10,13,10);sBuf += sReply;smtpSocket.Send(LPCSTR)sBuf,sBuf.GetLength();m_strInfo+=sBuf;UpdateData(FALSE);/构造电子邮件的体部/CSmtpDlg:GetBod

33、y()BOOL CSmtpDlg:GetBody(LPSTR& pszBody, int& nBodySize)BOOL bSuccess = FALSE;/打开附件文件CFile infile;if (infile.Open(m_strAttach, CFile:modeRead | CFile:shareDenyWrite)DWORD dwSize = infile.GetLength();if (dwSize)/读入数据BYTE* pszIn = new BYTEdwSize;tryinfile.Read(pszIn, dwSize);bSuccess = TRUE;catch(CFil

34、eException* pEx)bSuccess = FALSE;pEx-Delete();if (bSuccess)coder.Encode(pszIn, dwSize); /编码delete pszIn; /删除了输入缓冲区infile.Close(); /关闭输入文件/形成编码后的发送内容LPSTR pszEncoded = coder.EncodedMessage();int nEncodedSize = coder.EncodedMessageSize();nBodySize = nEncodedSize+(nEncodedSize/76)+1)*2)+1;pszBody = new

35、 charnBodySize;-nBodySize; int nInPos = 0;int nOutPos = 0;while (nInPos nEncodedSize)int nThisLineSize = min(nEncodedSize - nInPos, SMTP_MAXLINE);CopyMemory(&pszBodynOutPos, &pszEncodednInPos, nThisLineSize);nOutPos += nThisLineSize;CopyMemory(&pszBodynOutPos, rn, 2);nOutPos += 2;nInPos += nThisLine

36、Size;pszBodynOutPos = 0; /以空字符串结束 else bSuccess = TRUE;pszBody = NULL;nBodySize = 0; elseTRACE(_T(No bodypart body text or filename specified!n);return bSuccess;3 CMySocket套接字类MySocket.h.#include Base64.h /自己添加的包含语句#include #include #include using namespace std;class CSmtpDlg;/表示显示信息的标志#define S_CLO

37、SE 1#define S_CONNECT 2#define S_RECEIVE 3#define S_GETNUMMSGS 4 #define S_GETSIZEMSGS 5 #define S_ENDRETR 6 /表示smtp会话状态的枚举类型typedef enum FIRST=0,EHLO,AUTH,USER,PASS,MAIL,RCPT,DATA,QUIT STATE;/自己的套接字类定义class CMySocket : public CAsyncSocket/ Attributespublic:CString lastMsg;CString error;/ Operations

38、public:void Close(); /退出服务器void SetParent(CSmtpDlg * pDlg);CMySocket();virtual CMySocket();/ Overridespublic:/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CMySocket)public:virtual void OnConnect(int nErrorCode);virtual void OnReceive(int nErrorCode);virtual void OnClose(int nErrorCo

39、de);/AFX_VIRTUAL/ Generated message map functions/AFX_MSG(CMySocket)/ NOTE - the ClassWizard will add and remove member functions here./AFX_MSG/ Implementationprotected:private:void AnalyzeMsg(); /分析从服务器发来的数据,做出响应的响应CSmtpDlg* m_pDlg; /指向主对话框的指针STATE state; /smtp会话的状态CBase64 coder; /进行Base64编码的变量;.My

40、Socket.cpp.#include smtpDlg.h /自己添加的包含语句#include Base64.h.#define MAX_BUFF 20000/CMySocket:CMySocket()CMySocket:CMySocket()m_pDlg = NULL;state=FIRST;error=连接不上服务器rn;/CMySocket:CMySocket()CMySocket:CMySocket()m_pDlg = NULL;./ CMySocket member functions/当套接字收到FD_CONNECT消息时,执行此函数,表明连接已建立/CMySocket:OnCo

41、nnect()void CMySocket:OnConnect(int nErrorCode) if(nErrorCode=0) m_pDlg-Display(S_CONNECT);/当套接字收到服务器发来的数据时,执行此函数/CMySocket:OnReceive()void CMySocket:OnReceive(int nErrorCode) if(nErrorCode=0) char buffMAX_BUFF; /接收缓冲区int rec=Receive(buff,MAX_BUFF); /接收服务器发来的数据buffrec=NULL; /结尾置为NULL。lastMsg=buff;An

42、alyzeMsg(); /分析收到的数据,作不同的处理 else error=接收期间发生了错误!rn;m_pDlg-Display(S_CLOSE); /显示信息/当关闭连接时,执行此函数/CMySocket:OnClose()void CMySocket:OnClose(int nErrorCode) if(nErrorCode=0) m_pDlg-Display(S_CLOSE);/使套接字类的对话框指针变量指向主对话框/CMySocket:SetParent()void CMySocket:SetParent(CSmtpDlg *pDlg)m_pDlg = pDlg;/退出服务器/CM

43、ySocket:Close()void CMySocket:Close()CString str;str.Format(quit%c%c,13,10);Send(LPCSTR)str,str.GetLength();m_pDlg-Display(S_CLOSE);state=FIRST;CAsyncSocket:Close();error=与服务器的连接已经断开rn;/分析服务器发来的数据,做出相应的处理/CMySocket:AnalyzeMsg()void CMySocket:AnalyzeMsg()CString s;strstream str;string check;strcheck;

44、/根据smtp会话所处的状态做出不同的处理switch(state)case FIRST: /如果已经连接成功,类初始化的时候state为FIRSTm_pDlg-Display(S_RECEIVE); /发送消息到窗体if(!(check=220) s.Format(EHLO %s%c%c,m_pDlg-m_strSender,13,10);Send(LPCSTR)s,s.GetLength(); /发送EHLO命令state=EHLO;break;case EHLO:m_pDlg-Display(S_RECEIVE);if(!(check=250) s.Format(AUTH LOGIN%c

45、%c,13,10); Send(LPCSTR)s,s.GetLength(); /发送AUTH LOGIN命令state=AUTH;break;case AUTH:m_pDlg-Display(S_RECEIVE);if(!(check=334) coder.Encode(m_pDlg-m_strUserName);s.Format(_T(%s%c%c), coder.EncodedMessage(),13,10);Send(LPCSTR)s,s.GetLength(); /发送用户名state=USER; break;case USER:m_pDlg-Display(S_RECEIVE);i

46、f(!(check=334) coder.Encode(m_pDlg-m_strPassword);s.Format(_T(%s%c%c), coder.EncodedMessage(),13,10);Send(LPCSTR)s,s.GetLength(); /发送口令state=PASS;break;case PASS:m_pDlg-Display(S_RECEIVE);if(!(check=235) s.Format(MAIL FROM:%c%c,m_pDlg-m_strAddr,13,10); Send(LPCSTR)s,s.GetLength(); /发送MAIL FROM命令stat

47、e=MAIL;break;case MAIL:m_pDlg-Display(S_RECEIVE);if(!(check=250) s.Format(RCPT TO: %c%c,m_pDlg-m_strReceiver,13,10); Send(LPCSTR)s,s.GetLength(); /发送RECP命令state=RCPT;break;case RCPT: m_pDlg-Display(S_RECEIVE);if(!(check=250) s.Format(DATA%c%c,13,10); Send(LPCSTR)s,s.GetLength(); /发送DATA命令state=DATA;

48、break;case DATA: m_pDlg-Display(S_RECEIVE);if(!(check=354) m_pDlg-GetHeader();state=QUIT;break;case QUIT: m_pDlg-Display(S_RECEIVE);if(!(check=250) s.Format(QUIT%c%c,13,10); Send(LPCSTR)s,s.GetLength(); /发送QUIT命令state=DATA;break;default:m_pDlg-Display(S_RECEIVE);break;4 CBase64类Base64.h.class CBase6

49、4 public:CBase64();virtual CBase64();/方法virtual void Encode(const PBYTE, DWORD);virtual void Decode(const PBYTE, DWORD);virtual void Encode(LPCSTR sMessage);virtual void Decode(LPCSTR sMessage);virtual LPSTR DecodedMessage() const;virtual LPSTR EncodedMessage() const;virtual LONG DecodedMessageSize(

50、) const;virtual LONG EncodedMessageSize() const;protected:/ Internal bucket class.class TempBucketpublic:BYTE nData4;BYTE nSize;void Clear() :ZeroMemory(nData, 4); nSize = 0; ;/变量PBYTE m_pDBuffer;PBYTE m_pEBuffer;DWORD m_nDBufLen;DWORD m_nEBufLen;DWORD m_nDDataLen;DWORD m_nEDataLen;static char m_Dec

51、odeTable256;static BOOL m_Init;/方法virtual void AllocEncode(DWORD);virtual void AllocDecode(DWORD);virtual void SetEncodeBuffer(const PBYTE pBuffer, DWORD nBufLen);virtual void SetDecodeBuffer(const PBYTE pBuffer, DWORD nBufLen);virtual void _EncodeToBuffer(const TempBucket &Decode, PBYTE pBuffer);vi

52、rtual ULONG _DecodeToBuffer(const TempBucket &Decode, PBYTE pBuffer);virtual void _EncodeRaw(TempBucket &, const TempBucket &);virtual void _DecodeRaw(TempBucket &, const TempBucket &);virtual BOOL _IsBadMimeChar(BYTE);void _Init();.Base64.cpp.static char Base64Digits = ABCDEFGHIJKLMNOPQRSTUVWXYZabc

53、defghijklmnopqrstuvwxyz+/;BOOL CBase64:m_Init = FALSE;char CBase64:m_DecodeTable256;#ifndef PAGESIZE#define PAGESIZE 4096#endif#ifndef ROUNDTOPAGE#define ROUNDTOPAGE(a) (a/4096)+1)*4096)#endif/ Construction/Destruction/CBase64:CBase64() : m_pDBuffer(NULL), m_pEBuffer(NULL), m_nDBufLen(0),m_nEBufLen(0)CBase64:CBase64()if (m_pDBuffer != NULL)delete m_pDBuffer;m_pDBuffer = NULL;if (m_pEBuffer != NULL)delete m_pEBuffer;m_pEBuffer = NULL;LPSTR CBase64:DecodedMessage() const return (LPSTR) m_pDBuffer;LPSTR CBase64:EncodedMessage() const return (LPSTR) m_pEBuffer;

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!