2016-07-08 65 views
5

我的輸入文件是一個CSV文件,通過運行一些由python Tabulate模塊組成的python腳本,我創建瞭如下所示的表格: -在Python中發送表格作爲電子郵件正文(不是附件)

tabulate_output

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

我想送這個表在電子郵件正文和不是作爲附件使用python。

我已經創建了一個sendMail函數,並希望發送mail_body中的表。 sendMail([to_addr], from_addr, mail_subject, mail_body, [file_name])

+0

您可以要求收件人查看固定寬度字體的郵件,並將表格放在電子郵件正文中。 –

+0

爲什麼不把它作爲html表發送? – Arnial

+0

您需要構建HTML字符串,並使用適當的Content-Type標題發送它。 [一個例子](https://github.com/supersaiyanmode/gapi/blob/master/GApi4Term/commands/email.py#L8)。 – SuperSaiyan

回答

8

該代碼以典型純文本加html多部分/替代格式發送消息。如果你的記者在一個支持html的郵件閱讀器中讀到這個,他會看到HTML表格。如果他讀它純文本閱讀器,他會看到純文本版本。

無論哪種情況,他都會看到郵件正文中包含的數據,而不是作爲附件。

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很多。爲我工作。 這是關鍵行: 消息= MimeMultipart的( 「替代」,無,[MimeText用於(文本),MimeText用於(HTML, 'HTML')]) – Durvesh

+0

你好羅布, 我已經使用這個代碼段與Python 2.6 ,電子郵件似乎正在工作,HTML表格顯示有組織的數據,但沒有任何邊界,使其實際上可視化表。你能否建議在這裏需要做些什麼? –

+0

@VenuS - 我不知道如何使用'tabulate'軟件包指定一塊電路板。也許你可以用其他方式構建HTML並指定'border'屬性或使用CSS。無論如何,你可能想在[SO]上開一個新的問題來看看別人有什麼要說的。 –

相關問題