使用SMTP发送电子邮件

描述SMTP的基本操作,有如下常见的情景。假如Alice想给Bob发送一封简单的ASCII报文:

1)Alice启动她的邮件代理服务器并提供Bob的邮件地址(例如:***@163.com),撰写邮件,通过用户代理发送该邮件。

2)Alice的用户代理把报文发送给Alice的邮件服务器,该邮件再这里被放在报文发送队列中。

3)运行在Alice邮件服务器上的SMTP客户端发现了在报文队列中的该报文,他就创建一个到运行在Bob的邮件服务器上的SMTP服务器的TCP连接。

4)在经过一些初始SMTP握手后,SMTP客户端通过该TCP连接发送Alice的报文。

5)在Bob的有劲啊服务器上,SMTP的服务器接收该报文,Bob的邮件服务器然后将该报文放入Bob的邮箱中。

6)再Bob方便的时候,他调用用户代理阅读该报文。

如下图所示:

下面简单介绍发送邮件时,6步操作的具体内容。

SMTP客户机(运行在发送方邮件服务器上)在25号端口建立一个到SMTP的服务器(运行在接收方邮件服务器上)的TCP连接。如果某服务器没有开机,客户机会再稍后继续尝试连接。一旦连接建立,服务器与客户机之间执行一些应用层的握手操作,相互进行自我介绍,然后再发送数据报文。在SMTP握手阶段,SMTP客户机指明发送方的邮件地址(产生报文的用户)和接收方的邮件地址。一旦该SMTP客户机和服务器彼此介绍之后,客户机发送该报文。SMTP能利用TCP提供的可靠数据传输无差错地将邮件投递到服务器。该客户机如果有另外的报文要发送到该服务器,就在该相同的TCP连接上重复当前处理;否则,它指示TCP关闭连接。

SMTP客户机(C)和SMTP服务器(S)之间交换报文脚本的例子:客户机的主机名为crepes.fr,服务器的主机名为hamburger.edu。以c:开头的ASCII码文本行就是客户机交给其TCP套接字的哪些行,以s:开头的ASCII码则是服务器发送给其TCP套接字的哪些行,一旦TCP连接起来,就开始了下列过程:

S:220 hamburger.edu
C:HLo crepes.fr
S:250 Hello crepes.fr, pleased to meet you
C:MAIL FROM: <alice@crepes.fr> 
S:250 alice@crepes.fr  ···  Sender  ok
C:RCPT TO: <bob@hamberger.edu ... Recipient ok
C:DATA
S:354 Enter mail, end with "." on a line by itself
C:Do you like ketchup?
C:How about pickles?
C:.
S:250 Message accepted for delivery
C:QUIT
S:221 hamburger.edu closing connection

在客户机向服务器发送数据时,客户机向服务器发送了5条命令:HELO(Hello的缩写)、MAIL FROM、RCPT TO、 DATA以及QUIT。这些命令都是自解释的。客户机发送一个只包含一个句点的行,告诉服务器该报文结束了(按照ASCII码的表示方法,每个报文用CRLF.CRLF结束,其中的CR和LF分别表示回车和换行)。需要指出的是SMTP用的是持久连接:如果发送邮件的服务器有几个报文发往同一个接收邮件的服务器,他可以通过同一个TCP连接发送所有这些报文。对每个报文,客户机都用一个新的MAIL FROM:crepes.fr开始,类似,独立的一个句点表示报文发送结束,当所有邮件发送完成后才发送QUIT。

 

 

实现步骤:1 创建一个对话框程序,把MailMessage.h/MailMessage.cpp和SMTP.h/SMTP.cpp加入到工程中。2 添加如图所示得一些控件IDC_COMBO_SERVERIDC_COMBO_FROMIDC_COMBO_TOIDC_COMBO_SUBJECTIDC_EDIT_BODYIDSEND3 为各个组合框控件添加变量 CComboBox m_ctrlComboTo; CComboBox m_ctrlComboSubject; CComboBox m_ctrlComboServer; CComboBox m_ctrlComboFrom; CString m_strComboFrom; CString m_strComboServer; CString m_strComboSubject; CString m_strComboTo; CString m_strEditBody;并在构造函数中初始化 m_strComboFrom = _T(""); m_strComboServer = _T(""); m_strComboSubject = _T(""); m_strComboTo = _T(""); m_strEditBody = _T("");4 在SMTPEMailDlg.h中加入 #include "MailMessage.h" #include "SMTP.H"再在CSMTPEMailDlg::OnInitDialog()中加入: m_ctrlComboServer.InsertString(0,"mail.czvc.com"); m_ctrlComboServer.InsertString(1,"smtp.sina.com.cn"); m_ctrlComboServer.InsertString(2,"smtp.163.com"); m_ctrlComboServer.InsertString(3,"smtp.sohu.com"); m_ctrlComboServer.InsertString(4,"smtp.163.net"); m_ctrlComboServer.InsertString(5,"smtp.263.net"); m_ctrlComboServer.InsertString(6,"smtp.yahoo.com.cn"); m_ctrlComboServer.InsertString(7,"smtp.21cn.com"); m_ctrlComboServer.InsertString(8,"mail.fm365.com"); m_ctrlComboServer.InsertString(9,"smtp.elong.com"); m_ctrlComboServer.InsertString(10,"smtp.etang.com"); m_ctrlComboServer.InsertString(11,"smtp.yahoo.com"); //发送人信箱 m_ctrlComboFrom.InsertString(0,""); m_ctrlComboFrom.InsertString(1,""); //接受人信箱,当然您可以在此添加更多的接受信箱:) m_ctrlComboTo.InsertString(0,";"); m_ctrlComboSubject.InsertString(0,"嗨,你好!"); m_ctrlComboSubject.InsertString(1,"好久不见,近来可好?"); m_ctrlComboSubject.InsertString(2,"久违了,老兄!"); m_ctrlComboSubject.InsertString(3,"新年快乐!"); m_ctrlComboSubject.InsertString(4,"小妹妹你好!"); m_ctrlComboSubject.InsertString(5,"朋友,你现在还好吗?"); m_ctrlComboSubject.InsertString(6,"你好,可以和你做个朋友吗?"); m_ctrlComboSubject.InsertString(7,"我爱你!"); m_ctrlComboSubject.InsertString(8,"亲爱的,我想你!"); m_ctrlComboSubject.InsertString(9,"可以认识你吗?"); m_ctrlComboSubject.InsertString(10,"Are you girl?"); m_ctrlComboSubject.InsertString(11,"Hi, nice to see you!");5 发送按钮得消息响音函数:void CSMTPEMailDlg::OnSend() { UpdateData( TRUE ); CSMTP smtp( m_strComboServer ); CMailMessage msg; msg.m_sFrom = m_strComboFrom; msg.AddMultipleRecipients( m_strComboTo ); msg.m_sSubject = m_strComboSubject; msg.m_sBody = m_strEditBody; if( !smtp.Connect() ) { AfxMessageBox( smtp.GetLastError() ); return; } if( !smtp.SendMessage( &msg ) ) { AfxMessageBox( smtp.GetLastError() ); return; } if( !smtp.Disconnect() ) { AfxMessageBox( smtp.GetLastError() ); return; } AfxMessageBox( _T( "邮件发送成功!") ); //以下几行代码可选 //m_strComboTo = ""; //m_strComboSubject = ""; //m_strEditBody = ""; //UpdateData( FALSE ); //m_ctrlComboTo.SetFocus(); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值