0

我正在尝试向 libcurl 提供一长串电子邮件(其中一些最终不存在)。如果有任何无效的电子邮件,整个脚本就会死掉。

我可以为每个电子邮件地址重新连接到 SMTP 服务器(处理正确),但这只是愚蠢的低效。

我的相关代码如下:

// necessary simple curl setup completed above
// assume all referenced variables have been initialized

// init cURL server connection
curl_easy_setopt(curl, CURLOPT_URL, SMTPSERVER);
curl_easy_setopt(curl, CURLOPT_MAIL_FROM, MAILFROM);

curl_easy_setopt(curl, CURLOPT_WRITEHEADER, stdout);

char tmp[EMAIL_STR_LEN+3] = {0}; tmp[0] = '<';
while( fgets(&tmp[1], EMAIL_STR_LEN+1, emails) ){
        // '>' overwrites '\0' from fgets()
        tmp[EMAIL_STR_LEN-1] = '>';

        strncpy(current->email, tmp, EMAIL_STR_LEN+3);

        // malloc next link
        current->next = initemail();
        current = current->next;

        // remove \n\0 from stream
        fseek(emails, 2, SEEK_CUR);
}
fclose(emails);

current = head;
while(current){
        recipients = curl_slist_append(recipients, (const char *) current->email);
        current = current->next;
}

curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients);
curl_easy_perform(curl);

// clean up stuff

执行上述操作,但curl_easy_perform要调用一个电子邮件收件人,然后将变量置空并处理下一封电子邮件即可。唯一的问题是 libcurl 每次都重新连接到 SMTP 服务器,从而增加了处理的大量开销。

我在一个电子邮件线程的某处发现了这个“功能”,但这是一个相当过时的回复。我想知道是否有解决此问题的好方法,或者我是否只是在做一些愚蠢的事情。谢谢!

4

1 回答 1

1

您遇到了KNOWN_BUG #79:

SMTP。当向多个接收者发送数据时,如果其中一个接收者指示失败(在“RCPT TO”命令上),curl 将中止并返回失败。普通邮件程序会继续进行,但仍会发送给可以接收数据的程序。这在未来可能会发生变化。 http://curl.haxx.se/bug/view.cgi?id=3438362

随时帮助我们完成修复!

于 2012-11-25T17:17:26.723 回答