目录

上一个主题

7.3. 发送邮件

下一个主题

7.5. 发送HTML格式邮件


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)
{}