发送邮件时无法附加附件

时间:2017-05-04 11:00:11

标签: perl

任何人都可以帮助您在使用Email :: Simple发送电子邮件时附加两个文本文件。我能够收到邮件,但没有附件

我已经尝试了很多,但无法使其工作,不确定我是否有不正确的模块。由于MIME :: Lite的创建者的推荐,我不想使用MIME :: Lite。我基本上想要使用自己的SMTP详细信息,并获得Email :: Sender作为推荐。一切都有效,除了附件。

use strict;
use warnings;

use Email::Sender::Simple qw(sendmail);
use Email::Sender::Transport::SMTP ();
use Email::Simple ();
use Email::Simple::Creator ();
use Email::Sender::Transport::SMTP::TLS;
use Email::MIME;
use IO::All;

my $transport = Email::Sender::Transport::SMTP::TLS->new({
    host => 'smtp.office365.com',
    port => 587,
    sasl_username => 'abcsender@abc.com',
    sasl_password => 'P@ssw0rd@123',
    username => 'abcsender@abc.com',
    password => 'P@ssw0rd@123'
});

my @parts = (
        Email::MIME->create(
                attributes => {
                        content_type => "text/plain",
                        filename     => "/tmp/ERROR1493720941.log",
                        charset      => "US-ASCII",
                        disposition     =>"attachment",
                },    
                body => io( "/tmp/ERROR1493720941.log" )->all,
        ),
        Email::MIME->create(
                attributes => {
                        content_type => "text/plain",
                        filename     => "/tmp/FAILED1493720941.log",
                        charset      => "US-ASCII",
                        disposition     =>"attachment",
                },    
                body => io( "/tmp/FAILED1493720941.log" )->all,
        ),
);

my $email = Email::Simple->create(
  header => [
    To      => 'gsrivastava@abc.com',
    From    => 'abcsender@abc.com',
    Subject => 'Hi!',
  ],
  body => "Hello",
  parts      => [ @parts ],
);

sendmail($email, { transport => $transport });

正如@DaveCross在评论中所说,这是$ email-> as_string的输出

$VAR1 = 'To: gsrivastava@abc.com^M
From: abcsender@abc.com^M
Subject: Hi!^M
Date: Sun, 7 May 2017 07:58:46 -0400^M
^M
Hello^M

1 个答案:

答案 0 :(得分:0)

事实证明,这是一个非常简单的错误。您正在创建MIME电子邮件,但是当您创建实际的电子邮件对象时,您可以使用以下代码:

my $email = Email::Simple->create(
  header => [
    To      => 'gsrivastava@abc.com',
    From    => 'abcsender@abc.com',
    Subject => 'Hi!',
  ],
  body => "Hello",
  parts      => [ @parts ],
);

Email :: Simple不适用于MIME邮件,因此它不理解parts属性并忽略它。要创建MIME电子邮件,您需要使用Email :: MIME。

my $email = Email::MIME->create(
  header => [
    To      => 'gsrivastava@abc.com',
    From    => 'abcsender@abc.com',
    Subject => 'Hi!',
  ],
  parts      => [ @parts ],
);

请注意,我已删除body属性。 MIME电子邮件不能包含部分和正文。解决方案是将另一个元素添加到包含正文文本的@parts

my @parts = (
        Email::MIME->create(
                attributes => {
                        content_type => 'text/plain',
                        disposition  => 'attachment',
                        charset      => 'US-ASCII',
                        encoding     => 'quoted-printable',
                },
                body_str => 'Hello',
        ),

        ...
);