我正在尝试使用libetpan库和下面的代码通过Google服务器发送电子邮件。但是,当我运行mailsmtp_auth时,它返回16(MAILSMTP_ERROR_AUTH_NOT_SUPPORTED)。有什么想法吗?我使用相同的库让IMAP运行得很好,但是由于某些原因,SMTP正在逃避我。我在网上找到了很多样本,但似乎没有一个适用于Gmail。
int ret;
mailsmtp *smtp = NULL;
mailstream_low * low;
int fd;
mailstream_low * new_low;
char smtp_server[100] = "smtp.gmail.com";
char smtp_user[100] = "user";
char smtp_pass[100] = "password";
char smtp_email[100] = "user@gmail.com";
char body[100] = "Test email";
if ( (smtp = mailsmtp_new(0,NULL)) == NULL ){
return FALSE;
}
if ( (ret = mailsmtp_socket_connect(smtp, smtp_server, 587) != MAILSMTP_NO_ERROR ) ){
fprintf(stderr, "mail_socket_connect: %s\n", mailsmtp_strerror(ret) );
mailsmtp_free(smtp);
return FALSE;
}
ret = mailesmtp_ehlo(smtp);
if (ret != MAIL_NO_ERROR) {
fprintf(stderr, "mailsmtp_helo: %s\n", mailsmtp_strerror(ret) );
mailsmtp_free(smtp);
return FALSE;
}
ret = mailesmtp_starttls(smtp);
if ( ret != MAIL_NO_ERROR ) {
fprintf(stderr, "mailsmtp_starttls: %s\n", mailsmtp_strerror(ret) );
mailsmtp_free(smtp);
return FALSE;
}
// THIS IS WHERE THE ERROR OCCURS
ret = mailsmtp_auth(smtp, smtp_user, smtp_pass);
if ( ret != MAIL_NO_ERROR ) {
fprintf(stderr, "mailsmtp_auth: %s\n", mailsmtp_strerror(ret) );
mailsmtp_free(smtp);
return FALSE;
}
ret = mailsmtp_mail(smtp, smtp_email);
if ( ret != MAIL_NO_ERROR ) {
fprintf(stderr, "mailsmtp_mail: %s\n",mailsmtp_strerror(ret) );
mailsmtp_free(smtp);
return FALSE;
}
ret = mailsmtp_rcpt(smtp, smtp_email);
if ( ret != MAIL_NO_ERROR ) {
fprintf(stderr, "mailsmtp_rcpt: %s\n",mailsmtp_strerror(ret) );
mailsmtp_free(smtp);
return FALSE;
}
ret = mailsmtp_data(smtp);
if ( ret != MAIL_NO_ERROR ) {
fprintf(stderr, "mailsmtp_data: %s\n", mailsmtp_strerror(ret) );
mailsmtp_free(smtp);
return FALSE;
}
ret = mailsmtp_data_message(smtp, body, strlen(body));
if (ret != MAIL_NO_ERROR ) {
fprintf(stderr, "mailsmtp_data_meassage: %s\n", mailsmtp_strerror(ret) );
mailsmtp_free(smtp);
return FALSE;
}
return TRUE;
--------------------------------------
[编辑#1]:SASL
--------------------------------------
我已经设法通过编辑libetpan的源代码并在其代码库中修复Win32的一些问题来实现ALMOST工作(一旦我100%工作,我将发布结果)。但是,Gmail似乎需要SASL。在Windows中进行编译时,没有关于在libetpan中包含SASL支持的文档(Visual Studio 2010),而且我在查找任何特定于Windows的信息时遇到了很多麻烦。
获得SASL的最简单方法是什么?是否有预编译/预建的Windows SASL .lib文件,我可以使用标准的sasl.h文件吗?
谢谢, 本
答案 0 :(得分:0)
首先尝试拨打mailsmtp_init
,然后在mailesmtp_ehlo
之后调用mailesmtp_starttls
,如下所示:
if ( (ret = mailsmtp_ssl_connect(smtp, smtp_server, 587 ) != MAILSMTP_NO_ERROR ) ){
fprintf(stderr, "mail_ssl_connect: %s\n", mailsmtp_strerror(ret) );
mailsmtp_free(smtp);
return FALSE;
}
ret = mailsmtp_init(smtp );
if (ret != MAILSMTP_NO_ERROR) {
fprintf(stderr, "mailsmtp_init: %s\n", mailsmtp_strerror(ret) );
mailsmtp_free(smtp);
return FALSE;
}
ret = mailesmtp_starttls(smtp);
if ( ret != MAIL_NO_ERROR ) {
fprintf(stderr, "mailsmtp_starttls: %s\n", mailsmtp_strerror(ret) );
mailsmtp_free(smtp);
return FALSE;
}
ret = mailesmtp_ehlo(smtp);
if (ret != MAIL_NO_ERROR) {
fprintf(stderr, "mailsmtp_helo: %s\n", mailsmtp_strerror(ret) );
mailsmtp_free(smtp);
return FALSE;
}
ret = mailsmtp_auth(smtp, smtp_user, smtp_pass);
if ( ret != MAIL_NO_ERROR ) {
fprintf(stderr, "mailsmtp_auth: %s\n", mailsmtp_strerror(ret) );
mailsmtp_free(smtp);
return FALSE;
}
ret = mailsmtp_mail(smtp, smtp_email);
if ( ret != MAIL_NO_ERROR ) {
fprintf(stderr, "mailsmtp_mail: %s\n",mailsmtp_strerror(ret) );
mailsmtp_free(smtp);
return FALSE;
}