Как отправить вложение электронной почты с использованием 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;
Другие вопросы по тегам