今天学到了如何使用Python的smtplib库发送邮件,中间也是遇到了各种各样的错误和困难,还好都一一的解决了。下面来谈一谈我的这段经历。


配置你的邮箱

为什么要配置邮箱呢?具体要配置什么呢?

因为我们申请的一些免费邮箱都是默认不开启smtp/pop协议的。

SMTP是发邮件使用到的计算机网络中应用层协议中的一个;而POP则是收邮件时使用到的计算机网络中的应用层协议的其中一个。这都是理论性的知识了,上过计算机网络这门课的想必都知道,就不多说了。

配置就是要开启这项服务。否则我们就不能实现用Python代码来控制发送和接收邮件了。

我们在配置完成之后,系统会提示给我们一个邮箱客户端的授权码。作用就是我们登陆的时候替代原来的登陆密码。大家一定要完善保存咯。我这里采用的是163的邮箱,所以是可以自己设置这个授权码的。

使用代码发邮件

还是按照,先看代码再研究的策略。如下:

# coding:utf-8

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

"""
请确保自己的邮箱的smtp协议开启,都则会出现认证的错误的,如ssh等
"""

sender = "1564086XXXX@163.com"
# 收件人,可以是多个
receivers = ['102170XXXX@qq.com']

# 三个参数:第一个为纯文本,第二个plain设置文本格式,第三个为编码格式
message = MIMEText('这里是发送的邮件的主要的内容。Pure Text Here!','plain','utf-8')
message['From'] = Header('来自Mark','utf-8')
message['To'] = Header('测试标题','utf-8')

subject = '哈哈哈哈哈哈,这是邮件的主题 '
message['Subject'] = Header(subject,'utf-8')

try:
    smtpObj = smtplib.SMTP()
    smtpObj.connect('smtp.163.com',25)
    smtpObj.login(sender,'你的客户端授权码')
    smtpObj.sendmail(sender,receivers,message.as_string())
    smtpObj.quit()
    print '邮件已成功发送了'
except smtplib.SMTPException,e:
    print  e.message

测试的结果:

D:\Software\Python2\python.exe E:/Code/Python/MyTestSet/mail/PureText.py
邮件已成功发送了

Process finished with exit code 0

确实是成功发送了的。

代码探查

