Re: [PATCH v2] send-email: new options to walkaround email server limits

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



xiaoqiang zhao <zxq_yx_007@xxxxxxx> writes:

> Some email server(e.g. smtp.163.com) limits a fixed number emails to
> be send per session(connection) and this will lead to a send faliure.
>
> With --batch-size=<num> option, an auto reconnection will occur when
> number of sent email reaches <num> and the problem is solved.
>
> --relogin-delay option will make some delay between two successive
> email server login.

Here is how I would have written the above..

    send-email: --batch-size to work around some SMTP server limit

    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.

    Teach send-email to disconnect after sending a number of messages
    (configurable via the --batch-size=<num> option), wait for a few
    seconds (configurable via the --relogin-delay=<seconds> option) and
    reconnect, to work around such a limit.


But I am having a huge problem seeing how this patch is correct.  It
always is troubling to see a patch that makes the behaviour of a
program change even when the optional feature it implements is not
being used at all.  Why does it even have to touch smtp_auth_maybe?
Why does the updated smtp_auth_maybe have to do quite different
things even when batch-size is not defined from the original?
What is that new "Auth use saved password. \n" message about?

After reading the problem description in the proposed log message,
the most natural update to achieve the stated goal is to add code to
the loop that has the only caller to send_message() function, I
would think.  The loop goes over the input files and prepares the
variables used in send_message() and have the function send a single
message, initializing $smtp as necessary but otherwise reusing $smtp
the previous round has prepared.  So just after $message_id is
undefed in the loop, I expected that you would count "number of
messages sent so far during this session", and when that number
exceeds the batch size, disconnect $smtp and unset the variable,
and sleep for a bit, without having to change anything else.

Puzzled.

>  sub smtp_auth_maybe {
> -	if (!defined $smtp_authuser || $auth) {
> +	if (!defined $smtp_authuser || $num_sent != 0) {
>  		return 1;
>  	}
>  
> +	if ($auth && $num_sent == 0) {
> +		print "Auth use saved password. \n";
> +		return !!$smtp->auth($smtp_authuser, $smtp_authpass);
> +	}
> +
>  	# Workaround AUTH PLAIN/LOGIN interaction defect
>  	# with Authen::SASL::Cyrus
>  	eval {
> @@ -1187,6 +1201,7 @@ sub smtp_auth_maybe {
>  		'password' => $smtp_authpass
>  	}, sub {
>  		my $cred = shift;
> +		$smtp_authpass = $cred->{'password'};
>  
>  		if ($smtp_auth) {
>  			my $sasl = Authen::SASL->new(
> @@ -1442,6 +1457,15 @@ EOF
>  		}
>  	}
>  
> +	$num_sent++;
> +	if ($num_sent == $batch_size) {
> +		$smtp->quit;
> +		$smtp = undef;
> +		$num_sent = 0;
> +		print "Reconnect SMTP server required. \n";
> +		sleep($relogin_delay);
> +	}
> +
>  	return 1;
>  }



[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]