【问题标题】:Python: Sending Email to Multiple RecipientsPython:向多个收件人发送电子邮件
【发布时间】:2015-08-29 16:19:51
【问题描述】:

我正在尝试使用 Python 向多个人发送电子邮件。

def getRecipients(fileWithRecipients):
    recipients = []
    f = open(fileWithRecipients, 'r')
    for line in f:
        recipients.append(line)
    return recipients

def test_email():
    gmail_user = "csarankings@gmail.com"
    gmail_pass = getPassword("pass.txt")
    FROM = "csarankings@gmail.com"
    TO = getRecipients("recipients.txt")
    date = getCurrentDate()
    SUBJECT = "Current CSA Rankings: " + date
    TEXT = createEmailMessageFromFile("rankings.txt")

    message = """\From: %s\nTo: %s\nSubject: %s\n\n%s """ % (FROM, ", ".join(TO), SUBJECT, TEXT)

    try:
        server = smtplib.SMTP("smtp.gmail.com", 587)
        server.ehlo()
        server.starttls()
        server.login(gmail_user, gmail_pass)
        server.sendmail(FROM, TO, message)
        server.close()
        print("it worked")
    except:
        print("it failed :(")

无论出于何种原因,我的电子邮件只会发送给我的收件人列表中的第一个收件人(test_email() 函数中的 TO 变量。

我的收件人文件每行仅包含一个电子邮件地址(目前只有两个)。我认为我的 getRecipients() 函数可能有问题,所以我只是将两封电子邮件硬编码到 TO 变量中,它适用于第一个电子邮件地址,而不适用于第二个。

知道为什么会发生这种情况吗?我怀疑它与以下内容有关:

", ".join(TO)

我在哪里设置了我的message 变量。

注意:我的test_email() 主要基于此处最受好评的答案:

How to send an email with Gmail as provider using Python?

编辑:对于它的价值,当我将单个电子邮件地址的列表硬编码到 TO 变量中时,主题会在电子邮件中正确显示。当我使用 getRecipients() 函数时(即使在 recipients.txt 文件中只有一个电子邮件地址),它也会在电子邮件正文中显示:

主题:当前 CSA 排名 2015 年 6 月 13 日

不确定是否相关,但认为可能与问题有关。

EDIT_2:我不认为我的问题与以下内容重复:

How to send email to multiple recipients using python smtplib?

因为,虽然我使用smtplib.sendmail() 函数,但我根本不使用电子邮件模块,所以我们的代码非常不同......

【问题讨论】:

标签: python email smtp


【解决方案1】:

我可以通过在登录到服务器后遍历收件人列表来做到这一点。

类似的东西

    try:
        server = smtplib.SMTP("smtp.gmail.com", 587)
        server.ehlo()
        server.starttls()
        server.login(gmail_user, gmail_pass)
        print('Login successful')
    except:
       print('Login unsuccessful')

然后遍历列表

     for item in List: 
        TO = item
        FROM = gmail_user
        #message as defined above
        try: 
            server.sendmail(FROM, TO, message)
        except:
            print('not sent for' + item)

    server.close()

【讨论】:

  • 哇,我刚刚发现这就是问题所在。在我看来,API 设计在某种意义上是不合逻辑的,因为它不能帮助我循环遍历 TO。
猜你喜欢
  • 2012-05-18
  • 2017-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-17
  • 2019-03-01
相关资源
最近更新 更多