如何将变量传递给子程序以在 perl 中发送电子邮件

how to pass a variable to a subroutine to send email in perl

如果变量的内容不为空,我希望能够发送电子邮件

这是我的代码:

my $output = $ssh->capture({stdin_data => <<'EOS'}, 'pfexec /usr/bin/perl');

use File::Find::Rule;

my $dir = '/dir';

my $today = time();
my $onehour = $today - (60*60);
my $oneday = $today - (24*60*60);

my @files = File::Find::Rule->file()
                            ->name("*.0")
                            ->mtime(">$oneday")
                            ->mtime("<$onehour")
                            ->in( "$dir" );

for my $file (@files) {
    print "$file\n";
}

EOS

sub send_email{

use MIME::Lite;

$to = 'abcd@gmail.com';
$cc = 'efgh@mail.com';
$from = 'webmaster@yourdomain.com';
$subject = 'Test Email';


$msg = MIME::Lite->new(
                 From     => $from,
                 To       => $to,
                 Cc       => $cc,
                 Subject  => $subject,
                 Data     => $output
                 );

$msg->send;

}
if ($output) {
        send_email($output);
}

如您所见,我远程连接到服务器。找到一些文件,如果找到文件,请通过电子邮件发送。 我不知道如何创建子例程,所以它将 $output 作为参数并通过邮件发送。

谢谢

所以你问的是子程序如何接收参数?它是通过 @_ 数组。我在下面对你的子程序做了一些重写。

注意:use Mime::Lite; 应该移到子之外...最好将它一直移到顶部。所有 use 模块总是首先运行,无论它在您的代码中的什么位置,所以它最好列在靠近顶部的位置。此外,在一个地方查看所有依赖项通常很有用。如果你绝对不想加载 Mime::Lite 模块,除非 send_email 被调用,在 sub 中使用 require Mime::Lite; 而不是 use,它将被包含第一次调用 sub.

请记住对本地变量使用 my,这样您就不会在程序增长时遇到使用相同名称的其他变量的麻烦(称为命名空间污染)

use MIME::Lite;
...
my $output = $ssh->capture( ... );
...
sub send_email {
  my($data) = @_;
  my $subject = 'Test Email';
  my($to,$cc,$from) = ('abcd@gmail.com',
                       'efgh@mail.com',
                       'webmaster@yourdomain.com');
  my $msg = MIME::Lite->new(
                 From     => $from,
                 To       => $to,
                 Cc       => $cc,
                 Subject  => $subject,
                 Data     => $data,
            );
  $msg->send;
}

send_email($output) if $output;