Search code examples
pythonhtmlemailsmtplib

Add borders of table sent by email via Python


Currently I use this solution Send table as an email body (not attachment ) in Python for sending tables in emails via Python:

import smtplib
from smtplib import SMTPException
import csv
from tabulate import tabulate

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('result.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'] = 'a@abc.com'
message['To'] = 'b@abc.com'

sender = "a@abc.com"
receivers = ['b@abc.com']

try:
    smtp_obj = smtplib.SMTP('mail.abc.com')
    smtp_obj.sendmail(sender, receivers, message.as_string())         
    print ("Successfully sent email")
except SMTPException:
    print ("Error: unable to send email")

Data is loaded from csv file. But I need to add borders to the table to make it look like pandas DataFrame.


Solution

  • Here is the full solution of creating the table with borders.

    table = '' 
    with open('result.csv') as csvFile: 
        reader = csv.DictReader(csvFile, delimiter=',')    
        table = '<tr>{}</tr>'.format(''.join(['<td class="cell">{}</td>'.format(header) for header in reader.fieldnames])) 
        for row in reader:  
            table_row = '<tr>' 
            for fn in reader.fieldnames:            
                table_row += '<td class="cell">{}</td>'.format(row[fn]) 
            table_row += '</tr>' 
            table += table_row
    
    
    html = """
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>html title</title>
    <style type="text/css" media="screen">
    table{
        background-color: #000000;
        empty-cells:hide;
      Border:5px solid red;
     }
     td.cell{
        background-color: white;
     }
    
    </style>
    </head>
    <html><body><p>Hi!</p>
    <p>Here is your data.</p>
    <table style="border: black 0.5px;"> 
    %s 
    </table>
    <p>Regards,</p>
    <p>Python 3.5</p>
    </body></html>""" % table
    
    
    message = MIMEMultipart(
        "alternative", None, [MIMEText(html,'html')])
    
    
    message['Subject'] = "Some stats via mail"
    message['From'] = 'a@abc.com'
    message['To'] = 'b@abc.com'
    
    sender = "a@abc.com"
    receivers = ['b@abc.com']
    
    try:
        smtp_obj = smtplib.SMTP('mail.abc.com')
        smtp_obj.sendmail(sender, receivers, message.as_string())         
        print ("Successfully sent email")
    except SMTPException:
        print ("Error: unable to send email")