SMTP操作使用详解并通过python进行smtp邮件发送示例
转载请注明出处:
1.SMTP
SMTP 的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP 服务器就是遵循 SMTP 协议的发送邮件服务器。
SMTP 认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录 SMTP 服务器,这就使得那些垃圾邮件的散播者无可乘之机。
增加 SMTP 认证的目的是为了使用户避免受到垃圾邮件的侵扰。
2.网易邮箱可以通过以下方式开启:
请登录网页邮箱,点击邮箱页面上方的“设置”,选择“POP3/SMTP/IMAP”,请根据实际需求开启POP3/IMAP或者SMTP/IMAP服务,并根据页面提示进行短信验证操作。开通后即可使用foxmail、Outlook等第三方客户端进行收发邮件。(注:点击关闭,既可关闭成功
在开启服务时,需要保存好授权码:
163邮箱的smtp服务器:smtp.163.com 端口:465
163企业邮箱端口列表:
协议类型 | 服务器地址 | 默认端口 | 加密端口(SSL) |
---|---|---|---|
POP | pophz.qiye.163.com | 110 | 995 |
SMTP | smtphz.qiye.163.com | 25 | 994 |
IMAP | imaphz.qiye.163.com | 143 | 993 |
3.使用python实现smtp邮件发送
3.1. 安装smtplib和email模块
pip install smtplib
pip install email
3.2.发送简单纯文本邮件
# -*- coding: utf-8 -*-
# 从17280xxxxx@qq.com向zjxwxxxx@outlook.com发送一封邮件
# 注意, 此处要填写你自己正确的邮件地址
import smtplib
from email.header import Header
from email.mime.text import MIMEText
fromAddr ='17****1@163.com' # 发送邮件地址
password = 'GXKLZMSNHOMPDVXH' # SMTP服务的密码, 就是上述图中的授权码
toAddr = '1****5@163.com' # 目的邮件地址
subject = 'SMTP send mail' # 邮件标题
content = 'python send mail,very goode' # 邮件内容
def makeMail():
mail = MIMEText(content, 'plain', 'utf-8') # 使用MIMEText()构造一个文本格式的邮件
mail['From'] = Header(fromAddr, 'utf-8') # 构造邮件头From
mail['To'] = Header(toAddr, 'utf-8') # 构造邮件头To
mail['Subject'] = Header(subject, 'utf-8') # 构造邮件主题
return mail
def sendMail(mail):
# smtp= smtplib.SMTP() # 创建SMTP实例
# smtp.connect('smtp.qq.com') # 连接SMTP服务器
smtp = smtplib.SMTP_SSL("smtp.163.com") # 此处直接一步到位
smtp.login(fromAddr, password) # 登录SMTP服务
smtp.sendmail(fromAddr, toAddr, mail.as_string()) # 通过SMTP服务器发送邮件
smtp.quit()
sendMail(makeMail())
print('success')
运行该python脚本并验证配置:
在接收方的邮箱可以看到发送的邮件:
3.3.发送HTML邮件:
import smtplib
from email.mime.text import MIMEText
from email.header import Header
sender = 'xxxx@qq.com' #发件邮箱
passwd = 'lkugmgywydhfff' #发送人邮箱授权码
receivers = 'xxxx@qq.com' #收件邮箱
subject = 'python发邮Html邮件测试' #主题
content = """ #内容,HTML格式
<p>Python 邮件发送测试...</p>
<p><a href="http://www.baidu.com">这是一个链接</a></p>
"""
msg = MIMEText(content,'html','utf-8')
# msg['Subject'] = subject
msg['Subject'] = Header(subject,'utf-8')
# msg['From'] = sender
msg['From'] = Header('大傻子','utf-8')
# msg['To'] = receivers
msg['To'] = Header('二愣子','utf-8')
try:
s = smtplib.SMTP_SSL('smtp.qq.com',465)
s.login(sender,passwd)
s.sendmail(sender,receivers,msg.as_string())
print('Send Success')
except:
print('Send Failure')
3.4.发送图片邮件:
import smtplib
from email.mime.image import MIMEImage
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
sender = 'xxxx@qq.com'
passwd = 'lkugmgywydhfff'
receivers = 'xxxx@qq.com'
subject = 'python发邮带img的邮件测试' #主题
# 创建一个带附件的实例
msg = MIMEMultipart()
msg['Subject'] = subject
msg['From'] = sender
msg['To'] = receivers
# 创建正文
msg.attach(MIMEText('使用python smtplib模块和email模块自动发送邮件测试','plain','utf-8'))
# 创建图片附件
import os
img_file = open(os.getcwd()+"/a4.jpg",'rb').read()
msg_img = MIMEImage(img_file)
msg_img.add_header('Content-Disposition','attachment', filename = "a4.jpg")
msg_img.add_header('Content-ID', '<0>')
msg.attach(msg_img)
try:
s = smtplib.SMTP_SSL('smtp.qq.com',465)
s.set_debuglevel(1) #输出发送邮件详细过程
s.login(sender,passwd)
s.sendmail(sender,receivers,msg.as_string())
print('Send Succese')
except:
print('Send Failure')
3.5.发送带附件的邮件:
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
sender = 'xxxxxx@qq.com' #发件邮箱
passwd = 'lkugmgywydhfff' # 邮箱授权码
receivers = 'xxxxxx@qq.com' #收件邮箱
subject = 'python发带附件的邮件测试' #主题
# 创建一个带附件的实例
msg = MIMEMultipart()
msg['Subject'] = subject
msg['From'] = sender
msg['To'] = receivers
#创建正文,将文本文件添加到MIMEMultipart中
msg.attach(MIMEText('使用python smtplib模块和email模块自动发送邮件测试','plain','utf-8'))
#构造附件1,传送当前目录下 文件
att1 = MIMEText(open('testdata.xlsx','rb').read(),'base64','utf-8') # rb以二进制方式读取
# att1["Content-Type"] = 'application/octet-stream'
# filename为附件名称,可以任意写,写什么名字,邮件中显示什么名字
att1["Content-Disposition"] = 'attachment; filename = "testdata.xlsx" '
#将附件添加到MIMEMultipart中
msg.attach(att1)
#构造附件2
att2 = MIMEText(open('db.cfg','rb').read(),'base64','utf-8')
# att2["Content-Type"] = 'application/octet-stream'
att2["Content-Disposition"] = 'attachment; filename = "db.cfg" '
#将附件添加到MIMEMultipart中
msg.attach(att2)
try:
s = smtplib.SMTP_SSL('smtp.qq.com',465)
s.set_debuglevel(1) #输出发送邮件详细过程
s.login(sender,passwd)
s.sendmail(sender,receivers,msg.as_string())
print('Send Succese')
except:
print('Send Failure')
4.python 邮件发送模块与语法总结
4.1smtplib模块:
主要通过SMTP类与邮件系统进行交互。使用方法如下:
1.实例化一个SMTP对象:
s = smtplib.SMTP(邮件服务地址,端口号)
s = smtplib.SMTP_SSL(邮件服务地址,端口号)
2.登陆邮件,权限验证:
s.login(用户名,密码)
3.发送邮件:
s.sendmail(发件人邮箱,收件人邮箱,发送内容)
4.断开连接:
s.close()
4.2 email模块:
email模块:支持发送的邮件内容为纯文本、HTML内容、图片、附件。email模块中有几大类来针对不同的邮件内容形式,常用如下:
MIMEText:(MIME媒体类型)内容形式为纯文本、HTML页面。
MIMEImage:内容形式为图片。
MIMEMultupart:多形式组合,可包含文本和附件。
每一类对应的导入方式:
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
4.3 MIMEText:
MIMEText(msg,type,chartset) msg:文本内容 type:文本类型默认为plain(纯文本) ## 发送HTML格式的时候,修改为html,但同时要求msg的内容也是html的格式。 chartset:文本编码,中文为“utf-8” # 构造TEXT格式的消息 msg = MIMEText("hello.text","plain","utf-8") msg["Subject"] = "xxxxx" msg["From"] = "xxxx" msg["To"] = "xxxx" #发送以上构造的邮件内容要使用as_string将构造的邮件内容转换为string形式。 s.sendmail("xxx","xxx",msg.as_string)
4.4 MIMEImage、MIMEMultipart:
msg = MIMEMultipart() #实例化一个文本对象 msg_sub = MIMEText("hello.text","plain","utf-8") #将text消息添加到MIMEMultipart中,作为邮件正文。 msg.attach(msg_sub) #图片作为附件 import os img_datas = open(os.getcwd()+ "/reports/xxxx.png","rb").read() msg_img = MIMEImage(img_data) msg_img.add_header('Content-Disposition','attachment', filename = "xxxx.png" ) msg_img.add_header('Content-ID','<0>') #将图片添加到MIMEMultiplart中,作为附件发送。 msg.attach(mag_img)