Python之简单的SMTP发送邮件详细教程附代码
简介
Python发送邮件的教程本人在网站搜索的时候搜索出来了一大堆,但是都是说了一大堆原理然后就推出了实现代码,我测试用给出的代码进行发送邮件时都不成功,后面找了很久才找到原因,这都是没有一个详细的环境调试导致,所以今天特出一个详细的教程,一步一步从环境调试到代码实现整一个教程,希望对还在苦苦寻找解决方法却迟迟不能得到有效解决的人员一点帮助。
SMTP协议
首先了解SMTP(简单邮件传输协议),邮件传送代理程序使用SMTP协议来发送电邮到接收者的邮件服务器。SMTP协议只能用来发送邮件,不能用来接收邮件,而大多数的邮件发送服务器都是使用SMTP协议。SMTP协议的默认TCP端口号是25。
环境调试
上面说了是使用SMTP协议发送的邮件,所以需要先查看您的发件人邮箱是否有开启SMTP协议,如没有需要开启,我测试使用的是163.com的邮箱作为发信人邮箱,开启SMTP协议如下图所示。
1.先登录到163.com邮箱中(网易邮箱),如下图
2.看到邮箱上面的功能栏中有一个“设置”的选项,单击该选项,然后选择下拉菜单的“POP3/SMTP/IMAP”
3.如下图所示,上面红框的两个必须勾选上,如没有勾选,要选择开启就可以勾选上了,然后可以看到下面红框里是:SMTP服务器: smtp.163.com
实现代码
经过上面的设置后就将环境调试好了,下面就可以实现代码了,推荐使用pycharm4.5.3编辑器来编写代码,下面的代码在python2.7和python3.4版本测试都可使用。
1 #coding:utf-8 #强制使用utf-8编码格式 2 import smtplib #加载smtplib模块 3 from email.mime.text import MIMEText 4 from email.utils import formataddr 5 my_sender='发件人邮箱账号' #发件人邮箱账号,为了后面易于维护,所以写成了变量 6 my_user='收件人邮箱账号' #收件人邮箱账号,为了后面易于维护,所以写成了变量 7 def mail(): 8 ret=True 9 try: 10 msg=MIMEText('填写邮件内容','plain','utf-8') 11 msg['From']=formataddr(["发件人邮箱昵称",my_sender]) #括号里的对应发件人邮箱昵称、发件人邮箱账号 12 msg['To']=formataddr(["收件人邮箱昵称",my_user]) #括号里的对应收件人邮箱昵称、收件人邮箱账号 13 msg['Subject']="主题" #邮件的主题,也可以说是标题 14 15 server=smtplib.SMTP("smtp.xxx.com",25) #发件人邮箱中的SMTP服务器,端口是25 16 server.login(my_sender,"发件人邮箱密码") #括号中对应的是发件人邮箱账号、邮箱密码 17 server.sendmail(my_sender,[my_user,],msg.as_string()) #括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件 18 server.quit() #这句是关闭连接的意思 19 except Exception: #如果try中的语句没有执行,则会执行下面的ret=False 20 ret=False 21 return ret 22 23 ret=mail() 24 if ret: 25 print("ok") #如果发送成功则会返回ok,稍等20秒左右就可以收到邮件 26 else: 27 print("filed") #如果发送失败则会返回filed
如果发送成功则会返回ok,否则为执行不成功,如下图:
开拓视野
虽然代码可以用了,但是不免得有些人就爱瞎折腾,玩着玩着就把代码玩坏了,所以这里附上几个知识点以解你之疑惑。
1.看到上面代码第一行的“#coding:utf-8 ”没有,相信很多看这代码的人都不怎么注意这一行,反正这和代码实现又没啥关系,保存时选择utf-8格式就行了嘛;告诉你们哦这一行代码在python中非常重要,最好写每一页都要加上强制字符编码,因为python2版本它默认识别ASCII编码,所以当中文字符出现在python中它是不认的,出现的错误提示如下图所示:
错误提示示例: File "F:/python/s12/pymail.py", line 2
SyntaxError: Non-ASCII character '\xe5' in file F:/python/s12/pymail.py on line 2, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
所以当出现上面的编码错误提示时,可以在页面的第一行加上
#coding:utf-8 #强制编码为utf-8
或
# coding: GBK #强制编码为GBK