Как я могу отправить HTML-письмо с помощью Perl?

Я пытаюсь отправить HTML-письмо с помощью Perl.

 open(MAIL,"|/usr/sbin/sendmail -t");

    ## Mail Header
    print MAIL "To: $to\n";
    print MAIL "From: $from\n";
    print MAIL "Subject: $subject\n\n";
    ## Mail Body
    print MAIL "Content-Type: text/html; charset=ISO-8859-1\n\n"
        . "<html><head></head><body>@emailBody";
 close(MAIL)

Это правильный способ сделать это? По какой-то причине он не работает. Благодарим за помощь.

Ответ 1

Тип содержимого должен быть частью почтового заголовка. Сейчас это часть тела почты. Заголовок отделен от тела двойной новой строкой. Таким образом, удаление второй строки новой строки после заголовка темы должно устранить проблему типа содержимого, которая не будет правильно интерпретироваться.

Ответ 2

Начните с Email::Sender::Simple или Email::Sender.
В CPAN есть руководство по быстрому старту, а Рикардо написал хороший use -me в своем календаре приезда в 2009 году

В руководстве по быстрому старту:

  use strict;
  use Email::Sender::Simple qw(sendmail);
  use Email::Simple;
  use Email::Simple::Creator;

  my $email = Email::Simple->create(
    header => [
      To             => '"Xavier Q. Ample" <[email protected]>',
      From           => '"Bob Fishman" <[email protected]>',
      Subject        => "don't forget to *enjoy the sauce*",
      'Content-Type' => 'text/html', 
    ],
    body => "<p>This message is short, but at least it cheap.</p>",
  );
  sendmail($email);

Ответ 4

Если вы просто генерируете spewy электронные письма, и вам не нужна массовая надежность или настройка, вы всегда можете просто воспользоваться ярлыком...

use Email::Stuff;

my $html = <<'END_HTML';
<html>
  ...
</html>
END_HTML

Email::Stuff->to('"Xavier Q. Ample" <[email protected]>')
            ->from('"Bob Fishman" <[email protected]>')
            ->subject("Don't forget to *enjoy the sauce*")
            ->html_body($body)
            ->send;

Ответ 5

У меня возникла проблема при отправке MIME-сообщения с Perl с использованием sendmail.

После нескольких часов разочарования я обнаружил, что все сообщение должен быть в переменной с одним выражением для отправки сообщения отправитьmail. Так, например, если ваше сообщение полностью содержится в переменная с именем $email_msg, отправив сообщение через sendmail, будет выглядеть как:

$mailprog = '/usr/sbin/sendmail';
open(MAIL,"|$mailprog -t");
print MAIL $email_msg;
close MAIL;

Это работает, при использовании большого количества сообщений "print MAIL" "" похоже, отправляют почтовое сообщение, которое могут обрабатывать некоторые почтовые программы, как ожидалось.

Это использует Perl 5.8.8 на сервере CentOS.

Ответ 6

Вы можете использовать Email:: MIME

    my $message = Email::MIME->create(
    header_str => [
      From    => '[email protected]',
      To      => $address,
      Subject => encode_mimewords($subject,
        Charset => 'utf-8', Encoding => 'B'),
      'Content-Type' => 'text/html',
    ],
    attributes => {
      encoding => 'base64',
      charset  => 'UTF-8',
    },
    body_str => $message_body,
  );
  sendmail($message);

Ответ 7

Использование html-тега "pre" будет простым способом отправки script
вывода в электронной почте HTML.

    open(MAIL, "|/usr/sbin/sendmail -t");
    print MAIL "To: $EMAIL\n";
    print MAIL "From: $FROM\n";
    print MAIL "Subject: $SUBJECT";
    print MAIL "Content-Type: text/html; charset=ISO-8859-1\n\n";
    print MAIL < pre >\n$mailoutput< /pre >\n;
    close(MAIL);

Это позволит вам сделать все форматирование в script и будет
получить тот же вывод в электронной почте, что и на экране. [как вы знаете, убедитесь, что нет пробела до и после "pre" ]