python发送邮件(一)

最近设计了一个小的应用程序,主要是根据文件中邮件地址发送一份excel中内容,并且在接受方收到邮件都是以网页的格式呈现的。

下面主要是对python发送邮件涉及到的部分知识点做个总结

一、先介绍一下Smtp协议和POP3协议

SMTP (Simple Mail Transfer Protocol)

http://www.rfc-editor.org/info/rfc821    RFC821文档详细描述了这个协议信息;

  邮件传送代理 (Mail Transfer Agent,MTA) 程序使用SMTP协议来发送电邮到接收者的邮件服务器。SMTP协议只能用来发送邮件,不能用来接收邮件。大多数的邮件发送服务器 (Outgoing Mail Server) 都是使用SMTP协议。SMTP协议的默认TCP端口号是25。

  SMTP协议的一个重要特点是它能够接力传送邮件。它工作在两种情况下:一是电子邮件从客户机传输到服务器;二是从某一个服务器传输到另一个服务器。

POP3 (Post Office Protocol) & IMAP (Internet Message Access Protocol)

  POP协议和IMAP协议是用于邮件接收的最常见的两种协议。几乎所有的邮件客户端和服务器都支持这两种协议。

  POP3协议为用户提供了一种简单、标准的方式来访问邮箱和获取电邮。使用POP3协议的电邮客户端通常的工作过程是:连接服务器、获取所有信息并保存在用户主机、从服务器删除这些消息然后断开连接。POP3协议的默认TCP端口号是110。

  IMAP协议也提供了方便的邮件下载服务,让用户能进行离线阅读。使用IMAP协议的电邮客户端通常把信息保留在服务器上直到用户显式删除。这种特性使得多个客户端可以同时管理一个邮箱。IMAP协议提供了摘要浏览功能,可以让用户在阅读完所有的邮件到达时间、主题、发件人、大小等信息后再决定是否下载。IMAP协议的默认TCP端口号是143。

二、模块介绍

在python发送邮件主要涉及到两个模块:smtplib和email模块

1、smtplib模块

这个模块提供的功能主要是:

链接smtp服务器

登入smtp服务器

发送邮件

http://www.cnpaf.net/Class/SMTP/200408/106.html

smtplib.SMTP([host[, port[, local_hostname[, timeout]]]])

  SMTP类构造函数,表示与SMTP服务器之间的连接,通过这个连接我们可以向smtp服务器发送指令,执行相关操作(如:登陆、发送邮件)。 该类提供了许多方法,将在下面介绍。它的所有参数都是可选的,其中host参数表示smtp服务器主机名,上面例子中的smtp主机 为"smtp.yeah.net";port表示smtp服务的端口,默认是25;如果在创建SMTP对象的时候提供了这两个参数,在初始化的时候会自动 调用connect方法去连接服务器。
  smtplib模块还提供了SMTP_SSL类和LMTP类,对它们的操作与SMTP基本一致。
  smtplib.SMTP提供的方法:

SMTP.set_debuglevel(level)

  设置是否为调试模式。默认为False,即非调试模式,表示不输出任何调试信息。

SMTP.connect([host[, port]])

  连接到指定的smtp服务器。参数分别表示smpt主机和端口。注意: 也可以在host参数中指定端口号(如:smpt.yeah.net:25),这样就没必要给出port参数。

SMTP.docmd(cmd[, argstring])

  向smtp服务器发送指令。可选参数argstring表示指令的参数。

2、email模块

这个模块设计邮件格式的

以及如何设置发送各种复杂的邮件(附件,图片,音频等等网页格式等等)

3、代码实现

