Как я могу отправлять почту в Perl-скрипте? - PullRequest
0 голосов
/ 09 ноября 2019

Я адаптировал скрипт из поваренной книги Perl. Я проверяю его, чтобы отправить мне письмо в gmail.

#!/usr/bin/perl
use strict;
use warnings;

use MIME::Lite;
my $msg;
    $msg = MIME::Lite->new(From => 'zmumba@gmail.com',
    To => 'zmumba@gmail.com',
    Subject => 'My office photo',
    Type => 'multipart/mixed');

 $msg->attach(Type => 'image/png',
         Path => '/home/zmumba/ZMD_Proj/Docs/Reporting',
         Filename => 'office_lyout.png');

$msg->attach(Type => 'TEXT',
         Data => 'I hope you can use this!');

  $msg->send( );

Когда я запускаю этот скрипт, я получаю сообщение "/ home / zmumba / ZMD_Proj / Docs / Reporting", которое не читается. Отсюда Как я могу отправлять почту через Gmail с помощью Perl? , теперь я понимаю, что для использования MIME :: Lite мне нужно отправлять почту через почтовый сервер. Поэтому я заменил

$msg = MIME::Lite->new(From => 'zmumba@gmail.com

на

$msg = Email::Send::Gmail->new(From => 'zmumba@gmail.com

и получаю ошибку «Не удается найти метод объекта« новый »через пакет Email :: Send :: Gmail».

Затем я попытался

    $msg = Net::IMAP::Simple::SSL->new(From => 'zmumba@gmail.com',

и получил «Нечетное количество элементов в назначении хеша в /home/zmumba/perl5/lib/perl5/Net/IMAP/Simple.pm строка 25. Можетне вызывать метод "attach" для неопределенного значения в ... ". Любая помощь о том, как это сделать? Спасибо в ожидании.

Ответы [ 4 ]

2 голосов
/ 09 ноября 2019

Как уже упоминалось ранее, MIME :: Lite и Email :: Send не рекомендуется -

Email :: Send уходит ... ну, на самом деле не уходит, но официальнос пометкой «вне фаворита». У него есть проблемы с дизайном API, которые затрудняют его полезное расширение, и вместо того, чтобы пытаться отрицать функции и медленно упрощать новый интерфейс, мы выпустили Email :: Sender, который исправляет эти и другие проблемы

Я создал скрипт, который использует Email :: MIME, Email :: Sender :: Simple, Email :: Sender :: Transport :: SMTP для отправки почты. Вы можете взглянуть на https://github.com/sudo-batman/perl-toolkit/tree/master/Mail и использовать его в соответствии с вашими требованиями. Важные строки из этого кода -

sub create_mail {
    my ( $self, $file_attachments, $mail_subject, $mail_body ) = @_;

    my @mail_attachments;
    if (@$file_attachments) {
        foreach my $attachment (@$file_attachments) {
            my $single_attachment = Email::MIME->create(
                attributes => {
                    filename     => basename($attachment),
                    content_type => "application/json",
                    disposition  => 'attachment',
                    encoding     => 'base64',
                    name         => basename($attachment)
                },
                body => io->file($attachment)->all
            );
            push( @mail_attachments, $single_attachment );
        }
    }
    # Multipart message : It contains attachment as well as html body
    my @parts = (
        @mail_attachments,
        Email::MIME->create(
            attributes => {
                content_type => 'text/html',
                encoding     => 'quoted-printable',
                charset      => 'US-ASCII'
            },
            body_str => $mail_body,
        ),
    );

    my $mail_to_users    = join ', ', @{ $self->{config}->{mail_to} };
    my $cc_mail_to_users = join ', ', @{ $self->{config}->{mail_cc_to} };

    my $email = Email::MIME->create(
        header => [
            From    => $self->{config}->{mail_from},
            To      => $mail_to_users,
            Cc      => $cc_mail_to_users,
            Subject => $mail_subject,
        ],
        parts => [@parts],
    );
    return $email;
}

sub send_mail {
    my ( $self, $email ) = @_;
    my $transport = Email::Sender::Transport::SMTP->new(
        {
            host => $self->{config}->{smtp_server}
        }
    );
    eval { sendmail( $email, { transport => $transport } ); };
    if ($@) {
        return 0, $@;
    }
    else {
        return 1;
    }
}
2 голосов
/ 09 ноября 2019

Книге рецептов Perl 20 лет и ее рекомендации устарели. Использование MIME :: Lite не рекомендуется .

MIME :: Lite не рекомендуется его текущим сопровождающим. Существует ряд альтернатив, таких как Email :: MIME или MIME :: Entity и Email :: Sender, которые вы, вероятно, должны использовать вместо этого. MIME :: Lite продолжает накапливать странные сообщения об ошибках и не получает большого количества рефакторинга из-за доступности лучших альтернатив. Пожалуйста, рассмотрите возможность использования чего-то другого.

Вам, вероятно, следует следовать их рекомендации и использовать Email :: Sender .


"Не удается найти метод объекта "new" через пакет Email :: Send :: Gmail "

Вам необходимо загрузить Email :: Send :: Gmail с use Email::Send::Gmail.

Возможно, вам потребуется установить модуль Email :: Send :: Gmail . Проще всего сделать это с помощью cpanminus или , установить свежий Perl с perlbrew и затем использовать cpanminus.


Затем я попытался

$msg = Net::IMAP::Simple::SSL->new(From => 'zmumba@gmail.com',

и я получаю «Нечетное число элементов в назначении хеша в /home/zmumba/perl5/lib/perl5/Net/IMAP/Simple.pm строка 25.

MIME:: Lite, Email :: Send :: Gmail и Net :: IMAP :: Simple :: SSL - это разные библиотеки с разными интерфейсами, которые по-разному принимают разные аргументы. Для их использования обратитесь к документации.

1 голос
/ 10 ноября 2019

Gmail и другие почтовые серверы не допускают несанкционированную ретрансляцию. В большинстве случаев вам потребуется авторизованный доступ.

Вот то, что я использую, после того, как попробовал много модулей. Может быть, это решение кажется несколько устаревшим, но его легко заменить на HTML с обычным текстом в качестве альтернативы или других вложений. Параметры транспорта являются наиболее распространенными.

#!perl

use strict;
use warnings;
use utf8;

use Email::Sender::Simple qw(sendmail try_to_sendmail);
use Email::Sender::Transport::SMTPS;
use Email::Simple ();
use Email::Simple::Creator ();
use Email::MIME;

send_my_mail('john.doe@hisdomain.com','Test','Test, pls ignore');

sub send_my_mail {
  my ($to_mail_address, $subject, $body_text) = @_;

  my $smtpserver   = 'smtp.mydomain.com';
  my $smtpport     = 587;
  my $smtpuser     = 'me@mydomain.com';
  my $smtppassword = 'mysecret';

  my $transport = Email::Sender::Transport::SMTPS->new({
    host          => $smtpserver,
    ssl           => 'starttls',
    port          => $smtpport,
    sasl_username => $smtpuser,
    sasl_password => $smtppassword,
    #debug => 1,
  });

  my $text_part = Email::MIME->create(
    attributes => {
        'encoding'     => 'quoted-printable',
        'content_type' => 'text/plain',
        'charset'      => 'UTF-8',
    },
    'body_str' => $body_text,
  );

  my $alternative_part = Email::MIME->create(
    attributes => {
        'content_type' => 'multipart/alternative',
    },
    parts => [ $text_part, ],
  );

  my $email = Email::MIME->create(
    header_str => [
        To      => $to_mail_address,
        From    => "Website <$smtpuser>",
        Subject => $subject,
    ],
    attributes => {
             'content_type' => 'multipart/mixed',
         },
    parts => [  $alternative_part   ],
  );

  my $status = try_to_sendmail($email, { transport => $transport });

  return $status;
}
0 голосов
/ 10 ноября 2019

Взгляните на Email :: Send :: Gmail модуль. Это может решить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...