首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(现在使用SASL)

(现在使用SASL)
EN

Stack Overflow用户
提问于 2012-11-10 00:49:32
回答 1查看 845关注 0票数 0

我试图使用libetpan库和下面的代码通过Google服务器发送电子邮件。但是,当我运行mailsmtp_auth时,它返回16 (MAILSMTP_ERROR_AUTH_NOT_SUPPORTED)。知道为什么吗?我已经让IMAP在使用同一个库时运行得很好,但是SMTP出于某种原因正在避开我。我在网上发现了很多样本,但似乎没有一个适用于Gmail。

代码语言:javascript
复制
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在它的代码库中的一些问题(我将在100%工作后发布结果),使它几乎可以工作。然而,Gmail似乎需要SASL。在windows中编译时,没有关于在libetpan中包含SASL支持的文档(Visual 2010),而且我在在线查找任何特定于Windows的信息时遇到了很多困难。

获得SASL的最简单方法是什么?是否有预编译/预编译的windows SASL .lib文件可以与标准sasl.h文件一起使用?

谢谢,本

EN

回答 1

Stack Overflow用户

发布于 2012-11-10 01:07:03

尝试先调用mailsmtp_init,然后在mailesmtp_starttls之后调用mailesmtp_ehlo,如下所示:

代码语言:javascript
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13318106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档