# encoding: utf-8import sys
import os
import time
import xlrd
import smtplib
from email.mime.text import MIMEText
from email.utils import COMMASPACE,formatdate
from email import encoders
reload(sys)
sys.setdefaultencoding('utf8')def readFileFormal(fileName):data= xlrd.open_workbook(fileName)  # 读excel文件table = data.sheet_by_name(u'Sheet1')  # 获取一个工作表 有多种方法rownum = table.nrowscolnum = table.ncolsflag = False#获取表格的标题title = table.cell(0,0).valueif colnum != 16:flag = Truereturn flag#将execl中数据形成html格式def produceHtml(baseinfo,deductinfo,rowdata):content = '''<table border="0" cellpadding="0" cellspacing="0" width="1267" style="border-collapse:collapse;width:950pt"><colgroup><col width="72" style="width:54pt"  /><col width="79" span="2" style="mso-width-source:userset;mso-width-alt:2528;width:59pt"  /><col width="72" span="2" style="width:54pt"  /><col width="72" span="10" style="width:54pt"  /><col width="173" style="mso-width-source:userset;mso-width-alt:5536;width:130pt"  /></colgroup><tbody><tr height="19" style="mso-height-source:userset;height:14.25pt"><td rowspan="2" height="38" class="xl76" width="72" style="height: 28.5pt; width: 54pt; padding-top: 1px; padding-right: 1px; padding-left: 1px; color: windowtext; font-size: 10pt; font-family: 宋体; vertical-align: middle; border: 0.75pt solid windowtext; white-space: nowrap; text-align: center;">姓名</td><td rowspan="2" class="xl71" width="79" style="width: 59pt; padding-top: 1px; padding-right: 1px; padding-left: 1px; font-size: 10pt; font-family: 宋体; vertical-align: middle; border: 0.75pt solid windowtext; text-align: center;">学号</td><td rowspan="2" class="xl71" width="79" style="width: 59pt; padding-top: 1px; padding-right: 1px; padding-left: 1px; font-size: 10pt; font-family: 宋体; vertical-align: middle; border: 0.75pt solid windowtext; text-align: center;">成绩</td><td></tbody></table>'''return content#发送邮件
def send_mail(mail_host,mail_user,mail_password,receiveAdd,subject,content):  #receiveAdd:收件人;subject:主题;content:邮件内容flag = Falseinfo = ''sender=mail_user+"<"+mail_user+">"   #这里的hello可以任意设置,收到信后,将按照设置显示msg = MIMEText(content,_subtype='html',_charset='utf-8')    #创建一个实例,这里设置为html格式邮件msg['Subject'] = subject    #设置主题msg['From'] = sendermsg['To'] = receiveAddtry:s = smtplib.SMTP()s.connect(mail_host)  #连接smtp服务器s.login(mail_user,mail_password)  #登陆服务器s.sendmail(sender, receiveAdd, msg.as_string())  #发送邮件s.close()flag = Trueexcept Exception, e:#print str(e)info = str(e)flag = Falsereturn flag,infodef start(mailhost,mailuser,mailpassword,filename):baseinfo,deductinfo,alldata,title= readFile(filename)stateinfo=[]for i in range(len(alldata)):rowdata = alldata[i]content = produceHtml(baseinfo,deductinfo,rowdata) #这里的baseinfo 与 defuctinfo可以直接定死吗?receiveadd = rowdata[len(rowdata)-1]#print receiveaddif receiveadd != '':flag,info = send_mail(mailhost,mailuser,mailpassword,receiveadd,title,content)if flag:#print  receiveadd+"    "+"发送成功"+"    "+ time.ctime(time.time())sendinfo = receiveadd+"    "+"发送成功"+"    "+ time.ctime(time.time())else:#print "发送失败"sendinfo = '发送失败'else:#print ('此联系人地址不存在!!')sendinfo = '此联系人地址不存在!!'stateinfo.append(sendinfo)producetxt(stateinfo)#生成日志文件 主要是记录发送邮件的时间和信息
def producetxt(info):timeinfo =  time.strftime('%Y-%m-%d(%X)',time.localtime(time.time()))filename = os.getcwd()filename =filename +'/'+timeinfo+ '.txt'filename = 'logfile'+'.txt'f = open(filename,'a')for i in range(len(info)):f.write(info[i]+'\n')f.close()def issendmail(mail_host,mail_user,mail_password):  #receiveAdd:收件人;subject:主题;content:邮件内容flag = Falseinfo = ''try:s = smtplib.SMTP()s.connect(mail_host)  #连接smtp服务器s.login(mail_user,mail_password)  #登陆服务器s.close()flag = Trueexcept Exception, e:#print str(e)info = str(e)flag = Falsereturn flag,info
#检验发件者的邮件是否可以登入到服务器,判断验证是否成功

