Как отправить данные в табличном формате, извлеченные из базы данных по электронной почте, используя python? - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь отправить выбранные данные в табличном формате. Вывод, который я получаю в своем почтовом ящике:

{% for row in {results} %}  {{row[0]}}  {{row[1]}}  {{row[2]}}  {{row[3]}}  {{row[4]}}  {% endfor %}

Вот код:

from email.message import EmailMessage
import smtplib
import psycopg2
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from flask import Flask, render_template, request

msg = MIMEMultipart('alternative')
msg['Subject'] = 'Table'
msg['From'] = "pathakgandharv@gmail.com"
msg['To'] = "pathakgandharv@gmail.com"
text = "Hi!\nHow are you?\nHere is the data you wanted :"
# DatabaseConncetion
user = "------"
password = "-----"
host = "@some host"
port = 8081
database = " "
insert_time="some value"
entity_name="some value"
db_conn = psycopg2.connect(
    host=host, user=user, password=password, database=database)
cursor = db_conn.cursor()
sql_query = "SELECT * FROM operational_metadata WHERE bor_name = %s and insert_time  = %s;"
cursor.execute(sql_query, (entity_name, insert_time,))
results = cursor.fetchall()
for row in results:
    a0=row[0]
    a1=row[1]
    a2=row[2]
    a3=row[3]
    a4=row[4]

html = """\
<html>
  <head></head>
  <body>
   <table border="1">

     <tr>
     {% for row in {results} %}
        <td>{{row[0]}}</td>
        <td>{{row[1]}}</td>
        <td>{{row[2]}}</td>
        <td>{{row[3]}}</td>
        <td>{{row[4]}}</td>
     {% endfor %}

     </tr>

   </table>
  </body>
</html>
"""
part1 = MIMEText(text, 'plain')
part2 = MIMEText(html, 'html')
msg.attach(part1)
msg.attach(part2)
mail = smtplib.SMTP('smtp.gmail.com', 587)
mail.ehlo()
mail.starttls()
mail.login("pathakgandharv@gmail.com","----------")
mail.sendmail("pathakgandharv@gmail.com","pathakgandharv@gmail.com", msg.as_string())
mail.quit()

Как я могу отправить данные в табличном формате? Я могу получить все значения из базы данных. Есть ли другой и лучший подход? Я пытался использовать PrettyTable, но он не работал

1 Ответ

0 голосов
/ 29 апреля 2020

Есть куча проблем с вашим кодом.

  • Вы использовали только синтаксис шаблона Django, но не преобразовали его (вместе с контекстом) в правильный HTML.

. Внесите следующие изменения, чтобы получить правильное значение HTML для тела письма

from django.template import Template, Context

...
...

html = """\
<html>
  <head></head>
  <body>
   <table border="1">
     {% for row in results %}  <!-- braces are not required since `results` is a context variable -->
     <tr>
        {% for item in row %}
        <td>{{ item }}</td>
        {% endfor %}
     </tr>
     {% endfor %}

   </table>
  </body>
</html>
"""

template = Template(html)
html = template.render(Context({'results': results})

...
...

Check https://docs.djangoproject.com/en/dev/ref/templates/language/#template -варианты , чтобы понять, как работает оператор точки внутри Django шаблонов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...