引言

问题基于《计算机网络自定向下》第二章的课后套接字编程作业:邮件客户
题目的下载链接:python 压缩包
题目如下:
这个实验结束时,您将能够更好地了解SMTP协议。您还将获得使用Python实现标准协议的经验。您的任务是开发一个简单的邮件客户端,它可以向任何收件人发送电子邮件。您的客户端将需要连接到邮件服务器,使用SMTP协议与邮件服务器进行对话,并向邮件服务器发送电子邮件消息。Python提供了一个名为smtplib的模块,该模块内置了使用SMTP协议发送邮件的方法。但是,我们不会在这个实验室中使用这个模块,因为它隐藏了SMTP和套接字编程的细节。为了限制垃圾邮件,一些邮件服务器不接受来自任意来源的TCP连接。对于下面描述的实验,您可能需要尝试同时连接到大学邮件服务器和一个流行的Webmail服务器,例如AOL邮件服务器。你也可以试着在家里和大学校园里建立联系。
附加题
您当前的SMTP邮件客户端只处理在电子邮件正文中发送的文本消息。修改您的客户端,使它可以发送包含文本和图像的电子邮件。

正文

我选择的连接的是自己QQ的邮箱服务器,mail.qq.com IP地址为58.251.106.181。为了能够进行试验,需要先登录网页QQ邮箱,在设置-账户中找到如下地方生成一个授权码。

首先要知道SMTP的基本命令,参考SMTP命令行

  1. 建立与STMP服务器(58.251.106.181)的25号端口TCP连接:
from socket import *
import base64
# Choose a mail server (e.g. Google mail server) and call it mailserver
mailserver = '58.251.106.181'#smtp.qq.com
# Create socket called clientSocket and establish a TCP connection with mailserver
clientSocket= socket(AF_INET, SOCK_STREAM)
clientSocket.connect((mailserver ,25))
recv = clientSocket.recv(1024).decode()
print(recv)
if recv[:3] != '220':print('220 reply not received from server.')

返回:220 newxmesmtplogicsvrszc13.qq.com XMail Esmtp QQ Mail Server.

  1. 先HELO,再使用qq邮箱和授权码(需要base64编码)进行登录,
# Send HELO command and print server response.
heloCommand = 'HELO Alice\r\n'
clientSocket.send(heloCommand.encode())
recv1 = clientSocket.recv(1024).decode()
print(recv1)
if recv1[:3] != '250':print('250 reply not received from server.')
# Send auth login command and print server response.
heloCommand = 'auth login\r\n'
clientSocket.send(heloCommand.encode())
recv1 = clientSocket.recv(1024).decode()
print(recv1)
print(base64.b64decode(recv1[4:]).decode())#decode("base64","strict")
# Send users command and print server response.
users = base64.b64encode(b'youQQemail@qq.com') +"\r\n".encode()
print(users)
clientSocket.send(users)
recv1 = clientSocket.recv(1024).decode()
print(recv1)
# Send password and print server response.
password = base64.b64encode(b'你的授权码') +"\r\n".encode()
print(password)
clientSocket.send(password)
recv1 = clientSocket.recv(1024).decode()
print(recv1)

返回:
250-newxmesmtplogicsvrszc13.qq.com-9.46.14.43-20697823
250-SIZE 73400320
250 OK
334 VXNlcm5hbWU6(Username:)

334 UGFzc3dvcmQ6(Password:)

235 Authentication successful
显示登陆成功就可以发送信件了

  1. 然后使用mail from和rcpt to 传输发送方和接收方;我这里使用的发送方是我的QQ邮箱,接受方是网易邮箱,然后发送DATA信令就可以开始传输邮件内容了
# Send MAIL FROM command and print server response.
clientSocket.send("mail from:<XXXXXXXX@qq.com>\r\n".encode())
recv1 = clientSocket.recv(1024).decode()
print(recv1)
# Send RCPT TO command and print server response.
clientSocket.send("rcpt to:<XXXXXXXXX@163.com>\r\n".encode())
recv1 = clientSocket.recv(1024).decode()
print(recv1)
# Send DATA command and print server response.
clientSocket.send("DATA\r\n".encode())
print(clientSocket.recv(1024).decode())

