You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Perl中如何将$output变量传入子例程实现非空时邮件发送

解决邮件发送子例程的问题

我来帮你搞定这个邮件发送子例程的问题!咱们一步步来,先把接收$output参数的邮件子例程写好,再整合到你的远程文件查找逻辑里。

第一步:编写接收$output的邮件发送子例程

下面分两种常用脚本语言给出示例,你可以根据自己的实际情况选择:

Perl版本子例程

sub send_email {
    my ($output) = @_;  # 接收传入的$output参数

    # 邮件基础配置
    my $to = 'your-recipient@example.com';
    my $from = 'your-sender@example.com';
    my $subject = '远程服务器找到目标文件';

    # 构建邮件内容
    my $message = "远程服务器上找到的文件信息:\n\n$output";

    # 调用系统sendmail发送邮件(也可以用Email::Sender等专业模块,需提前安装)
    open my $mail, '|-', '/usr/sbin/sendmail', '-t' or die "无法启动sendmail: $!";
    print $mail "To: $to\n";
    print $mail "From: $from\n";
    print $mail "Subject: $subject\n\n";
    print $mail $message;
    close $mail;

    print "邮件发送成功!\n";
}

Shell版本子例程(函数)

send_email() {
    local output="$1"  # 接收传入的参数

    # 邮件基础配置
    to="your-recipient@example.com"
    from="your-sender@example.com"
    subject="远程服务器找到目标文件"

    # 调用系统mail命令发送邮件
    echo -e "远程服务器上找到的文件信息:\n\n$output" | mail -s "$subject" -r "$from" "$to"
    echo "邮件发送成功!"
}

第二步:整合远程查找逻辑

把远程连接、文件查找和邮件子例程结合起来,形成完整的工作流:

Perl版本完整逻辑

use strict;
use warnings;

# 先定义邮件子例程
sub send_email {
    my ($output) = @_;
    my $to = 'your-recipient@example.com';
    my $from = 'your-sender@example.com';
    my $subject = '远程服务器找到目标文件';

    open my $mail, '|-', '/usr/sbin/sendmail', '-t' or die "无法启动sendmail: $!";
    print $mail "To: $to\n";
    print $mail "From: $from\n";
    print $mail "Subject: $subject\n\n";
    print $mail "远程服务器上找到的文件信息:\n\n$output";
    close $mail;

    print "邮件发送成功!\n";
}

# 远程服务器配置
my $remote_host = 'your-server.example.com';
my $remote_user = 'your-username';
# 远程执行文件查找命令(这里示例查找/var/log下的.log文件,可按需修改)
my $output = `ssh $remote_user\@$remote_host "find /var/log -name '*.log' -type f"`;

# 判断是否找到文件($output非空则发送邮件)
if ($output ne '') {
    send_email($output);
} else {
    print "未找到目标文件,无需发送邮件。\n";
}

Shell版本完整逻辑

#!/bin/bash

# 定义邮件发送函数
send_email() {
    local output="$1"
    to="your-recipient@example.com"
    from="your-sender@example.com"
    subject="远程服务器找到目标文件"

    echo -e "远程服务器上找到的文件信息:\n\n$output" | mail -s "$subject" -r "$from" "$to"
    echo "邮件发送成功!"
}

# 远程服务器配置
remote_host="your-server.example.com"
remote_user="your-username"
# 远程执行文件查找命令(示例查找/var/log下的.log文件,可按需修改)
output=$(ssh $remote_user@$remote_host "find /var/log -name '*.log' -type f")

# 判断是否找到文件($output非空则发送邮件)
if [ -n "$output" ]; then
    send_email "$output"
else
    echo "未找到目标文件,无需发送邮件。"
fi

注意事项

  • 确保本地机器能无密码SSH登录远程服务器(可通过ssh-keygen配置密钥对),避免脚本卡在输入密码环节。
  • 本地机器需安装并配置好sendmail或mail工具,确保邮件能正常发送。
  • Perl环境下如果追求更稳定的邮件发送,可安装Email::Sender等专业模块,替代直接调用系统sendmail。

内容的提问来源于stack exchange,提问作者danidar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:41:19