2016-07-08 23 views
5

Il mio file di input è un file CSV e eseguendo alcuni script python che sono composti dal modulo Tabulate di Python, ho creato una tabella simile a questa: -Invia tabella come corpo di posta elettronica (non allegato) in Python

tabulate_output o

| Attenuation | Avg Ping RTT in ms | TCP UP | 
|---------------:|---------------------:|---------:| 
|    60 |    2.31 | 106.143 | 
|    70 |    2.315 | 103.624 | 

Vorrei inviare la tabella nel corpo del messaggio e non comeattaccamento utilizzando python.

Ho creato una funzione sendMail e mi aspetto di inviare la tabella nel mail_body. sendMail([to_addr], from_addr, mail_subject, mail_body, [file_name])

+0

Si potrebbe chiedere al destinatario di visualizzare la posta con il carattere a larghezza fissa e solo inserire la tabella nel corpo dell'e-mail. –

+0

Perché non inviarlo come tabella html? – Arnial

+0

Sarà necessario costruire la stringa HTML e inviarla attraverso l'intestazione Content-Type appropriata. [Un esempio qui] (https://github.com/supersaiyanmode/gapi/blob/master/GApi4Term/commands/email.py#L8). – SuperSaiyan

risposta

8

Questo codice invia il messaggio nel tipico testo normale più html multipart/formato alternativo. Se il tuo corrispondente lo legge in un lettore di posta compatibile con html, vedrà la tabella HTML. Se legge il lettore di testo semplice, vedrà la versione in testo normale.

In entrambi i casi, vedrà i dati inclusi nel corpo del messaggio e non come allegato.

import csv 
from tabulate import tabulate 
from email.mime.multipart import MIMEMultipart 
from email.mime.text import MIMEText 
import smtplib 

me = '[email protected]' 
password = 'yyyzzz!!2' 
server = 'smtp.gmail.com:587' 
you = '[email protected]' 

text = """ 
Hello, Friend. 

Here is your data: 

{table} 

Regards, 

Me""" 

html = """ 
<html><body><p>Hello, Friend.</p> 
<p>Here is your data:</p> 
{table} 
<p>Regards,</p> 
<p>Me</p> 
</body></html> 
""" 

with open('input.csv') as input_file: 
    reader = csv.reader(input_file) 
    data = list(reader) 

text = text.format(table=tabulate(data, headers="firstrow", tablefmt="grid")) 
html = html.format(table=tabulate(data, headers="firstrow", tablefmt="html")) 

message = MIMEMultipart(
    "alternative", None, [MIMEText(text), MIMEText(html,'html')]) 

message['Subject'] = "Your data" 
message['From'] = me 
message['To'] = you 
server = smtplib.SMTP(server) 
server.ehlo() 
server.starttls() 
server.login(me, password) 
server.sendmail(me, you, message.as_string()) 
server.quit() 
+0

@ Rob-Thnx molto. Ha funzionato per me Questa era la linea chiave: message = MimeMultipart ( "alternativo", None, [MIMEText (testo), MIMEText (html, 'html')]) – Durvesh

+0

Ciao Rob, ho usato questo pezzo di codice con Python 2.6 L'e-mail sembra funzionare, la tabella HTML mostra i dati organizzati, ma non ci sono bordi attorno a essa per renderli effettivamente visibili a livello visivo. Potresti suggerire per favore cosa deve essere fatto qui? –

+0

@VenuS - Non sono sicuro di come si specifica una scheda usando il pacchetto 'tabulate'. Forse puoi costruire l'HTML in un altro modo e specificare l'attributo 'border' o usare i CSS. Indipendentemente da ciò, potresti voler aprire una nuova domanda su [SO] per vedere cosa hanno da dire gli altri. –

Problemi correlati