2011-09-08 8 views
5

私はUbuntuで動作し、MySQLデータベースの内容を処理するpythonスクリプトを持っています。スクリプトが未処理のexceptionになったとき、または処理が完了したときに通知を受けたい。pythonスクリプトがエラーに陥ったときに通知する方法、または単に停止する方法はありますか?

これを行うには適切な方法はありますか?

は、私がthis SO-Answerに示された方法を使用してのpythonの中から自分にメールを送信するのではと思ったが、私は私のlogindataハードコーディングする必要があることを行うことができるように - 私はに慣れていないよ(スクリプトは、公開サーバ上で実行されます会社内で)。

これを回避する方法や、より適切な方法でそれを実現する方法はありますか?

+0

このログインデータは、SMTPサーバーまたはMySQL、あるいはその両方で認証されますか? – arunkumar

+0

SMTP-Severを使用します。私はそのために私のGMailアカウントを使用したい。 – Aufwind

答えて

1

通常、SMTP経由でメールを送信するときにログインデータを入力する必要はありません。私があなただったら、あなたがリンクしてきた答えで与えられたコードを実験し、あなたの会社のSMTPサーバーで試してみよう。

+0

あなたはあなたが何を意味するのか説明してください。あなたは... SMTP経由でメールを送信するときにログインデータを提供する必要はありません。 ... *? – Aufwind

+0

@Aufwind:あなたが 'abc @ xyz.com'に電子メールを送り、' xyz.com'のSMTPサーバー(MXレコードにリストされているSMTPサーバー)に接続しているとすれば、ほとんどの場合、ログインの詳細を入力しなくてもメールを受け入れます。 – NPE

1

私が書いた例外ハンドラは、スクリプトが終了したときに例外を電子メールで送信して使用します。 sys.excepthook = ExceptHookでそれを設定します。

import os 
import sys 
import traceback 
import re 
import smtplib 
import getpass 

def ExceptHook(etype, value, tb): 
    """Formats traceback and exception data and emails the error to me: &^&^@&^&^&.com. 

    Arguments: 
    etype -- Exception class type 
    value -- Exception string value 
    tb -- Traceback string data 
    """ 

    excType = re.sub('(<(type|class \')|\'exceptions.|\'>|__main__.)', '', str(etype)).strip() 
    Email = {'TO':"*****@*****.com", 'FROM':getpass.getuser() + '@blizzard.com', 'SUBJECT':'** Exception **', 'BODY':'%s: %s\n\n' % (excType, etype.__doc__)} 

    for line in traceback.extract_tb(tb): 
     Email['BODY'] += '\tFile: "%s"\n\t\t%s %s: %s\n' % (line[0], line[2], line[1], line[3]) 
    while 1: 
     if not tb.tb_next: break 
     tb = tb.tb_next 
    stack = [] 
    f = tb.tb_frame 
    while f: 
     stack.append(f) 
     f = f.f_back 
    stack.reverse() 
    Email['BODY'] += '\nLocals by frame, innermost last:' 
    for frame in stack: 
     Email['BODY'] += '\nFrame %s in %s at line %s' % (frame.f_code.co_name, frame.f_code.co_filename, frame.f_lineno) 
     for key, val in frame.f_locals.items(): 
      Email['BODY'] += '\n\t%20s = ' % key 
      try: 
       Email['BODY'] += str(val) 
      except: 
       Email['BODY'] += '<ERROR WHILE PRINTING VALUE>' 
    thisHost = socket.gethostname() 
    thisIP = socket.gethostbyname(thisHost) 
    gmTime = time.gmtime() 
    logName = 'SomeTool_v%s_%s_%s_%s.%s.%s_%s.%s.%s.log' % (__version__, thisHost, thisIP, gmTime.tm_mon, gmTime.tm_mday, gmTime.tm_year, gmTime.tm_hour, gmTime.tm_min, gmTime.tm_sec) 
    if not os.path.exists(LOGS_DIR): 
     try: 
      os.mkdir(LOGS_DIR) 
     except: 
      baseLogDir = os.path.join(NET_DIR, "logs") 
      if not os.path.exists(baseLogDir): 
       try: 
        os.mkdir(baseLogDir) 
       except: 
        pass 
       else: 
        open(os.path.join(baseLogDir, logName), 'w').write(Email['BODY']) 
     else: 
      open(os.path.join(LOGS_DIR, logName), 'w').write(Email['BODY']) 
    Email['ALL'] = 'From: %s\nTo: %s\nSubject: %s\n\n%s' % (Email['FROM'], Email['TO'], Email['SUBJECT'], Email['BODY']) 
    server = smtplib.SMTP(MY_SMTP) 
    server.sendmail(Email['FROM'], Email['TO'], Email['ALL']) 
    server.quit() 

if __name__ == '__main__': 
    sys.excepthook = ExceptHook 
    try: 
     1/0 
    except: 
     sys.exit() 
0

あなたはクーロンでこれを実行している場合、私はbashでのpythonの外側でスクリプトの戻り値を見てお勧めします。きれいな出口が0を返すものの

$ python test.py 
Traceback (most recent call last): 
    File "test.py", line 7, in <module> 
    raise ValueError("test") 
ValueError: test 
$ echo $? 
1 

$ python test.py 
$ echo $? 
0 

のcronを監視するには、あなたがリターンを書くことができ、スクリプトで例外が発生した場合たとえば、あなたは1の戻り値を取得しますどこかのファイルへの値。ファイルに0以外の値が含まれている場合は、monitを使用して通知します。when the timestamp is older than how often your cron is supposed to run

0

そのマシンにはsendmailがインストールされていますか?smtpサーバーと直接通信するのではなく、sendmailを使って電子メールを送信します。この

echo -e "To: [email protected]\nSubject: Testx\nTest\n" | sudo sendmail -bm -t -v 

を試してみてくださいそれは冗長モードで動作中のsendmailが表示されますし、それが動作するかどうか、あなただけの、例えば電子メールを送信するためにsendmailを使用することができます

ps = Popen(["/usr/lib/sendmail"]+list(your_recipents), \ 
       stdin=PIPE) 
    ps.stdin.write('you msg') 
    ps.stdin.flush() 
    ps.stdin.close() 
0

あなたのオプションのいくつかは -

あなたがメールリレーとしてすることができますセットアップ、簡単なSMTPサーバ社内ネットワーク上のマシン/サーバへのアクセスを持っている場合。 Gmailにログインの詳細をより安全に設定するには、誰がそのマシンにアクセスできるかによって異なります。それは潜在的に、別のサーバ上の単純なVMとして実行することさえできます。あなただけがアクセスできるVMです。その後、このサーバーを使用してpythonスクリプトからメールを送信します。

企業ネットワーク上のサーバーにアクセスできない場合は、認証を必要としないSMTPサーバーを探すことができます。

また、電子メールを送信してその資格情報を使用するためだけに、Gmailユーザーを作成することもできます。

0

GMail APIを使用することができます。スクリプト内にパスワードは必要ありません。 This answerが役に立ちます。

関連する問題