lemonldap-ng/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/_SMTP.pm
Xavier Guimard 2d2edb61ac Merge experimental branch (#960)
Also update version to 2.0
2016-03-17 22:19:44 +00:00

181 lines
5.3 KiB
Perl

##@file
# SMTP common functions
##@class
# SMTP common functions
package Lemonldap::NG::Portal::_SMTP;
use strict;
use String::Random;
use MIME::Lite;
use MIME::Base64;
use Encode;
our $VERSION = '2.0.0';
## @method string gen_password(string regexp)
# Generate a complex password based on a regular expression
# @param regexp regular expression
# @return complex password
sub gen_password {
my $self = shift;
my $regexp = shift;
my $random = new String::Random;
return $random->randregex($regexp);
}
## @method int send_mail(string mail, string subject, string body, string html)
# Send mail
# @param mail recipient address
# @param subject mail subject
# @param body mail body
# @param html optional set content type to HTML
# @return boolean result
sub send_mail {
my ( $self, $mail, $subject, $body, $html ) = @_;
# Set charset
my $charset = $self->{mailCharset} ? $self->{mailCharset} : "utf-8";
# Encode the body with the given charset
$body = encode( $charset, $body );
$subject = encode( $charset, $subject );
# Debug messages
$self->lmLog( "SMTP From " . $self->{mailFrom}, 'debug' );
$self->lmLog( "SMTP To " . $mail, 'debug' );
$self->lmLog( "SMTP Subject " . $subject, 'debug' );
$self->lmLog( "SMTP Body " . $body, 'debug' );
$self->lmLog( "SMTP HTML flag " . ( $html ? "on" : "off" ), 'debug' );
$self->lmLog( "SMTP Reply-To " . $self->{mailReplyTo}, 'debug' )
if $self->{mailReplyTo};
# Encode the subject
$subject = encode_base64($subject);
$subject =~ s/\s//g;
$subject = "=?$charset?B?" . $subject . "?=";
# Detect included images (cid)
my %cid = ( $body =~ m/"cid:([^:]+):([^"]+)"/g );
# Replace cid in body
$body =~ s/"cid:([^:]+):([^"]+)"/"cid:$1"/g;
eval {
# Create message
my $message;
# HTML case
if ($html) {
$message = MIME::Lite->new(
From => $self->{mailFrom},
To => $mail,
"Reply-To" => $self->{mailReplyTo},
Subject => $subject,
Type => 'multipart/related',
);
# Attach HTML message
$message->attach(
Type => "text/html; charset=$charset",
Data => qq{$body},
);
# Attach included images
foreach ( keys %cid ) {
$message->attach(
Type => "image/" . ( $cid{$_} =~ m/\.(\w+)/ )[0],
Id => $_,
Path => $self->getApacheHtdocsPath() . "/" . $cid{$_},
);
}
}
# Plain text case
else {
$message = MIME::Lite->new(
From => $self->{mailFrom},
To => $mail,
"Reply-To" => $self->{mailReplyTo},
Subject => $subject,
Type => 'TEXT',
Data => $body,
);
# Manage content type and charset
$message->attr( "content-type" => "text/plain" );
$message->attr( "content-type.charset" => $charset );
}
# Send the mail
$self->{SMTPServer}
? $message->send(
"smtp", $self->{SMTPServer},
AuthUser => $self->{SMTPAuthUser},
AuthPass => $self->{SMTPAuthPass}
)
: $message->send();
};
if ($@) {
$self->lmLog( "Send message failed: $@", 'error' );
return 0;
}
return 1;
}
## @method string getMailSession(string user)
# Check if a mail session exists
# @param user the value of the user key in session
# @return the first session id found or nothing if no session
sub getMailSession {
my ( $self, $user ) = @_;
my $moduleOptions = $self->{globalStorageOptions} || {};
$moduleOptions->{backend} = $self->{globalStorage};
my $module = "Lemonldap::NG::Common::Apache::Session";
# Search on mail sessions
my $sessions = $module->searchOn( $moduleOptions, "user", $user );
# Browse found sessions to check if it's a mail session
foreach my $id ( keys %$sessions ) {
my $mailSession = $self->getApacheSession( $id, 1 );
next unless ($mailSession);
return $id if ( $mailSession->data->{_type} =~ /^mail$/ );
}
# No mail session found, return empty string
return "";
}
## @method string getRegisterSession(string mail)
# Check if a register session exists
# @param mail the value of the mail key in session
# @return the first session id found or nothing if no session
sub getRegisterSession {
my ( $self, $mail ) = @_;
my $moduleOptions = $self->{globalStorageOptions} || {};
$moduleOptions->{backend} = $self->{globalStorage};
my $module = "Lemonldap::NG::Common::Apache::Session";
# Search on register sessions
my $sessions = $module->searchOn( $moduleOptions, "mail", $mail );
# Browse found sessions to check if it's a register session
foreach my $id ( keys %$sessions ) {
my $registerSession = $self->getApacheSession( $id, 1 );
next unless ($registerSession);
return $id if ( $registerSession->data->{_type} =~ /^register$/ );
}
# No register session found, return empty string
return "";
}
1;