package Config::ClawsMail::Account;
use v5.26;
use Moo;
use Types::Standard qw(Str InstanceOf);
use Config::ClawsMail::Server;
use namespace::clean;
has [qw(account_name name address)] => (
is => 'ro',
required => 1,
isa => Str,
);
has [qw(imap smtp)] => (
is => 'ro',
isa => InstanceOf['Config::ClawsMail::Server'],
);
my @ssl_string=qw(no ssl starttls);
sub new_from_config {
my ($class,$args) = @_;
my $config = $args->{account_config};
return unless $config->{protocol} eq '1';
my $section = $args->{account_section};
(my $password_section = $section)=~ s{Account: }{account:};
my $password_store = $args->{password_store};
my $imap_server = Config::ClawsMail::Server->new({
host => $config->{receive_server},
port => (
$config->{set_imapport}
? $config->{imap_port}
: $config->{ssl_imap} == 1
? scalar getservbyname('imaps','tcp')
: scalar getservbyname('imap','tcp')
),
ssl => $ssl_string[$config->{ssl_imap}],
%{$config}{qw(user_id)},
password => $password_store->password_for($password_section,'recv'),
});
my $smtp_server = Config::ClawsMail::Server->new({
host => $config->{smtp_server}||$config->{receive_server},
port => (
$config->{set_smtpport}
? $config->{smtp_port}
: $config->{ssl_smtp} == 1
? scalar getservbyname('smtps','tcp')
: scalar getservbyname('smtp','tcp')
),
ssl => $ssl_string[$config->{ssl_smtp}],
( $config->{use_smtp_auth} ? (
user_id => $config->{smtp_user_id} || $config->{user_id},
password => $password_store->password_for($password_section,'send') || $password_store->password_for($password_section,'recv')
) : () ),
});
return $class->new({
%{$config}{qw(account_name name address)},
imap => $imap_server,
smtp => $smtp_server,
});
}
sub email_transport {
my ($self) = @_;
require Email::Sender::Transport::SMTPS;
my $smtp = $self->smtp;
return Email::Sender::Transport::SMTPS->new(
host => $smtp->host,
port => $smtp->port,
ssl => $smtp->ssl,
( $smtp->user_id ? (
sasl_username => $smtp->user_id,
sasl_password => $smtp->password,
) : () )
);
}
1;