返回:
250 OK
250 OK
354 End data with <CR><LF>.<CR><LF>.
最后一行告诉我们要用 <CR><LF>.<CR><LF>.作为邮件内容的结尾,因为服务器并不知道我们的邮件有多长,对于它来说,TCP提供一个比特流,所以需要一个邮件结尾标志

  1. 接下来就是直接发送邮件内容了,但是内容需要满足一定的格式邮件客户段才可以解析。可以参考这
headline = '''From: XXXXXXXXXX@qq.com\\r\nTo: XXXXXXXXXX@163.com\\r\nSubject:Test for SMTP command\\r\n\r\n'''
msg = "This is my test!"
endmsg = "\r\n.\r\n."
# Send message data.
clientSocket.send(headline.encode())
clientSocket.send(msg.encode())
# Message ends with a single period.
clientSocket.send(endmsg.encode())
print(clientSocket.recv(1024).decode())
# Send QUIT command and get server response.
clientSocket.send("quit".encode())

然后你就可以接受到邮件了

附加题

需要同时传输文字和图片。我们需要对图像也进行base64编码进行传输,还需要配置一下MIME的信息头
参考smtp协议 文本图片数据组合
登录代码不变,修改后半部分代码:

headline = '''From: XXXXXXXXX@qq.com\\r\nTo: XXXXXXXXX@163.com\\r\nSubject:Test for SMTP command\\r\nMIME-Version: 1.0 \\r\nContent-Type: multipart/mixed; boundary="1234DED00099A";\\r\nContent-Transfer-Encoding: 7bit \r\n\r\n'''
subTextHead = '''--1234DED00099A\r\nContent-Type: text/plain; charset=us-ascii \\r\nContent-Transfer-Encoding: 7bit \r\n\r\n'''
subImgHead = '''--1234DED00099A\r\nContent-Type: image/jpg; name="dog.jpg";\\r\nContent-Transfer-Encoding: base64 \\r\nContent-Description: ""A photo of dog""\\r\n\r\n'''
subEnd = '\r\n--XX-1234DED00099A--\r\n'
msg = "This is my test!"
endmsg = "\r\n.\r\n."
# Send DATA command and print server response.
clientSocket.send("DATA\r\n".encode())
print(clientSocket.recv(1024).decode())
# Send message data.
clientSocket.send(headline.encode())
clientSocket.send(subImgHead.encode())
with open('dog.jpg','rb') as f:img_data = f.read()base64_data = base64.b64encode(img_data)
clientSocket.send(base64_data)
clientSocket.send("\r\n".encode())
clientSocket.send(subTextHead.encode())
clientSocket.send(msg.encode())
clientSocket.send("\r\n".encode())# Message ends with a single period.
clientSocket.send(endmsg.encode())
print(clientSocket.recv(1024).decode())
# Send QUIT command and get server response.
clientSocket.send("quit".encode())

结果NICE!:

