【问题标题】:How to send data in tabular format fetched from data base in email using python?如何使用python以表格格式从电子邮件中的数据库中发送数据?
【发布时间】:2020-04-29 11:52:30
【问题描述】:

我正在尝试以表格格式发送获取的数据。我在邮箱中收到的输出是:

{% 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 但它不起作用

【问题讨论】:

    标签: python html database jinja2


    【解决方案1】:

    你的代码有很多问题。

    • 您只使用了 Django 模板语法,但没有将其(连同上下文)呈现为正确的 HTML。
    • Python 用于访问列表元素的方括号语法不适用于 Django 的模板。在模板代码中,使用 row.0 代替 row[0]

    执行以下更改以为邮件正文生成正确的 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})
    
    ...
    ...
    

    查看https://docs.djangoproject.com/en/dev/ref/templates/language/#template-variables 以了解点运算符在 Django 模板中的工作原理。

    【讨论】:

    • 这不是问题
    • 谢谢,伙计,还有更多 - 我现在有两个结果列表,但可能有很多,具体取决于用户。所以,我对此无能为力。例如,每个列表有 15 个值。那肯定是固定的。我想明智地打印数据列表,即第一个列表应该在第一行,第二个列表应该在第二行,依此类推。我无法弄清楚如何为该场景动态添加每一行。你能帮我解决这个问题吗?无论如何,感谢您的帮助
    • 我已经更新了处理变量号的答案。行和项目。
    猜你喜欢
    • 1970-01-01
    • 2015-12-23
    • 2021-10-07
    • 1970-01-01
    • 2016-08-03
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    相关资源
    最近更新 更多