python3.5入门笔记(16) 发邮件

1.基本常识

邮件发送流程:发件人--- > MUA(邮件用户代理即用户邮箱) --- > MTA(邮件传输代理,如网易,阿里云等email提供商)--- > MTA …… MTA--- > MDA(目的地邮件投递代理) <--- MUA < --- 收件人

发邮件时:MUA和MTA使用SMTP协议,中间的MTA也是此协议

收邮件时:MUA和MDA使用POP3(或POP4)

 

2.SMTP发送邮件

Smtplib模块(发送邮件)和email模块(构造邮件)

(1)smtpObj=smtplib.SMTP([host[,port[,local_hostname]]])  创建SMTP

host:SMTP服务器主机IP地址或域名

port:端口号

local_hostname:本地主机名(服务器在本地可以不用写host和port,直接写localhost)

(2)SMTP.sendmail(from_addr,to_addrs,msg[,mail_option.rcpt_options])

from_addr: 发件人地址

to_addrs:  邮件发送地址

msg: 发送消息

(3)常用方法:

 

3.实例

例子1:网易邮箱发送给qq邮箱


# -*- conding:UTF-8 -*-
# 功能: 发送简单的文本邮件
# 注意: 确保该代码可用请先到发送者邮箱后台开启 SMTP 登录功能,并获得第3方登录密码
# 注意: 使用163邮件服务器时,可用 SMTP()方法,25端口进行登录
# 注意: 使用腾讯邮件服务器时,必须使用 SMTP_SSL()方法,465端口进行登录

import smtplib       # 导入 smtplib 邮件处理库,连接邮件服务器
from email.mime.text import MIMEText  #编辑邮件内容和格式
from email.utils import formataddr
from email.header import Header

mail_server = "smtp.163.com"     # 发件人邮件服务器
port = "25"                      # 服务端口
sender = "********@163.com"      # 发件人邮箱帐号
sender_passw = "********"        # 发件人邮箱密码(第3方登录授权密码)
receiver = "**********@qq.com"   # 收件人邮箱帐号

# 三个参数:第一个为文本内容,第二个 plain 设置文本格式,第三个 utf-8 设置编码
msg = MIMEText('邮件正文','plain','utf-8')      # 邮件内容(正文)  需要发送HTML文件时,plain 改为 html 即可!
msg['From'] = formataddr(["发件人邮箱昵称", sender])      # 发件人信息
msg['To'] = formataddr(["收件人邮箱昵称", receiver])      # 收件人信息
# 邮件的主题
msg['Subject'] = "邮件的主题"  #方法1:不设置文本编码格式
subject = '邮件的主题'
msg['Subject'] = Header(subject, 'utf-8')

def sendMail(mail_server, port, sender,sender_passw, receiver):
    try:
        mail = smtplib.SMTP()       # 使用SMTP()方法指向邮件服务器(使用QQ邮箱服务器时,需改用 SMTP_SSL()方法)
        mail.connect(mail_server, port)           # 连接服务器
        mail.login(sender, sender_passw)          # 请求服务器,登录帐号
        mail.sendmail(sender, receiver, msg.as_string() )   # 发送邮件(给receiver传入列表时,表示群发)
        mail.quit()       # 断开连接
        print("邮件发送成功!")
    except:
        mail.quit()
        print("邮件发送失败!")
if __name__ == '__main__':
    sendMail(mail_server, port, sender, sender_passw, receiver)

例子2:带附件(qq发qq )

去设置-->账户-->找到POP3/IMAP  开启POP3/SMTP服务

#coding=utf-8
import smtplib
from email.mime.text import MIMEText  #设置邮件正文
from email.mime.multipart import MIMEMultipart   #设置带附件的邮件
from email.header import Header
from email.utils import formataddr

mail_server = "smtp.qq.com"     # 发件人邮件服务器
port = "465"                      # 服务端口
sender = "******@qq.com"      # 发件人邮箱帐号
sender_passw = '******'     #发件人邮箱密码(第3方登录授权密码)
receiver = "*****@qq.com"   # 收件人邮箱帐号

# 创建一个带附件的实例
message = MIMEMultipart()
message['From'] = formataddr(["发件人邮箱昵称", sender])      # 发件人信息
message['To'] = formataddr(["收件人邮箱昵称", receiver])      # 收件人信息
subject = 'Python SMTP 邮件测试'
message['Subject'] = Header(subject, 'utf-8')
 # 邮件正文内容
message.attach(MIMEText('这是菜鸟教程Python 邮件发送测试……', 'plain', 'utf-8'))

# 构造附件1,传送当前目录下的 test.txt 文件
att1 = MIMEText(open('test.txt', 'wb+').read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
# 这里的filename可以任意写,写什么名字,邮件中显示什么名字
att1["Content-Disposition"] = 'attachment;filename="test.txt"'
message.attach(att1)

# 构造附件2,传送当前目录下的 runoob.txt 文件
att2 = MIMEText(open('runoob.txt', 'wb+').read(), 'base64', 'utf-8')
att2["Content-Type"] = 'application/octet-stream'
att2["Content-Disposition"] = 'attachment; filename="runoob.txt"'
message.attach(att2)
try:
    smtpObj = smtplib.SMTP_SSL()
    smtpObj.connect(mail_server, port)
    smtpObj.login(sender, sender_passw)
    smtpObj.sendmail(sender, receiver, message.as_string())
    smtpObj.quit()
    print('邮件发送成功')
except smtplib.SMTPException:
    print('Error: 无法发送邮件')
发布了28 篇原创文章 · 获赞 1 · 访问量 3181

猜你喜欢

转载自blog.csdn.net/pdd51testing/article/details/84400337