Python对SMTP支持有smtplib和email两个模块,email负责构造邮件,smtplib负责发送邮件。
python创建SMTP对象的语法:
- smtpObj = smtplib.SMTP([host [ , port [ , local_hostname ]]])
- host: smtp服务器主机,可以指定主机的ip地址或域名,是可选参数
- port:如果提供了host参数,就需要制定smtp服务的端口号,一般是25,如果是ssl,那一般为465
- local_host: 如果smtp在本地主机,就要指定这个参数
- 在创建smtp这个对象时,如果提供了host和port,那它会自动调用connect方法连接服务器
SMTP对象使用sendmail方法发送邮件
- SMTP.sendmail(from_addr,to_addrs,msg[,mail_options,rcpt_options])
- from_addr: 邮件发送者地址
- to_addrs: 字符串列表,邮件发送地址
- msg:发送消息,是字符串,表示邮件的内容,包含标题,发信人,收件人,邮件内容,附件等构成,要特别注意他的格式
普通文本邮件的发送:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @date: 2018/6/5 下午9:09
# @author: Bill
# @file: sendMail.py
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from_addr = 'xxxx@163.com' # 设置i你的邮箱账号
password = 'xxxxx' # 设置你的邮箱密码,有的邮箱需要开通授权码
smtp_server = 'smtp.163.com'
to_addrs = ['178919347@qq.com'] # 邮件接收者的地址,是一个列表
# 第一个参数为文本内容,第二个plain设置文本格式,第三个设置编码utf-8
msg = MIMEText('''你好,今天约吗''', 'plain', 'utf-8')
msg['From'] = Header('''约吗''', 'utf-8')
msg['To'] = Header('''约吗''', 'utf-8')
msg['Subject'] = Header('''约吗''','utf-8')
# 注意 文本内容最好用三引号扩起来,如果报554错误,可能是有敏感信息被看成了垃圾邮件
try:
smtpObj = smtplib.SMTP_SSL(smtp_server, 465) # 建立ssl连接,创建smtp对象时已经自动创建了连接,所以不需要connect方法了
smtpObj.login(from_addr,password)
smtpObj.sendmail(from_addr, to_addrs, msg.as_string())
print("邮件发送成功!")
except smtplib.SMTPException as e:
print("Error: 无法发送邮件!\n错误信息: {}".format(e))
发送html格式的邮件
只需要把plain格式改变为html就可以了
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @date: 2018/6/6 上午11:27
# @author: Bill
# @file: send_html_mail.py
from email.mime.text import MIMEText
import smtplib
from email.header import Header
from_addr = 'xxx@139.com'
password = 'xxx' # 设置你的邮箱密码,有的邮箱需要开通授权码
smtp_server = 'smtp.139.com'
to_addrs = ['350013086@qq.com']
mail_msg = '''
<p>Python check!</p>
<p><a href="http://www.baidu.com">This is an url!</a></p>
''' # 带有html标签格式的文本
msg = MIMEText(mail_msg, 'html', 'utf-8') # 构造信息是把原来的plain修改成html就可以了
msg['From'] = Header(from_addr, 'utf-8')
msg['To'] = Header(to_addrs[0], 'utf-8')
msg['Subject'] = Header('''Use Python, enjoy Python''', 'utf-8')
try:
smtpObj = smtplib.SMTP_SSL(smtp_server, 465)
smtpObj.login(from_addr, password)
smtpObj.sendmail(from_addr, to_addrs, msg.as_string())
print("发送成功!")
except smtplib.SMTPException as e:
print("发送失败!")
print("错误信息:{}".format(e))
发送带附件的邮件
发送文本,需要构造MIMEText对象
发送附件,需要构造MIMEMultipart对象,然后往里面填见MIMEText作为邮件正文,MIMEBase对象作为附件
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @date: 2018/6/6 上午11:44
# @author: Bill
# @file: send_attachment.py
from email.mime.text import MIMEText
import smtplib
from email.header import Header
from email.mime.multipart import MIMEMultipart
from_addr = 'xxxxxx@139.com'
password = 'xxxxx' # 设置你的邮箱密码,有的邮箱需要开通授权码
smtp_server = 'smtp.139.com'
to_addrs = ['350013086@qq.com']
mail_msg = '''
<p>Python check!</p>
<p><a href="http://www.baidu.com">This is an url!</a></p>
'''
msg = MIMEMultipart() # 创建一个带附件的实例
msg['From'] = Header(from_addr, 'utf-8')
msg['To'] = Header(to_addrs[0], 'utf-8')
msg['Subject'] = Header('''Use Python, enjoy Python''', 'utf-8')
msg.attach(MIMEText(mail_msg, 'html', 'utf-8')) # 邮件正文的内容
# 构造附件1,传送当前目录下的demon1.py
att1 = MIMEText(open('demon1.py', 'r').read(), 'base64', 'utf-8')
att1['Content-Type'] = 'application/octet-stream'
att1['Content-Dispostion'] = 'attachment;filename="demon1.py"' # filename写什么,邮件附件就以什么命名
msg.attach(att1)
try:
smtpObj = smtplib.SMTP_SSL(smtp_server, 465)
smtpObj.login(from_addr, password)
smtpObj.sendmail(from_addr, to_addrs, msg.as_string())
print("发送成功!")
except smtplib.SMTPException as e:
print("发送失败!")
print("错误信息:{}".format(e))