久也旧 2022-07-28 20:59 采纳率: 0%
浏览 65
已结题

python smtplib库给多个收件人发送邮件的时候,To标头怎么分开来显示?

我在使用smtplib给多人发送邮件的时候,所有的收件人都能收到我发邮件,但是邮件的To标头显示的收件人是连在一起的。像截图上这样,该怎么把它给分开呢?

img


下面是代码
代码是每次从txt文档里一次获取很多行收件人地址,然后添加进列表里一次性发出去。

#!/usr/bin/python
# -*- coding: UTF-8 -*-
from email.header import Header
from email.mime.text import MIMEText
import smtplib
from email.utils import parseaddr, formataddr
import Queue
import threading
n = 0
def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr((Header(name, 'utf-8').encode(), addr))



muban = open("1.html", "r")
from_addr = "ceshi@mfkbnhl.cn"
password = "Aa332633"
smtp_server = "185.127.xxx"
msg = MIMEText(muban.read(), 'html', 'utf-8')
msg['From'] = _format_addr('nihao <%s>' % from_addr)
msg['Subject'] = Header('nihao', 'utf-8').encode()
server = smtplib.SMTP(smtp_server, 1010)
server.login(from_addr, password)

def smtp1():
    m = [] #添加列表
    while not q.empty():
        global n
        # 获取多组队列数据
        for l in range(2):#一次获取n组
            # print (q.get())
            m.append(q.get())
        msg['To'] = ','.join(m)
        server.sendmail(from_addr, m, msg.as_string())
        #n += 1
        #print("发送成功,第%s封" % (n))





q = Queue.Queue()
try:
    for e in open("1.txt", 'r'):
        i = e.replace("\n", "")
        if "@" not in i or "----" in i or " " in i or len(i) > 90 or "/" in i or "?" in i or "@." in i:
            pass
        else:
            try:
                i.encode("ascii")
            except UnicodeDecodeError:
                pass
            else:
                q.put(i)
    for s in range(1):
        t1 = threading.Thread(target=smtp1)
        t1.start()

except Exception as e:
    with open("baocuo.txt", "a") as s:
        s.write("错误:%s" % e)

我的邮件服务器端对连接数有限制,不能开太高的线程。所以我试了这种单次提交多组的方式,测试发现会快很多。To标头改成统一的话据说会降低邮件评分影响入箱率。如果To标头做不到分开显示的话,smtplib库的内部我能自己改吗?我刚学python没多久 不太懂这些

  • 写回答

4条回答 默认 最新

  • eq0284 2022-07-28 22:32
    关注

    msg['To'] = ','.join(m),to指定多人,收件人就是连在一块的,如果群发,to做不到显示当前收件人,可以这么改:

    msg['To'] = '所有人'
    
    

    也可以循环收件人群发,通过python多进程发送邮件

    import smtplib
    from email.mime.text import MIMEText
    from multiprocessing import Pool
    import time
    
    
    
    def sendEmail(smtp, message):
        smtp.sendmail(message["From"], [message["To"]], message.as_string())
        time.sleep(1)
    
        
    if __name__=="__main__":
        address = []
        pool = Pool(processes=10)
        subject = input("请输入邮件的主题")  # 邮件的主题
        content = input("请输入邮件的内容") # 邮件的内容
        sender = ""  # 发件人
        password = '**************'  # 授权密码
    
        message = MIMEText(content, "html", "utf-8")
        message["From"] = sender
        message["Subject"] = subject
    
        smtp = smtplib.SMTP_SSL('smtp.163.com', 994)  # qq用465,163用994
        smtp.login(sender, password)
        
        for receiver in address:
            message["To"] = receiver
            pool.apply_async(sendEmail, args=(smtp,message))   #进程总数为10,当前进程执行完后启动新进程.
    
        pool.close()
        # 主进程阻塞,等所有进程执行完毕
        pool.join()
    
    
    
    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月31日
  • 赞助了问题酬金10元 7月29日
  • 修改了问题 7月29日
  • 修改了问题 7月28日
  • 展开全部

悬赏问题

  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题