Как отправить вложение электронной почты с использованием Net :: SMTP :: TLS - PullRequest
0 голосов
/ 03 января 2019

Мне нужно подключиться к серверу 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 Ответ

0 голосов
/ 03 января 2019

... единственный модуль, который я смог найти, это 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;
...