Python模块smtplib让群发邮件变得简单1.smtplib模块介绍2.email.utils模块使用3.发送email的其它几个模块4.实例

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元组并返回适合于ToCc标题的字符串值。如果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。欢迎指点。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大内老A

ASP.NET Core的配置(4):多样性的配置来源[中篇]

我们在本篇文章中会介绍三种针对物理文件的ConfiguationProvider,它们分别是针对JSON文件的JsonConfiguationProvider,...

2058
来自专栏Java 源码分析

JavaWeb基础

1. XML xml一般就用来存放少量的数据,或者是作为配置文件。 xml的声明<?xml version=”1.0” encoding=”utf-8”?> ...

3315
来自专栏码洞

基于Netty实现Redis协议的编码解码器

上面是Netty的服务器端基本消息处理结构,为了便于初学者理解,它和真实的结构有稍许出入。Netty是基于NIO的消息处理框架,用来高效处理网络IO。处理网络消...

2741
来自专栏菩提树下的杨过

利用sharding-jdbc分库分表

sharding-jdbc是当当开源的一款分库分表的数据访问层框架,能对mysql很方便的分库、分表,基本不用修改原有代码,只要配置一下即可,完整的配置参考以下...

5417
来自专栏杂烩

大话HelloWord是如何出现在面前的-浅谈虚拟机运行流程

    初学Java,大都会用记事本写个Hello Word,然后用CMD编译出class文件,最后执行一下。当控制台输出Hello Word的时候,一个简单的...

1582
来自专栏coder修行路

Java基础(四)线程快速了解

其实可以理解是java的压缩包 方便使用,只要在classpath设置jar路径即可 数据库驱动,ssh框架等都是以jar包体现的

1180
来自专栏菩提树下的杨过

利用sharding-jdbc分库分表

sharding-jdbc是当当开源的一款分库分表的数据访问层框架,能对mysql很方便的分库、分表,基本不用修改原有代码,只要配置一下即可,完整的配置参考以下...

3317
来自专栏陈树义

简单笔记

1、类的表面类型和实际类型 实例对象有两个类型:表面类型(Apparent Type)和实际类型(ActualType),表面类型是声明时的类型,实际类型是对象...

2615
来自专栏移动端开发

iOS 多线程之线程锁Swift-Demo示例总结

线程锁是什么       在前面的文章中总结过多线程,总结了多线程之后,线程锁也是必须要好好总结的东西,这篇文章构思的时候可能写的东西得许多,只能挤时间一点点的...

6167
来自专栏猿份到

LeakCanary源码浅析

在Android开发中最让人们头疼的就是内存泄漏了,今天来介绍一个查看内存是否泄漏的工具LeakCanary,并通过研究源码明白它是如何分析和查找存在泄漏信息的...

3505

扫码关注云+社区

领取腾讯云代金券