下面就来深入的研究一下发送邮件实现的流程吧。我们注意到了,最最主要的是下面的这样一段代码。

    smtpObj = smtplib.SMTP()
    smtpObj.connect('smtp.163.com',25)
    smtpObj.login(sender,'你的客户端授权码')
    smtpObj.sendmail(sender,receivers,\
    message.as_string()
    smtpObj.quit()

不难看出,主要是经历了下面的这些流程:

  • 获得SMTP服务
  • 连接服务器
  • 模拟客户端登陆
  • 实现发送邮件
  • 退出登录

    其中核心的也就是客户端登陆和发送邮件的两个步骤。模拟登陆的时候需要注意的就是使用你自己的授权码就行了,没什么难度。而发送邮件的时候需要注意一下参数。发件人是一个,而收件人是一个列表,里面可以有很多个收件人(这样可以借助这个列表实现邮件的群发)。


其他需要注意的也就是使用MIME类型的数据,和使用utf-8编码就行了。属于非智力相关的内容。所以不用太在意。会用就可以了。

这样看来,发个邮件什么的也不是很难嘛。(^__^) 嘻嘻……

错误总结

  • 错误一:500、530等5开头的错误,大致为什么ssh异常啊什么的。有点web常识的都知道,5开头的错误代码一般都是服务器内部的错误,所以这基本上可以判断出我们的代码其实没有出错。我们主要的排错方向应该是服务器端了(当然了,凡是没有任何的绝对,但这种情况出现的概率确实是很小的)。这时,我们要检查一下自己的邮箱的SMTP/POP服务开启了没有啊等等

  • 错误二 :授权码没有写或者填写成了自己的邮箱之前的密码,错误提示一般都是认证相关的。这一点属于低级错误了。因为在配置完自己的SMTP/POP服务之后,系统会发还一个短信提示,告知用户要使用授权码替代原密码登陆邮箱。所以使用你的授权码进行登录呗。

  • 错误三:代码中的错误。这就更加的不应该了,少写了必填项,或者编码没添加等类似的错误是我们应该极力避免的,所以尽量保证自己的代码的正确。

Python模块探秘之smtplib,实现纯文本邮件的发送的更多相关文章

  1. Python模块探秘 Smtplib发送带有各种附件的邮件

    这两天对Python的邮件模块比较感兴趣,于是就查了查资料.同时在实际的编码过程中也遇到了各种各样的问题.下面我就来分享一下我与smtplib的故事. 前提条件 我的上一篇博文里面讲解了,发送邮件必须 ...

  2. thunderbird发送纯文本邮件

    向邮件列表中发邮件时,要求邮件格式必须是纯文本格式的,在thunderbird中,邮件格式(plain text或者html格式)在[工具->账户设置->[账户名称]->通讯录]下的 ...

  3. PyQt(Python+Qt)学习随笔:纯文本编辑器QPlainTextEdit功能详解

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 一.概述 QPlainTextEdit是用于纯文本的一个高级文档编辑器 ...

  4. Python模块探秘之EasyGui

    在Windows想用Python开发一些简单的界面,所以找到了很容易上手的EasyGui库.下面就分享一下简单的使用吧. 参考的链接:官网Tutorial 接下来,我将从简单,到复杂一点点的演示如何使 ...

  5. python的email、smtplib、poplib模块收发邮件

    一封电子邮件的旅程是: MUA:Mail User Agent--邮件用户代理.(即类似Outlook的电子邮件软件) MTA:Mail Transfer Agent--邮件传输代理,就是那些Emai ...

  6. Python通过yagmail和smtplib模块发送简单邮件

    SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件.HTML邮件以及带附件的邮件.python发邮件需要掌握两个模块的用法,smtplib和email,这俩模块是pytho ...

  7. smtplib与email模块(实现邮件的发送)

    SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件.HTML邮件以及带附件的邮件. Python对SMTP支持有smtplib和email两个模块,email负责构造邮件, ...

  8. php socket通过smtp发送邮件(纯文本、HTML,多收件人,多抄送,多密送)

    <?php /** * 邮件发送类 * 支持发送纯文本邮件和HTML格式的邮件,可以多收件人,多抄送,多秘密抄送 * @example * $mail = new MySendMail(); * ...

  9. JavaMail入门:创建纯文本、HTML格式的邮件

    转自:http://haolloyin.blog.51cto.com/1177454/353849/ 在 http://java.sun.com/products/javamail/ 下载了 Java ...

随机推荐

  1. [SDOI2010]代码拍卖会

    题目描述 随着iPig在P++语言上的造诣日益提升,他形成了自己一套完整的代码库.猪王国想参加POI的童鞋们都争先恐后问iPig索要代码库.iPig不想把代码库给所有想要的小猪,只想给其中的一部分既关 ...

  2. ●UVA 10674 Tangents

    题链: https://vjudge.net/problem/UVA-10674 题解: 计算几何,求两个圆的公切线. <算法竞赛入门经典——训练指南>P266,讲得很清楚的. 大致是分为 ...

  3. HDU2303(数论)大整数求余+素数筛选

    Sample Input 143 10 143 20 667 20 667 30 2573 30 2573 40 0 0   Sample Output GOOD BAD 11 GOOD BAD 23 ...

  4. SpringBoot学习之自动依赖

    在前面使用SSM集成时,我们可以使用注解实现无配置化注入,但是这种依赖被进行“人工干预了的”,换句话就是说我们手动进行装配,那么此时还没有达到SpringBoot这种自动装配的效果,那么究竟Sprin ...

  5. 如何使用GitHub

    进行版本控制时,我们可以直接通过网页来进行版本控制,也可以下载git客户端.值得注意的是,git的客户端有很多种,具体的可以参考:https://git-scm.com/downloads/guis/ ...

  6. jenkins更新后出现JNLP-connect,JNLP2-connect警告

    在更新jenkins后出现提示 This Jenkins instance uses deprecated protocols: JNLP-connect,JNLP2-connect. It may ...

  7. 两个对象用equals方法比较为true,它们的Hashcode值相同吗?

    两个对象用equals方法比较为true,它们的Hashcode值相同吗? 答:不一定相同.正常情况下,因为equals()方法比较的就是对象在内存中的值,如果值相同,那么Hashcode值也应该相同 ...

  8. 韩顺平玩转Oracle视频资料整理

    .oracle10g 11g:g(grid)表示网格技术 以baidu搜索为准,现在想使用一个软件,但是此软件在离自己非常近的地方就存在了下载地址,但是与自己非常远的地方也同样存在一个下载地址,而搜索 ...

  9. ACM Find them, Catch them

    The police office in Tadu City decides to say ends to the chaos, as launch actions to root up the TW ...

  10. Django Views(视图函数)

    http请求中产生两个核心对象: http请求:HttpRequest对象 http响应:HttpResponse对象 所在位置:django.http 之前我们用到的参数request就是HttpR ...