使用 smtplib 发送邮件

前几天看到了很多关于smtplib的教程,几乎所有教程例子的代码都挺复杂的(感觉对smtplib新手不是很友好)。所以,我想教大家如何最简单地实现发送邮件。

smtplib介绍

SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。

代码结构

废话不多说,首先把代码的结构献上

import smtplib
obj = smtplib.SMTP(你邮箱的协议,你邮箱支持的端口)
obj.ehlo()
obj.starttls()
obj.login(你的邮箱名,密码)
obj.sendmail(你的邮箱名,收件邮箱,'Subject:标题\n\n内容')
obj.quit()

代码解析

import smtplib

导入smtplib,这个相信大家都知道。

obj = smtplib.SMTP(邮箱协议,你的邮箱支持的端口)

使用smtplib.SMTP来创建一个你邮箱的对象。这个“邮箱协议”就是你的邮箱的smtp协议,然后还要加上“你的邮箱支持的端口”,有些邮箱支持456端口,有些支持587端口,我会把每个不同的电子邮箱所支持的smtp协议和支持的端口放到最后,方便大家去查讯。
邮箱协议:传入字符串
你的邮箱支持的端口:传输数字即可

注意!有时候运行这段代码的时候,会出现“由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。”的错误,这种情况重新运行代码就行了。还有,如果你是qq邮箱或网易邮箱,就需要开启smtp协议。不知道的朋友可以百度一下。

obj.ehlo()

ehlo()这一步可以加上也可以不加。这个函数用来判断目前是否有异常,无异常就会返回一个包含250的值的括号。

注意!如果你是脚本式运行的,就不会返回结果,只有交互式运行才回返回结果这种情况,你只需要print(obj.ehlo()),这样无论是交互式还是脚本式都会返回结果了!

obj.starttls()

starttls()这个函数用于进行tls加密,如果你在smtplib.SMTP函数那步的第二个参数,也就是你的邮箱支持的端口是465,那么,这一步就可以跳过了。因为465端口已经进行了ssl加密了。如果加密成功的话,就会返回一个带220值的括号。
和ehlo()函数一样,需要print(obj.starttls())

obj.login(你的邮箱名,密码)

login中文就是登录的意思,也就是说开始登陆,需要传入的参数是你的邮箱名和邮箱密码。
你的邮箱名:字符串
密码:字符串

注意:如果你是qq邮箱或网易邮箱,传入的不能是密码!需要传入smtp协议的授权码。和密码一样,授权码传入字符串,而且传入授权码的时候,要把所有字母改为小写,授权码之间不能有空格!否则login()函数不知道你已经传入了授权码!

obj.sendmail(你的邮箱名,收件邮箱,'Subject:标题\n\n内容')

“你的邮箱名”就是要传入你的完整邮箱名字,收件邮箱就是发送邮件的目标的完整邮箱名。接着,有人就会开始觉得奇怪了。为什么我要加上一个Subject:标题\n\n内容。我并不是用来标记,而是在发送邮件的时候必须要这样写。“Subject:”冒号后面用来输标题名,然后需要两个\n来进行换行从标题输入框跳到内容输入框。

你的邮箱名:字符串
收件邮箱:字符串
标题和内容:字符串

obj.quit()

接着,还需要退出服务器才能正确发送。
这就是一个代码实例:

import smtplib
obj = smtplib.SMTP('smtp.qq.com',587)
obj.starttls()
obj.login('example@qq.com',授权码)#我使用的是qq邮箱,所以不能输入密码
obj.sendmail('example@qq.com','go@hotmail.com','Subject:Hi\n\nTNT!')
obj.quit()

结果:

太棒了!再来一次!
我们不是中国人吗?试一次中文!!!
这次的代码:

import smtplib
obj = smtplib.SMTP('smtp.qq.com',587)
obj.starttls()
obj.login('example@qq.com',授权码)#我使用的是qq邮箱,所以不能输入密码
obj.sendmail('example@qq.com','go@hotmail.com','Subject:中文测试\n\n我失败了')
obj.quit()

完了,报错了!
File “C:\Users\Administrator\AppData\Local\Programs\Python\Python37-32\lib!smtplib.py”, line 855, in sendmail
msg = _fix_eols(msg).encode(‘ascii’)
UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 8-13: ordinal not in range(128)

错误解析

在发送邮件的时候,smtplib需要把内容进行编码。报错的内容就说是在编码内容成ascii的时候出现了错误。当我们查看一下ascii编码列表的时候,发现没有中文字符的编码结果!怎么办呢?在发送内容的时候,其实不仅可以编码成为ascii还能编码成utf-8!所以呢,我们要改一下主程序代码。请大家按照自己的错误信息所指的报错文件,一般都是C:/program files/python(我这里因为一些需求,安装到了不同的目录,请大家不要复制我的目录)。
然后,在主程序的第855行,把msg = _fix_eols(msg).encode(‘ascii’)改成msg = _fix_eols(msg).encode(‘utf-8)就行了,接着,回到我们的程序,再来跑一次代码!
结果:
使用smtplib发送邮件

我 们 完 成 了!

不同的邮箱协议和支持的端口

注意:这里只显示一部分著名的邮箱

邮箱名 协议 端口
网易邮箱 smtp.163.com 465
Hotmail/outlook smtp-mail.outlook.com 587
Gmail smtp.gmail.com 587
qq邮箱 smtp.qq.com 465/587
Yahoo smtp.mail.yahoo.com 587

需要什么帮助的话请加群号:773940913,或在评论区提问。

本作品采用《CC 协议》,转载必须注明作者和本文链接
coder Derek
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!