7.4. 邮件推送给多用户¶
将邮件推送给多个用户可以在代码中直接将用户邮箱账号列出,但是这样操作会很麻烦,需要一一列出用户邮箱,运行后想要再次添加用户邮箱会很麻烦,所以可以将所有用户邮箱信息写在文本文件中,然后从文本文件中读取出来。这样做的好处是可以随时添加用户邮箱信息,对刚添加的用户进行推送邮件。Python发送邮件前面用到两种方式,一种是smtplib库,另一种是yagmail库。那么下面就用这两种库将邮件推送给多用户。
SMTP给多个用户发邮件¶
实例如下:
导入所需要的第三方库。
>>> import sys
>>> import smtplib
>>> import datetime
>>> import mimetypes
>>> from email.encoders import encode_base64
>>> import os
>>> import time
>>> from email.mime.text import MIMEText
>>> from email.mime.base import MIMEBase
>>> from email.mime.multipart import MIMEMultipart
>>> from email.header import Header
>>> from cfg import email_cfg
>>> dt = datetime.datetime.now()
使用163的smtp服务。设定需要登录的邮箱信息。
>>> mail_host="smtp.163.com"
>>> mail_user=email_cfg['user']
>>> mail_pass=email_cfg['passwd']
>>> sender = mail_user
将email.list中的用户邮箱读取出来并赋值给cnts。遍历cnts,将遍历所得值列入receivers_arr。
>>> cnts = open('case_a_sends_email_txt/email.list').readlines()
>>> receivers_arr = []
>>> for cnt in cnts:
>>> tt = cnt.strip()
>>> if tt:
>>> if tt.startswith('#'):
>>> continue
>>> receivers_arr.append(tt)
>>> receivers = set(receivers_arr)
写入邮件内容。
>>> cnt = '''测试'''
>>> message = MIMEText(cnt, 'html', 'utf-8')
登录已开启smtp服务的邮箱。
>>> smtpObj = smtplib.SMTP_SSL('smtp.163.com',port=465)
>>> smtpObj.login(mail_user, mail_pass)
(235, b'Authentication successful')
依次向用户邮箱发送邮件,当接收邮件邮箱大于10,重新登录发送邮件邮箱。
>>> idx_c = 1
>>> for reci in receivers:
>>> # 重新实例化,不然用户会叠加。
>>> msg = MIMEMultipart('mixed')
>>> msg.attach(message)
>>> msg['From'] = "<{}>".format(mail_user)
>>> subject = 'Test, {}'.format(dt.strftime("%Y.%m"))
>>> msg['Subject'] = subject
>>> msg['To'] = reci
>>> if idx_c > 10:
>>> smtpObj = smtplib.SMTP_SSL('smtp.163.com',port=465)
>>> smtpObj.login(mail_user, mail_pass)
>>> idx_c = 0
>>> try:
>>> smtpObj.sendmail(sender, [reci], msg.as_string())
>>> print('成功')
>>> except:
>>> print('err', reci)
>>> # 发送失败的邮箱尝试发送5次
>>> for i in range(5):
>>> try:
>>> smtpObj.sendmail(sender, [reci], msg.as_string())
>>> print('成功')
>>> except:
>>> print('失败')
>>> del (msg)
>>> time.sleep(.2)
>>> idx_c = idx_c + 1
成功
成功
yagmail给多个用户发邮件¶
yagmail将邮件推送给多人只要将所有邮箱地址列为列表即可。用户邮箱可用逗号分隔。
导入 yamail 库,登录发送邮箱。
>>> import yagmail
>>> yag = yagmail.SMTP( user="samele_ferrum@163.com", password="QWDBKMFMYUZPDXTY", host='smtp.163.com')
发送的邮件内容, 直接可填写邮件附件地址。(text.txt 为附件地址。)
>>> contents = ['This is the body, and here is just text http://somedomain/image.png',
>>> 'You can find an audio file attached.', 'test.txt']
从文本文件中读取用户邮箱,赋值给列表receivers_arr。
send()
直接将用户邮箱列表调用即可。
>>> cnts = open('case_a_sends_email_txt/email.list').readlines()
>>> receivers_arr = []
>>> for cnt in cnts:
>>> tt = cnt.strip()
>>> if tt:
>>> if tt.startswith('#'):
>>> continue
>>> receivers_arr.append(tt)
>>> yag.send(receivers_arr, 'subject', contents)
{}