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を実行しますが、1つの電子メール受信者で呼び出されるように移動し、変数をNULLにして、次の電子メールを処理します。唯一の問題は、libcurlが毎回SMTPサーバーに再接続し、処理に多大なオーバーヘッドが追加されることです。

この「機能」がメールスレッドのどこかで言及されているのを見つけましたが、それはかなり古い応答でした。これを回避する良い方法があるのか​​、それとも私が愚かなことをしているだけなのかと思っていました。ありがとう!

4

1 に答える 1

1

KNOWN_BUG #79が発生しています:

SMTP。複数の受信者にデータを送信する場合、受信者の 1 人が (「RCPT TO」コマンドで) 失敗を示すと、curl は中止し、失敗を返します。通常のメール プログラムは処理を続行し、データを受信できるプログラムに送信します。これは将来変更される可能性があります。 http://curl.haxx.se/bug/view.cgi?id=3438362

お気軽に修正にご協力ください。

于 2012-11-25T17:17:26.723 に答える