【问题标题】:Change email credentials when looping smtp python循环 smtp python 时更改电子邮件凭据
【发布时间】:2021-03-22 05:39:35
【问题描述】:

我正在使用以下代码向客户发送电子邮件,正如你们所知,不同公司设置了每日发送限制。 我想要实现的是在达到限制之前更改电子邮件凭据,但继续使用收件人列表。 例如:我有 5 个电子邮件凭据,每个电子邮件 ID 将 50 封电子邮件,并且会自动更改。

我使用的代码:

import smtplib 
  
 
li = ["xxxxx@gmail.com", "yyyyy@gmail.com"] 
  
for dest in li: 
    s = smtplib.SMTP('smtp.gmail.com', 587) 
    s.starttls() 
    s.login("sender_email_id", "sender_email_id_password") 
    message = "Message_you_need_to_send"
    s.sendmail("sender_email_id", dest, message) 
    s.quit() 

【问题讨论】:

  • 您是否总是有足够的 gmail ID 凭据来覆盖您的客户列表?在此示例中(5 个凭据),您将无法向超过 250 个客户发送电子邮件。是否有必要从第一个凭据集中通过电子邮件发送前 50 个客户端?或者每个凭证可以设置电子邮件/任何/ 50 个客户吗?
  • 丢掉你的语言的繁琐,并提供错误信息和一个最小的例子来重现错误。

标签: python email smtp smtplib


【解决方案1】:

在其列表中获取目的地的索引,并将其转换为凭据列表中的索引。

for i, dest in enumerate(li):
    if i//50 >= len(credentials):
        print("Ran out of credentials")
        break
    creds = credentials[i//50]
    // use credentials to send mail

【讨论】:

    【解决方案2】:
    clients = ["xxxxx@gmail.com", "yyyyy@gmail.com"]
    chunk_size = 50
    chunks = (clients[i:i+chunk_size] for i in range(0,len(clients), chunk_size))
    
    creds = [("sender_email_id_1", "sender_email_id_password_1"), ("sender_email_id_2", "sender_email_id_password_2")]
    
    for i,chunk in enumerate(chunks):
        try:
            user, pw = creds[i]
        except IndexError:
            print("Ran out of credentials")
            raise
        for client in chunk:
            s = smtplib.SMTP('smtp.gmail.com', 587) 
            s.starttls() 
            s.login(user, pw) 
            message = "Message_you_need_to_send"
            s.sendmail(user, client, message) 
            s.quit()
    

    如果您不想限制自己,但想继续尝试发送尽可能多的电子邮件:

    clients = ["xxxxx@gmail.com", "yyyyy@gmail.com"]
    creds = [("sender_email_id_1", "sender_email_id_password_1"), ("sender_email_id_2", "sender_email_id_password_2")]
    
    for cred,client in zip(itertools.cycle(creds), clients):
        user, pw = creds
        s = smtplib.SMTP('smtp.gmail.com', 587) 
        s.starttls() 
        s.login(user, pw) 
        message = "Message_you_need_to_send"
        s.sendmail(user, client, message) 
        s.quit()
    

    【讨论】:

      【解决方案3】:

      以下使用生成器nextcred 循环遍历列表中的凭据,直到您发送了所有消息。在您遍历整个列表后,它会返回到第一对。

      我们使用一对发送 50 条消息,然后注销并使用下一对凭据重新登录。

      import smtplib 
      
      
      def nextcred():
          credentials = [('user', 'password'), ('plugh', 'xyzzy'), ('alfred', 'what me worry?')]
          while True:
              for tup in credentials:
                  yield tup
      
      li = ["xxxxx@gmail.com", "yyyyy@gmail.com"] 
      
      cred = nextcred()
      s = None
      
      for idx, dest in enumerate(li):
          if (idx % 50) == 0:
              if s:
                  s.quit()
              account, passw = next(cred)
              s = smtplib.SMTP('smtp.gmail.com', 587) 
              s.starttls() 
              s.login(account, passw)
      
          message = "Message_you_need_to_send"
          s.sendmail("sender_email_id", dest, message) 
      
      s.quit()
      

      顺便说一句,我希望您并没有真正通过将字符串粘贴在一起来构建您的 SMTP 消息。 Python email 库负责处理大量极端情况和复杂情况,如果您不熟悉 SMTP 和 MIME,这些情况很难解决,也无法猜测如何解决。

      【讨论】:

        猜你喜欢
        • 2021-05-24
        • 2020-02-20
        • 2018-04-30
        • 1970-01-01
        • 1970-01-01
        • 2021-12-14
        • 2016-10-23
        • 1970-01-01
        • 2021-12-30
        相关资源
        最近更新 更多