Как использовать Email :: Mime с sendmail - PullRequest
0 голосов
/ 24 ноября 2018

Я пытаюсь отправить электронное письмо в формате HTML, используя скрипт.Мне придется использовать нативные вещи Unix и Email::Mime, так как это единственное, что я нашел установленным в коробке, с которой я застрял.Я создаю сообщение Email::Mime и отправляю его на sendmail.

Но я получаю сообщение об ошибке: В заголовке не найдены адреса получателей * Я видел другие сценарии RUBY, использующие sendmail, так чтоработает для этой коробки.

Может ли кто-нибудь помочь мне с тем, что я могу делать неправильно в приведенном ниже фрагменте?

sub send_mail(){

use MIME::QuotedPrint;
use HTML::Entities;
use IO::All;
use Email::MIME;

# multipart message
my @parts = (
    Email::MIME->create(
        attributes => {
            content_type => "text/html",
            disposition  => "attachment",
            encoding     => "quoted-printable",
            charset      => "US-ASCII",
        },
        body_str => "Hello there!",
    ),
);

my $email = Email::MIME->create(
    header_str => [
        To => 'abc@xxx.com',
        From => 'abc@xxx.com',
        Subject => "Test Email",
    ],
    parts      => [@parts],
);

# die $email->as_string;
# die YAML::XS::Dump(\%mail);

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

print MAIL $email;

close (MAIL);

}

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018
print MAIL $email;

должно быть

print MAIL $email->as_string;
0 голосов
/ 24 ноября 2018

Прежде всего, если вашему почтовому серверу требуется аутентификация (что обычно делают большинство), вам нужно указать SMTP-сессию:

$transport = EMail::Sender::Transport::SMTP::Persistent->new({
  # host, port, ssl, etc
})

Более того, я думаю, что вам на самом деле не нужнасоздавать контент как собственный MIME-контент.Я использовал нечто подобное в моей собственной работе:

$email = Email::MIME->Create(
  header_str => [ ... ],
  body_str => $message,
  attributes => {
    charset => 'UTF-8',
    encoding => 'base64',
    content_type => 'text/html',
  }
)

После отправки почты через sendmail($email, { transport => $transport }) вам необходимо закрыть сеанс через $transport->disconnect.

Для вашего приложенияВы можете адаптировать несколько вещей, таких как фактический протокол отправки (если он отличается от SMTP) или содержимое хеш-атрибутов.

...