使用libcurl发送第一封无效电子邮件后,SMTP连接将关闭。这是一个;特写“;还是我把事情搞砸了?

使用libcurl发送第一封无效电子邮件后,SMTP连接将关闭。这是一个;特写“;还是我把事情搞砸了?,c,curl,smtp,libcurl,C,Curl,Smtp,Libcurl,我试图给libcurl提供一长串电子邮件(其中一些最终不存在)。如果存在任何无效电子邮件,则整个脚本将失效 我可以为每个电子邮件地址重新连接SMTP服务器(处理正确),但效率太低了 我的相关代码如下: // necessary simple curl setup completed above // assume all referenced variables have been initialized // init cURL server connection curl_easy_set

我试图给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
//上面完成了必要的简单卷曲设置
//假设所有引用的变量都已初始化
//init cURL服务器连接
curl_easy_setopt(curl,CURLOPT_URL,SMTPSERVER);
curl_easy_setopt(curl,CURLOPT_MAIL_FROM,MAILFROM);
curl\u easy\u setopt(curl,CURLOPT\u WRITEHEADER,stdout);
char tmp[EMAIL_STR_LEN+3]={0};tmp[0]=''从fgets()覆盖'\0'
tmp[EMAIL_STR_LEN-1]='>';
strncpy(当前->电子邮件、tmp、电子邮件地址+3);
//malloc下一链接
当前->下一步=initemail();
当前=当前->下一步;
//从流中删除\n\0
fseek(电子邮件,2,SEEK_CUR);
}
fclose(电子邮件);
电流=水头;
while(当前){
recipients=curl\u slist\u append(recipients,(const char*)current->email);
当前=当前->下一步;
}
curl\u easy\u setopt(curl、CURLOPT\u MAIL\u RCPT、收件人);
旋度,易于执行(旋度);
//清理东西
执行上述操作,但移动
curl\u easy\u perform
对一个电子邮件收件人进行调用,然后将变量置零并处理下一封电子邮件。唯一的问题是libcurl每次都会重新连接到SMTP服务器,这给处理增加了巨大的开销

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

您正在经历#79:

SMTP。当向多个收件人发送数据时,如果其中一个收件人指示失败,curl将中止并返回失败(在 “RCPT TO”命令)。普通邮件程序将继续运行,并且不会停止 发送给那些可以接收数据的人。这是需要改变的 将来


请随时帮助我们完成修复

我对libcurl不太了解,但你的fseek很糟糕——fgets会在tmp[]中包含新行,并自动从流中跳转,而“\0”被附加到字符串中,除非你把它放在流中。@loreb,我不同意它“糟糕”,但你是对的。只需覆盖\n即可实现同样的效果。谢谢,@DanielStenberg。我会看一看代码,看看是否我能处理。