Как отправить вложение электронной почты с использованием Net::SMTP::TLS
Мне нужно подключиться к серверу Microsoft Exchange, и единственный модуль, который я смог найти, - Net::SMTP::TLS. Я могу отправлять электронные письма, но не могу понять, как он хочет, чтобы я прикрепил файл. В отличие от MIME::Lite, он не просто прикрепляет файл и отправляет. Похоже, он ожидает, что я напишу вложение после того, как прикрепил его к электронному письму.
В: Нет ли способа, которым я могу просто прикрепить файл? Должен ли я использовать какой-то другой модуль для работы с Microsoft Exchange?
Пожалуйста, смотрите мой код ниже, а также ссылку на обсуждение Ars Technica по этой теме. Этот код, кажется, помещает то, что должно быть телом письма, во вложенный файл.
$smtp->mail($from_email);
$smtp->to(@to_email_arr);
$smtp->cc(@cc_email_arr);
$smtp->data;
$smtp->datasend("Subject: $subject\n");
$smtp->datasend("To: $to_email\n");
$smtp->datasend("CC: $cc_email\n");
$smtp->datasend("From: $from_email\n");
$smtp->datasend("MIME-Version: 1.0\n");
$smtp->datasend("Content-Disposition: attachment; filename=\"$filename\"n");
$smtp->datasend("Content-Type: application/text; name=attachment.txt ");
$smtp->datasend();
$smtp->datasend($body_msg);
$smtp->dataend;
$smtp->quit;
1 ответ
... единственный модуль, который я смог найти, это Net::SMTP::TLS
Основной модуль Net:: SMTP поддерживает оба явных TLS (используя STARTTLS
команда, это то, что Net::SMTP::TLS
и неявный TLS (TLS с самого начала) уже несколько лет, и не должно быть необходимости использовать модуль, от которого отказались более 10 лет назад. Использование Net::SMTP
это почти то же самое:
use Net::SMTP;
my $smtp = Net::SMTP->new(mailhost, ... ;
$smtp->starttls(); # make sure to install IO::Socket::SSL
$smtp->auth(username, password); # make sure to install Authen::SASL
$smtp->mail(...);
$smtp->to(...);
...
В любом случае, ваша главная проблема, кажется, состоит в том, чтобы создать письмо с вложениями, которые вы затем могли бы отправить через $smtp->data(mail)
(или с data
, datasend
, dataend
). До сих пор вы пытались создать это письмо вручную и потерпели неудачу, так как не представляете, как это на самом деле должно быть сделано.
Если вы действительно настаиваете на том, чтобы сделать это вручную, я рекомендую вам изучить соответствующие стандарты, в частности RFC 2045 и RFC 2046, которые описывают как кодирование двоичного вложения, так и способ размещения этого кодированного вложения в качестве вложения в структурированной почте.
Но, учитывая, что стандарт далеко не прост и что легко создавать противоречащие стандарту письма, которые работают с протестированными почтовыми клиентами, но не могут работать позже с другими почтовыми клиентами, было бы гораздо лучше использовать библиотеку вместо создания собственной и, вероятно, неправильное представление о почте MIME. Обсуждение 2001 года, на которое вы ссылаетесь, даже указывает на то, что использование чего-то вроде MIME:: Lite было бы лучшей идеей, чем попытка MIME-кодирования вручную.
Как создать письмо с вложениями с помощью MIME:: Lite четко описано в документации, просто следуйте приведенному там примеру. Основное отличие этого примера в том, что вы хотите отправлять почту по-своему, чего можно добиться с помощью as_string
:
use MIME::Lite;
use Net::SMTP;
# create MIME::Lite object as documented
my $msg = MIME::Lite->new(...);
$msg->attach(...);
# create object, authenticate, set to,from.. in SMTP dialog
my $smtp = Net::SMTP->new(...);
$smtp->starttls(...);
$smtp->auth(...);
$smtp->mail(...);
$smtp->to(...);
# send created mail
$smtp->data($msg->as_string);
$smtp->quit;