【问题标题】:How to Send an Email Attachment using Net::SMTP::TLS如何使用 Net::SMTP::TLS 发送电子邮件附件
【发布时间】:2019-05-29 14:08:08
【问题描述】:

我需要连接到 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;

【问题讨论】:

    标签: perl smtp-auth


    【解决方案1】:

    ...我发现的唯一可以实现此目的的模块是 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-20
      • 2012-08-30
      • 2016-04-17
      • 2019-07-06
      • 2013-10-09
      相关资源
      最近更新 更多