社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python模块smtplib让群发邮件变得简单

狗厂 • 7 年前 • 629 次点击  

1.smtplib模块介绍

SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。
Python创建 SMTP 对象语法如下:

import smtplib

smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )
  • smtplib模块负责发送邮件
  • smtplib模块还提供了SMTP_SSL类和LMTP类,对它们的操作与SMTP基本一致。
    • host: SMTP 服务器主机。 你可以指定主机的ip地址或者域名如: hellobi.com,这个是可选参数。
    • port: 如果你提供了 host 参数, 你需要指定 SMTP 服务使用的端口号,一般情况下 SMTP 端口号为25。
    • local_hostname: 如果 SMTP 在你的本机上,你只需要指定服务器地址为 localhost 即可。

2.email.utils模块使用

email.utils模块中提供了几个有用的方法:

  • email.utils.quote(str)
    将str中的反斜杠替换为两个反斜杠的新字符串,并将双引号替换为反斜杠双引号。
  • email.utils.unquote(str)
    返回一个不带引号的str的新字符串。如果str结束并以双引号开头,则会被剥离。同样,如果str结束并以尖括号开始,它们将被剥离。
  • email.utils.parseaddr(address)
    解析地址 - 应该是某个包含地址的字段(例如“ 收件人”或“ 抄送”)的值,并将其解析为其真实姓名和 电子邮件地址部分。返回该信息的元组,除非解析失败,在这种情况下返回2元组。('', '')
  • email.utils.formataddr(pair)
    与此相反parseaddr(),这需要表单的2元组并返回适合于To或 Cc标题的字符串值。如果pair的第一个元素为false,则第二个元素将不加修改地返回。(realname, email_address),实际上,parseaddr(), formataddr(),两者互逆。
  • email.utils.getaddresses(fieldvalues)
    此方法返回由返回的表单的2元组列表parseaddr()。 fieldvalues是可能返回的一系列头字段值 Message.get_all。下面是一个简单的例子,它可以获取消息的所有收件人:
from email.utils import getaddresses

tos = msg.get_all('to', [])
ccs = msg.get_all('cc', [])
resent_tos = msg.get_all('resent-to', [])
resent_ccs = msg.get_all('resent-cc', [])
all_recipients = getaddresses(tos + ccs + resent_tos + resent_ccs)

3.发送email的其它几个模块

  • email模块负责构造邮件
    • 类email.mime.text.MIMEText(_text),是使用字符串_text来生成MIME对象的主体文本
    • MIME是(Multipurpose Internet Mail Extensions) 多用途互联网邮件扩展类型
    • MIME设置的目的是为了在发送电子邮件时附加多媒体数据,让邮件根据其类型进行处理。
from email.mime.text import MIMEText
  • 如果你想让你的邮件标题使用非ASCII字符集,就要使用email.header编码非ASCII字符集
from email.header import Header

email.header.Header(s=None, charset=None, maxlinelen=None, header_name=None, 
                     continuation_ws=' ', errors='strict')
创建一个能容纳不同字符集的字符串的MIME对象的标头
  • s:初始标头,即要编码之前的标头
  • chatset:字符集,默认为ASCII
  • maxlinelen:标头名的行的最大长度,默认为76
  • header_name:标头名,默认无
  • continuation_ws:默认为单个空格字符
  • errors:直接传递到Header的append()方法里
  • email.encoders 编码器
from email import encoders
  • 其它
from email.mime.multipart import MIMEMultipart

email.mime.multipart.MIMEMultipart(_subtype='mixed', boundary=None, _subparts=None, **_params)


def _format_addr(s):
# 这个函数的作用是把一个标头的用户名编码成utf-8格式的,如果不编码原标头中文用户名,用户名将无法被邮件解码
    name, addr = parseaddr(s)
    return formataddr((Header(name, "utf-8").encode(), addr))
    # Header().encode(splitchars=';, \t', maxlinelen=None, linesep='\n')
        # 功能:编码一个邮件标头,使之变成一个RFC兼容的格式
  • MIMEMultipart是MIMEBase的一个子类,多个MIME对象的集合
  • _subtype默认值为mixed。boundary是MIMEMultipart的边界,默认边界是可数的。
  • 如果是txt/doc/csv/xls等plain格式的话用email.mime.MIMEApplication去发就行了,但如果是比如pdf/jpg/png等格式发的话,用email.mime.MIMEBase去发
# 如果是pdf/jpg/png等格式
from email.mime.base import MIMEBase
email.mime.base.MIMEBase(_maintype, _subtype, **_params)
# fp = open(filename,"rb")
# file = MIMEBase("application","pdf",filename = filename)
# 如果是txt/doc/csv/xls等plain格式的话
from email.mime.application import MIMEApplication
fp = open(att_file, 'rb')
file = MIMEApplication(fp.read())

4.实例

#!/usr/bin/env python3.4
# encoding: utf-8
"""
Created on 18-5-17
@title: '测试版'
@author: Xusl
"""
import smtplib
from email.mime.text import MIMEText
from email.header import Header

sender = 'xxxxxxxx@163.com'
receiver = 'xxxxxxxx@chyjr.com'
subject = 'python email test'
smtpserver = 'smtp.163.com'
username = 'xxxxxxxx@163.com'
password = 'xxxxxxxx'

msg = MIMEText('<html><h1>你好</h1></html>', 'html', 'utf-8')
msg['Subject'] = Header(subject, 'utf-8')

smtp = smtplib.SMTP()
smtp.connect(smtpserver)
smtp.login(username, password)
smtp.sendmail(sender, receiver, msg.as_string())
smtp.quit()

发送成功

写了一个群发邮件的功能,代码已上传Github。欢迎指点。


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/P1CvlgTzJ7
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/13399
 
629 次点击