Python批量邮件用BCC而非TO致Kindle无法接收,如何修改代码?
解决Kindle无法接收BCC邮件的问题:将收件人移至TO字段的两种实现方式
原代码的核心问题是提前生成了邮件字符串,之后修改msg['To']不会影响已经固定的text变量,导致收件人设置根本没生效。下面给两种符合需求的修改方案:
方案一:单封邮件发送给多个TO收件人
这种方式会把所有Kindle邮箱放在同一份邮件的TO字段里,所有收件人能看到彼此的邮箱地址,发送效率更高。
修改后的代码:
receiver_email = ["email1@mail.com", "email2@mail.com", "email3@mail.com", "email4@mail.com", "email5@mail.com"] subj = "Issue - "+fullDate msg = MIMEMultipart('alternative') msg['Subject'] = subj msg['From'] = sender_email # 设置TO字段为逗号分隔的收件人字符串 msg['To'] = ", ".join(receiver_email) msg.attach(MIMEText('Forward this email to your kindle account')) # 附件部分保持不变 print("Attaching "+epubname) fp = open(epubname, "rb") epub_file = MIMEApplication(fp.read()) fp.close() encoders.encode_base64(epub_file) epub_file.add_header('Content-Disposition', 'attachment', filename=epubname) msg.attach(epub_file) debug = False if debug: print(msg.as_string()) else: server = smtplib.SMTP('smtp.office365.com',587) server.ehlo() server.starttls() server.login("##EMAIL##", "##PASSWORD##") # 必须在设置完所有邮件头后再生成最终邮件文本 text = msg.as_string()+ "\r\n" + message_text # sendmail第二个参数传收件人列表 server.sendmail(sender_email, receiver_email, text.encode('utf-8')) server.quit()
方案二:发送多封独立的单收件人邮件
这种方式会给每个Kindle邮箱单独发一封邮件,收件人看不到其他邮箱地址,更符合隐私需求。
修改后的代码:
receiver_email = ["email1@mail.com", "email2@mail.com", "email3@mail.com", "email4@mail.com", "email5@mail.com"] subj = "Issue - "+fullDate debug = False # 提前建立SMTP连接,避免重复握手 if not debug: server = smtplib.SMTP('smtp.office365.com',587) server.ehlo() server.starttls() server.login("##EMAIL##", "##PASSWORD##") for email_to in receiver_email: # 每次循环重新创建邮件对象,避免邮件头污染 msg = MIMEMultipart('alternative') msg['Subject'] = subj msg['From'] = sender_email msg['To'] = email_to msg.attach(MIMEText('Forward this email to your kindle account')) # 附件部分 print(f"Attaching {epubname} for {email_to}") fp = open(epubname, "rb") epub_file = MIMEApplication(fp.read()) fp.close() encoders.encode_base64(epub_file) epub_file.add_header('Content-Disposition', 'attachment', filename=epubname) msg.attach(epub_file) if debug: print(msg.as_string()) else: text = msg.as_string()+ "\r\n" + message_text server.sendmail(sender_email, email_to, text.encode('utf-8')) # 最后统一关闭连接 if not debug: server.quit()
关键说明
- 方案一适合不在乎收件人互相可见的场景,只需要发送一次邮件;方案二更注重隐私,每个收件人收到独立的专属邮件。
- 两种方案都修复了原代码提前生成邮件字符串的问题,确保
msg['To']的修改能正确反映到最终发送的邮件内容中。
内容的提问来源于stack exchange,提问作者MovieAddicted
相关产品推荐
相关产品推荐

