python—smtplib、email群发邮件

使用python内置包、模块smtplibemail实现自动化、集群式发邮件,其中email负责构造邮件,smtplib负责发送邮件。

1、smtplib模块函数及参数详解

import smtplib

server = smtplib.SMTP()
server.connect(host, port)
server.login(username, password) 
server.sendmail(from_addr, to_addr, msg.as_string()) 
server.quit() 

注意;在本地新建.py文件时候,不能命名为email.py,而且你存放这个py文件的文件夹里,也不能email.py。这是由于我们后面要调用email模块,如果将文件也命名为email,会造成报错。

1.1、smtplib.SMTP.方法

SMTP (Simple Mail Transfer Protocol)翻译过来是“简单邮件传输协议”的意思,SMTP 协议是由源服务器到目的地服务器传送邮件的一组规则。可以简单理解为:我们需要通过SMTP指定一个服务器,这样才能把邮件送到另一个服务器。

在模块smtplib中,SMTP为定义的一个类:

 class SMTP_SSL(SMTP):
      
        default_port = SMTP_SSL_PORT

        def __init__(self, host='', port=0, local_hostname=None,
                     keyfile=None, certfile=None,
                     timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
                     source_address=None, context=None):
1.2、connect(host, port)方法

host: SMTP 服务器主机。 你可以指定主机的ip地址或者域名如: runoob.com,这个是可选参数。
port: 如果你提供了 host 参数, 你需要指定 SMTP 服务使用的端口号,一般情况下 SMTP 端口号为25。
端口也可在邮箱端进行设置,并查看IMAP/SMTP服务是否开启。


开启SMTP服务
查看端口号
1.3、login(username, password) 方法

在开启SMTP服务后,会生成授权码保存使用,此处的passwrd即为此码,非邮箱登录密码

username = 'xxx@qq.com'
password = '你的授权码数字'

server.login(username, password) 
#username:登录邮箱的用户名
#password:登录密码/授权码
1.4、sendmail(sender, to_addr, msg.as_string()) 方法

sendmail是“发送邮件”的意思,是发送邮件用的,sendmail()方法需要三个参数:发件人,收件人和邮件内容。

server.sendmail(from_addr, to_addr, msg.as_string()) 
#from_addr:邮件发送地址,就是上面的username
#to_addr:邮件收件人地址
#msg.as_string():为一个字符串类型 

2、email包函数及参数详解

from email.mime.text import MIMEText #内容形式为纯文本、HTML页面。
from email.mime.image import MIMEImage # 内容形式为图片。
from email.mime.multipart import MIMEMultipart #多形式组合,可包含文本和附件。

2.1、构建邮件头Header()

标准邮件需要三个头部信息:From , To 和 Subject ,第三到五行代码就提供了这三个信息。

from email.header import Header

msg['From'] = Header(from_addr)
msg['To'] = Header(to_addr)
msg['Subject'] = Header('python test')
2.2、构建邮件内容MIMEText()
MIMEText(msg,type,chartset) #MIMEText()方法需要输入三个参数:
# msg:文本内容,可自定义
# type:文本类型,默认为plain(纯文本)
# chartset:文本编码,中文为“utf-8”

from email.mime.text import MIMEText
msg = MIMEText('send by python','plain','utf-8')

3、代码结构组织、封装

#1.导入模块
import smtplib from email.mime.text import MIMEText
#2.定义变量
from_addr='xxx@qq.com!
password='你的授权码数字’
to_addr=lxxx@qq.com!
smtp_server='smtp.qq.com’
msg=MIMEText('send by Python','plain','utf-81)
#3.使用方法
server =smtplib.SMTP(smtp_server,465)
server.login(from_addr,password)
server.sendmail(from_addr,to_addr,msg.as_string()
server.quit()

采用模块+变量+方法可以使代码结构更为清晰、可读。
完整代码如下:增加了利用csv模块实现读取邮箱信息。

# 1、引入模块------------------------------
import smtplib# smtplib 用于邮件的发信动作
from email.mime.text import MIMEText# email 用于构建邮件内容
from email.header import Header# 用于构建邮件头
import csv# 引用csv模块,用于读取邮箱信息

# 2、定义变量------------------------------
from_addr = input('请输入登录邮箱:')# 发信方的信息:发信邮箱,邮箱授权码
password = input('请输入邮箱授权码:')
smtp_server = 'smtp.qq.com'# 发信服务器
text='人生不易,在线学技;人生苦短,我用Python!'# 邮件正文
data = [['liaoxuefeng ', 'liaoxuefeng@qq.com'],['kaxi', 'kaxi@qq.com']]# 待写入csv文件的收件人数据

#3、使用方法------------------------------
# 写入收件人数据
with open('to_addrs.csv', 'w', newline='') as f:
    writer = csv.writer(f)
    for row in data:
        writer.writerow(row)
# 读取收件人数据,并启动写信和发信流程
with open('to_addrs.csv', 'r') as f:
    reader = csv.reader(f)
    for row in reader:
        to_addrs=row[1]
        msg = MIMEText(text,'plain','utf-8')
        msg['From'] = Header(from_addr)
        msg['To'] = Header(to_addrs)
        msg['Subject'] = Header('python test')
        server = smtplib.SMTP_SSL()
        server.connect(smtp_server,465)
        server.login(from_addr, password)
        server.sendmail(from_addr, to_addrs, msg.as_string())

server.quit()# 关闭服务器
3.1、可能存在的报错
# ValueError: server_hostname cannot be an empty string or start with a leading dot.
# 因为Python 3.7修改了ssl.py,导致smtplib.SMTP_SSL也连带产生了问题。
# 在括号内加入host参数

server = smtplib.SMTP_SSL(smtp_server)
# smtplib.SMTPException: No suitable authentication method found
# 在登录(login)之前调用starttls()方法就可以了。

server.starttls()
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容

  • 一、相关模块介绍 发送邮件主要用到了smtplib和email两个模块,这里首先就两个模块进行一下简单的介绍: 1...
    LizPL阅读 1,349评论 0 3
  • 网络 理论模型,分为七层物理层数据链路层传输层会话层表示层应用层 实际应用,分为四层链路层网络层传输层应用层 IP...
    FlyingLittlePG阅读 768评论 0 0
  • python发邮件需要掌握两个模块的用法,smtplib和email,这俩模块是python自带的,只需impor...
    Magic_小灰灰阅读 306评论 0 0
  • python使用SMTP发送电子邮件 SMTP是发送邮件的协议,Pytho...
    小娟_bb93阅读 804评论 0 1
  • 他和她都是被家庭抛弃的孩子,他为了存活一路坑蒙拐骗、行乞、卖艺,她为了存活一路行乞。他们相遇在京城行乞的途中,他们...
    九歌驾到阅读 297评论 0 1