Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';如果Perl脚本中出现任何错误,那么发送电子邮件的最佳方式是什么?_Perl - Fatal编程技术网

什么';如果Perl脚本中出现任何错误,那么发送电子邮件的最佳方式是什么?

什么';如果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

我正在编写一个脚本,它可以做很多事情,如果在执行过程中的任何时候执行了“die”或出现错误,我想给自己发送一封电子邮件


我目前正在使用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();