Python 使用SMTP协议发送邮件相关推荐

  1. python应用系列教程——python使用smtp协议发送邮件:html文本邮件、图片邮件、文件附件邮件

    全栈工程师开发手册 (作者:栾鹏) python教程全解 python使用smtp协议发送电子邮件.包含发送html文本邮件.包含图片附件的邮件,包含其他文件附件的邮件.可设置邮件的收发人,主题,内容 ...

  2. SMTP协议发送邮件

    网上找了一个smtp邮箱的发送工具类,还行,用我自己的qq测试可以发送package com.exampleimport javax.mail.Address; import javax.mail.S ...

  3. Linux 平台使用smtp协议发送邮件

    Linux平台使用smtp协议 发送邮件 前言 项目简介 项目开发环境 项目代码 测试结果以及存在问题 写在最后 前言 本人第一次写博客,主要目的是想记录一下自己的学习结果,本篇博客内容纯手打,参考资 ...

  4. smtp协议源ip是服务器地址吗,Smtp协议发送邮件

    Smtp协议发送邮件,是最全面的smtp协议发送邮件教程!有助于新手快速入门,从而跟好的进阶学习.本文档内容丰富,知识全面,简单易懂 Smtp协议发送邮件 MTP(Simple Mail Transf ...

  5. python怎么发送邮件_python中是如何借助smtp协议发送邮件的?

    前言 现如今邮件已经逐渐替代了书信传递,成为日常办公不可缺少的一部分.在Java开发中,我们会利用POP3协议和SMTP协议借助java类来发送邮件,从而我们了解到,要想发送邮件,需要拥有可以发送邮件 ...

  6. 开发第一步之SMTP协议发送邮件,获取手机的详细信息

    目前是测试代码,只有一个页面,运行软件时会自动的获取系统信息,并且发送,开机自启动等. 布局准备把应用的图标让他从下往上旋转变大,应用的名称从左往右移动,应用的版本从右往左移动,现在只是用文字代替,看 ...

  7. java qq协议 php_PHP使用SMTP协议发送邮件

    PHP开发者一般都是使用PHPMailer发送邮件,不知道你有没有看过它的源码呢?其实并不难,核心在于SMTP协议,下面我分享下如何不依赖PHPMailer来发送邮件. 我选择使用QQ邮箱的SMTP服 ...

  8. php中如何使用smtp,PHP使用SMTP协议发送邮件

    PHP开发者一般都是使用PHPMailer发送邮件,不知道你有没有看过它的源码呢?其实并不难,核心在于SMTP协议,下面我分享下如何不依赖PHPMailer来发送邮件. 我选择使用QQ邮箱的SMTP服 ...

  9. php smtp.qq.com,PHP使用SMTP协议发送邮件

    PHP开发者一般都是使用PHPMailer发送邮件,不知道你有没有看过它的源码呢?其实并不难,核心在于SMTP协议,下面我分享下如何不依赖PHPMailer来发送邮件. 我选择使用QQ邮箱的SMTP服 ...

最新文章

  1. NC:菌物组构建---随机性v.确定性、干旱胁迫、宿主筛选、统一动态(郭良栋、杨军点评)
  2. 英特尔杀入游戏显卡市场:3000元档位,支持光追和AI超分辨率,挑战AMD英伟达...
  3. POJ1741 Tree 树中点对统计【树分治入门】
  4. 球球大作战为什么显示服务器神游,球球大作战不能玩怎么解决_球球大作战不能玩解决方案详细分析_好特教程...
  5. 世界变化快,不学“SQL托管实例”跟不上时代
  6. boost--windows平台下针对VS的简单编译
  7. 虚拟机Class文件结构笔记
  8. 全向轮机器人运动模型及应用分析(图片版)
  9. JSON.parse()函数处理json格式字符串方法
  10. 拓端tecdat|R语言泊松Poisson回归模型分析案例
  11. php中的opendir函数,php中opendir函数用法实例
  12. 贝叶斯分析好坏_浅析贝叶斯定理及其应用
  13. 数字IC设计知识点及综合题详解(提前批、秋招必刷基础题)——(四)亚稳态、跨时钟域(CDC)处理方法及其编程仿真代码
  14. 如何利用在线工具更改寸照底色
  15. Chrome谷歌浏览器无法调用摄像头原因及解决办法
  16. python个性化推荐系统毕业设计_个性化推荐系统架构设计(一)
  17. 养生防癌:八大神效食物能杀死癌细胞
  18. OpenWrt下使用docker安装icloudpd实现iPhone照片备份私有云盘nas
  19. FM ALV和OO ALV的区别
  20. 基带信号、载波信号和宽带信号

热门文章

  1. BUUCTF RE WP31-32 [WUSTCTF2020]level1、[GWCTF 2019]xxor
  2. 搭建node版本下载服务器(node版本高速镜像)
  3. 32位计算机怎么安装ps,ps怎么安装到电脑上(免费教你安装ps)
  4. 开源海思开发板(HIVIEW开发板)
  5. 基于Java SSM springboot健身管理系统设计和实现
  6. 【你知道路由重分布吗】
  7. 缠中说禅108课》87:逗庄家玩的一些杂史 4
  8. zemax中如何快速查看波像差
  9. winrar远程代码执行漏洞(cve-2018-20250)
  10. 年薪170万程序员在线征婚为什么会遭嘲讽?