什么';如果Perl脚本中出现任何错误,那么发送电子邮件的最佳方式是什么?
我正在编写一个脚本,它可以做很多事情,如果在执行过程中的任何时候执行了“die”或出现错误,我想给自己发送一封电子邮件什么';如果Perl脚本中出现任何错误,那么发送电子邮件的最佳方式是什么?,perl,Perl,我正在编写一个脚本,它可以做很多事情,如果在执行过程中的任何时候执行了“die”或出现错误,我想给自己发送一封电子邮件 我目前正在使用END块检查退出状态,如果大于0,则调用错误电子邮件子例程,但我想知道是否有更好的方法。当前实现的缺陷是,如果电子邮件子例程中发生错误,将发生无限循环。如果您在Unix系统上,包括(可能)Mac OS/X:/myscript.pl 2>/tmp/myscript.pl.log | mail-s'myscript.pl失败me@example.comsend(“sm
我目前正在使用END块检查退出状态,如果大于0,则调用错误电子邮件子例程,但我想知道是否有更好的方法。当前实现的缺陷是,如果电子邮件子例程中发生错误,将发生无限循环。如果您在Unix系统上,包括(可能)Mac OS/X:
/myscript.pl 2>/tmp/myscript.pl.log | mail-s'myscript.pl失败me@example.com
在Windows上我不知道。我对sendmail使用
eval
(因为它几乎总是安装的):
eval
{
#做点什么
};
如果($@)
{
my$ip=`ifconfig`
或死亡“无法ifconfig:$!\n”;
my@now=localtime;
my$now=sprintf(“%04d-%02d-%02d%02d:%02d:%02d:%02d”、$now[5]+1900、$now[4]+1、$now[3]、$now[2]、$now[1]、$now[0]);
打开(SENDMAIL,“|/usr/sbin/SENDMAIL-oi-t-fyou\@yourdomain.com”)
或者“无法为sendmail分叉:$!\n”;
打印SENDMAIL我们这里有两个独立的问题:
当程序死亡时,如果代码也遇到致命错误,如何(可靠地)执行代码而不创建无限循环
从Perl代码发送电子邮件的最佳方式是什么
因此,分别回答以下问题:
与其使用END
块,不如使用$SIG{{uuuuu DIE}
处理程序(未测试的代码,但应该是正确的):
当然,CPAN上有许多优秀的邮件发送模块。我个人的偏好是,默认情况下,它将使用sendmail
发送邮件,但是,如果您在Windows或其他没有sendmail
命令的系统上,您可以使用MIME::Lite->send(“smtp”);
直接通过SMTP发送,而无需通过本地MTA。还支持通过发送邮件服务器路由邮件(如果您的上游提供商阻止端口25,则可以使用该服务器!),并在需要时处理该服务器上的通用身份验证方法
我个人的偏好是Net::SMTP perl模块。有点冗长,但功能非常全面
my $mail = Net::SMTP->new($smtp_host);
$mail->mail("$login\@foo.com");
$mail->to("$login\@foo.com");
$mail->data();
#Generate email headers
$mail->datasend("From: Root <root\@foo.com>");
$mail->datasend("Subject: Status");
$mail->datasend("To: root\@foo.com");
$mail->datasend("\n") # Need one newline between headers and body
# Report data
$mail->datasend("Mail body here");
$mail->datasend("More mail body, repeat $mail->datasend() as needed");
# Then close connection
$mail->quit();
my$mail=Net::SMTP->new($SMTP\u主机);
$mail->mail($login\@foo.com);
$mail->to($login\@foo.com”);
$mail->data();
#生成电子邮件标题
$mail->datasend(“From:Root”);
$mail->datasend(“主题:状态”);
$mail->datasend(“收件人:root\@foo.com”);
$mail->datasend(“\n”)#需要在标题和正文之间换行
#报告数据
$mail->datasend(“此处为邮件正文”);
$mail->datasend(“更多邮件正文,根据需要重复$mail->datasend()”;
#然后关闭连接
$mail->quit();
这两种方法都很有效。我更喜欢这个方法,因为如果我替换SENDMAIL,它可以在Windows上工作,而且我可以用Perl实现所有功能。谢谢!
$SIG{__DIE__} = \&error_handler;
sub error_handler {
die @_ if $^S; # Do nothing if we died in an eval{}
delete $SIG{__DIE__}; # Clear handler in case following code also dies
print STDERR "Blue Wizard is about to die!\n";
}
my $mail = Net::SMTP->new($smtp_host);
$mail->mail("$login\@foo.com");
$mail->to("$login\@foo.com");
$mail->data();
#Generate email headers
$mail->datasend("From: Root <root\@foo.com>");
$mail->datasend("Subject: Status");
$mail->datasend("To: root\@foo.com");
$mail->datasend("\n") # Need one newline between headers and body
# Report data
$mail->datasend("Mail body here");
$mail->datasend("More mail body, repeat $mail->datasend() as needed");
# Then close connection
$mail->quit();