在perl中发送多部分邮件

时间:2015-07-14 07:55:57

标签: perl email

我正在尝试使用net::smtp模块通过Perl脚本发送邮件。当我发送没有任何附件的普通邮件时它工作正常。我不会收到任何邮件。

    use Net::SMTP;
    use MIME::Base64;
    use File::Basename;  
    use MIME::Base64 qw( encode_base64 );
    use MIME::Base64 qw( decode_base64 );
    @attachments = 'C:\Users\ups7kor\Desktop\scripts\commadnline\appending.pl';
    $toAddress = '***';
    $fromAddress = '***';
    $ServerName = '***';
    my $boundary = 'End Of mail';

    my $smtp = Net::SMTP->new($ServerName, Timeout => 60) or print $failureLogHandler  ++$errrorCount.")ERROR:Could not create SMTP object . \n\t please check SMPT Adress in $iniFileData{INI_SMTP_SERVER_NAME} of $iniFileSection{INI_EMAIL} section ";

    $smtp->mail($fromAddress);
    $smtp->recipient($toAddress, { SkipBad => 1 });
    $smtp->data();
    $smtp->datasend("To: $toAddress\n");
    $smtp->datasend("From: $fromAddress\n");
    $smtp->datasend("Subject: $subject\n");
    $smtp->datasend("MIME-Version: 1.0\n");
    $smtp->datasend("Content-type: multipart/mixed;\n\tboundary=\"$boundary\"\n");
    $smtp->datasend("--$boundary\n");
    $smtp->datasend("Content-type: text/plain\n");
    $smtp->datasend("Content-Disposition: quoted-printable\n");
    $smtp->datasend("\n $messageBody\n");

    if(@attachments)
    {
    $smtp->datasend("--$boundary\n");
    foreach $attachment (@attachments)
    {
        open(DAT, $attachment) || die("Could not open text file!");
        my @textFile = <DAT>;
        close(DAT); 
        my $filename = basename($attachment);
        $smtp->datasend("Content-Type: application/text; name=\"$filename\"\n");
        $smtp->datasend("Content-Disposition: attachment; filename=\"$filename\"\n");
        $smtp->datasend("\n");
        $smtp->datasend("@textFile\n");
   }
   }



    $smtp->datasend("--$boundary --\n");
    $smtp->dataend();
    $smtp->quit;

但是,如果我在其他机器上尝试相同的代码,它可以正常工作。 为什么相同的代码在我的机器上不起作用并且在其他机器上工作正常。

请帮忙。

3 个答案:

答案 0 :(得分:2)

您可以使用MIME :: Lite模块。

请参阅:https://metacpan.org/pod/MIME::Lite#Create-a-multipart-message

梗概:

### Create the multipart "container":
$msg = MIME::Lite->new(
    From    =>'me@myhost.com',
    To      =>'you@yourhost.com',
    Cc      =>'some@other.com, some@more.com',
    Subject =>'A message with 2 parts...',
    Type    =>'multipart/mixed'
);

### Add the text message part:
### (Note that "attach" has same arguments as "new"):
$msg->attach(
    Type     =>'TEXT',
    Data     =>"Here's the GIF file you wanted"
);

### Add the image part:
$msg->attach(
    Type        =>'image/gif',
    Path        =>'aaa000123.gif',
    Filename    =>'logo.gif',
    Disposition => 'attachment'
);

更新:根据Dave的评论:

查看Email::Stuffer模块。使用它创建多部分消息非常简单。

Email::Stuffer->to('Simon Cozens<simon@somewhere.jp>')
              ->from('Santa@northpole.org')
              ->text_body("You've been good this year. No coal for you.")
              ->attach_file('choochoo.gif')
              ->send;

答案 1 :(得分:2)

您正在使用一些相当低级别的工具来构建您的消息。这可能会奏效,但您需要实施构建MIME消息的所有规则 - 这听起来就像是努力工作。

每当我想用电子邮件和Perl做某事时,我会在Email :: *命名空间中查找相应的模块。我可能从Email::MIME开始,但我注意到现在包含指向Email::Stuffer的指针,这可能更简单。

答案 2 :(得分:0)

您可以使用 Mail :: Sender 模块发送包含正文附件的邮件。如果你有这个模块,只是一个小例子。

  

my $ sender = new Mail :: Sender {smtp =&gt; &#39;服务器名称&#39;,from =&gt;   &#39; EMAILID&#39;};                  $ sender-&gt; MailFile({to =&gt;&#39; xxx.gmail.com,yyy.gmail.com&#39;,subject =&gt;&#39;您要放置的某个主题&#39;,                  msg =&gt; &#34;邮件正文&#34;,file =&gt; &#39;您需要发送的附件的路径&#39;});