2017-03-28 2 views
0

J'essayais de générer une sortie et d'envoyer la même chose au courrier électronique, en utilisant le code ci-dessous à l'aide de modules python smtplib, mais cela ne fonctionnait pas correctement. La fonction de messagerie fonctionne, mais la réception d'un fichier vide. Quelqu'un peut-il me guider ce qui ne va pas dans ce codepython smtp attacher la fonction

import boto.iam 
import csv 
import smtplib 
from email.MIMEMultipart import MIMEMultipart 
from email.MIMEBase import MIMEBase 
from email import Encoders 
# Opening CSV file with write permission 
file = open ('report.csv', 'wb') 
writer = csv.writer(file) 
writer.writerow(['UserName', 'arn', 'password-last-used']) 
conn = boto.iam.connection.IAMConnection() 
users = conn.get_all_users()['list_users_response']['list_users_result']['users'] 
for i in users: 
    writer.writerow([i.user_name, i.arn, i.get("password_last_used", 'Never Used')]) 
def send_report(): 
    server = smtplib.SMTP("localhost", 25) 
    SUBJECT = "AWS Report" 
    EMAIL_FROM = "localhost" 
    EMAIL_TO = ['[email protected]'] 
    msg = MIMEMultipart() 
    msg['Subject'] = SUBJECT 
    msg['From'] = EMAIL_FROM 
    msg['To'] = ', '.join(EMAIL_TO) 
    part = MIMEBase('application', "octet-stream") 
    part.set_payload(open("report.csv", "rb").read()) 
    Encoders.encode_base64(part) 
    part.add_header('Content-Disposition', 'attachment; filename="report.csv"') 
    msg.attach(part) 
    server.sendmail(EMAIL_FROM, EMAIL_TO, msg.as_string()) 
send_report() 

Répondre

0

Il manque un fichier.close(). C'est un problème typique de python antipattern. Utilisez toujours with open() as pour vous assurer que le fichier est correctement fermé.

with open ('report.csv', 'wb') as file: 
    writer = csv.writer(file) 
    writer.writerow(['UserName', 'arn', 'password-last-used']) 
    for i in users: 
     writer.writerow(
     [i.user_name, i.arn, i.get("password_last_used", 'Never Used')])