python开发基于SMTP协议的邮件代发服务
写在这篇文章前照例给大家灌输点名词解释,理论知识,当然已经很熟悉的同学可以往下翻直接看干货
1. 什么是SMTP
SMTP即简单传输协议(Simple Mail Transfer Protocol),和http协议一样同样是出于osi七层中的应用层,作为一种电子邮件传输的标准而存在,实现了SMTP的邮箱服务端可以成为SMTP服务器,也叫邮件发送服务器,顾名思义,只管发送邮件,不管接受邮件。
2.IMAP,POP3,SMTP的关系
正如上面说的,SMTP只是作为发送邮件的标准,真正的邮件都存在于邮件服务商的邮件服务器里,那如果我不想登陆服务商的官方平台,用三方软件类似于我们常见的Foxmail,outlook等等软件,那你能够在这些软件上看到你这个邮箱账号下所有的邮件就是基于IMAP或 POP3协议,邮箱服务器准许第三方软件获取邮件,所以实现了IMAP,POP3这两种接受邮件协议的服务端称为邮件接受服务器,刚好就与SMTP的发送服务器配合构成了一个完整的邮件服务
正片开始之前还是介绍些背景吧,公司要做一个代发邮件的功能来对接每个业务子系统,为用户实现一键发送邮件的功能,当然基于业务而言,上我也不能就简单的实现一个发送邮件的脚本或是工具给各个子系统使用,包括发件日志监控,通用邮箱非法内容筛选,统计分析等等内容,但这这些并不是我们的主题。
步骤一 先了解下SMTP协议数据组装,以下是使用python的email库实现了邮件数据打包。
import base64
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText from_email = 'ailinyijiu@qq.com'
to_email = ['ailingyijiu@qq.com']
cc_email = ['ailingyijiu@qq.com']
bcc_email = ['ailingyijiu@qq.com']
body = 'ailinyijiu@qq.com' msg = MIMEMultipart('alternative')
msg['From'] = from_email # 发件人
msg['To'] = ','.join(to_email) # 收件人
msg['Cc'] = ','.join(cc_email) # 抄送人
msg['Subject'] = '邮件标题'
msg.attach(MIMEText(body, 'html', 'utf-8')) # 内容以html形式传输
attachment = MIMEApplication('bytes') # 定义附件,需要传入附件的二进制形式
attachment.add_header('Content-Disposition', 'attachment',
filename='=?utf-8?b?' + base64.b64encode('我的附件'.encode('UTF-8')) + '?=')
msg.attach(attachment)
msg = msg.as_string()
打包之后的数据格式如下:

