Отправить список словарей, отформатированных с отступами, в виде строки по электронной почте, используя smtplib? - PullRequest
1 голос
/ 03 октября 2019

Я пытаюсь отправить список словарей в формате с отступами на мою электронную почту. На данный момент это полученное электронное письмо, полученное на основе моего кода:

[{
        'post_id': '3524',
        'text': '?\n.\n▪️10/3 9 PM\n 9:00 ~ 11:45 Special host\n \n.\n▪️\n ~\n.\n▪️10/5 8PM More\n',
        'time': datetime.datetime(2019, 6, 13, 18, 31, 36),
        'image': ‘’,
        'link': 'https://bit.ly/'
    }, { {
            'post_id': '3524',
            'text': '?\n.\n▪️10/3 9 PM\n 9:00 ~ 11:45 Special host\n \n.\n▪️\n ~\n.\n▪️10/5 8PM More\n',
            'time': datetime.datetime(2019, 6, 13, 18, 31, 36),
            'image': ‘’,
            'link': None
        }
        ]

Мой код отправляет электронное письмо одной строкой, где "\ n" отображаются в виде букв и не отформатированы с помощью вкладок.

Мне нужно сохранить эмодзи, специальные символы (на другом языке), включая разрывы строк. Как мне этого добиться?

Текущий код:

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart


print(type(posts))  # <class 'list'>
print(posts)  # [{'post_id': '3524', 'text': '?\n.\n▪️10/3 9 PM\n 9:00 ~ 11:45 Special host\n \n.\n▪️\n ~\n.\n▪️10/5 8PM More\n', 'time': datetime.datetime(2019, 6, 13, 18, 31, 36), 'image': ‘’, 'link': 'https://bit.ly/'}, {{'post_id': '3524', 'text': '?\n.\n▪️10/3 9 PM\n 9:00 ~ 11:45 Special host\n \n.\n▪️\n ~\n.\n▪️10/5 8PM More\n', 'time': datetime.datetime(2019, 6, 13, 18, 31, 36), 'image': ‘’, 'link': None}]

posts = str(posts)  # otherwise error: msg.attach(MIMEText(message_content)) File "/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/email/mime/text.py", line 34, in __init__ _text.encode('us-ascii') AttributeError: 'list' object has no attribute 'encode'

recipients = ["recipient_id@yahoo.com"]
sender = "sender_id@gmail.com"
subject = "report reminder"
body = posts

msg = MIMEMultipart()
msg['Subject'] = subject
msg['From'] = sender
msg['To'] = ", ".join(recipients)
msg.attach(MIMEText(body, 'plain'))

# sending
session = smtplib.SMTP('smtp.gmail.com', 587)
session.starttls()
session.login(sender, 'my password')
send_it = session.sendmail(sender, recipients, msg.as_string())
session.quit()

Чтобы уточнить, я хотел бы отправить весь список словарей в виде строки, скобок и всего в отформатированном виде (активные табуляции / новые строки).

1 Ответ

0 голосов
/ 03 октября 2019

Если вы хотите форматировать JSON в электронной почте, вам нужно использовать json.dumps() в данных тела. Для этого вам нужно предоставить аргумент indent в функции. Проверьте код

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import json

posts = [{"latlng":[77.7355421,12.985924],"name":"International Tech Park Bangalore 2.5 km","type":"work","icon":"suitcase"},{"latlng":[77.7515038,12.9829723],"name":"H M Tech Park 2.3 km","type":"work","icon":"suitcase"},{"latlng":[77.721544,12.981423],"name":"Prestige Featherlite Techapark 4.7km","type":"work","icon":"suitcase"}]


recipients = ["reciever@demo.com"]
sender = "sender@demo.com"
subject = "report reminder"
body = json.dumps(posts, indent=4) #changed code line

msg = MIMEMultipart()
msg['Subject'] = subject
msg['From'] = sender
msg['To'] = ", ".join(recipients)
msg.attach(MIMEText(body, 'plain'))

# sending
session = smtplib.SMTP('smtp.office365.com', 587)
session.starttls()
session.login(sender, 'your password')
send_it = session.sendmail(sender, recipients, msg.as_string())
session.quit()

Содержимое электронной почты имеет вид:

[
    {
        "latlng": [
            77.7355421,
            12.985924
        ],
        "name": "International Tech Park Bangalore 2.5 km",
        "type": "work",
        "icon": "suitcase"
    },
    {
        "latlng": [
            77.7515038,
            12.9829723
        ],
        "name": "H M Tech Park 2.3 km",
        "type": "work",
        "icon": "suitcase"
    },
    {
        "latlng": [
            77.721544,
            12.981423
        ],
        "name": "Prestige Featherlite Techapark 4.7km",
        "type": "work",
        "icon": "suitcase"
    }
]
...