init III
This commit is contained in:
106
Perl OTRS/Kernel/System/Email/DoNotSendEmail.pm
Normal file
106
Perl OTRS/Kernel/System/Email/DoNotSendEmail.pm
Normal file
@@ -0,0 +1,106 @@
|
||||
# --
|
||||
# Copyright (C) 2001-2019 OTRS AG, https://otrs.com/
|
||||
# --
|
||||
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
|
||||
# the enclosed file COPYING for license information (GPL). If you
|
||||
# did not receive this file, see https://www.gnu.org/licenses/gpl-3.0.txt.
|
||||
# --
|
||||
|
||||
package Kernel::System::Email::DoNotSendEmail;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
our @ObjectDependencies = (
|
||||
'Kernel::System::CommunicationLog',
|
||||
'Kernel::System::Log',
|
||||
);
|
||||
|
||||
sub new {
|
||||
my ( $Type, %Param ) = @_;
|
||||
|
||||
# allocate new hash for object
|
||||
my $Self = {%Param};
|
||||
bless( $Self, $Type );
|
||||
|
||||
# debug
|
||||
$Self->{Debug} = $Param{Debug} || 0;
|
||||
|
||||
$Self->{Type} = 'DoNotSendEmail';
|
||||
|
||||
return $Self;
|
||||
}
|
||||
|
||||
sub Send {
|
||||
my ( $Self, %Param ) = @_;
|
||||
|
||||
$Param{CommunicationLogObject}->ObjectLog(
|
||||
ObjectLogType => 'Message',
|
||||
Priority => 'Debug',
|
||||
Key => 'Kernel::System::Email::DoNotSendEmail',
|
||||
Value => 'Received message for emulated sending without real external connections.',
|
||||
);
|
||||
|
||||
$Param{CommunicationLogObject}->ObjectLog(
|
||||
ObjectLogType => 'Message',
|
||||
Priority => 'Debug',
|
||||
Key => 'Kernel::System::Email::DoNotSendEmail',
|
||||
Value => 'Validating message contents.',
|
||||
);
|
||||
|
||||
# check needed stuff
|
||||
for (qw(Header Body ToArray)) {
|
||||
if ( !$Param{$_} ) {
|
||||
my $ErrorMessage = "Need $_!";
|
||||
|
||||
$Param{CommunicationLogObject}->ObjectLog(
|
||||
ObjectLogType => 'Message',
|
||||
Priority => 'Error',
|
||||
Key => 'Kernel::System::Email::DoNotSendEmail',
|
||||
Value => $ErrorMessage,
|
||||
);
|
||||
|
||||
return {
|
||||
Success => 0,
|
||||
ErrorMessage => $ErrorMessage,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
# from
|
||||
if ( !defined $Param{From} ) {
|
||||
$Param{From} = '';
|
||||
}
|
||||
|
||||
# recipient
|
||||
my $ToString = join ', ', @{ $Param{ToArray} };
|
||||
|
||||
$Param{CommunicationLogObject}->ObjectLogStart(
|
||||
ObjectLogType => 'Connection',
|
||||
);
|
||||
|
||||
$Param{CommunicationLogObject}->ObjectLog(
|
||||
ObjectLogType => 'Connection',
|
||||
Priority => 'Info',
|
||||
Key => 'Kernel::System::Email::DoNotSendEmail',
|
||||
Value => "Sending email from '$Param{From}' to '$ToString'.",
|
||||
);
|
||||
|
||||
$Param{CommunicationLogObject}->ObjectLog(
|
||||
ObjectLogType => 'Connection',
|
||||
Priority => 'Info',
|
||||
Key => 'Kernel::System::Email::DoNotSendEmail',
|
||||
Value => "Email successfully sent!",
|
||||
);
|
||||
|
||||
$Param{CommunicationLogObject}->ObjectLogStop(
|
||||
ObjectLogType => 'Connection',
|
||||
Status => 'Successful',
|
||||
);
|
||||
|
||||
return {
|
||||
Success => 1,
|
||||
};
|
||||
}
|
||||
|
||||
1;
|
||||
486
Perl OTRS/Kernel/System/Email/SMTP.pm
Normal file
486
Perl OTRS/Kernel/System/Email/SMTP.pm
Normal file
@@ -0,0 +1,486 @@
|
||||
# --
|
||||
# Copyright (C) 2001-2019 OTRS AG, https://otrs.com/
|
||||
# --
|
||||
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
|
||||
# the enclosed file COPYING for license information (GPL). If you
|
||||
# did not receive this file, see https://www.gnu.org/licenses/gpl-3.0.txt.
|
||||
# --
|
||||
|
||||
package Kernel::System::Email::SMTP;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
use Net::SMTP;
|
||||
|
||||
our @ObjectDependencies = (
|
||||
'Kernel::Config',
|
||||
'Kernel::System::DB',
|
||||
'Kernel::System::Encode',
|
||||
'Kernel::System::Log',
|
||||
'Kernel::System::CommunicationLog',
|
||||
);
|
||||
|
||||
sub new {
|
||||
my ( $Type, %Param ) = @_;
|
||||
|
||||
# allocate new hash for object
|
||||
my $Self = {%Param};
|
||||
bless( $Self, $Type );
|
||||
|
||||
# debug
|
||||
$Self->{Debug} = $Param{Debug} || 0;
|
||||
if ( $Self->{Debug} > 2 ) {
|
||||
|
||||
# shown on STDERR
|
||||
$Self->{SMTPDebug} = 1;
|
||||
}
|
||||
|
||||
( $Self->{SMTPType} ) = ( $Type =~ m/::Email::(.*)$/i );
|
||||
|
||||
return $Self;
|
||||
}
|
||||
|
||||
sub Check {
|
||||
my ( $Self, %Param ) = @_;
|
||||
|
||||
$Param{CommunicationLogObject}->ObjectLogStart(
|
||||
ObjectLogType => 'Connection',
|
||||
);
|
||||
|
||||
my $Return = sub {
|
||||
my %LocalParam = @_;
|
||||
$Param{CommunicationLogObject}->ObjectLogStop(
|
||||
ObjectLogType => 'Connection',
|
||||
Status => $LocalParam{Success} ? 'Successful' : 'Failed',
|
||||
);
|
||||
|
||||
return %LocalParam;
|
||||
};
|
||||
|
||||
my $ReturnSuccess = sub { return $Return->( @_, Success => 1, ); };
|
||||
my $ReturnError = sub { return $Return->( @_, Success => 0, ); };
|
||||
|
||||
# get config object
|
||||
my $ConfigObject = $Kernel::OM->Get('Kernel::Config');
|
||||
|
||||
# get config data
|
||||
$Self->{FQDN} = $ConfigObject->Get('FQDN');
|
||||
$Self->{MailHost} = $ConfigObject->Get('SendmailModule::Host')
|
||||
|| die "No SendmailModule::Host found in Kernel/Config.pm";
|
||||
$Self->{SMTPPort} = $ConfigObject->Get('SendmailModule::Port');
|
||||
$Self->{User} = $ConfigObject->Get('SendmailModule::AuthUser');
|
||||
$Self->{Password} = $ConfigObject->Get('SendmailModule::AuthPassword');
|
||||
|
||||
$Param{CommunicationLogObject}->ObjectLog(
|
||||
ObjectLogType => 'Connection',
|
||||
Priority => 'Debug',
|
||||
Key => 'Kernel::System::Email::SMTP',
|
||||
Value => 'Testing connection to SMTP service (3 attempts max.).',
|
||||
);
|
||||
|
||||
# 3 possible attempts to connect to the SMTP server.
|
||||
# (MS Exchange Servers have sometimes problems on port 25)
|
||||
my $SMTP;
|
||||
|
||||
my $TryConnectMessage = sprintf
|
||||
"%%s: Trying to connect to '%s%s' on %s with SMTP type '%s'.",
|
||||
$Self->{MailHost},
|
||||
( $Self->{SMTPPort} ? ':' . $Self->{SMTPPort} : '' ),
|
||||
$Self->{FQDN},
|
||||
$Self->{SMTPType};
|
||||
TRY:
|
||||
for my $Try ( 1 .. 3 ) {
|
||||
|
||||
$Param{CommunicationLogObject}->ObjectLog(
|
||||
ObjectLogType => 'Connection',
|
||||
Priority => 'Debug',
|
||||
Key => 'Kernel::System::Email::SMTP',
|
||||
Value => sprintf( $TryConnectMessage, $Try, ),
|
||||
);
|
||||
|
||||
# connect to mail server
|
||||
eval {
|
||||
$SMTP = $Self->_Connect(
|
||||
MailHost => $Self->{MailHost},
|
||||
FQDN => $Self->{FQDN},
|
||||
SMTPPort => $Self->{SMTPPort},
|
||||
SMTPDebug => $Self->{SMTPDebug},
|
||||
);
|
||||
return 1;
|
||||
} || do {
|
||||
my $Error = $@;
|
||||
$Kernel::OM->Get('Kernel::System::Log')->Log(
|
||||
Priority => 'error',
|
||||
Message => sprintf(
|
||||
"SMTP, connection try %s, unexpected error captured: %s",
|
||||
$Try,
|
||||
$Error,
|
||||
),
|
||||
);
|
||||
};
|
||||
|
||||
last TRY if $SMTP;
|
||||
|
||||
$Param{CommunicationLogObject}->ObjectLog(
|
||||
ObjectLogType => 'Connection',
|
||||
Priority => 'Debug',
|
||||
Key => 'Kernel::System::Email::SMTP',
|
||||
Value => "$Try: Connection could not be established. Waiting for 0.3 seconds.",
|
||||
);
|
||||
|
||||
# sleep 0,3 seconds;
|
||||
select( undef, undef, undef, 0.3 ); ## no critic
|
||||
}
|
||||
|
||||
# return if no connect was possible
|
||||
if ( !$SMTP ) {
|
||||
|
||||
$Param{CommunicationLogObject}->ObjectLog(
|
||||
ObjectLogType => 'Connection',
|
||||
Priority => 'Error',
|
||||
Key => 'Kernel::System::Email::SMTP',
|
||||
Value => "Could not connect to host '$Self->{MailHost}'. ErrorMessage: $!",
|
||||
);
|
||||
|
||||
return $ReturnError->(
|
||||
ErrorMessage => "Can't connect to $Self->{MailHost}: $!!",
|
||||
);
|
||||
}
|
||||
|
||||
# Enclose SMTP in a wrapper to handle unexpected exceptions
|
||||
$SMTP = $Self->_GetSMTPSafeWrapper(
|
||||
SMTP => $SMTP,
|
||||
);
|
||||
|
||||
# use smtp auth if configured
|
||||
if ( $Self->{User} && $Self->{Password} ) {
|
||||
|
||||
$Param{CommunicationLogObject}->ObjectLog(
|
||||
ObjectLogType => 'Connection',
|
||||
Priority => 'Debug',
|
||||
Key => 'Kernel::System::Email::SMTP',
|
||||
Value => "Using SMTP authentication with user '$Self->{User}' and (hidden) password.",
|
||||
);
|
||||
|
||||
if ( !$SMTP->( 'auth', $Self->{User}, $Self->{Password} ) ) {
|
||||
|
||||
my $Code = $SMTP->( 'code', );
|
||||
my $Error = $Code . ', ' . $SMTP->( 'message', );
|
||||
|
||||
$SMTP->( 'quit', );
|
||||
|
||||
$Param{CommunicationLogObject}->ObjectLog(
|
||||
ObjectLogType => 'Connection',
|
||||
Priority => 'Error',
|
||||
Key => 'Kernel::System::Email::SMTP',
|
||||
Value => "SMTP authentication failed (SMTP code: $Code, ErrorMessage: $Error).",
|
||||
);
|
||||
|
||||
return $ReturnError->(
|
||||
ErrorMessage => "SMTP authentication failed: $Error!",
|
||||
Code => $Code,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
return $ReturnSuccess->(
|
||||
SMTP => $SMTP,
|
||||
);
|
||||
}
|
||||
|
||||
sub Send {
|
||||
my ( $Self, %Param ) = @_;
|
||||
|
||||
$Param{CommunicationLogObject}->ObjectLog(
|
||||
ObjectLogType => 'Message',
|
||||
Priority => 'Info',
|
||||
Key => 'Kernel::System::Email::SMTP',
|
||||
Value => 'Received message for sending, validating message contents.',
|
||||
);
|
||||
|
||||
# check needed stuff
|
||||
for (qw(Header Body ToArray)) {
|
||||
if ( !$Param{$_} ) {
|
||||
|
||||
$Param{CommunicationLogObject}->ObjectLog(
|
||||
ObjectLogType => 'Message',
|
||||
Priority => 'Error',
|
||||
Key => 'Kernel::System::Email::SMTP',
|
||||
Value => "Need $_!",
|
||||
);
|
||||
|
||||
return $Self->_SendError(
|
||||
%Param,
|
||||
ErrorMessage => "Need $_!",
|
||||
);
|
||||
}
|
||||
}
|
||||
if ( !$Param{From} ) {
|
||||
$Param{From} = '';
|
||||
}
|
||||
|
||||
# connect to smtp server
|
||||
my %Result = $Self->Check(%Param);
|
||||
|
||||
if ( !$Result{Success} ) {
|
||||
return $Self->_SendError( %Param, %Result, );
|
||||
}
|
||||
|
||||
# set/get SMTP handle
|
||||
my $SMTP = $Result{SMTP};
|
||||
|
||||
$Param{CommunicationLogObject}->ObjectLog(
|
||||
ObjectLogType => 'Message',
|
||||
Priority => 'Debug',
|
||||
Key => 'Kernel::System::Email::SMTP',
|
||||
Value => "Sending envelope from (mail from: $Param{From}) to server.",
|
||||
);
|
||||
|
||||
# set envelope from, return if from was not accepted by the server
|
||||
if ( !$SMTP->( 'mail', $Param{From}, ) ) {
|
||||
|
||||
my $FullErrorMessage = sprintf(
|
||||
"Envelope from '%s' not accepted by the server: %s, %s!",
|
||||
$Param{From},
|
||||
$SMTP->( 'code', ),
|
||||
$SMTP->( 'message', ),
|
||||
);
|
||||
|
||||
$Param{CommunicationLogObject}->ObjectLog(
|
||||
ObjectLogType => 'Message',
|
||||
Priority => 'Error',
|
||||
Key => 'Kernel::System::Email::SMTP',
|
||||
Value => $FullErrorMessage,
|
||||
);
|
||||
|
||||
return $Self->_SendError(
|
||||
%Param,
|
||||
ErrorMessage => $FullErrorMessage,
|
||||
SMTP => $SMTP,
|
||||
);
|
||||
}
|
||||
|
||||
TO:
|
||||
for my $To ( @{ $Param{ToArray} } ) {
|
||||
|
||||
$Param{CommunicationLogObject}->ObjectLog(
|
||||
ObjectLogType => 'Message',
|
||||
Priority => 'Debug',
|
||||
Key => 'Kernel::System::Email::SMTP',
|
||||
Value => "Sending envelope to (rcpt to: $To) to server.",
|
||||
);
|
||||
|
||||
# Check if the recipient is valid
|
||||
next TO if $SMTP->( 'to', $To, );
|
||||
|
||||
my $FullErrorMessage = sprintf(
|
||||
"Envelope to '%s' not accepted by the server: %s, %s!",
|
||||
$To,
|
||||
$SMTP->( 'code', ),
|
||||
$SMTP->( 'message', ),
|
||||
);
|
||||
|
||||
$Param{CommunicationLogObject}->ObjectLog(
|
||||
ObjectLogType => 'Message',
|
||||
Priority => 'Error',
|
||||
Key => 'Kernel::System::Email::SMTP',
|
||||
Value => $FullErrorMessage,
|
||||
);
|
||||
|
||||
return $Self->_SendError(
|
||||
%Param,
|
||||
ErrorMessage => $FullErrorMessage,
|
||||
SMTP => $SMTP,
|
||||
);
|
||||
}
|
||||
|
||||
my $ToString = join ',', @{ $Param{ToArray} };
|
||||
|
||||
# get encode object
|
||||
my $EncodeObject = $Kernel::OM->Get('Kernel::System::Encode');
|
||||
|
||||
# encode utf8 header strings (of course, there should only be 7 bit in there!)
|
||||
$EncodeObject->EncodeOutput( $Param{Header} );
|
||||
|
||||
# encode utf8 body strings
|
||||
$EncodeObject->EncodeOutput( $Param{Body} );
|
||||
|
||||
# send data
|
||||
$Param{CommunicationLogObject}->ObjectLog(
|
||||
ObjectLogType => 'Message',
|
||||
Priority => 'Debug',
|
||||
Key => 'Kernel::System::Email::SMTP',
|
||||
Value => "Sending message data to server.",
|
||||
);
|
||||
|
||||
# Send email data by chunks because when in SSL mode, each SSL
|
||||
# frame has a maximum of 16kB (Bug #12957).
|
||||
# We send always the first 4000 characters until '$Data' is empty.
|
||||
# If any error occur while sending data to the smtp server an exception
|
||||
# is thrown and '$DataSent' will be undefined.
|
||||
my $DataSent = eval {
|
||||
my $Data = ${ $Param{Header} } . "\n" . ${ $Param{Body} };
|
||||
my $ChunkSize = 4000;
|
||||
|
||||
$SMTP->( 'data', ) || die "error starting data sending";
|
||||
|
||||
while ( my $DataLength = length $Data ) {
|
||||
my $TmpChunkSize = ( $ChunkSize > $DataLength ) ? $DataLength : $ChunkSize;
|
||||
my $Chunk = substr $Data, 0, $TmpChunkSize;
|
||||
|
||||
$SMTP->( 'datasend', $Chunk, ) || die "error sending data chunk";
|
||||
|
||||
$Data = substr $Data, $TmpChunkSize;
|
||||
}
|
||||
|
||||
$SMTP->( 'dataend', ) || die "error ending data sending";
|
||||
|
||||
return 1;
|
||||
};
|
||||
|
||||
if ( !$DataSent ) {
|
||||
my $FullErrorMessage = sprintf(
|
||||
"Could not send message to server: %s, %s!",
|
||||
$SMTP->( 'code', ),
|
||||
$SMTP->( 'message', ),
|
||||
);
|
||||
|
||||
$Param{CommunicationLogObject}->ObjectLog(
|
||||
ObjectLogType => 'Message',
|
||||
Priority => 'Error',
|
||||
Key => 'Kernel::System::Email::SMTP',
|
||||
Value => $FullErrorMessage,
|
||||
);
|
||||
|
||||
return $Self->_SendError(
|
||||
%Param,
|
||||
ErrorMessage => $FullErrorMessage,
|
||||
SMTP => $SMTP,
|
||||
);
|
||||
}
|
||||
|
||||
# debug
|
||||
if ( $Self->{Debug} > 2 ) {
|
||||
$Kernel::OM->Get('Kernel::System::Log')->Log(
|
||||
Priority => 'notice',
|
||||
Message => "Sent email to '$ToString' from '$Param{From}'.",
|
||||
);
|
||||
}
|
||||
|
||||
$Param{CommunicationLogObject}->ObjectLog(
|
||||
ObjectLogType => 'Message',
|
||||
Priority => 'Info',
|
||||
Key => 'Kernel::System::Email::SMTP',
|
||||
Value => "Email successfully sent from '$Param{From}' to '$ToString'.",
|
||||
);
|
||||
|
||||
return $Self->_SendSuccess(
|
||||
SMTP => $SMTP,
|
||||
%Param
|
||||
);
|
||||
}
|
||||
|
||||
sub _Connect {
|
||||
my ( $Self, %Param ) = @_;
|
||||
|
||||
# check needed stuff
|
||||
for (qw(MailHost FQDN)) {
|
||||
if ( !$Param{$_} ) {
|
||||
$Kernel::OM->Get('Kernel::System::Log')->Log(
|
||||
Priority => 'error',
|
||||
Message => "Need $_!",
|
||||
);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
# Remove a possible port from the FQDN value
|
||||
my $FQDN = $Param{FQDN};
|
||||
$FQDN =~ s{:\d+}{}smx;
|
||||
|
||||
# set up connection connection
|
||||
my $SMTP = Net::SMTP->new(
|
||||
$Param{MailHost},
|
||||
Hello => $FQDN,
|
||||
Port => $Param{SMTPPort} || 25,
|
||||
Timeout => 30,
|
||||
Debug => $Param{SMTPDebug},
|
||||
);
|
||||
|
||||
return $SMTP;
|
||||
}
|
||||
|
||||
sub _SendResult {
|
||||
my ( $Self, %Param ) = @_;
|
||||
|
||||
my $SMTP = delete $Param{SMTP};
|
||||
$SMTP->( 'quit', ) if $SMTP;
|
||||
|
||||
return {%Param};
|
||||
}
|
||||
|
||||
sub _SendSuccess {
|
||||
my ( $Self, %Param ) = @_;
|
||||
return $Self->_SendResult(
|
||||
Success => 1,
|
||||
%Param
|
||||
);
|
||||
}
|
||||
|
||||
sub _SendError {
|
||||
my ( $Self, %Param ) = @_;
|
||||
|
||||
my $SMTP = $Param{SMTP};
|
||||
if ( $SMTP && !defined $Param{Code} ) {
|
||||
$Param{Code} = $SMTP->( 'code', );
|
||||
}
|
||||
|
||||
return $Self->_SendResult(
|
||||
Success => 0,
|
||||
%Param,
|
||||
SMTPError => 1,
|
||||
);
|
||||
}
|
||||
|
||||
sub _GetSMTPSafeWrapper {
|
||||
my ( $Self, %Param, ) = @_;
|
||||
|
||||
my $SMTP = $Param{SMTP};
|
||||
|
||||
return sub {
|
||||
my $Operation = shift;
|
||||
my @LocalParams = @_;
|
||||
|
||||
my $ScalarResult;
|
||||
my @ArrayResult = ();
|
||||
my $Wantarray = wantarray;
|
||||
|
||||
eval {
|
||||
if ($Wantarray) {
|
||||
@ArrayResult = $SMTP->$Operation( @LocalParams, );
|
||||
}
|
||||
else {
|
||||
$ScalarResult = $SMTP->$Operation( @LocalParams, );
|
||||
}
|
||||
|
||||
return 1;
|
||||
} || do {
|
||||
my $Error = $@;
|
||||
$Kernel::OM->Get('Kernel::System::Log')->Log(
|
||||
Priority => 'error',
|
||||
Message => sprintf(
|
||||
"Error while executing 'SMTP->%s(%s)': %s",
|
||||
$Operation,
|
||||
join( ',', @LocalParams ),
|
||||
$Error,
|
||||
),
|
||||
);
|
||||
};
|
||||
|
||||
return @ArrayResult if $Wantarray;
|
||||
return $ScalarResult;
|
||||
};
|
||||
}
|
||||
|
||||
1;
|
||||
63
Perl OTRS/Kernel/System/Email/SMTPS.pm
Normal file
63
Perl OTRS/Kernel/System/Email/SMTPS.pm
Normal file
@@ -0,0 +1,63 @@
|
||||
# --
|
||||
# Copyright (C) 2001-2019 OTRS AG, https://otrs.com/
|
||||
# --
|
||||
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
|
||||
# the enclosed file COPYING for license information (GPL). If you
|
||||
# did not receive this file, see https://www.gnu.org/licenses/gpl-3.0.txt.
|
||||
# --
|
||||
|
||||
package Kernel::System::Email::SMTPS;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
use Net::SMTP;
|
||||
|
||||
use parent qw(Kernel::System::Email::SMTP);
|
||||
|
||||
our @ObjectDependencies = (
|
||||
'Kernel::System::Log',
|
||||
);
|
||||
|
||||
# Use Net::SSLGlue::SMTP on systems with older Net::SMTP modules that cannot handle SMTPS.
|
||||
BEGIN {
|
||||
if ( !defined &Net::SMTP::starttls ) {
|
||||
## nofilter(TidyAll::Plugin::OTRS::Perl::Require)
|
||||
## nofilter(TidyAll::Plugin::OTRS::Perl::SyntaxCheck)
|
||||
require Net::SSLGlue::SMTP;
|
||||
}
|
||||
}
|
||||
|
||||
sub _Connect {
|
||||
my ( $Self, %Param ) = @_;
|
||||
|
||||
# check needed stuff
|
||||
for (qw(MailHost FQDN)) {
|
||||
if ( !$Param{$_} ) {
|
||||
$Kernel::OM->Get('Kernel::System::Log')->Log(
|
||||
Priority => 'error',
|
||||
Message => "Need $_!"
|
||||
);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
# Remove a possible port from the FQDN value
|
||||
my $FQDN = $Param{FQDN};
|
||||
$FQDN =~ s{:\d+}{}smx;
|
||||
|
||||
# set up connection connection
|
||||
my $SMTP = Net::SMTP->new(
|
||||
$Param{MailHost},
|
||||
Hello => $FQDN,
|
||||
Port => $Param{SMTPPort} || 465,
|
||||
Timeout => 30,
|
||||
Debug => $Param{SMTPDebug},
|
||||
SSL => 1,
|
||||
SSL_verify_mode => 0,
|
||||
);
|
||||
|
||||
return $SMTP;
|
||||
}
|
||||
|
||||
1;
|
||||
67
Perl OTRS/Kernel/System/Email/SMTPTLS.pm
Normal file
67
Perl OTRS/Kernel/System/Email/SMTPTLS.pm
Normal file
@@ -0,0 +1,67 @@
|
||||
# --
|
||||
# Copyright (C) 2001-2019 OTRS AG, https://otrs.com/
|
||||
# --
|
||||
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
|
||||
# the enclosed file COPYING for license information (GPL). If you
|
||||
# did not receive this file, see https://www.gnu.org/licenses/gpl-3.0.txt.
|
||||
# --
|
||||
|
||||
package Kernel::System::Email::SMTPTLS;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
use Net::SMTP;
|
||||
|
||||
use parent qw(Kernel::System::Email::SMTP);
|
||||
|
||||
our @ObjectDependencies = (
|
||||
'Kernel::System::Log',
|
||||
);
|
||||
|
||||
# Use Net::SSLGlue::SMTP on systems with older Net::SMTP modules that cannot handle SMTPTLS.
|
||||
BEGIN {
|
||||
if ( !defined &Net::SMTP::starttls ) {
|
||||
## nofilter(TidyAll::Plugin::OTRS::Perl::Require)
|
||||
## nofilter(TidyAll::Plugin::OTRS::Perl::SyntaxCheck)
|
||||
require Net::SSLGlue::SMTP;
|
||||
}
|
||||
}
|
||||
|
||||
sub _Connect {
|
||||
my ( $Self, %Param ) = @_;
|
||||
|
||||
# check needed stuff
|
||||
for (qw(MailHost FQDN)) {
|
||||
if ( !$Param{$_} ) {
|
||||
$Kernel::OM->Get('Kernel::System::Log')->Log(
|
||||
Priority => 'error',
|
||||
Message => "Need $_!"
|
||||
);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
# Remove a possible port from the FQDN value
|
||||
my $FQDN = $Param{FQDN};
|
||||
$FQDN =~ s{:\d+}{}smx;
|
||||
|
||||
# set up connection connection
|
||||
my $SMTP = Net::SMTP->new(
|
||||
$Param{MailHost},
|
||||
Hello => $FQDN,
|
||||
Port => $Param{SMTPPort} || 587,
|
||||
Timeout => 30,
|
||||
Debug => $Param{SMTPDebug},
|
||||
);
|
||||
|
||||
return if !$SMTP;
|
||||
|
||||
$SMTP->starttls(
|
||||
SSL_verify_mode => 0,
|
||||
);
|
||||
|
||||
return $SMTP;
|
||||
}
|
||||
|
||||
1;
|
||||
236
Perl OTRS/Kernel/System/Email/Sendmail.pm
Normal file
236
Perl OTRS/Kernel/System/Email/Sendmail.pm
Normal file
@@ -0,0 +1,236 @@
|
||||
# --
|
||||
# Copyright (C) 2001-2019 OTRS AG, https://otrs.com/
|
||||
# --
|
||||
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
|
||||
# the enclosed file COPYING for license information (GPL). If you
|
||||
# did not receive this file, see https://www.gnu.org/licenses/gpl-3.0.txt.
|
||||
# --
|
||||
|
||||
package Kernel::System::Email::Sendmail;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
our @ObjectDependencies = (
|
||||
'Kernel::Config',
|
||||
'Kernel::System::CommunicationLog',
|
||||
'Kernel::System::Encode',
|
||||
'Kernel::System::Log',
|
||||
);
|
||||
|
||||
sub new {
|
||||
my ( $Type, %Param ) = @_;
|
||||
|
||||
# allocate new hash for object
|
||||
my $Self = {%Param};
|
||||
bless( $Self, $Type );
|
||||
|
||||
# debug
|
||||
$Self->{Debug} = $Param{Debug} || 0;
|
||||
|
||||
$Self->{Type} = 'Sendmail';
|
||||
|
||||
return $Self;
|
||||
}
|
||||
|
||||
sub Send {
|
||||
my ( $Self, %Param ) = @_;
|
||||
|
||||
$Param{CommunicationLogObject}->ObjectLog(
|
||||
ObjectLogType => 'Message',
|
||||
Priority => 'Info',
|
||||
Key => 'Kernel::System::Email::Sendmail',
|
||||
Value => 'Received message for sending, validating message contents.',
|
||||
);
|
||||
|
||||
# check needed stuff
|
||||
for (qw(Header Body ToArray)) {
|
||||
if ( !$Param{$_} ) {
|
||||
my $ErrorMsg = "Need $_!";
|
||||
|
||||
$Param{CommunicationLogObject}->ObjectLog(
|
||||
ObjectLogType => 'Message',
|
||||
Priority => 'Error',
|
||||
Key => 'Kernel::System::Email::Sendmail',
|
||||
Value => $ErrorMsg,
|
||||
);
|
||||
|
||||
return $Self->_SendError(
|
||||
%Param,
|
||||
ErrorMessage => $ErrorMsg,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
# from for arg
|
||||
my $Arg = quotemeta( $Param{From} );
|
||||
if ( !$Param{From} ) {
|
||||
$Arg = "''";
|
||||
}
|
||||
|
||||
# get recipients
|
||||
my $ToString = '';
|
||||
for my $To ( @{ $Param{ToArray} } ) {
|
||||
if ($ToString) {
|
||||
$ToString .= ', ';
|
||||
}
|
||||
$ToString .= $To;
|
||||
$Arg .= ' ' . quotemeta($To);
|
||||
}
|
||||
|
||||
$Param{CommunicationLogObject}->ObjectLog(
|
||||
ObjectLogType => 'Message',
|
||||
Priority => 'Debug',
|
||||
Key => 'Kernel::System::Email::Sendmail',
|
||||
Value => 'Checking availability of sendmail command.',
|
||||
);
|
||||
|
||||
# check availability
|
||||
my %Result = $Self->Check();
|
||||
|
||||
if ( !$Result{Success} ) {
|
||||
|
||||
$Param{CommunicationLogObject}->ObjectLog(
|
||||
ObjectLogType => 'Message',
|
||||
Priority => 'Error',
|
||||
Key => 'Kernel::System::Email::Sendmail',
|
||||
Value => "Sendmail check error: $Result{ErrorMessage}",
|
||||
);
|
||||
|
||||
return $Self->_SendError(
|
||||
%Param,
|
||||
%Result,
|
||||
);
|
||||
}
|
||||
|
||||
$Param{CommunicationLogObject}->ObjectLogStart(
|
||||
ObjectLogType => 'Connection',
|
||||
);
|
||||
|
||||
$Param{CommunicationLogObject}->ObjectLog(
|
||||
ObjectLogType => 'Connection',
|
||||
Priority => 'Info',
|
||||
Key => 'Kernel::System::Email::Sendmail',
|
||||
Value => "Sending email from '$Param{From}' to '$ToString'.",
|
||||
);
|
||||
|
||||
# set sendmail binary
|
||||
my $Sendmail = $Result{Sendmail};
|
||||
|
||||
# restore the child signal to the original value, in a daemon environment, child signal is set
|
||||
# to ignore causing problems with file handler pipe close
|
||||
local $SIG{'CHLD'} = 'DEFAULT';
|
||||
|
||||
# invoke sendmail in order to send off mail, catching errors in a temporary file
|
||||
my $FH;
|
||||
my $GenErrorMessage = sub { return sprintf( q{Can't send message: %s!}, shift, ); };
|
||||
## no critic
|
||||
if ( !open( $FH, '|-', "$Sendmail $Arg " ) ) {
|
||||
## use critic
|
||||
my $ErrorMessage = $GenErrorMessage->($!);
|
||||
|
||||
$Param{CommunicationLogObject}->ObjectLog(
|
||||
ObjectLogType => 'Connection',
|
||||
Priority => 'Error',
|
||||
Key => 'Kernel::System::Email::Sendmail',
|
||||
Value => "Error during message sending: $ErrorMessage",
|
||||
);
|
||||
|
||||
return $Self->_SendError(
|
||||
%Param,
|
||||
ErrorMessage => $ErrorMessage,
|
||||
);
|
||||
}
|
||||
|
||||
my $EncodeObject = $Kernel::OM->Get('Kernel::System::Encode');
|
||||
|
||||
# encode utf8 header strings (of course, there should only be 7 bit in there!)
|
||||
$EncodeObject->EncodeOutput( $Param{Header} );
|
||||
|
||||
# encode utf8 body strings
|
||||
$EncodeObject->EncodeOutput( $Param{Body} );
|
||||
|
||||
print $FH ${ $Param{Header} };
|
||||
print $FH "\n";
|
||||
print $FH ${ $Param{Body} };
|
||||
|
||||
# Check if the filehandle was already closed because of an error
|
||||
# (e. g. mail too large). See bug#9251.
|
||||
if ( !close($FH) ) {
|
||||
|
||||
my $ErrorMessage = $GenErrorMessage->($!);
|
||||
|
||||
$Param{CommunicationLogObject}->ObjectLog(
|
||||
ObjectLogType => 'Connection',
|
||||
Priority => 'Error',
|
||||
Key => 'Kernel::System::Email::Sendmail',
|
||||
Value => "Error during message sending: $ErrorMessage",
|
||||
);
|
||||
|
||||
return $Self->_SendError(
|
||||
%Param,
|
||||
ErrorMessage => $ErrorMessage,
|
||||
);
|
||||
}
|
||||
|
||||
$Param{CommunicationLogObject}->ObjectLog(
|
||||
ObjectLogType => 'Connection',
|
||||
Priority => 'Info',
|
||||
Key => 'Kernel::System::Email::Sendmail',
|
||||
Value => "Email successfully sent from '$Param{From}' to '$ToString'!",
|
||||
);
|
||||
|
||||
$Param{CommunicationLogObject}->ObjectLogStop(
|
||||
ObjectLogType => 'Connection',
|
||||
Status => 'Successful',
|
||||
);
|
||||
|
||||
return $Self->_SendSuccess();
|
||||
}
|
||||
|
||||
sub _SendSuccess {
|
||||
my ( $Self, %Param ) = @_;
|
||||
|
||||
return {
|
||||
%Param,
|
||||
Success => 1,
|
||||
};
|
||||
}
|
||||
|
||||
sub _SendError {
|
||||
my ( $Self, %Param ) = @_;
|
||||
|
||||
$Param{CommunicationLogObject}->ObjectLogStop(
|
||||
ObjectLogType => 'Connection',
|
||||
Status => 'Failed',
|
||||
);
|
||||
|
||||
return {
|
||||
Success => 0,
|
||||
%Param,
|
||||
};
|
||||
}
|
||||
|
||||
sub Check {
|
||||
my ( $Self, %Param ) = @_;
|
||||
|
||||
# get config data
|
||||
my $Sendmail = $Kernel::OM->Get('Kernel::Config')->Get('SendmailModule::CMD');
|
||||
|
||||
# check if sendmail binary is there (strip all args and check if file exists)
|
||||
my $SendmailBinary = $Sendmail;
|
||||
$SendmailBinary =~ s/^(.+?)\s.+?$/$1/;
|
||||
if ( !-f $SendmailBinary ) {
|
||||
return (
|
||||
Success => 0,
|
||||
ErrorMessage => "No such binary: $SendmailBinary!"
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
Success => 1,
|
||||
Sendmail => $Sendmail,
|
||||
);
|
||||
}
|
||||
|
||||
1;
|
||||
112
Perl OTRS/Kernel/System/Email/Test.pm
Normal file
112
Perl OTRS/Kernel/System/Email/Test.pm
Normal file
@@ -0,0 +1,112 @@
|
||||
# --
|
||||
# Copyright (C) 2001-2019 OTRS AG, https://otrs.com/
|
||||
# --
|
||||
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
|
||||
# the enclosed file COPYING for license information (GPL). If you
|
||||
# did not receive this file, see https://www.gnu.org/licenses/gpl-3.0.txt.
|
||||
# --
|
||||
|
||||
package Kernel::System::Email::Test;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
our @ObjectDependencies = (
|
||||
'Kernel::System::Cache',
|
||||
'Kernel::System::CommunicationLog',
|
||||
);
|
||||
|
||||
sub new {
|
||||
my ( $Type, %Param ) = @_;
|
||||
|
||||
my $Self = {%Param};
|
||||
bless( $Self, $Type );
|
||||
|
||||
$Self->{CacheKey} = 'Emails';
|
||||
$Self->{CacheType} = 'EmailTest';
|
||||
|
||||
$Self->{Type} = 'Test';
|
||||
|
||||
return $Self;
|
||||
}
|
||||
|
||||
sub Send {
|
||||
my ( $Self, %Param ) = @_;
|
||||
|
||||
my $Class = ref $Self;
|
||||
|
||||
# Get and delete the communication-log object from the Params because all the
|
||||
# other params will be cached (necessary for the unit tests).
|
||||
my $CommunicationLogObject = delete $Param{CommunicationLogObject};
|
||||
|
||||
$CommunicationLogObject->ObjectLog(
|
||||
ObjectLogType => 'Message',
|
||||
Priority => 'Debug',
|
||||
Key => $Class,
|
||||
Value => 'Received message for emulated sending without real external connections.',
|
||||
);
|
||||
|
||||
# get already stored emails from cache
|
||||
my $Emails = $Kernel::OM->Get('Kernel::System::Cache')->Get(
|
||||
Key => $Self->{CacheKey},
|
||||
Type => $Self->{CacheType},
|
||||
) // [];
|
||||
|
||||
# recipient
|
||||
my $ToString = join ', ', @{ $Param{ToArray} };
|
||||
|
||||
$CommunicationLogObject->ObjectLogStart(
|
||||
ObjectLogType => 'Connection',
|
||||
);
|
||||
|
||||
$CommunicationLogObject->ObjectLog(
|
||||
ObjectLogType => 'Connection',
|
||||
Priority => 'Info',
|
||||
Key => $Class,
|
||||
Value => sprintf( "Sending email from '%s' to '%s'.", $Param{From} // '', $ToString ),
|
||||
);
|
||||
|
||||
push @{$Emails}, \%Param;
|
||||
|
||||
$Kernel::OM->Get('Kernel::System::Cache')->Set(
|
||||
Key => $Self->{CacheKey},
|
||||
Type => $Self->{CacheType},
|
||||
Value => $Emails,
|
||||
TTL => 60 * 60 * 24,
|
||||
);
|
||||
|
||||
$CommunicationLogObject->ObjectLog(
|
||||
ObjectLogType => 'Connection',
|
||||
Priority => 'Info',
|
||||
Key => $Class,
|
||||
Value => "Email successfully sent!",
|
||||
);
|
||||
|
||||
$CommunicationLogObject->ObjectLogStop(
|
||||
ObjectLogType => 'Connection',
|
||||
Status => 'Successful',
|
||||
);
|
||||
|
||||
return {
|
||||
Success => 1,
|
||||
};
|
||||
}
|
||||
|
||||
sub EmailsGet {
|
||||
my ( $Self, %Param ) = @_;
|
||||
|
||||
return $Kernel::OM->Get('Kernel::System::Cache')->Get(
|
||||
Key => $Self->{CacheKey},
|
||||
Type => $Self->{CacheType},
|
||||
) // [];
|
||||
}
|
||||
|
||||
sub CleanUp {
|
||||
my ( $Self, %Param ) = @_;
|
||||
|
||||
return $Kernel::OM->Get('Kernel::System::Cache')->CleanUp(
|
||||
Type => $Self->{CacheType},
|
||||
);
|
||||
}
|
||||
|
||||
1;
|
||||
Reference in New Issue
Block a user