• 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.7python3.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

  • 相关阅读:
    MySQL数据库封装和分页查询
    程序员的价值在哪里?
    奇葩的程序员
    京东咚咚架构演进
    程序员必看的《黑客帝国》,你看懂了吗?
    微信后台技术“干货们”带来的启发
    drf框架 2 drf框架的请求生命周期(as_view和dispatch方法), 请求、解析、渲染、响应、异常, 序列化组件 ,ORM配置回顾(media文件配置),应用在settings.py中INSTALLED_APPS注册意义 ,数据库配置
    drf框架, 接口(api) Django FBV => CBV drf框架的基础试图类 drf核心组件 群查与单查 python换源
    前端Vue框架 05 第三方插件(vuex: 组件间交互的(移动端), axios
    前端Vue框架 04 路由:逻辑跳转、路由传参 项目组件的数据局部化处理data(){ return{} } 组件的生命周期钩子 组件间通信 全局配置css, js
  • 原文地址:https://www.cnblogs.com/xcblogs-python/p/5727238.html
Copyright © 2020-2023  润新知