【问题标题】:sending emails on a loop using Python使用 Python 循环发送电子邮件
【发布时间】:2021-12-30 23:19:48
【问题描述】:

我正在尝试使用 for 循环向多个收件人发送电子邮件,如果在主题或正文中找到“”,则会将其动态替换为收件人姓名。

我正在遍历{"name": "email"} 形式的收件人字典

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

def send(recipients, subject, message):
    for name, email in recipients.items():
        edited_subject = subject.replace("<>", name)
        edited_message = message.replace("<>", name)

        mail = MIMEMultipart()
        mail['from'] = 'Tomas'
        mail['to'] = email
        mail['subject'] = edited_subject
        mail.attach(MIMEText(edited_message, "plain"))

        with smtplib.SMTP(host="smtp.gmail.com", port=587) as smtp:
            smtp.ehlo()
            smtp.starttls()
            smtp.login(username, password)
            smtp.send_message(mail)

循环似乎只发送给第一个收件人。

【问题讨论】:

    标签: python python-3.x loops email smtplib


    【解决方案1】:

    with 语句确保正确获取和释放资源。不要在每个循环中创建一个新的 smtp,而是尝试创建一次,然后在上下文中循环:

    from email.mime.multipart import MIMEMultipart
    from email.mime.text import MIMEText
    import smtplib
    
    def send(recipients, subject, message):
        with smtplib.SMTP(host="smtp.gmail.com", port=587) as smtp:
            smtp.ehlo()
            smtp.starttls()
            smtp.login(username, password)
            for name, email in recipients.items():
                edited_subject = subject.replace("<>", name)
                edited_message = message.replace("<>", name)
    
                mail = MIMEMultipart()
                mail['from'] = 'Tomas'
                mail['to'] = email
                mail['subject'] = edited_subject
                mail.attach(MIMEText(edited_message, "plain"))
                smtp.send_message(mail)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-05
      • 1970-01-01
      • 1970-01-01
      • 2019-12-17
      • 2020-02-24
      • 2020-03-29
      • 2019-10-18
      相关资源
      最近更新 更多