为何无法成功发送电子邮件
编号:QA004110
建立日期: 2001年4月15日 最后修改日期:2001年4月15日
所属类别:
Zhao Lei:
操作系统:windows98
编程工具:vc++6.0
问题:如下代码为何无法成功发送电子邮件?
CString string1,string2;
////////////////////////////////
//-----------------------------
//connect
CSocket socket;
socket.Create();
socket.Connect("smtp.263.net",25);
//-----------------------------
//send mail order
string1="MAIL From: <aboywaitinggirl@263.net>\r\n";
socket.Send(string1,string1.GetLength());
//-----------------------------
//send rcpt order
string1="RCPT TO: <aboywaitinggirl@263.net>\r\n";
socket.Send(string1,string1.GetLength());
//-----------------------------
//send data order
string1="DATA\r\n";
socket.Send(string1,string1.GetLength());
//----------------------------
//send header
//............................
//寄信人地址
string1="寄信人地址: ;
//............................
//收信人地址
信人地址: sFriendly<sEamil(to)>,sFriendly<sEmail>\r\n";
string2="收信人地址: ABoyWaitingGirl@263.net<ABoyWaitingGirl@263.net>\r\n";
string1+=string2;
//............................
//日期
CTime m_tDateTime;
m_tDateTime = m_tDateTime.GetCurrentTime();
string2= _T( "日期: " );
string2+= m_tDateTime.Format( "%a, %d %b %y %H:%M:%S %Z" );
string2+="\r\n";
string1+=string2;
//............................
//主题
string2="主题:无\r\n";
string1+=string2;
socket.Send(string1,string1.GetLength());
//----------------------------
//send body
string1="Received?\r\n";
socket.Send(string1,string1.GetLength());
//----------------------------
//tell the server this is the end of the mail
string1="\r\n.\r\n";
socket.Send(string1,string1.GetLength());
//-----------------------------
//Close the socket
socket.Close();
pointer->MessageBox("OK");
////////////////////////////////
回答:
这是SMTP协议的问题,请参照以下内容:
步骤:
1.用'HELO 用户名\r\n'向服务发出请求,(注:如果是需要验证的SMTP服务器,应用'EHLO 用户名\r\n'.
2.检查服务器返回信息是否OK(注:如果是多行返回的话,前面若干行均由'-'字符打头,最后一行没有此字符,另外,对不同的命令,表示成功的前缀并不相同,这一点上SMTP协议不如POP协议的“+OK”,“-ERR”方便。需要自己调试摸索)。以后每个都应检查是否成功。
3.如果需要验证,则发出验证命令,服务器会在返回的信息中告诉你用什么类型的验证方法。
4.MAIL FROM:<邮件地址>\r\n
5.RCPT TO:<邮件地址>\r\n 可以重复若干个不同的地址。
6.DATA\r\n
7.发数据。。。
8.发数据"\r\n.\r\n"告诉服务器数据发送结束。(不要忘记)。
9.QUIT\r\n
注意:你的套接字应创建成阻塞式,否则在第7步会出现数据发丢的情况,因为非阻塞式的套接字只是将数据先发给WSOCK.DLL再由WSOCK.dll发出去。
我有自己写的源代码。
(主持人注:你应该按照上面介绍的步骤检查服务器的返回信息,事实上你的问题是263的服务器需要身份认证,参考QA003775 "怎样增加smtp身份认证功能"。)
此问题由李海回答。
| |
|
|
| |
|
|