Отправить l oop результат в теле письма - PullRequest
0 голосов
/ 12 января 2020

Я пытаюсь представить результат «печати» (пример 1) в содержании электронной почты (пример 2).

Используемые данные:

 {
  "@odata.context": "XXX",
  "value": [
    {
      "Customer_Name": "ABC inc",
      "Customer_No": "002",
      "Date_of_Export": "2020-01-10T05:36:55.3Z",
      "Error_Message": "error message 1.",
      "Type_of_Export": "E-Mail"
    },
    {
      "Customer_Name": "CBA inc",
      "Customer_No": "001",
      "Date_of_Export": "2020-01-10T05:39:13.137Z",
      "Error_Message": "Error message 2",
      "Type_of_Export": "E-Mail"
    }
  ]}

ПРИМЕР 1 (ПЕЧАТЬ):

Когда я использую код ниже, я получаю желаемый результат:

r = requests.get("http://www.example.com/test.json")
r_dict = json.loads(r.text)

if len(r_dict["value"])==0:
    print("No errors")
else:
    print("List of errors:\n")
    for item in r_dict["value"]:
        print('"Customer":', '(' + item['Customer_No'] + ')' + item['Customer_Name'] + ', "Typ":', item['Type_of_Export'] + ', "Error": ', item['Error_Message'])

Я получаю:

Список ошибок:

«Клиент»: (002) AB C в c, «Тип»: E-Mail, «Ошибка»: сообщение об ошибке 1.
«Клиент»: (001) CBA в c, «Тип»: электронная почта, «Ошибка»: сообщение об ошибке 2

ПРИМЕР 2 (ПОЧТА):

Но я могу ' Право на отправку одного и того же результата в теле письма не может быть получено, потому что приложена только последняя строка

Список ошибок:

«Клиент»: (001) CBA в c, «Тип»: E-Mail, «Ошибка»: сообщение об ошибке 2

Код, который я использую:

import json
import requests
import smtplib
from requests_ntlm import HttpNtlmAuth
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

html_top = """<html><body>"""
html_end = """</body></html> """

r = requests.get("http://www.example.com/test.json")
r_dict = json.loads(r.text)

    if len(r_dict["value"])==0:
        print("No errors")
    else:
            html_body_top = "<p>List of errors:<br></p>"

            for item in r_dict["value"]:
                html_body = '"Customer":' + '(' + item['Customer_No'] + ')' + item['Customer_Name'] + ', "Typ":' + item['Type_of_Export'] + ', "Error": ' + item['Error_Message']
            mail_html = MIMEText(html_top + html_body_top + html_body + html_end, "html")
            message.attach(mail_html)
            with smtplib.SMTP("000.000.000.000", xx) as server:
                    server.sendmail(sender_email, receiver_email, message.as_string())

Я хотел бы отправить электронное письмо, содержащее все 2 строки, как в примере 1.

Ответы [ 2 ]

1 голос
/ 12 января 2020

Ваша проблема в том, что при каждой итерации l oop вы перезаписываете предыдущее значение html_body

for item in r_dict["value"]:
                html_body = '"Customer":' + '(' + item['Customer_No'] + ')' + item['Customer_Name'] + ', "Typ":' + item['Type_of_Export'] + ', "Error": ' + item['Error_Message']

Быстрое решение - перейти на использование оператора += и добавить символ новой строки в конце.

html_body = ''
for item in r_dict["value"]:
                html_body += '"Customer":' + '(' + item['Customer_No'] + ')' + item['Customer_Name'] + ', "Typ":' + item['Type_of_Export'] + ', "Error": ' + item['Error_Message'] + '\n'
1 голос
/ 12 января 2020

Перед вашим for l oop, объявите html_body и добавьте к нему значения с помощью +=:

html_body = ""
for item in r_dict["value"]:
                html_body += '"Customer":' + '(' + item['Customer_No'] + ')' + item['Customer_Name'] + ', "Typ":' + item['Type_of_Export'] + ', "Error": ' + item['Error_Message'] + '\n'

Я добавил \n в конце к "print "перерыв.

...