抄送电子邮件和多个收件人电子邮件地址不起作用

Posted

技术标签:

【中文标题】抄送电子邮件和多个收件人电子邮件地址不起作用【英文标题】:CC email and multiple TO email addresses not working 【发布时间】:2021-06-27 07:19:52 【问题描述】:

我在 Python 中创建了一个函数,它将构建一个 html 格式的电子邮件,并通过一个接受匿名电子邮件发送的 Exchange 服务器匿名发送。

但是,CC 列表中的任何人都不会获得副本,只有 TO 列表中的 FIRST 人会获得副本。我尝试使用“逗号”和“分号”作为电子邮件分隔符,但都不起作用。奇怪的是,在收到的电子邮件中可以看到所有电子邮件地址(并且格式正确),尽管只有一个人(收件人列表中列出的第一个人)获得了副本。

这是我的代码

def send_email(sender, subject, sendAsDraft = True): # sendAsDraft not implemented

    global toEmail
    global ccEmail

    # create the email message
    htmlFile = open(saveFolder + '\\' + htmlReportBaseName + '.html',encoding = 'utf-8')
    message = htmlFile.read().replace('\n', '')
    message = message.replace(chr(8217), "'") # converts a strange single quote into the standard one
    message = message.replace("'",''') # makes a single quote html friendly
    htmlFile.close()

    # get the email body text
    emailBody = open('emailBody.txt')
    bodyText = emailBody.read()
    emailBody.close()

    now = dt.datetime.today().replace(second = 0, microsecond = 0)
    timeStr = returnReadableDate(now) # returns the date as a string in the 'normal' reading format

    # insert the current date/time into the marker in the email body
    bodyText = bodyText.replace('xxxx', timeStr)

    # insert the email body text into the HTML
    message = message.replace('xxxx', bodyText)

    msg = MIMEMultipart('Report Email')
    msg['Subject'] = subject
    msg['From'] = sender
    msg['To'] = '; '.join(toEmail) 
    msg['Cc'] = '; '.join(ccEmail) 
    msg.add_header('Content-Type','text/html')
    
    msg.set_payload(message)

    # complete the email send
    message = ''
    try:
        smtpObj = sl.SMTP('1.2.3.4:5') # obviously IP address anonymised
        smtpObj.sendmail(sender, '; '.join(toEmail), msg.as_string()) 
        message = 'Email successfully sent'        
    except:
        message = 'Email could not be sent due to an error'
    finally:
        # write the outcome to the Instance log
        global InstanceLog
        # write the log
        log(InstanceLog, message)

    # close object and exit function    
    smtpObj.quit()

问题可能出在电子邮件服务器上吗?未经身份验证的电子邮件只能发送给一个人?一方面这看起来很奇怪,另一方面又有意义。

谢谢大家。

西米

【问题讨论】:

【参考方案1】:

小心。 send_message 可以使用邮件的标题来构建其收件人列表,但 sendmail 需要地址的列表 或将字符串作为单个收件人地址处理。

并且标题应该包含逗号而不是分号。

所以你应该有:

...
msg['To'] = ' '.join(toEmail) 
msg['Cc'] = ','.join(ccEmail) 
...

及以后:

smtpObj.sendmail(sender, toEmail + ccEmail, msg.as_string())

或:

smtpObj.send_message(msg)

【讨论】:

嗨,Serge,谢谢。我正在测试代码,但仍然发现使用标头和 .send_message(msg) 的组合不会将副本发送到抄送电子邮件地址。 @Seamus 我刚刚测试了一条更简单的消息,send_message 在使用逗号作为分隔符时确实使用了 To 和 Cc 标头的内容。【参考方案2】:

看docs,这应该是逗号分隔的字符串:

msg['To'] = ', '.join(toEmail)

【讨论】:

不,抱歉。它必须是一个分隔字符串。字符串列表会引发错误。另外,我认为 MIME 对象中的电子邮件地址被忽略了。相反,看起来电子邮件地址在 smtpObj.sendmail() 中被接受 你是对的,文档说它应该是一个逗号分隔的字符串,你试过吗?如果收件人不需要见面,您可以单独发送他们作为解决方法。 顺便说一句。 smtpObj.sendmail() 将接受电子邮件地址的字符串列表和分隔字符串而不会引发错误,但电子邮件仍然只会发送到第一个“收件人”电子邮件地址。

以上是关于抄送电子邮件和多个收件人电子邮件地址不起作用的主要内容,如果未能解决你的问题,请参考以下文章

抄送收件人的 Mandrill 合并变量不起作用

Pear PHP Mail 发送 CC 似乎不起作用

使用 html Mailto 向多个收件人发送电子邮件:不起作用

使用 swiftmailer 密件抄送多个地址

为啥发件人行在我的邮件功能上不起作用?

在 Laravel 5.4 中向多个抄送收件人发送电子邮件