2017-05-17 3 views
0

値が特定の基準と一致する場合に電子メールを送信するスクリプトを作成しました。毎回のチェックで複数の電子メールの代わりに1つの電子メールを送信したいと思っています。私は別の機能を投げ入れることで軽減できると思ったが、それをどうやって行うのか分からない。どのようにこれを達成するための任意のアイデア?代わりに、おそらく配列や辞書に、メッセージ本文に入るに項目を追加するためにそれを使用し、電子メールを送信するためにcheckを使用してのCSVから一度読んだ1通のメールを送信する方法

import csv, requests, xmltodict, smtplib, email.utils 
from email.mime.text import MIMEText 

def sendEmail(host, value, devicename): 
    # Create the message 
    msg = MIMEText('This is the body of the message.') 
     msg['To'] = email.utils.formataddr(('Recipient', 'XXXXXX')) 
     msg['From'] = email.utils.formataddr(('Author', 'XXXXX')) 
     msg['Subject'] = 'Simple test message' 
     server = smtplib.SMTP('XXXXXXX') 
     server.set_debuglevel(True) # show communication with the server 

    try: 
     server.sendmail('XXXXXX', ['XXXXXX'], msg.as_string()) 
    finally: 
     server.quit() 

def check(hostIP, value): 
    xml = """<?xml version="1.0" encoding="iso-8859-1"?>""" 

    headers = {'Content-Type': 'application/xml'} 
    response = requests.post('http://' + hostIP + '/RPC2', data=xml, headers=headers).text 

    doc = xmltodict.parse(response) 
    uptime = str(doc['response']) 

    maxtime = '300' 
    time = str(uptimeValue) 
    day = time // (24 * 3600) 

    if day >= maxtime: 
     print 'it is' 
     sendEmail(str(hostIP), str(value), str(devicename)) 
    else: 
     print "it is not!" 

def main(): 
    try: 
     with open('list.csv', 'r') as file: 
      reader = csv.DictReader(file) 
      for row in reader: 
       check(row['Host'], row['Value']) 
    except Exception as error: 
     print ValueError("Could not properly read the csv file") 
     sys.exit(0) 

if __name__ == "__main__": 
    main() 
+0

は1つの電子メールは今複数の電子メールメッセージを介して分割情報のすべてが含まれているのでしょうか? –

+0

「メールデータ」はありません。あなたは**空の**メールを送信しています。 – stovfl

+0

@ScottHunter - うん、1つのメールにすべてのデータが含まれているようにしたい。今すぐスクリプトを実行すると、ループごとに1つのメールが送信されます – yusof

答えて

1

置き換え

def sendEmail(message): 

if day >= maxtime: 
     print 'it is' 
     return (str(hostIP), str(value), str(devicename)) 

+0

!しかし今は、その日が最大時間よりも短い場合、関数の問題に直面しています。それは今まで働いていましたが、今はループを壊すだけです。私は、リターンを入れてから、else文の後にパスしても助けにならなかった。他に何か入れてもいい? – yusof

+0

基本的には、ループを再び通過しません。 – yusof

+0

私はそれができることを知らなかった!それは今や理にかなっている。それは完璧に働いた! – yusof

0

。その後、ファイルの処理が完了したら、その収集した情報を使用して電子メールの本文を構築し、sendEmailへの1回の呼び出しで提供することができます。

checkの中からsendEmailを呼び出していないことを意味します。あなたはファイルを完了したらmainからそれを呼び出します。

+0

それでは、質問は...どうすればsendEmail関数にすべてを送る前にcsvを処理し終わるまでチェックを待つ必要がありますか?それは私が空白を描いている最大のものだと思う。実際に働いた – yusof

関連する問題