我用socket编写了一个自动发邮件的程序,是无附件的,只是文本,服务器是smtp.gmail.com,但是最终还是不能成功,出现以下提示:530 5.7.0 Must issue a STARTTLS command first. 20sm13059wfi.16我的源程序如下:
#include <string>
#include <Winsock2.h>
#include <stdio.h>using std::string;void main()
{
string Serv="HELO 209.85.201.109\r\n";
string From="MAIL FROM:<[email protected]>\r\n";
string To="RCPT TO:<[email protected]>\r\n";
    string Text="你好\r\n\r\n.\r\n";
char *MailMessage[]=
{
const_cast<char*>(Serv.c_str()),
        const_cast<char*>(From.c_str()),
const_cast<char*>(To.c_str()),
"DATA\r\n",
const_cast<char*>(Text.c_str()),
"QUIT\r\n",
NULL
}; WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 1, 1 );

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) 
{          
return;
}
                                       

if ( LOBYTE( wsaData.wVersion ) != 1 ||
        HIBYTE( wsaData.wVersion ) != 1 ) 
{
WSACleanup( );
return; 
} SOCKET s=socket(AF_INET,SOCK_STREAM,0); SOCKADDR_IN sin;
sin.sin_addr.S_un.S_addr=inet_addr("209.85.201.109");
sin.sin_family=AF_INET;
sin.sin_port=htons(25); if(connect(s,(LPSOCKADDR)&sin,sizeof(SOCKADDR))==SOCKET_ERROR)
printf("error!\r\n"); int Length=0;
int End=0;
char sBuff[255]="";
int Msg=0; do
{
Length=recv(s,(LPSTR)sBuff+End,sizeof(sBuff)-End,0);
printf("%s",sBuff);
End+=Length;
sBuff[End]='\0'; send(s,(LPSTR)MailMessage[Msg],strlen(MailMessage[Msg]),0);
Msg++;
}while(MailMessage[Msg]); closesocket(s);
WSACleanup();
return;
}
请大家帮帮忙,我换了tom.com的还是不行,不过提示就出现不一样的.如下:
553 this mail is blocked by kbas system,blockid=cnapp12.tom.com.28482.1209482329另外我的程序里没进行身份验证,请问发送身份验证的格式应该如何写?谢谢大家!

解决方案 »

  1.   

    不要尝试用socket来做这个。如果你要做,必须对两个最基本的协议ESMTP和MIME非常熟悉,而熟悉这个是很难的。就验证而言则比普通邮件更难了,这是不同服务器要求不一样的,最普通的验证很容易做,但是人家服务器是否支持就难说了。这是要根据EHLO的返回值判断的,而你不熟悉EHLO和所有认证协议是解析不了这个的。这种邮件功能一般通过现有模块来做。对于Windows系统,我想CDOSYS是最简单的。你去MSDN搜索相关的文章慢慢学吧
      

  2.   

    我用socket编写了一个自动发邮件的程序,是无附件的,只是文本,服务器是smtp.gmail.com,但是最终还是不能成功,出现以下提示:530 5.7.0 Must issue a STARTTLS command first. 20sm13059wfi.16 
    ===============
    注意Start TLS Command.TLS即Transport Layer Security,建议使用OPENSSL.
      

  3.   

    使用这个吧:
    VC++ SMTP协议电子邮件传送剖析
    http://www.yesky.com/20021119/1640691.shtml
      

  4.   

    请问,楼上是如何解决这个问题啊?“530 5.7.0 Must issue a STARTTLS command first”