2012-11-10 52 views
0

我正在嘗試使用libetpan庫和下面的代碼通過Google服務器發送電子郵件。但是,當我運行mailsmtp_auth時,它返回16(MAILSMTP_ERROR_AUTH_NOT_SUPPORTED)。任何想法爲什麼?我已經使用相同的庫運行IMAP,但由於某些原因,SMTP正在逃避我。我在網上發現了很多示例,但它們都不適用於Gmail。libetpan和Gmail SMTP(現在與SASL)

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] = "[email protected]"; 
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文件?

感謝, 本

回答

0

嘗試調用mailsmtp_init第一,然後調用mailesmtp_ehlomailesmtp_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; 
} 
+0

感謝您的答覆。我試過了,但是現在在mailesmtp_ehlo命令上得到MAILSMTP_ERROR_STREAM(3)。 – Fmstrat

+0

我還嘗試了一些代碼我在網上找到,即具有「\t低= mailstream_get_low(SMTP的>流); \t FD = mailstream_low_get_fd(低); \t new_low = mailstream_low_tls_open(FD); \t mailstream_low_free(低); \t mailstream_set_low(smtp-> stream,new_low);「之前的「ehlo」,但只是導致mailesmtp_ehlo命令崩潰的應用程序。這個樣本也有ehlo,而不是helo。 – Fmstrat

+0

其實,我剛剛意識到你在連接中將「套接字」更改爲「ssl」。使用「ssl」,libetpan庫實際上崩潰了.. – Fmstrat