Bug 33964: Use Email::Sender::Transport::SMTP::Persistent for sending email

As described in bug 30013, some outgoing SMTP services ( such as Gmail ) do not like Koha's current behavior of initiating a new connection for each email sent.  If we switch from Email::Sender::Transport::SMTP to Email::Sender::Transport::SMTP::Persistent and store the object for the duration of the message queue processing, this should solve that issue.

Signed-off-by: Sam Lau <samalau@gmail.com>

Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
This commit is contained in:
Kyle M Hall 2023-06-08 11:57:47 -04:00 committed by Tomas Cohen Arazi
parent ad124fe536
commit e9ce739b74
No known key found for this signature in database
GPG Key ID: 0A272EA1B2F3C15F
4 changed files with 14 additions and 8 deletions

View File

@ -980,6 +980,8 @@ sub SendQueuedMessages {
my $limit = $params->{limit};
my $where = $params->{where};
my $smtp_transports = {};
my $count_messages = 0;
my $unsent_messages = Koha::Notice::Messages->search({
status => 'pending',
@ -1009,7 +1011,7 @@ sub SendQueuedMessages {
# This is just begging for subclassing
next if ( lc($message->{'message_transport_type'}) eq 'rss' );
if ( lc( $message->{'message_transport_type'} ) eq 'email' ) {
my $rv = _send_message_by_email( $message, $params->{'username'}, $params->{'password'}, $params->{'method'} );
my $rv = _send_message_by_email( $message, $params->{'username'}, $params->{'password'}, $params->{'method'}, $smtp_transports );
$count_messages++ if $rv;
}
elsif ( lc( $message->{'message_transport_type'} ) eq 'sms' ) {
@ -1315,7 +1317,7 @@ sub _get_unsent_messages {
sub _send_message_by_email {
my $message = shift or return;
my ($username, $password, $method) = @_;
my ( $username, $password, $method, $smtp_transports ) = @_;
my $patron;
my $to_address = $message->{'to_address'};
@ -1467,8 +1469,11 @@ sub _send_message_by_email {
if !$message->{to_address}
|| $message->{to_address} ne $email->email->header('To');
$smtp_transports->{ $smtp_server->id } ||= $smtp_server->transport;
my $smtp_transport = $smtp_transports->{ $smtp_server->id };
try {
$email->send_or_die({ transport => $smtp_server->transport });
$email->send_or_die({ transport => $smtp_transport });
_set_message_status(
{

View File

@ -61,7 +61,7 @@ sub store {
$email->transport($transport);
$email->send_or_die;
Returns an I<Email::Sender::Transport::SMTP> object that can be used directly
Returns an I<Email::Sender::Transport::SMTP::Persistent> object that can be used directly
with Email::Sender.
=cut
@ -88,8 +88,8 @@ sub transport {
$params->{debug} = $self->debug;
require Email::Sender::Transport::SMTP;
my $transport = Email::Sender::Transport::SMTP->new( $params );
require Email::Sender::Transport::SMTP::Persistent;
my $transport = Email::Sender::Transport::SMTP::Persistent->new( $params );
return $transport;
}

View File

@ -41,6 +41,7 @@ requires 'Email::Address', '>= 1.908';
requires 'Email::Date', '1.103';
requires 'Email::MessageID', '1.406';
requires 'Email::Sender', '1.300030';
requires 'Email::Sender::Transport::SMTP::Persistent', '2.6'
requires 'Email::Stuffer', '0.014';
requires 'Exception::Class', '1.38';
requires 'File::Slurp', '9999.13';

View File

@ -44,13 +44,13 @@ subtest 'transport() tests' => sub {
my $transport = $server->transport;
is( ref($transport), 'Email::Sender::Transport::SMTP', 'Type is correct' );
is( ref($transport), 'Email::Sender::Transport::SMTP::Persistent', 'Type is correct' );
is( $transport->ssl, 0, 'SSL is not set' );
$server->set({ ssl_mode => '1' })->store;
$transport = $server->transport;
is( ref($transport), 'Email::Sender::Transport::SMTP', 'Type is correct' );
is( ref($transport), 'Email::Sender::Transport::SMTP::Persistent', 'Type is correct' );
is( $transport->ssl, '1', 'SSL is set' );
is( $transport->debug, '0', 'Debug setting honoured (disabled)' );