gpt4 book ai didi

c - libetpan 和 Gmail SMTP(现在带有 SASL)

转载 作者:行者123 更新时间:2023-11-30 17:56:42 36 4
gpt4 key购买 nike

我正在尝试使用 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 文件?

谢谢,本

最佳答案

尝试先调用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;
}

关于c - libetpan 和 Gmail SMTP(现在带有 SASL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13318106/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com