def isExisting(user,password):flag = False# ostrich="smtp.163.com"  #设置服务器# user="iphonexb@163.com"    #用户名# password="iphonexiaoxiao55"   #口令host = user.strip('')hostlist = host.split('@')host = hostlist[1]host = 'smtp.'+host#print hostflag ,info= issendmail(host,user,password)#print flag,inforeturn flag#
def initValue(user,password,filenameStr):host = user.strip('')hostlist = host.split('@')host = hostlist[1]host = 'smtp.'+hostmailhost = host #设置服务器mailuser = user    #用户名mailpassword=password   #口令filename = filenameStrstart(mailhost,mailuser,mailpassword,filename)'''
if __name__ == "__main__":print#isExisting()mail_host="smtp.163.com"  #设置服务器mail_user="xxx@163.com"    #用户名mail_password="xxxxx"   #口令mail_postfix="163.com"  #发件箱的后缀filename = '成绩.xls'start(mail_host,mail_user,mail_password,filename)'''

界面如图一二

验证错误

三、在程序实现过程中会出现各样的错误:

http://blog.csdn.net/mindmb/article/details/7898528

解决UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe5 in position 108: ordinal not in range(128

http://www.oschina.net/code/snippet_111708_15987

如果是认证失败,登入服务器时密码账号有问题

(535, 'authentication failed 95187d9c-ee91-45a9-b7d5-c495c23abbd7’)

4 Authentication failed, please open smtp flag first!

http://blog.csdn.net/bruce128/article/details/8761949

(535, 'Error: authentication failed')

http://bbs.chinaunix.net/thread-717982-1-1.html

(454, 'Error: authentication failed, system busy')

一般情况,为了保障用户邮箱的安全,QQ邮箱设置了POP3/SMTP的开关。系统缺省设置是“关闭”,在用户需要POP3/SMTP功能时请“开启”。关闭POP3/SMTP后,您将只能接受邮件,不能发送邮件。

如果不是因为设置问题,试试QQ重新更改下登录密码。这时邮箱密码需要重新设置。

如果重设后没有用,可以考虑过几天试试,有可能QQ的邮件服务器认为你发的邮件为垃圾邮件。网上搜索的答案中,目前没有个定论,但是在QQ邮箱中,这种情况也是多见的。

还有呢,可以试试换个别的邮件客户端KOOMAIL。

用163.com的smtp服务器比较稳定,qq的出现不知道的问题

http://www.altn.cn/qa/ec/qa_ec_mta.htm   邮件服务器常见错误代码解释

以上错误发送都是有关smtp服务器认证出现。

相关链接:

https://docs.python.org/2/library/email-examples.html   官方例子

http://www.jb51.net/article/49216.htm

http://my.oschina.net/dillan/blog/133344    smtplib和 email模块的介绍

http://blog.csdn.net/goof/article/details/7921851

http://www.cnblogs.com/lonelycatcher/archive/2012/02/09/2343480.html

http://www.cnblogs.com/xiaowuyi/archive/2012/03/17/2404015.html

http://bbs.chinaunix.net/thread-836514-1-1.html   login错误

python发送邮件(一)相关推荐

  1. python邮件发送哪个好_最全总结!聊聊 Python 发送邮件的几种方式

    1. 前言 邮件,作为最正式规范的沟通方式,在日常办公过程中经常被用到 我们都知道 Python内置了对 SMTP 的支持,可以发送纯文本.富文本.HTML 等格式的邮件 本文将聊聊利用 Python ...

  2. Python发送邮件smtplib.SMTP各报错问题的解决方法

    Python发送邮件smtplib.SMTP各报错问题的解决方法 参考文章: (1)Python发送邮件smtplib.SMTP各报错问题的解决方法 (2)https://www.cnblogs.co ...

  3. 用Python发送邮件[zt]

    用Python发送邮件 服务器需要周期性的检查邮件队列,然后通过smtp服务器发送出去,就网上搜了搜,然后修改了加工了一下,写了一个邮件发送的简单模块 两个文件 config.py:配置信息 send ...

  4. python发送邮件及附件

    今天给大伙说说python发送邮件,官方的多余的话自己去百度好了,还有一大堆文档说实话不到万不得已的时候一般人都不会去看,回归主题: 本人是mac如果没有按照依赖模块的请按照下面的截图安装 导入模块如 ...

  5. Python发送邮件以及对其封装

    Python发送邮件分为四步 连接到smtp服务器 登陆smtp服务器 准备邮件 发送邮件 导入所需要的包 import smtplib from email.mime.text import MIM ...

  6. python 发送邮件connect none_Python发送邮件功能示例【使用QQ邮箱】

    本文实例讲述了Python发送邮件功能.分享给大家供大家参考,具体如下: 这里以QQ邮箱为例说明 登录邮箱点账号 开启smtp 开启时会要求你发送一条短信,发送完成后点已发送. 就有授权码了 代码如下 ...

  7. python 发送邮件的两种方式【终极篇】

    python 发送邮件的两种方式[终极篇] 一,利用python自带的库 smtplib简单高效 from email.mime.multipart import MIMEMultipart from ...

  8. python自动截图发送邮件_PhantomJS按尺寸截取页面,并用python发送邮件

    前言:当前有个任务是要把几个网站的日志返回状态码进行汇总,用饼图展示,并每天发送邮件. 一.分析问题 画出饼图,这个我用kibana给画出来了,下面不做讲解: 截取饼图,因为kibana是用js展示出 ...

  9. 最全总结!聊聊 Python 发送邮件的几种方式

    1. 前言 邮件,作为最正式规范的沟通方式,在日常办公过程中经常被用到 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. 很多已经做案例 ...

  10. flask-mail异步发送邮件_使用 python 发送邮件

    使用 python 发送邮件,这个也没啥讲的,分享三种方式发送邮件,最后一种三行代码就可以发送邮件,是不是很爽啊,话不多说,直接上代码 第一种:正常发送邮件,也就是同步发送邮件 #!/usr/bin/ ...

最新文章

  1. 并行机调度问题matlab,顺序依赖并行机调度问题介绍
  2. 模板资源管理器的使用
  3. Spring Cloud生态的构建
  4. 二、逻辑回归算法梳理
  5. 【helpdesk】启明星helpdesk7.0版本里,实现邮件提交功能介绍和原理
  6. HTML 5 Web 存储-localStorage
  7. linux上C++编译过程
  8. 如何用softmax和sigmoid来做多类分类和多标签分类
  9. 调整KDevelop字体大小
  10. windows理论基础(一)
  11. 转反射的第一部分:发现和执行
  12. 如何使用.NET清除IE的缓存(Temporary Internet Files)
  13. Java NIO和IO的区别
  14. 罗技鼠标宏压枪 - 绝地求生 -刺激战场
  15. windows下安装linux环境
  16. 圆锥曲线解答题实用结论
  17. python selenium爬虫入门案例day04:Vhiphop街舞视频
  18. 【2021年度总结】旧年的喜怒哀乐和新年的虎啸龙腾
  19. 自学IT和接受IT培训两者的优缺点分析
  20. CVE-2021-42287、CVE-2021-42278域内提权漏洞

热门文章

  1. PyQt5-显示不同类型的消息对话框(提示对话框)
  2. 百度云怎么快速清理和谐文件啊
  3. 图论复习之强连通分量以及缩点—Tarjan算法
  4. [Java大厂必备面试题] 点滴促就辉煌, 每日三题【Day5】:基础篇2
  5. 需求分析挑战之旅(疯狂的订餐系统)(2)——需求分析的大道理
  6. java丐帮_java多线程学习笔记(二)
  7. 阜城中学2021高考成绩查询,河北省衡水市阜城中学2020-2021学年高二上学期开学考试英语试题...
  8. oracle udt 解析,UDT协议实现分析总结
  9. Python在IDLE中实现清屏和更改IDEL的shell的背景颜色
  10. object_detection源码解析-box_list