【问题标题】:Emails are not getting trigerred to CC recipients抄送收件人不会触发电子邮件
【发布时间】:2019-01-01 22:31:21
【问题描述】:

我开发了一个 python 代码来向选定的用户发送邮件。邮件被递送到“TO”收件人,而不是“CC”收件人。

可以有 100 个抄送收件人,这些信息将被硬编码。

请帮我找出下面代码中的错误

conn = pyodbc.connect('Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=Birthday_Database.accdb;')
cur = conn.cursor()
sql = ("SELECT Name,DOB,Image,Email FROM Calendar where DOB = {}".format(t2))
cur.execute(sql)
df = cur.fetchall()    

if len(df) == 0:
    print("There are no Birthday's for today!!!!")
    sys.exit(0)

for row in df:
    myVar1 = row.Name
    myVar2 = row.Image
    myVar3 = row.Email

# Define these once; use them twice!
    strFrom = 'do.not.reply@abc.com'
    strTo = myVar3
    Image = myVar2
    Names = myVar1
    strcc = ['qwerty@abc.com','ytrewq@abc.com','poiuyt@abc.com']
    strcc = ','.join(strcc)

    msgRoot = MIMEMultipart('related')
    msgRoot['Subject'] = 'Happy Birthday {0}'.format(Names)
    msgRoot['From'] = strFrom
    msgRoot['To'] = strTo
    msgRoot['Cc'] = strcc
    #msgRoot['Cc'] = strcc
    msgRoot.preamble = 'This is a multi-part message in MIME format.'
    print(msgRoot['Cc'])
    msgAlternative = MIMEMultipart('alternative')
    msgRoot.attach(msgAlternative)

    msgText = MIMEText('This is the alternative plain text message.')
    msgAlternative.attach(msgText)

    msgText = MIMEText('<br><img src="cid:image1">', 'html')
    msgAlternative.attach(msgText)

    fp = open("Images\{0}".format(Image),"rb")
    msgImage = MIMEImage(fp.read())
    fp.close()

    msgImage.add_header('Content-ID', '<image1>')
    msgRoot.attach(msgImage)

    import smtplib
    smtp = smtplib.SMTP()
    smtp.connect('outlook.abc.com')
    #smtp.login('exampleuser', 'examplepass')

    smtp.sendmail(strFrom,strTo+strcc, msgRoot.as_string())
    smtp.quit()

【问题讨论】:

  • 我有一个类似的代码。唯一的区别在于 sendmail 调用:我使用 [strTo, strcc] 而不是 strTo+strcc
  • 只有抄送列表中的第一个收件人才能收到邮件,其他人没有。

标签: python email mime


【解决方案1】:

根据the docs

发送邮件。所需的参数是 RFC 822 发件人地址字符串,一个列表 RFC 822 收件人地址字符串(裸字符串将被视为具有 1 个地址的列表),和一个消息字符串。

据此,您的连接字符串将被视为单个地址。要修复它,请创建一个列表并将其用于 to_addrs 参数。

to_addrs = [strTo] + cc_list

其中 cc_list 是一个列表中的 strcc。

【讨论】:

    【解决方案2】:

    问题的原因是sendmail 方法需要地址列表,而您传递的是单个字符串。而且文档很明确:

    ...(裸字符串将被视为具有 1 个地址的列表)...

    所以你很幸运,CC 列表的第一个成员可以收到邮件......

    但由于您已正确填写邮件的收件人和抄送字段,您可以简单地使用send_message 方法,该方法使用该字段来查找收件人列表。当我们在这里时,您真的应该只连接到邮件服务器一次,然后循环发送消息:

    import smtplib
    smtp.connect('outlook.abc.com')
    #smtp.login('exampleuser', 'examplepass')
    for row in df:
        ...
        msgRoot.attach(msgImage)
    
        smtp.send_message(msgRoot)
    
    smtp.quit()
    

    【讨论】:

      猜你喜欢
      • 2011-07-24
      • 1970-01-01
      • 2011-02-01
      • 1970-01-01
      • 2013-08-28
      • 1970-01-01
      • 2017-10-01
      • 1970-01-01
      • 2021-06-27
      相关资源
      最近更新 更多