Python发送QQ邮件

用Python来发送一个电子邮件需要以下几个步骤:
1.注册一个邮箱(以QQ邮箱为例)
2.需要特殊设置,以QQ邮箱为例:受限进入QQ邮箱的设置中心,点击"账户"选项,下滑可以看到"POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务"一栏,把"POP3/SMTP服务"打开(默认是关闭的),然后点击生成授权码,可以得到一串代码,如下图:

3.通过Python代码实现邮件的自动发送:

# 导入相应的包
import smtplib
from email.mime.text import MIMEText

# MIMEText三个主要参数
# 1. 邮件内容
# 2. MIME子类型,在此案例我们用plain表示text类型
# 3. 邮件编码格式,一定要用"utf-8"编码,因为内容可能包含非英文字符,不用的可能收到的邮件是乱码
msg = MIMEText("这是我用python发送的邮件", "plain", "utf-8")

# 发送email地址,填入你授权码的那个邮箱地址,此处地址是我常用QQ的地址
from_addr = "861xxx467@qq.com"
# 此处密码填你之前获得的授权码,不是你的QQ邮箱密码
from_pwd = "foqbewnhiilvbdci"

# 接受email地址,填入你要发送的邮箱地址,此处地址是我另外一个QQ小号的邮箱地址
to_addr = "792xxx621@qq.com"

# 输入SMTP服务器地址,并使用该服务器给你发送电子邮件
# 此处根据不同的邮件服务商有不同的值,
# 现在基本任何一家邮件服务商,如果采用第三方收发邮件,都需要开启授权选项
# 腾讯QQ邮箱的SMTP地址是"smtp.qq.com"
smtp_srv = "smtp.qq.com"

try:
    # 不能直接使用smtplib.SMTP来实例化,第三方邮箱会认为它是不安全的而报错
    # 使用加密过的SMTP_SSL来实例化,它负责让服务器做出具体操作,它有两个参数
    # 第一个是服务器地址,但它是bytes格式,所以需要编码
    # 第二个参数是服务器的接受访问端口,SMTP_SSL协议默认端口是465
    srv = smtplib.SMTP_SSL(smtp_srv.encode(), 465)
    # 使用授权码登录你的QQ邮箱
    srv.login(from_addr, from_pwd)
    # 使用sendmail方法来发送邮件,它有三个参数
    # 第一个是发送地址
    # 第二个是接受地址,是list格式,意在同时发送给多个邮箱
    # 第三个是发送内容,作为字符串发送
    srv.sendmail(from_addr, [to_addr], msg.as_string())
    print('发送成功')
except Exception as e:
    print('发送失败')
finally:
    #无论发送成功还是失败都要退出你的QQ邮箱
    srv.quit()

 运行后我的另外一个QQ小号就成功收到了我大号发来的电子邮件:

可以看到这封邮件有内容,但是并没有发件人和主题,这里可以用到另外一个模块Header来给我们的邮件添加发件人和主题:

import smtplib
from email.mime.text import MIMEText
from email.header import Header

msg = MIMEText("这是我用python发送的邮件",  "plain", "utf-8")

# 填写发送方的信息
header_from = Header("皮皮嘉", "utf-8")
msg['From'] = header_from

# 填写接受方的信息
header_to = Header("皮皮嘉的小号", 'utf-8')
msg['To'] = header_to

# 填写该邮件的主题
header_sub = Header("Python", 'utf-8')
msg['Subject'] = header_sub

from_addr = "861709467@qq.com"
from_pwd = "foqbewnhiilvbdci"
to_addr = "792555621@qq.com"

smtp_srv = "smtp.qq.com"

try:
    srv = smtplib.SMTP_SSL(smtp_srv.encode(), 465)
    srv.login(from_addr, from_pwd)
    srv.sendmail(from_addr, [to_addr], msg.as_string())
    print('发送成功')
except Exception as e:
    print('发送失败')
finally:
    srv.quit()

这是在来看就发现有主题和发送人了:

 

posted @ 2019-03-17 23:16  皮皮嘉  阅读(727)  评论(0编辑  收藏  举报