git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v5] send-email: --batch-size to work around some SMTP server limit

From
Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Date
May 22, 2017, 09:26 UTC
Message-ID
<CACBZZX5GYV50rjg9X602JHqFPaoofH9TwDf_-r_MDu8-rmNV6Q@mail.gmail.com>
In-Reply-To
<20170521125950.5524-1-zxq_yx_007@163.com>
On Sun, May 21, 2017 at 2:59 PM, xiaoqiang zhao <zxq_yx_007@163.com> wrote:
> Some email servers (e.g. smtp.163.com) limit the number emails to be
> sent per session(connection) and this will lead to a faliure when
> sending many messages.
This OK to me, the nits I had are addressed by Junio's reply.

Looking at this the Nth time now though I wonder about this approach in general. In all your E-Mails I don't think you ever said /what/ sort of error you had from the SMTP server, you just said you had a failure or an error, I assume you hit one of the die's in the send_message() function. Can you paste the actual error you get without this patch?

I wonder if something like this would Just Work for this case without any configuration or command-line options, with the added benefit of just working for anyone with transitory SMTP issues as well (patch posted with -w, full version at https://github.com/avar/git/commit/acb60c4bde50bdcb62b71ed46f49617e2caef84e.patch):

diff --git a/git-send-email.perl b/git-send-email.perl
index 8a1ee0f0d4..c2d85236d1 100755
--- a/git-send-email.perl
+++ b/git-send-email.perl
@@ -1363,6 +1363,10 @@ EOF
                        die __("The required SMTP server is not
properly defined.")
                }

+               my $num_tries = 0;
+               my $max_tries = 5;
+       smtp_again:
+               eval {
                        if ($smtp_encryption eq 'ssl') {
                                $smtp_server_port ||= 465; # ssmtp
                                require Net::SMTP::SSL;
@@ -1429,6 +1433,22 @@ EOF
                        }
                        $smtp->dataend() or die $smtp->message;
                        $smtp->code =~ /250|200/ or die
sprintf(__("Failed to send %s\n"), $subject).$smtp->message;
+                       1;
+               } or do {
+                       my $error = $@ || "Zombie Error";
+
+                       warn sprintf(__("Failed to send %s due to
error: %s"), $subject, $error);
+                       if ($num_tries++ < $max_tries) {
+                               $smtp->quit if defined $smtp;
+                               $smtp = undef;
+                               $auth = undef;
+                               my $sleep = $num_tries * 3; # 3, 6, 9, ...
+                               warn sprintf(__("This is retry %d/%d.
Sleeping %d before trying again"),
+                                            $num_tries, $max_tries, $sleep);
+                               sleep($sleep);
+                               goto smtp_again;
+                       }
+               };
        }
        if ($quiet) {
                printf($dry_run ? __("Dry-Sent %s\n") : __("Sent
%s\n"), $subject);

Now that's very much a WIP and I don't have a server like that to test against.

Having worked with SMTP a lot in a past life/job, I'd say it's *very*
likely that you're just getting a /^4/ error code from 163.com,
probably 421, which would make this logic even simpler. I.e. we could
just adjust this to back-off for /^4/ instead of trying to handle
arbitrary errors.

Anyway, I'm not interested in pursuing that WIP patch, and I don't
think perfect should be the enemy of the good here. Your patch works
for you, doesn't really damage anything else, so if you're not
interested in hacking up something like the above I think we should
just take it.

But I do think it would be very good to get a reply to you / details
in the commit message about what error you get exactly in this
scenario, see if you get better details with --smtp-debug, and if so
paste that (sans any secret info like user/password you don't want to
share).

Then if we're poking at this code in the future we can maybe just fix
this in some more general fashion while keeping this use-case in mind.
Previous: Stefan BellerNext: Junio C Hamano
Message 12 of 15 in “send-email: --batch-size to work around some SMTP server limit”
  1. send-email: --batch-size to work around some SMTP server limitxiaoqiang zhao, May 21, 2017
  2. Junio C HamanoMay 22, 2017
  3. ZhaoxiangqiangMay 22, 2017
  4. send-email: have default batch size when relogin delay is givenStefan Beller, Feb 7, 2018
  5. Eric SunshineFeb 7, 2018
  6. send-email: error out when relogin delay is missingStefan Beller, Feb 7, 2018
  7. xiaoqiang zhaoFeb 8, 2018
  8. Eric SunshineFeb 8, 2018
  9. Stefan BellerFeb 8, 2018
  10. Eric SunshineFeb 8, 2018
  11. send-email: error out when relogin delay is missingStefan Beller, Feb 12, 2018
  12. Ævar Arnfjörð BjarmasonMay 22, 2017
  13. Junio C HamanoMay 23, 2017
  14. Jan ViktorinMay 23, 2017
  15. 赵小强May 23, 2017

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.