将数据合并为一封电子邮件:Python

merge data into single one for an email : Python

我想合并数据,这样我只能发送一封电子邮件

for body in result:
        msg = EmailMessage()
        msg.set_content(body)
        msg['From'] = email_address
        msg['To'] = recipient_address
        msg['Subject'] = subject_desc
        server = smtplib.SMTP('smtp.gmail.com', 587)
        server.ehlo()
        server.starttls()
        server.login("youremail@gmail.com", password)
        print("login success")
        server.send_message(msg)
        print("This message has been sent")
        server.quit()

这段代码实际上向我发送了十几封电子邮件,其中包含我从 result 获得的数据,因为它处于循环状态,但我想为这几十条数据发送一封电子邮件。 我试过这样的事情:

def email(body):
    data = []
    for body in result:
        data.append(body)
    return data

但它仍然发送了十几封电子邮件,而不是一封我该怎么办?

提前谢谢你:)

如果您有包含许多字符串的列表,则创建一个字符串

body = "\n".join(result)

并在没有 for 循环的情况下发送。

msg = EmailMessage()

body = "\n".join(result)
#body = "\n---\n".join(result) # to separate result with line `---`

msg.set_content(body)

msg['From'] = email_address
msg['To'] = recipient_address
msg['Subject'] = subject_desc

如果您有包含文件名的列表,那么您可以使用 for-loop 但缩进不同。

仅发送图片示例。对于其他类型的文件,它需要不同的 maintypesubtype

filenames = ['images/lenna.jpg', 'images/cats.jpg']

# ... 

msg = EmailMessage()

for name in filenames:
    msg.add_attachment(open(name, 'rb').read(), filename=name, maintype='text', subtype='jpg')

msg['From'] = email_address
msg['To'] = recipient_address
msg['Subject'] = subject_desc

或者你可以使用其他模块来猜测类型

import mimetypes

# ... code ...

for name in filenames:
    ctype, encoding = mimetypes.guess_type(name)
    print(name, ctype, encoding)
    maintype, subtype = ctype.split('/')
    msg.add_attachment(open(name, 'rb').read(), filename=name, maintype=maintype, subtype=subtype)

当然你也可以在同一个邮件中使用set_content()add_attachment()
它可以用来发送 HTML 图像 - 但我跳过这个例子。