Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何使用Net::SMTP::TLS发送电子邮件附件_Perl_Smtp Auth - Fatal编程技术网

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

Perl 如何使用Net::SMTP::TLS发送电子邮件附件,perl,smtp-auth,Perl,Smtp Auth,我需要连接到Microsoft Exchange服务器,我发现唯一可以实现这一点的模块是Net::SMTP::TLS。我可以发送电子邮件,但是,我无法理解它希望我附加文件的方式。与MIME::Lite不同,它不只是附加文件并发送。它看起来像是希望我在将附件附加到电子邮件后再写入附件 Q:有没有什么方法可以直接附加文件?我是否应该使用其他模块与Microsoft Exchange一起工作? 请参阅下面我的代码,以及有关此主题的链接。这段代码似乎把邮件的正文放进了附件中 $smtp-

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

Q:有没有什么方法可以直接附加文件?我是否应该使用其他模块与Microsoft Exchange一起工作?

请参阅下面我的代码,以及有关此主题的链接。这段代码似乎把邮件的正文放进了附件中

        $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;
。。。我找到的唯一可以实现这一点的模块是Net::SMTP::TLS

核心模块支持显式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)
(或者使用
data
datasend
dataend
)发送该邮件。到目前为止,您已经尝试手工构建此邮件,但失败了,因为您不知道如何真正做到这一点

如果你真的坚持手工操作,我建议你学习相关标准,特别是描述二进制附件编码以及如何将编码后的附件作为结构化邮件中的附件的标准

但是,考虑到标准远非简单,而且很容易构建与标准相矛盾的邮件,这些邮件可以与经过测试的邮件客户端一起使用,但以后无法与其他邮件客户端一起使用,因此最好使用库,而不是创建您自己的、可能是错误的MIME邮件。您提到的2001年的讨论甚至指出,使用类似的方法比尝试手工进行MIME编码更好

如何使用MIME::Lite创建带有附件的邮件,请按照此处的示例进行操作。该示例的主要区别在于,您希望以自己的方式发送邮件,这可以通过
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;