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
相关产品推荐
相关产品推荐

