Perl, Sendgrid и Net::SMTP и MIME::Entity
В моем Perl-коде я использовал Net::SMTP и MIME:Entity для отправки электронной почты через мою учетную запись Sendgrid (из их API v2, где я мог использовать свою учетную запись в качестве API)...
это работало безупречно.
Но мы перенесли серверы на более новую версию. Все еще Unix (Linux), но имеет более новое оборудование, включая более новую версию Plesk. IP-адреса все одинаковые, мы перенесли их на новое оборудование. Мы изменили IP-адрес, который является основным, но мы убедились, что добавили его в sendgrid whitelabel...
Так что я не знаю, почему это перестало бы работать. Я не получаю никаких ошибок в коде, API подключается. Но я никогда не вижу никаких писем, независимо от того, что я делаю.
Так как ошибок нет, не уверен, почему это не работает.
Вот мой код, вы видите недостаток, который может привести к сбою?
sub Send_Multi_Part_Email_MimeLite {
my ($__to,$__cc,$__bcc,$__from,$__subject,$__html_message,$__text_message,$__importance,$__xpriority,$__x_ms_priority) = @_;
if($__x_ms_priority && ($__x_ms_priority =~ /\|/)) {
($__x_ms_priority,$_attachFile,$_attachFilePath) = split /\|/, $__x_ms_priority, 3;
}
if($__xpriority && ($__xpriority =~ /\|/)) {
($__xpriority,$_unSubKey,$_mbrUn) = split /\|/, $__xpriority, 3;
}
if($__importance && ($__importance =~ /\|/)) {
($__importance,$_emailType) = split /\|/, $__importance, 2;
}
my $_useNewSystem = 1; # Declare new system... set to 1 to use it and not use MimeLite any longer...
if($_useNewSystem) {
use MIME::Entity;
use Net::SMTP;
my $_sendIp = $ENV{REMOTE_ADDR} || "127.0.0.1";
if($__to && ($__to =~ /\;/)) {
$__to =~ s/\;/\,/g;
}
if($__cc && ($__cc=~ /\;/)) {
$__cc =~ s/\;/\,/g;
}
if(!$__bcc) {
$__bcc = 'testmailacct@gmail.com'; # not real, but when in production is a real email, so we can get emails to confirm they are being delivered... only when debugging... Commented out if not in test mode...
}
if($__bcc && ($__bcc =~ /\;/)) {
$_bcc =~ s/\;/\,/g;
}
if(!$__html_message) {
$__html_message = $__text_message;
$__html_message =~ s/\n/br()."\n"/eg;
$__html_message =~ s/\cM\cJ/br()."\n"/eg;
}
$_emailSentType = "";
$mime = MIME::Entity->build(Type => 'multipart/alternative',
Encoding => '-SUGGEST',
From => $__from,
To => $__to,
Subject => $__subject,
'Importance' => $__importance,
"X-Mailer" => "$_co_domain Sendgrid Mailer - Version 2.0",
'X-Organization' => "$_co_name",
"X-Mail-Sent-For" => "The Club or www.$_co_domain/$_un; From IP: $_sendIp",
'X-Priority' => $__xpriority,
'X-MSMail-Priority' => $__x_ms_priority
);
$_sendKey = ""; # removed for security...
$_removeLink = qq~https://www.testing.com/backoffice.cgi?page=unsubscribe$_sendKey~;
$__text_message .= qq~
You are receiving this email as a club member of The $_co_name. You can turn off your
email subscription by logging into your back office with your username and password
that you registered with. Or you may click:
$_removeLink to remove yourself.
~;
if($__html_message) {
$__html_message .= qq~<br>
<br>
<span style="font-size: 12px; color: #808040;">
You are receiving this email as a club member of The $_co_name.<br>
You can turn off your email subscription by logging into your back office<br>
with your username and password that you registered with.<br>
Or you may click: <a href="$_removeLink">Here</a> to remove yourself,<br>
or call our Customer Care Center at (888)123-4567 for assistance<br>
<br>
<br></span>
<br>
~;
}
$mime->attach(Type => 'text/plain',
Encoding =>'-SUGGEST',
Data => $__text_message);
$mime->attach(Type => 'text/html',
Encoding =>'-SUGGEST',
Data => $__html_message);
if($_attachFile) {
### Attach stuff to it:
if($_attachFilePath && ($_attachFilePath =~ /csv$/i)) {
$_mimType = "text/csv";
$_mimEncoding = "US-ASCII";
} elsif($_attachFilePath && ($_attachFilePath =~ /gif$/i)) {
$_mimType = "image/gif";
$_mimEncoding = "base64";
} elsif($_attachFilePath && ($_attachFilePath =~ /jpg$/i)) {
$_mimType = "images/jpeg";
$_mimEncoding = "base64";
} elsif($_attachFilePath && ($_attachFilePath =~ /png$/i)) {
$_mimType = "images/png";
$_mimEncoding = "base64";
} else {
$_mimType = "text/plain";
$_mimEncoding = "UTF-8";
}
# Attach the file that it sent...
$mime->attach(Path => $_attachFilePath,
Type => "$_mimType",
Encoding => "$_mimEncoding");
}
# Sendgrid Login credentials
$username = 'myloginemail';
$password = "myloginpass";
# Open a connection to the SendGrid mail server
$smtp = Net::SMTP->new('smtp.sendgrid.net',
Port=> 587,
Timeout => 60,
Hello => "testing.com", Debug => 1) or return("0","could not establish connection!: $!");
# Authenticate
if($smtp) {
$smtp->auth($username, $password);
# Send the rest of the SMTP stuff to the server
$smtp->mail($__from);
$smtp->to($__to);
$smtp->data($mime->stringify);
$smtp->quit();
open(DEB,">>/home/path/files/aa_mime_email_debug_tracking.txt");
seek(DEB,0,2);
$_resultMsg = $smtp->message();
$_resultMsg =~ s/\n//eg;
$_resultMsg =~ s/\cM\cJ//eg;
# just added this, not sure if it will work... want to create a loop of the $smtp to put it in the debug file, so I can see what is happening and why email does not go anywhere, but connection works...
$_resultMsg2 = "";
foreach (keys %{$smtp}) {
$_resultMsg2 .= "," if $_resultMsg2;
# Test this one:
$_resultMsg2 .= " $_ => ${$hash_ref}{$_}";
# Then test this one:
$_resultMsg2 .= ", $_ = " . ${$hash_ref}->{$_};
}
print DEB qq~Result: '~ . $_resultMsg . qq~'; smtpTest: '~ . $_resultMsg2 . qq~'; From => "$__from", To => "$__to", Subject => "$__subject", If Member Username passed: "$_mbrUn", on: ~ . Format_Date_For_Viewing(time(),"") . "\n";
close(DEB);
return (1,"");
} else {
open(DEB,">>/home/path/files/aa_mime_email_debug_tracking.txt");
seek(DEB,0,2);
print DEB qq~ERROR: '~ . $smtp->message() . qq~' (Sendgrid error!!!) - From => "$__from", To => "$__to", Subject => "$__subject", If Member Username passed: "$_mbrUn", on: ~ . Format_Date_For_Viewing(time(),"") . "\n";
close(DEB);
return (0,$smtp->message());
}
} else {
# Code for old email system... not using sendgrid, using sendmail... no longer in use, but code left there for times when sendgrid not working or something... used MimeLite
}
}
Во всяком случае, я понятия не имею, почему это не работает. Администраторы Сервера проверили, и в очереди нет ни ошибок, ни электронных писем, так что... так что ничего не застряло где-то, что мы можем найти...
Может ли кто-нибудь что-то увидеть, кроме моего ужасного программирования??? лол
Спасибо, Ричард
1 ответ
Если программа работала раньше, не менялась и не выдает никаких ошибок, вероятно, в этом нет ничего плохого. Протестируйте отправку электронного письма вручную.
Начните с кодирования вашего имени пользователя и пароля:
perl -MMIME::Base64 -e 'print encode_base64 $_ for qw/myloginemail myloginpass/'
Затем используйте telnet с закодированным именем пользователя после первого 334 и паролем после второго:
telnet smtp.sendgrid.net 587
Trying 167.89.118.51...
Connected to smtp.sendgrid.net.
Escape character is '^]'.
220 SG ESMTP service ready at ismtpd0011p1las1.sendgrid.net
helo testing.com
250 Hello, nice to meet you
auth login
334 VXNlcm5hbWU6
bXlsb2dpbmVtYWls
334 UGFzc3dvcmQ6
bXlsb2dpbnBhc3M=
235 Authentication succeeded
mail from:<testmailacct@gmail.com>
250 2.1.5 Ok
rcpt to:<testmailacct@gmail.com>
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
subject: test
This is test 0.
.
250 2.0.0 Ok: queued as BBAEA3483C73
quit
221 2.0.0 Bye
Connection closed by foreign host.