【问题标题】:libetpan and Gmail SMTP (now with SASL)libetpan 和 Gmail SMTP(现在使用 SASL)
【发布时间】:2012-10-30 08:45:48
【问题描述】:

我正在尝试使用 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 的一些问题来完成这项工作(一旦我得到 100% 的工作,我将发布结果)。但是,Gmail 似乎需要 SASL。在 Windows (Visual Studio 2010) 中编译时,没有关于在 libetpan 中包含 SASL 支持的文档,而且我在在线查找任何特定于 Windows 的信息时遇到了很多麻烦。

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

谢谢, 本

【问题讨论】:

    标签: c visual-studio-2010 email smtp sasl


    【解决方案1】:

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

    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;
    }
    

    【讨论】:

    • 感谢您的回复。我试过这个,但现在在 mailesmtp_ehlo 命令上得到一个 MAILSMTP_ERROR_STREAM (3)。
    • 我还尝试了一些我在网上找到的代码,其中包含“low = mailstream_get_low(smtp->stream); fd = mailstream_low_get_fd(low); new_low = mailstream_low_tls_open(fd); mailstream_low_free(low); mailstream_set_low (smtp->stream, new_low);"在“ehlo”之前,但这只会导致 mailesmtp_ehlo 命令使应用程序崩溃。该样本也首先有 ehlo,而不是 helo。
    • 实际上,我刚刚意识到您在连接中将“socket”更改为“ssl”。使用“ssl”,libetpan 库实际上崩溃了..
    猜你喜欢
    • 2018-06-23
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 2012-01-24
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多