如何从Perl发送多行输出到/ bin / mail?

时间:2010-09-23 03:23:39

标签: perl smtp module client stdout

我有一个Perl脚本,可以将多行输出打印到屏幕上。我需要捕获这些行并将它们分成一段电子邮件(/ bin / mail)或文本文件,我可以通过/ bin邮件在另一个操作中发送。实际上,我已经找到了简单(愚蠢)的方式,我使用bash包装器来做邮件位。看起来像,

#!/usr/bin/bash
source /nethome/zog/.bash_profile 
cd /nethome/zog/bin/perl  
/nethome/zog/bin/perl/find_free_space.pl > text.file
/bin/mail -s FreeSpace@NJ3 zog@geemail.com < text.file

我想使用Net :: SMTP来执行smtp位。至少可以说,上述内容并不优雅。

我看到这样的事情:

open(MAIL, "| /bin/mail -s FreePorts me\@geemail.com") || 
   die "mail failed: $!\n"; print MAIL "This is how it goes."
在stackoverflow上

但无法将STDOUT重定向到邮件。我正在使用:

$complete_output .= "\n"; "|/bin/mail -s FreePorts zog\@geeemail.com" || die "mail failed: $!\n";

我不确定您是否都需要查看Perl脚本才能提供帮助,但it is on pastebin。请告诉我。

1 个答案:

答案 0 :(得分:1)

STDOUT在这里没有发挥作用。有什么你忘记告诉我们的吗?打印到MAIL文件句柄时发生了什么?这个输出是否成为了消息?将多行发送到MAIL文件句柄时会发生什么?

您的代码是:

"|/bin/mail -s FreePorts zog\@geeemail.com" || die "mail failed: $!\n";

这没有任何作用。它是一个字符串,也是一个真正的价值。交替永远不会对模具分支进行。你在问题中使用了第一段代码时发生了什么?编写一个小示例脚本,看看是否可以发送邮件并进行测试,直到找到答案为止。例如,这是一个测试问题的完整脚本:

#!perl
use strict;
use warnings;
open my $mail, '| /bin/mail -s FreePorts me@geemail.com';
print $mail "This is a test message from $$ at " . localtime() . "\n";
close $mail or die "The pipe failed!\n $?";

当你跑步时会发生什么?从命令行尝试相同的命令会发生什么?

为什么不使用Perl模块(比如其中一个Email :: *模块)而不是依赖外部命令?关于进程间通信有很多要了解,我认为你已经落后了。模块为您处理所有细节,界面更好,更灵活。