package sendmail; require Exporter; use strict; use Net::SMTP; use IO::Socket::SSL; use checktld; use Net::DNS::Resolver; our @ISA = qw(Exporter); our @EXPORT_OK = qw(send_mail); our $debug = 0; sub validate_mailaddr { my $p_email_addr = $_[0]; my $l_valid_format; my $l_dns_error; die "validate_mailaddr: Illegal argument count" if(@_ != 1); my $l_dns = Net::DNS::Resolver->new( nameservers => [ qw(127.0.0.1) ] ); $p_email_addr =~ /^([^\s@,:"<>]+)@([^\s@,:"<>]+)\.([^\s@,:"<>.\d]{2,})$/; return undef if(!valid_tld($3)); $l_dns->query($2.'.'.$3); $l_dns_error = $l_dns->errorstring; return undef if($l_dns_error eq 'NXDOMAIN'); return undef if($l_dns_error ne 'NOERROR'); return "$1\@$2.$3"; }; sub send_mail { my $p_sender; my $p_recipient; my $p_response_path; my $p_cc; my $p_subject; my $p_message; my $l_result = 1; my $l_mailer; my $l_status; my $l_eval_err; die "send_mail: Illegal argument count" if(@_ != 6); ($p_sender,$p_recipient,$p_response_path,$p_cc,$p_subject,$p_message) = @_; print STDERR "Sanity check of recipient address...\n" if($p_debug); return 0 if(!defined ($p_recipient = validate_mailaddr($p_recipient))); print STDERR "Sanity check of response path address...\n" if($p_debug && $p_response_path ne ''); if($p_response_path ne '') { return 0 if(!defined ($p_response_path = validate_mailaddr($p_response_path))); } print STDERR "$p_recipient\n" if($debug); $l_mailer = Net::SMTP->new( 'localhost', Hello => '', Timeout => 60, SSL => 1 ); return undef if(!defined $l_mailer); $l_status = eval { print STDERR "Sending MAIL FROM...\n" if($debug); $l_mailer->mail($p_sender); print STDERR "Attempting RCPT TO...\n" if($debug); if($l_mailer->to($p_recipient)) { print STDERR "Sending CC...\n" if($p_cc && $debug); $l_mailer->cc($p_response_path) if($p_cc && $p_response_path ne ''); print STDERR "Sending message data...\n"; $l_mailer->data(); $l_mailer->datasend("Content-Type: text/plain; charset=utf-8\n"); $l_mailer->datasend("From: <$p_sender>\n"); $l_mailer->datasend("To: <$p_recipient>\n"); $l_mailer->datasend("Reply-To: <$p_response_path>\n") if($p_response_path $l_mailer->datasend("Cc: <$p_response_path>\n") if($p_response_path && $p $l_mailer->datasend("Subject: $p_subject\n\n"); $l_mailer->datasend("$p_message"); $l_mailer->dataend(); return "OK"; } else { return "Connection refused"; } }; $l_eval_err = $@; $l_mailer->quit; if($l_eval_err) { $l_result = 0; print STDERR "The transaction failed: $@\n"; $l_result = -1 if($l_eval_err =~ /Greylisted/); } if($l_status ne 'OK') { print STDERR "The transaction failed: $l_status\n"; return 0; } return $l_result; }; 1; __END__