【发布时间】:2012-05-25 21:58:47
【问题描述】:
我正在尝试向我的电子邮件帐户发送一封简单的文本邮件,但由于某种原因我的代码无法正常工作。这就是我到目前为止所拥有的......
int SendStartUpMail(char* mailserver, int port, char* user, char* pass)
{
SOCKET sslSock;
SOCKADDR_IN sslInfo;
SSL_CTX *ctx;
SSL *ssl;
char bufferRecv[BUFFER_LEN];
char bufferSend[BUFFER_LEN];
int byte;
sslSock = openConnection(mailserver, port);
memset( bufferRecv, '\0', BUFFER_LEN );
byte = recv(sslSock,bufferRecv,BUFFER_LEN,0);
if(byte == SOCKET_ERROR)
return -1;
printf("%s\n",bufferRecv);
strcpy(bufferSend,"HELO\r\n");
send(sslSock,bufferSend,strlen(bufferSend),0);
memset( bufferRecv, '\0', BUFFER_LEN );
byte = recv(sslSock,bufferRecv,BUFFER_LEN,0);
if(byte == SOCKET_ERROR)
return -1;
printf("%s",bufferRecv);
strcpy(bufferSend,"STARTTLS\r\n");
send(sslSock,bufferSend,strlen(bufferSend),0);
memset( bufferRecv, '\0', BUFFER_LEN );
byte = recv(sslSock,bufferRecv,BUFFER_LEN,0);
if(byte == SOCKET_ERROR)
return -1;
printf("%s",bufferRecv);
SSL_library_init();
ctx = SSL_CTX_new(SSLv3_client_method());
if ( ctx == NULL )
return -1;
ssl = SSL_new(ctx);
if ( ssl == NULL )
return -1;
SSL_set_fd(ssl, sslSock);
if ( SSL_connect(ssl) == 1 )
{
strcpy(bufferSend,"HELO\r\n");
SSL_write(ssl,bufferSend,strlen(bufferSend));
memset( bufferRecv, '\0', BUFFER_LEN );
SSL_read(ssl,bufferRecv,BUFFER_LEN);
printf(">%s\n",bufferRecv);
strcpy(bufferSend,"AUTH LOGIN\r\n");
SSL_write(ssl,bufferSend,strlen(bufferSend));
memset( bufferRecv, '\0', BUFFER_LEN );
SSL_read(ssl,bufferRecv,BUFFER_LEN);
printf(">%s\n",bufferRecv);
strcpy(bufferSend,"USER c29tZXVzZXJuYW1lQGdtYWlsLmNvbQ==\r\n");
SSL_write(ssl,bufferSend,strlen(bufferSend));
memset( bufferRecv, '\0', BUFFER_LEN );
SSL_read(ssl,bufferRecv,BUFFER_LEN);
printf(">%s\n",bufferRecv);
strcpy(bufferSend,"PASS c29tZXBhc3N3b3Jk\r\n");
SSL_write(ssl, bufferSend,strlen(bufferSend));
memset( bufferRecv, '\0', BUFFER_LEN );
SSL_read(ssl,bufferRecv,BUFFER_LEN);
printf(">%s\n",bufferRecv);
}
else
{
printf("Error on SSL_connect\n");
SSL_free(ssl);
SSL_CTX_free(ctx);
close(sslSock);
return -1;
}
SSL_free(ssl);
SSL_CTX_free(ctx);
close(sslSock);
}
当我运行这段代码时,我会从 smtp 服务器收到一些消息:
> 220 mx.google.com ESMTP
> 250 mx.google.com at your service
> 220 2.0.0 Ready to Start TLS
> Conected with RC4-SHA encryption
> 250 mx.google.com at your service
> 334
> 334
> 535-5.7.1 Useername and Password not accepted
正如您所见,他们说我的密码和用户名错误,但我知道,这并没有错。 我在发送之前使用 base64 编码对我的用户名和密码进行编码,我使用此站点对其进行编码http://base64-encoder-online.waraxe.us/ 我使用端口 587。
我的问题是我还有其他事情要做吗??? 谢谢。
我也尝试过使用谷歌两步验证的应用程序专用密码,但仍然无法登录。
我尝试连接到 hotmail,但得到一个不同的错误,而不是错误 535 我得到 p>
451 请求操作中止:处理中的本地错误
【问题讨论】:
-
您是否在此处显示实际的用户名/密码?它们都以相同的6个字符开头,这看起来有点可疑。
-
不,我没有在这里使用实际的用户名和密码,但在我的应用程序中,我使用了正确的用户名和密码。我正在同时使用 winsock2 和 openssl
-
@JerryCoffin:据我所知,base64 电子邮件是:“someusername@gmail.com”和密码:“somepassword”,因此 beginning 相同。跨度>
-
@Morpfh:好的——有道理。我想我应该在问之前先解码它们......
-
如果我删除了身份验证登录,它将无法工作