如何使用Net :: SMTP :: TLS发送电子邮件附件

时间:2019-01-02 23:39:27

标签: perl smtp-auth

我需要连接到Microsoft Exchange服务器,而我发现可以实现此目标的唯一模块是Net :: SMTP :: TLS。我能够发送电子邮件,但是我无法理解它要我附加文件的方式。与MIME :: Lite不同,它不只是附加文件并发送。看来我希望在将附件附加到电子邮件之后再写附件。

问:我无法通过某种方式附加文件吗?我是否应该使用其他模块与Microsoft Exchange配合使用?

请在下面查看我的代码,以及与此主题相关的Ars Technica discussion的链接。该代码似乎将应该是电子邮件正文的内容放入附件中。

        $smtp->mail($from_email);
        $smtp->to(@to_email_arr);
        $smtp->cc(@cc_email_arr);
        $smtp->data;
        $smtp->datasend("Subject: $subject\n");
        $smtp->datasend("To: $to_email\n");
        $smtp->datasend("CC: $cc_email\n");
        $smtp->datasend("From: $from_email\n");

        $smtp->datasend("MIME-Version: 1.0\n");
        $smtp->datasend("Content-Disposition: attachment; filename=\"$filename\"n");
        $smtp->datasend("Content-Type: application/text; name=attachment.txt ");
        $smtp->datasend();

        $smtp->datasend($body_msg);

        $smtp->dataend;
        $smtp->quit;

1 个答案:

答案 0 :(得分:6)

  

...我发现唯一可以实现此目标的模块是Net :: SMTP :: TLS

核心模块Net::SMTP支持显式TLS(使用STARTTLS,这是Net::SMTP::TLS正在做的事情)和隐式TLS(从一开始就支持TLS)的支持,不需要使用10年前被废弃的模块。 Net::SMTP的用法几乎相同:

  use Net::SMTP;
  my $smtp = Net::SMTP->new(mailhost, ... ; 
  $smtp->starttls(); # make sure to install IO::Socket::SSL
  $smtp->auth(username, password); # make sure to install Authen::SASL
  $smtp->mail(...);
  $smtp->to(...);
  ...

无论如何,您的主要问题似乎是构造带有附件的邮件,然后可以通过$smtp->data(mail)(或使用datadatasenddataend)发送附件。到目前为止,您已经尝试过手动构建此邮件,但由于您不知道如何真正完成操作,因此失败了。

如果您真的坚持要手动执行此操作,建议您研究相关标准,特别是RFC 2045RFC 2046,它们描述二进制附件的编码以及如何放置此编码的附件然后作为结构化邮件中的附件。

但是,鉴于该标准远非简单易行,并且易于构建与标准邮件兼容的邮件,这些邮件可与经过测试的邮件客户端一起使用,但以后无法与其他邮件客户端一起使用,因此最好使用库来代替创建您自己的并且可能是错误的MIME邮件概念。您所参考的2001年讨论甚至指出,使用MIME::Lite之类的东西比尝试手工进行MIME编码更好。

如何使用MIME :: Lite创建带有附件的邮件是clearly described in the documentation,请按照此处的示例进行操作。该示例的主要区别在于,您想以自己的方式发送邮件,可以使用as_string

use MIME::Lite;
use Net::SMTP;

# create MIME::Lite object as documented
my $msg = MIME::Lite->new(...);
$msg->attach(...);

# create object, authenticate, set to,from.. in SMTP dialog
my $smtp = Net::SMTP->new(...);
$smtp->starttls(...);
$smtp->auth(...); 
$smtp->mail(...);
$smtp->to(...);

# send created mail
$smtp->data($msg->as_string);
$smtp->quit;