首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Perl中发送文本附件的问题

在Perl中发送文本附件的问题
EN

Stack Overflow用户
提问于 2018-10-01 08:24:12
回答 1查看 457关注 0票数 2

我有一个发送邮件的程序如下:

代码语言:javascript
运行
复制
sub SendMail {
    my $subject = shift;
    my @message = @_;
    my $sender;

    my $MIME_BOUNDARY = '====Multipart.Boundary.689464861147414354====';
    my $now = strftime("%Y-%m-%d %H:%M:%S", localtime);
    my @addresses = split(",", $ENV{ADMIN_MAIL});
    my $sender = $ENV{USER} || $ENV{USERNAME};
    $sender .= "\@" . hostname();
    my $smtp = Net::SMTP->new($ENV{MAILHOST} || 'mailhost', Debug => 1);
    unless ( $smtp ) {
        die "Error while sending notification mail. Not connected to SMTP server.";
    }
    $smtp->mail( $addresses[0] );
    $smtp->recipient( @addresses );
    $smtp->data;
    $smtp->datasend("From: $sender\n");
    $smtp->datasend("To: " . join(",", @addresses) . "\n");
    $smtp->datasend("Subject: $subject\n");
    $smtp->datasend("Date: " . strftime("%a, %d %b %Y %H:%M:%S %z", localtime) . "\n");     

    if ( @log_messages ) {
        $smtp->datasend("Mime-Version: 1.0\n");
        $smtp->datasend("Content-Type: multipart/mixed; boundary=\"$MIME_BOUNDARY\"\n");
        $smtp->datasend("This is a multipart message in MIME format.\n");
        $smtp->datasend("--$MIME_BOUNDARY\n");
    }

    $smtp->datasend("Content-type: text/plain; charset=UTF-8\n");
    $smtp->datasend("Content-Disposition: quoted-printable\n");
    $smtp->datasend("\n");
    foreach ( @message ) { $smtp->datasend("$_\n") }
    $smtp->datasend("\n\n");
    $smtp->datasend("Message from " . hostname() . " (PID=$$) sent by 'LogDumper.pl' at $now");
    $smtp->datasend("\n");

    if ( @log_messages ) {
        $smtp->datasend("\n");
        $smtp->datasend("--$MIME_BOUNDARY\n");
        $smtp->datasend("Content-Type: text/plain; name=\"logs.txt\"\n");
        $smtp->datasend("Content-Disposition: attachment; filename=\"logs.txt\"\n");
        $smtp->datasend("\n");
        foreach ( @log_messages ) { $smtp->datasend("$_\n") }
        $smtp->datasend("\n");
        $smtp->datasend("--$MIME_BOUNDARY--\n");
    }

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

}

该过程可以很好地处理纯文本邮件,即空@log_messages。但是,如果我试图附加一个文本文件

代码语言:javascript
运行
复制
my @log_messages;
push @log_messages, "Line 1";
push @log_messages, "Line 2";
SendMail("The Subject", "The Message");

那么邮件就不发送了。

调试输出如下:

代码语言:javascript
运行
复制
Net::SMTP=GLOB(0x7a78a40)<<< 354 Start mail input; end with <CRLF>.<CRLF>
Net::SMTP=GLOB(0x7a78a40)>>> From: Domscheit@xxxxx
Net::SMTP=GLOB(0x7a78a40)>>> To: wernfried.domscheit@xxxxx.xxx
Net::SMTP=GLOB(0x7a78a40)>>> Subject: The Suject
Net::SMTP=GLOB(0x7a78a40)>>> Date: Mo, 01 Okt 2018 10:15:57 W. Europe Daylight Time
Net::SMTP=GLOB(0x7a78a40)>>> Mime-Version: 1.0
Net::SMTP=GLOB(0x7a78a40)>>> Content-Type: multipart/mixed; boundary="====Multipart.Boundary.689464861147414354===="
Net::SMTP=GLOB(0x7a78a40)>>> This is a multipart message in MIME format.
Net::SMTP=GLOB(0x7a78a40)>>> --====Multipart.Boundary.689464861147414354====
Net::SMTP=GLOB(0x7a78a40)>>> Content-type: text/plain; charset=UTF-8
Net::SMTP=GLOB(0x7a78a40)>>> Content-Disposition: quoted-printable
Net::SMTP=GLOB(0x7a78a40)>>> The Message
Net::SMTP=GLOB(0x7a78a40)>>> Message from xxxxx (PID=8072) sent by 'LogDumper.pl' at 2018-10-01 10:15:54
Net::SMTP=GLOB(0x7a78a40)>>> --====Multipart.Boundary.689464861147414354====
Net::SMTP=GLOB(0x7a78a40)>>> Content-Type: text/plain; name="logs.txt"
Net::SMTP=GLOB(0x7a78a40)>>> Content-Disposition: attachment; filename="logs.txt"
Net::SMTP=GLOB(0x7a78a40)>>> Line 1
Net::SMTP=GLOB(0x7a78a40)>>> Line 2
Net::SMTP=GLOB(0x7a78a40)>>> --====Multipart.Boundary.689464861147414354====--
Net::SMTP=GLOB(0x7a78a40)>>> .
Net::SMTP: Unexpected EOF on command channel at C:\Developing\Source\LogDumper.pl line 1271.

显然,有一个缺失或不必要的\n。我试着把它放在几乎所有地方,但我没有让它发挥作用。

更新:

实际上,当我在Linux上执行脚本时,它是工作的,而不是在我的Windows开发PC上。

EN

回答 1

Stack Overflow用户

发布于 2018-10-02 07:00:20

我认为问题已经解决了。

  • 它在Linux的生产服务器上工作。
  • 当我在办公室工作时,它在开发Windows上工作
  • 当我在家工作并通过VPN连接时,它在Windows上不起作用-…

嗯,这并不是真的解决了,但对我来说,它的工作很好。我还没有测试它是否在VPN上失败,对于一个更高级别的包也是如此。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52587153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档