发送电子邮件的程序实例
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
发送电子邮件的程序
一、程序界面设计
smtp电子邮件发送程序的用户界面
填入smtp服务器地址、邮箱用户名和口令,端口号是25,并填入发信人,发信地址填入你在该网站的免费邮箱地址。在对话框的右面填入发送电子邮件的相关信息,选择一个附件,然后点击“发送”按钮,程序会与服务器建立TCP连接,然后按照ESMTP协议发送ELHO命令,然后发送用户名和口令,经过验证,进入SMTP会话。通过命令交互,将邮件和附件发送出去,然后断开连接。在此过程中,右下方的多文本列表框(RichTextBox)会显示全部的会话信息。
现在的SMTP服务器与以前不一样,一般都要经过验证身份后,才为你提供传输邮件的服务,验证的方法有很多种,这里只实现了一种,仅仅为了说明问题。
程序实现的技术要点是:
1.运用Windows的消息驱动机制
2.通过状态转换来控制会话命令的发布顺序
3.实现了base64编码和译码。
二、创建应用程序的过程
1.使用MFC AppWizard创建应用程序框架
工程名是Smtp,应用程序的类型是基于对话框的,对话框的标题是“电子邮件发送客
户端程序”,需要Windows Sockets的支持,其它部分接受系统的默认设置就可以。向导自动为应用程序创建了两个类:
应用程序类:CSmtpApp,基类是CWinApp,对应的文件是Smtp.h和Smtp.cpp。
对话框类:CSmtpDlg,基类是CDialog,对应的文件是SmtpDlg.h和SmtpDlg.cpp。
2.为对话框添加控件
在程序的主对话框界面中添加相应的控件对象,并按照下表修改控件的属性。
3.定义控件的成员变量
为对话框中的控件对象定义相应的成员变量。
4.为控件对象添加事件响应函数
5.Base64编码和解码
创建一个普通的类,用来实现base64编码和解码。
6.创建CMySocket类
为了能够捕获并响应socket事件,应创建用户自己的套接字类,可利用类向导添加。
Class Type选择MFC Class,类名为CMySocket,基类是CAsyncSocket类,创建后对应的文件是MySocket.h和MySocket.cpp。在利用类向导为CMySocket类添加OnConnect,OnClose和OnReceive三个事件处理函数,并为它添加一般的成员函数和变量。可参看下一小节的程序代码。
7.手工添加包含语句以及事件函数和成员函数的代码
8.分阶段编译执行,进行测试
三、程序清单
1.CSmtpApp应用程序类
Smtp.h
Smtp.cpp
//CSmtpApp::InitInstance()
添加一句初始化多文本框控件的函数。
BOOL CSmtpApp::InitInstance()
{
if (!AfxSocketInit())
{
AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
return FALSE;
}
AfxEnableControlContainer(); //MFC自动创建的代码
AfxInitRichEdit(); //用户自己添加的...............
}
2.CSmtpDlg对话框类
SmtpDlg.h
.................
#include "MySocket.h" //自己添加的包含语句
#include "Base64.h" //自己添加的包含语句
...............
class CSmtpDlg : public CDialog
{
// Construction
public:
void Display(LONG flag); //显示信息
void GetHeader(); //创建电子邮件的头部
CMySocket smtpSocket; //套接字类对象
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_strPassword; //口令
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 OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnButtonView(); //点击“浏览”按钮时执行
virtual void OnOK(); //点击“发送“按钮时执行
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
CBase64 coder; //进行Base64编码的变量
BOOL GetBody(LPSTR& pszBody, int& nBodySize);//构造邮件体};
..............