Проблема с отправкой текстового вложения в Perl - PullRequest
0 голосов
/ 01 октября 2018

У меня есть процедура для отправки писем:

sub SendMail {
    my $subject = shift;
    my @message = @_;
    my $sender;

    my $MIME_BOUNDARY = '====Multipart.Boundary.689464861147414354====';
    my $now = strftime("%Y-%m-%d %H:%M:%S", localtime);
    my @addresses = split(",", $ENV{ADMIN_MAIL});
    my $sender = $ENV{USER} || $ENV{USERNAME};
    $sender .= "\@" . hostname();
    my $smtp = Net::SMTP->new($ENV{MAILHOST} || 'mailhost', Debug => 1);
    unless ( $smtp ) {
        die "Error while sending notification mail. Not connected to SMTP server.";
    }
    $smtp->mail( $addresses[0] );
    $smtp->recipient( @addresses );
    $smtp->data;
    $smtp->datasend("From: $sender\n");
    $smtp->datasend("To: " . join(",", @addresses) . "\n");
    $smtp->datasend("Subject: $subject\n");
    $smtp->datasend("Date: " . strftime("%a, %d %b %Y %H:%M:%S %z", localtime) . "\n");     

    if ( @log_messages ) {
        $smtp->datasend("Mime-Version: 1.0\n");
        $smtp->datasend("Content-Type: multipart/mixed; boundary=\"$MIME_BOUNDARY\"\n");
        $smtp->datasend("This is a multipart message in MIME format.\n");
        $smtp->datasend("--$MIME_BOUNDARY\n");
    }

    $smtp->datasend("Content-type: text/plain; charset=UTF-8\n");
    $smtp->datasend("Content-Disposition: quoted-printable\n");
    $smtp->datasend("\n");
    foreach ( @message ) { $smtp->datasend("$_\n") }
    $smtp->datasend("\n\n");
    $smtp->datasend("Message from " . hostname() . " (PID=$$) sent by 'LogDumper.pl' at $now");
    $smtp->datasend("\n");

    if ( @log_messages ) {
        $smtp->datasend("\n");
        $smtp->datasend("--$MIME_BOUNDARY\n");
        $smtp->datasend("Content-Type: text/plain; name=\"logs.txt\"\n");
        $smtp->datasend("Content-Disposition: attachment; filename=\"logs.txt\"\n");
        $smtp->datasend("\n");
        foreach ( @log_messages ) { $smtp->datasend("$_\n") }
        $smtp->datasend("\n");
        $smtp->datasend("--$MIME_BOUNDARY--\n");
    }

    $smtp->dataend;
    $smtp->quit;

}

Процедура отлично работает с обычными текстовыми письмами, т.е. пустыми @log_messages.Однако, если я попытаюсь прикрепить текстовый файл

my @log_messages;
push @log_messages, "Line 1";
push @log_messages, "Line 2";
SendMail("The Subject", "The Message");

, то письмо не будет отправлено.

Вывод отладки таков:

Net::SMTP=GLOB(0x7a78a40)<<< 354 Start mail input; end with <CRLF>.<CRLF>
Net::SMTP=GLOB(0x7a78a40)>>> From: Domscheit@xxxxx
Net::SMTP=GLOB(0x7a78a40)>>> To: wernfried.domscheit@xxxxx.xxx
Net::SMTP=GLOB(0x7a78a40)>>> Subject: The Suject
Net::SMTP=GLOB(0x7a78a40)>>> Date: Mo, 01 Okt 2018 10:15:57 W. Europe Daylight Time
Net::SMTP=GLOB(0x7a78a40)>>> Mime-Version: 1.0
Net::SMTP=GLOB(0x7a78a40)>>> Content-Type: multipart/mixed; boundary="====Multipart.Boundary.689464861147414354===="
Net::SMTP=GLOB(0x7a78a40)>>> This is a multipart message in MIME format.
Net::SMTP=GLOB(0x7a78a40)>>> --====Multipart.Boundary.689464861147414354====
Net::SMTP=GLOB(0x7a78a40)>>> Content-type: text/plain; charset=UTF-8
Net::SMTP=GLOB(0x7a78a40)>>> Content-Disposition: quoted-printable
Net::SMTP=GLOB(0x7a78a40)>>> The Message
Net::SMTP=GLOB(0x7a78a40)>>> Message from xxxxx (PID=8072) sent by 'LogDumper.pl' at 2018-10-01 10:15:54
Net::SMTP=GLOB(0x7a78a40)>>> --====Multipart.Boundary.689464861147414354====
Net::SMTP=GLOB(0x7a78a40)>>> Content-Type: text/plain; name="logs.txt"
Net::SMTP=GLOB(0x7a78a40)>>> Content-Disposition: attachment; filename="logs.txt"
Net::SMTP=GLOB(0x7a78a40)>>> Line 1
Net::SMTP=GLOB(0x7a78a40)>>> Line 2
Net::SMTP=GLOB(0x7a78a40)>>> --====Multipart.Boundary.689464861147414354====--
Net::SMTP=GLOB(0x7a78a40)>>> .
Net::SMTP: Unexpected EOF on command channel at C:\Developing\Source\LogDumper.pl line 1271.

Видимо, естьотсутствует или не нужен \n.Я пытался поставить его почти везде, но у меня это не получается.

Обновление:

На самом деле это работает, когда я выполняю скрипт в Linux, но не намой компьютер для разработки Windows.

1 Ответ

0 голосов
/ 02 октября 2018

Я думаю, что проблема решена.

  • Он работает на производственном сервере в Linux
  • Он работает на ПК под управлением Windows, когда я работаю в офисе
  • Он не работает в Windows, когда я работаю дома и подключен через VPN - неприятный отдел безопасности ...

Ну, это не совсем решено, но для меня это работает нормально.Я не проверял (пока), происходит ли сбой через VPN также для одного из пакетов более высокого уровня.

...