发送E-MAIL程序的设计

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

试验8发送E-MAIL程序的设计通过这次试验,要掌握按照支持SMTP认证的SMTP会话过程,发送E-MAIL协议命令的基本原理,其中E-MAIL帐号和密码要用BASE64编码,SMTP服务器可借助ISP提供(如:SMTP.163.com)。相关内容说明参考[RFC2554]规范中定义了SMTP的认证过程[2],但RFC2554中没有定义具体的认证参数。SMTP的认证功能主要是增加了AUTH命令,AUTH命令有多种用法,而且有多种认证机制,AUTH支持的认证机制主要有LOGIN,CRAM-MD5等。LOGIN是大多数免费邮件服务器都支持的,如163,263与新浪都支持。而新浪还支持CRAM-MD5机制。认证机制一般只在真正发送邮件之前进行,而且只需要执行一次。当认证成功后,即可按原来正常的处理发送邮件。原理是口令-应答(Challenge-Response),即会话的过程是发送文本来完成的,过程为交互式的请求应答模式,每次会话服务器总是返回一定的响应吗,表示客户端的请求是否被正确地应答,会话过程有一定的次序。由服务器发送命令要求客户端回答,客户端根据服务器发送信息进行回答,如果应答通过了,则认证成功,即可继续处理。下面对LOGIN机制作一个简单介绍。S:表示服务器返回,C:表示客户端发送,三位数字代码如334为服务器响应码。LOGIN口令-应答过程如下:1C:AUTHLOGIN2S:334dXNlcm5hbWU63C:bXlnOTQ=(假设邮箱名为”myg94”)4S:334cGFzc3dvcmQ65C:MzQ5OTA5Mg==(假设密码为”3499092”)6S:235Authenticationsuccessful.上述6个步骤的说明如下:1为客户端向服务器发送认证指令。2服务端返回base64编码串,成功的响应码为334。编码字符串解码后为“username:”,说明要求客户端发送用户名。3客户端发送用base64编码的用户名,此处为“myg94”。4服务端返回base64编码串,成功响应码为334。编码字符串解码后为“password:”,说明要求客户端发送用户口令。5客户端发送用base64编码的口令,此处为“3499092”。6成功后,服务端返回码为235,表示认证成功可以发送邮件了。在SMTP的[RFC821]中,在与邮件服务器连接成功后,第一个命令一般是“HELO”。但是在支持认证的邮件服务器中,第一个命令应改为“EHLO”。所以这时的SMTP会话过程应修改如下:1C:EHLO2S:2503C:AUTHLOGIN4S:334dXNlcm5hbWU65C:bXlnOTQ=(假设邮箱名为”myg94”)6S:334cGFzc3dvcmQ67C:MzQ5OTA5Mg==(假设密码为”3499092”)8S:235Authenticationsuccessful.9C:MAILFROM:netmao94@163.com10S:25011C:RCPTTO:MYG94@163.COM12S:25013C:DATA14S:35415C:QUIT16S:221S:表示服务器返回,C:表示客户端发送。参考程序运行界面如下:参考代码如下://将ok按钮改成发送按钮,然后发送具体信件voidCSMTPwithAttachDlg::OnOK(){//TODO:AddextravalidationhereCWaitCursorwc;UpdateData(true);//首先判断SMTP服务器是否为空,如果为空,则设定为默认值if(m_Server.IsEmpty()){m_Server=smtp.163.com;UpdateData(false);}else{//创建SMTP信息体,通过类来实现CSMTPMessage*pMessage=CreateMessage();//连接到服务器CSMTPConnectionconnection;//判断是否是自动拨号上网//if(m_bAutoDial)//connection.ConnectToInternet();UpdateData(true);m_IP=_T();BOOLbConnect=connection.Connect(m_Server,m_Authenticate,m_UID,m_PWD,m_Port,m_IP);//如果连接不成功if(!bConnect){CStringsMsg;sMsg.Format(_T(不能连接到服务器!,Error:%d),GetLastError());AfxMessageBox(sMsg,MB_ICONSTOP);}else{//发送具体信息if(!connection.SendMessage(*pMessage)){CStringsMsg;sMsg.Format(_T(发送信息失败!\nResponse:%s),connection.GetLastCommandResponse());AfxMessageBox(sMsg,MB_ICONSTOP);}}//删除消息体deletepMessage;}}//为了调试方便,程序运行的时候自动输入一些参数voidCSMTPwithAttachDlg::SetPara(){UpdateData(true);//开始进行初始化,为了方便程序调试,在程序运行后自动输入//m_Receiver=busywxp@163.com;m_CC=busywxp@sohu.com;m_Address=busywxp@163.com;m_Server=smtp.163.com;m_Port=25;m_Name=大熊;m_UID=busywxp;m_IP=ANY_IP_ADDRESS;m_bMime=false;m_bHTML=false;m_sEncodingFriendly=ChineseSimplified(GB2312);m_sEncodingCharset=gb2312;//m_UpdateData(false);}//创建一个新建发送体CSMTPMessage*CSMTPwithAttachDlg::CreateMessage(){//创建信息体CSMTPMessage*pMessage=newCSMTPMessage;CSMTPBodyPartattachment;//设定mine标志mimepMessage-SetMime(m_bMime);//设定信息和附件的编码方式pMessage-SetCharset(m_sEncodingCharset);attachment.SetCharset(m_sEncodingCharset);//获得各种基本信息pMessage-AddMultipleRecipients(m_Receiver,CSMTPMessage::TO);if(!m_CC.IsEmpty())pMessage-AddMultipleRecipients(m_CC,CSMTPMessage::CC);if(!m_BCC.IsEmpty())pMessage-AddMultipleRecipients(m_BCC,CSMTPMessage::BCC);if(!m_Title.IsEmpty())pMessage-m_sSubject=m_Title;if(!m_Letter.IsEmpty()){//表示是否以HTML的格式发送邮件if(m_bHTML)pMessage-AddHTMLBody(m_Letter,_T());elsepMessage-AddTextBody(m_Letter);}//增加附件,如果要发送附件if(!m_Attachment.IsEmpty())pMessage-AddMultipleAttachments(m_Attachment);//设定发送者地址if(m_Name.IsEmpty()){pMessage-m_From=m_Address;pMessage-m_ReplyTo=m_Address;}else{CSMTPAddressaddress(m_Name,m_Address);pMessage-m_From=address;pMessage-m_ReplyTo=address;}m_Authenticate=(CSMTPConnection::LoginMethod)m_Authenticate_1;//增加一个自定义头,测试用#ifdef_DEBUGpMessage-AddCustomHeader(_T(X-Program:CSTMPMessageTester));#endifreturnpMessage;}//选择服务器登陆方式voidDDX_CBData(CDataExchange*pDX,intnIDC,DWORD&dwItemData){HWNDhWndCtrl=pDX-PrepareCtrl(nIDC);if(pDX-m_bSaveAndValidate){dwItemData=0L;intnCurSel=(int)::SendMessage(hWndCtrl,CB_GETCURSEL,0,0L);if(nCurSel!=CB_ERR)dwItemData=::SendMessage(hWndCtrl,CB_GETITEMDATA,nCurSel,0L);}else{for(intnIndex=(int)::SendMessage(hWndCtrl,CB_GETCOUNT,0,0L)-1;nIndex=0;nIndex--){DWORDdwData=::SendMessage(hWndCtrl,CB_GETITEMDATA,nIndex,0L);if(dwData==dwItemData){::SendMessage(hWndCtrl,CB_SETCURSEL,nIndex,0L);break;}}if(nIndex0)//itemwasn'tfoundSendMessage(hWndCtrl,WM_SETTEXT,0,(LPARAM)(LPCSTR)???);}}//向下拉框中增加一些选项intCSMTPwithAttachDlg::CBAddStringAndData(CWnd*pDlg,intnIDC,LPCTSTRpszString,DWORDdwItemData){intnInserted=CB_ERR;CWnd*pComboBox=pDlg-GetDlgItem(nIDC);if(pComboBox){nInserted=(int)pComboBox-SendMessage(CB_ADDSTRING,0,(LPARAM)pszString);if(nInserted=0){if(pComboBox-SendMessage(CB_SETITEMDATA,nInserted,dwItemData)==CB_ERR)nInserted=CB_ERR;}}returnnInserted;}//打开选择附件的对话框voidCSMTPwithAttachDlg::OnBrowerFile(){CDataExchangeDX(this,TRUE);DDX_Text(&DX,IDC_EDIT_Attachment,m_Attachment);CFileDialogdlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T(AllFiles(*.*)|*.*||));if(dlg.DoModal()==IDOK){CStringsNewFile=dlg.GetPathName();if(m_Attachment.GetLength()){m_Attachment+=_T(,);m_Attachment+=sNewFile;}elsem_Attachment=sNewFile;//UpdatetheUICDataExchangeDX2(this

1 / 7
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功