发送E-MAIL程序的设计_第1页
发送E-MAIL程序的设计_第2页
发送E-MAIL程序的设计_第3页
发送E-MAIL程序的设计_第4页
发送E-MAIL程序的设计_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、试验8 发送E-MAIL程序的设计相关内容说明参考RFC 2554规范中定义了SMTP的认证过程2,但RFC 2554 中没有定义具体的认证参数。SMTP的认证功能主要是增加了AUTH命令,AUTH命令有多种用法,而且有多种认证机制,AUTH支持的认证机制主要有LOGIN,CRAM-MD5等。 LOGIN是大多数免费邮件服务器都支持的,如163,263与新浪都支持。而新浪还支持CRAM-MD5机制。认证机制一般只在真正 发送邮件之前进行,而且只需要执行一次。当认证成功后,即可按原来正常的处理发送邮件。原理是口令-应答(Challenge-Response),即会话的过程是发送文本来完成的,过程

2、为交互式的请求应答模式,每次会话服务器总是返回一定的响应吗,表示客户端的请求是否被正确地应答,会话过程有一定的次序。由服务器发送命令要求客户端回答,客户端根据服务器发送信息进行回答,如果应答通过了,则认证成功,即可继续处理。下面对LOGIN机制作一个简单介绍。S:表示服务器返回,C:表示客户端发送 ,三位数字代码如334为服务器响应码。LOGIN 口令-应答过程如下: 1 C: AUTH LOGIN 2 S: 334 dXNlcm5hbWU6 3 C: bXlnOTQ= (假设邮箱名为”myg94”) 4 S: 334 cGFzc3dvcmQ6 5 C: MzQ5OTA5Mg= (假设密码为”

3、3499092”) 6 S: 235 Authentication successful. 上述6个步骤的说明如下:1 为客户端向服务器发送认证指令。 2 服务端返回base64编码串,成功的响应码为334。编码字符串解码后为“username:”,说明要求客户端发送用户名。 3 客户端发送用base64编码的用户名,此处为“myg94”。 4 服务端返回base64编码串,成功响应码为334。编码字符串解码后为“password:”,说明要求客户端发送用户口令。 5 客户端发送用base64编码的口令,此处为“3499092”。 6 成功后,服务端返回码为235,表示认证成功可以发送邮件了。

4、在SMTP的RFC 821中,在与邮件服务器连接成功后,第一个命令一般是“HELO”。但是在支持认证的邮件服务器中,第一个命令应改为“EHLO”。所以这时的SMTP 会话过程应修改如下:1 C: EHLO2 S: 2503 C: AUTH LOGIN4 S: 334 dXNlcm5hbWU65 C: bXlnOTQ= (假设邮箱名为”myg94”)6 S: 334 cGFzc3dvcmQ67 C: MzQ5OTA5Mg= (假设密码为”3499092”)8 S: 235 Authenticationsuccessful. 9 C10 S: 25011 C12 S: 25013 C: DATA1

5、4 S: 35415 C: QUIT16 S: 221S:表示服务器返回,C:表示客户端发送。参考程序运行界面如下:参考代码如下:/将ok按钮改成发送按钮,然后发送具体信件void CSMTPwithAttachDlg:OnOK() / TODO: Add extra validation hereCWaitCursor wc;UpdateData(true);/首先判断SMTP服务器是否为空,如果为空,则设定为默认值if (m_Server.IsEmpty()UpdateData(false);else/创建SMTP信息体,通过类来实现CSMTPMessage* pMessage = Cre

6、ateMessage();/连接到服务器CSMTPConnection connection;/判断是否是自动拨号上网/if (m_bAutoDial)/connection.ConnectToInternet();UpdateData(true);m_IP=_T();BOOL bConnect = connection.Connect(m_Server, m_Authenticate, m_UID, m_PWD, m_Port, m_IP);/如果连接不成功if (!bConnect) CString sMsg;sMsg.Format(_T(不能连接到服务器!, Error:%d), Get

7、LastError(); AfxMessageBox(sMsg, MB_ICONSTOP);else /发送具体信息if (!connection.SendMessage(*pMessage) CString sMsg;sMsg.Format(_T(发送信息失败!nResponse:%s), connection.GetLastCommandResponse();AfxMessageBox(sMsg, MB_ICONSTOP); /删除消息体 delete pMessage;/为了调试方便,程序运行的时候自动输入一些参数void CSMTPwithAttachDlg:SetPara ()Upd

8、ateData(true);/开始进行初始化,为了方便程序调试,在程序运行后自动输入/m_Receiver=busywxp;m_CC=busywxp;m_Address=busywxp;m_Port=25;m_Name=大熊;m_UID=busywxp;m_IP=ANY_IP_ADDRESS;m_bMime=false;m_bHTML=false;m_sEncodingFriendly=Chinese Simplified (GB2312); m_sEncodingCharset=gb2312;/m_UpdateData(false);/创建一个新建发送体CSMTPMessage* CSMTP

9、withAttachDlg:CreateMessage()/创建信息体CSMTPMessage* pMessage = new CSMTPMessage;CSMTPBodyPart attachment; /设定mine标志mime pMessage-SetMime(m_bMime); /设定信息和附件的编码方式 pMessage-SetCharset(m_sEncodingCharset); attachment.SetCharset(m_sEncodingCharset); /获得各种基本信息pMessage-AddMultipleRecipients(m_Receiver, CSMTPM

10、essage: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, _

11、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 CSMTPAddress address(m_Name, m_Address);pMessage-m_From = address;pMessage-m_Re

12、plyTo = address;m_Authenticate=(CSMTPConnection:LoginMethod) m_Authenticate_1;/增加一个自定义头,测试用#ifdef _DEBUGpMessage-AddCustomHeader(_T(X-Program: CSTMPMessageTester);#endifreturn pMessage;/选择服务器登陆方式void DDX_CBData(CDataExchange* pDX, int nIDC, DWORD& dwItemData)HWND hWndCtrl = pDX-PrepareCtrl(nIDC);if

13、(pDX-m_bSaveAndValidate)dwItemData = 0L;int nCurSel = (int) :SendMessage(hWndCtrl, CB_GETCURSEL, 0, 0L);if (nCurSel != CB_ERR)dwItemData = :SendMessage(hWndCtrl, CB_GETITEMDATA, nCurSel, 0L);elsefor (int nIndex = (int) :SendMessage(hWndCtrl, CB_GETCOUNT, 0, 0L) - 1; nIndex = 0; nIndex-)DWORD dwData

14、= :SendMessage(hWndCtrl, CB_GETITEMDATA, nIndex, 0L);if (dwData = dwItemData):SendMessage(hWndCtrl, CB_SETCURSEL, nIndex, 0L);break;if (nIndex GetDlgItem(nIDC); if (pComboBox) nInserted = (int) pComboBox-SendMessage(CB_ADDSTRING, 0, (LPARAM) pszString); if (nInserted = 0) if (pComboBox-SendMessage(C

15、B_SETITEMDATA, nInserted, dwItemData) = CB_ERR) nInserted = CB_ERR; return nInserted;/打开选择附件的对话框void CSMTPwithAttachDlg:OnBrowerFile() CDataExchange DX(this, TRUE); DDX_Text(&DX, IDC_EDIT_Attachment, m_Attachment);CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T(All Files (*.*)|*.*|);if (dlg.DoModal() = IDOK) CS

温馨提示

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

评论

0/150

提交评论