Send table as an email body (not attachment ) in Python

Question:

My input file is a CSV file and by running some python script which consists of the python Tabulate module, I have created a table that looks like this below:-

tabulate_output
or

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

I would like to send the this table in the email body and not as an attachment using python.

I have created a sendMail function and will be expecting to send the table in the mail_body.
sendMail([to_addr], from_addr, mail_subject, mail_body, [file_name])

Asked By: Durvesh

||

Answers:

This code sends the message in the typical plain text plus HTML multipart/alternative format. If your correspondent reads this in an HTML-aware mail reader, he’ll see the HTML table. If he reads it in a plain-text reader, he’ll see the plain-text version.

In either case, he will see the data included in the body of the message, and not as an attachment.

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()
Answered By: Robᵩ
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.