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:
parent
ad124fe536
commit
e9ce739b74
|
|
@ -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(
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
1
cpanfile
1
cpanfile
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -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)' );
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue