This commit is contained in:
2024-10-14 00:08:40 +02:00
parent dbfba56f66
commit 1462d52e13
4572 changed files with 2658864 additions and 0 deletions

View 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;

View 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;

View 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;

View 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;

View 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;

View 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;