仔细发现SMTP协议的数据格式和http的数据格式大相径庭,这是因为对于传输多个文件或其他多媒体内容,http协议同样也使用了是最开始为邮件服务的MIME协议
在上面的图片中 MIME 主类型为 multipart 子类型为 mixed 代表的是将每一个附件和邮件内容混合 区分成不同块,通过boundary划分,其他的类型包括 alternative:内容包括普通文本和超文本(也就是html);在http中用到的还有 form-data用于form表单。相同点就是 都是用boundary来区分不同的提交内容
今天不想写了,未完待续。。。
python开发基于SMTP协议的邮件代发服务的更多相关文章
- 使用java语言基于SMTP协议手写邮件客户端
使用java语言基于SMTP协议手写邮件客户端 1. 说明 电子邮件是互联网上常见的应用,他是互联网早期的产品,直至今日依然受到广大用户的喜爱(在中国可能因为文化背景不同,电子邮件只在办公的时候常用) ...
- 用c++开发基于tcp协议的文件上传功能
用c++开发基于tcp协议的文件上传功能 2005我正在一家游戏公司做程序员,当时一直在看<Windows网络编程> 这本书,把里面提到的每种IO模型都试了一次,强烈推荐学习网络编程的同学 ...
- Loadrunner脚本开发-基于HTTP协议的流媒体视频在线播放服务器性能测试
脚本开发-基于HTTP协议的流媒体视频在线播放服务器性能测试 by:授客 QQ:1033553122 目的 实现基于http协议的流媒体在线视频播放,服务器性能测试脚本,模拟用户浏览器方式在线播放 ...
- .net平台 基于 XMPP协议的即时消息服务端简单实现
.net平台 基于 XMPP协议的即时消息服务端简单实现 昨天抽空学习了一下XMPP,在网上找了好久,中文的资料太少了所以做这个简单的例子,今天才完成.公司也正在准备开发基于XMPP协议的即时通讯工具 ...
- 基于公网smtp协议实现邮件服务器
刚开始做邮件服务器开发,一切都是茫然的.在书上网上都很难找到一套完整的邮件服务器开发教程.在个人的摸索中碰到了很多蛋疼得问题.现终于完成了,将我的开发经验分享给大家. 开发环境:vs2012 mfc ...
- 基于SMTP协议的CMD命令邮件发送
网上有不少的这类的文章,以是参照这些文章后,自己实际运行的结果.系统使用的是WIN7 旗舰版. 1.打开CMD命令后,连接到SMTP服务器,如连接到QQ的SMTP服务,输入命令 telnet smtp ...
- C#基础--基于POP3协议的邮件接收和基于STMP的邮件发送
最近在用outlook同步邮件.对邮件协议有一点兴趣.于是就去收集了一些资料,学习了一下如何通过.net来实现邮件的收发. 一:SMTP协议 1.什么是SMTP协议: SMTP目前 ...
- python实现基于smtp发送邮件
[前言] 在某些项目中,我们需要实现发送邮件的功能,比如: 爬虫结束后,发送邮件通知 定时发送邮件提醒待办事项 某项业务逻辑触发邮件通知 今天我们就分享如何基于smtp借助163邮箱来发送邮件 [实现 ...
- python测试基于websocket协议的即时通讯接口
随着html5的广泛应用,基于websocket协议的即时通讯有了越来越多的使用场景,本文使用python中的websocket-client模块来做相关的接口测试 import webclient ...
随机推荐
- js Vquery
// JavaScript Document function myAddEvent(obj,sEv,fn){ alert('fn:'+fn); if(obj.attachEvent){ obj.at ...
- AspNetCore3.1_Secutiry源码解析_1_目录
文章目录 AspNetCore3.1_Secutiry源码解析_1_目录 AspNetCore3.1_Secutiry源码解析_2_Authentication_核心项目 AspNetCore3.1_ ...
- STM32 初学不知道外设对应的APB1还是APB2
STM32参考手册搜索“系统架构”或者“系统结构”,即可查看外设挂在哪个时钟下,也就知道开启哪个时钟了.
- Lua Table pairs输出顺序问题 (版本差异 解决数字索引间断并兼容字符串索引)
问题标签: Lua Table 迭代器;Lua Table 输出顺序; Lua Table 顺序输出;Lua Table 数字索引 字符串索引;Lua Table pairs; 问题背景: 使用pai ...
- IE浏览器下载文件中文文件名乱码问题解决
处理过程 根据IE的F12中的log提示,是因为http头信息中的编码替换了html文件中的编码.我最初的思路是设置Tomcat默认编码,但是我发现我已经在Server.xml中设置过,想到这里我想到 ...
- Unity 游戏框架搭建 2019 (九~十二) 第一章小结&第二章简介&第八个示例
第一章小结 为了强化教程的重点,会在合适的时候进行总结与快速复习. 第二章 简介 在第一章我们做了知识库的准备,从而让我们更高效地收集示例. 在第二章,我们就用准备好的导出工具试着收集几个示例,这些示 ...
- Prism 源码解读1-Bootstrapper和Region的创建
介绍 之前也研究过Prism框架但是一直没有深入理解,现在项目上想把一个Winform的桌面应用程序改造成WPF程序,同时我希望程序是可测试可维护架构良好的,Prism的这些设计理念正好符合我的需求, ...
- [贪心,dp] Educational Codeforces Round 71 (Rated for Div. 2) C. Gas Pipeline (1207C)
题目:http://codeforces.com/contest/1207/problem/C C. Gas Pipeline time limit per test 2 seconds memo ...
- [模拟]Educational Codeforces Round 2A Extract Numbers
Extract Numbers time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...
- 面试刷题17:线程两次start()会发生什么?
线程是并发编程的基础元素,是系统调度的最小单元,现代的jvm直接对应了内核线程.为了降低并发编程的门槛,go语言引入了协程. 你好,我是李福春,我在准备面试,今天的题目是? 一个线程两次调用start ...