乐趣区

关于python:Python36自动群发邮件

如何把收件人名字一一对应

本文适宜有一丢丢会主动发邮件的道友看,仅供参考,坑位无限。
前提条件,鄙人的解释器是 IDLE 3.6(用惯了,不想降级)
以两个邮箱为例子。

to_emails=['123@qq.com','456@qq.com']
to_names=['怪盗基德','上杉绘梨衣']

主动群发邮件,解决收件人姓名时大多是用 join 函数解决,
造成以逗号分隔的字符串。

官网大大说:Header 承受的第一个参数的数据类型必须要是字符串或者字节,列表是不能解码。

to_names=['怪盗基德','上杉绘梨衣']
msg['To'] = Header(",".join)

But, 我试了一下,没有用,两个邮箱的收件人都是怪盗基德,上杉绘梨衣。不确定是什么起因,不排除是版本问题,有道友晓得能够跟我说一下哈。


如上图,两个名字一起了(把怪盗基德忘了吧)。
外汇经纪商比照 https://www.fx61.com/brokerlist

没方法,笔者只好另辟蹊径,想出了有两种解决方案。
【1】遍历列表
【2】利用 Excel 表格

【1】遍历两个列表

import smtplib
from email.mime.text import MIMEText
from email.header import Header
import time

from_name = input('请输出发件人:')
from_addr = input('请输出发件人邮箱:')
password = input('请输出发件人邮箱受权码:')

to_namelist = []
to_addrs = []
number=0   

while True:
    name=input('请输出收件人:')
    to_namelist.append(name)
    email=input('请输出收件儿邮箱:')
    to_addrs.append(email)
    temp=input('(可群发)是否持续输出邮箱,输出 n 加回车键退出,输出任意键持续:')
    number=number+1   
    if temp=='n':
        break

smtp_server ='smtp.qq.com'    

input_subject = input('请输出邮件主题:')

text = input('请输出邮件内容:')

for i in range(number):          
    to_name=to_namelist[i]
    to_addr=to_addrs[i]
    msg = MIMEText(text,'plain','utf-8')
    msg['From'] = Header(from_name)
    msg['To'] = Header(to_name)   
    msg['Subject'] = Header(input_subject)
    server = smtplib.SMTP_SSL()
    server.connect(smtp_server,465)
    server.login(from_addr, password)
    server.sendmail(from_addr,to_addr, msg.as_string())
    server.quit()
now=time.strftime('%Y-%m-%d %H:%M:%S',
time.localtime(time.time()))
print(now)
print('邮件发送胜利!')

【2】将两个列表通过 csv 放进 Excel 表格里,再通过读取 Excel 表格进行循环

import time
import smtplib
from email.mime.text import MIMEText
from email.header import Header
import csv


#发件人信息
from_addr='1499823573@qq.com'
password='xzrbanqjofkugaei'


#如果有 Excel 表格就不必新建了,没有 csv 就得思考新建 csv 文件


#形式一:通过现有列表新建 csv 文件
#data=[['怪盗基德','123@qq.com'],['上杉绘梨衣','@456.com']]

#形式二:通过输出造成列表再新建 csv 文件
dataemail=[]
dataname=[]
data=[]
number=0
while True:
    input_name=input('请输出收件人称说(可随便写):')
    dataname.append(input_name)
    input_email=input('请输出收件人邮箱账号:')
    dataemail.append(input_email)
    b=input('是否持续输出,n 退出,任意键持续:')
    number=number+1
    if b=='n':
        break
    
i=0
for i in range(number):
    data.append([dataname[i],dataemail[i]])

with open('C:/Users/ASUS/Desktop/ 邮箱数据.csv','a',newline='') as f:
    writer=csv.writer(f)
    for row in data:
        writer.writerow(row)

input_fromname=input('请输出发件人:')
input_subject=input('请输出邮件主题:')
text=input('请输出邮件群发内容:')
with open('C:/Users/ASUS/Desktop/ 邮箱数据.csv','r') as f:
    reader=csv.reader(f)
    for row in reader:
        to_addrs=row[1]
        to_name=row[0]
        #text='ncoqw'
        msg=MIMEText(text,'plain','utf-8')
        msg['From']=Header(input_fromname)
        msg['To']=Header(to_name)
        msg['Subject']=Header(input_subject)
        server=smtplib.SMTP_SSL()
        server.connect('smtp.qq.com',465)
        server.login(from_addr,password)
        server.sendmail(from_addr,to_addrs,msg.as_string())
server.quit()
        
now=time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
print(now)
print('邮件发送胜利!')

这里有个点刚开始没想到

data.append([dataname[i],dataemail[i]])
退出移动版