计算机网络-套接字编程作业(3)-邮件客户端

背景知识

1)梳理逻辑(摘自SMTP的连接和发送过程):
(a)建立TCP连接(使用Socket)
(b)客户端发送HELO/EHLO命令以标识发件人自己的身份, 接受 服务器端响应;
(c)客户端发送AUTH LOGIN登录请求,接着发送用户名和密码;
(d)客户端发送RCPT命令,以标识该电子邮件的计划接收人,可以有多个RCPT行;
(e)协商结束,发送邮件,用命令DATA发送
(f)以.表示结束输入内容一起发送出去
(g)结束此次发送,用QUIT命令退出

2)每个命令都以\r\n结尾,特定格式命令:
HELO:HELO <domain> <CRLF>
RCPT TO:<forward-path> <CRLF>——<forward-path>
3)选择邮箱服务器
gmail还要翻墙,弃用(¬ 。¬)
我是使用网易邮箱作为邮箱服务器,公司邮箱作为目标账户。
网易邮箱需要提前进行一些设置,开启STMP功能,方法如下:

  1. 登录邮箱 -- 设置 -- 进入POP3/SMTP/IMAP界面,可以看最下面提示有SMTP服务器: smtp.163.com
  2. 勾选 IMAP/SMTP服务,会弹出提示设置授权码
  3. 进入设置授权码,开启服务,这里需要手机号码验证(如果你和我一样,关联的手机号码已经不知道丢哪里了,可以换一个绑定当前手机的网易邮箱,(^ ^)),总之,设置好授权码后,这个授权码就是代码里的password

下面是最终代码展示:

from socket import *
import base64
msg = 'I love computer networks!'
endmsg = '\r\n.\r\n'
# 邮件服务器,端口 25 
mailserver = 'smtp.163.com'

fromaddr = 'z****@163.com' # 填写自己的邮箱
toaddr = 'z***@***.com' # 填写目标邮箱
username = 'z****@163.com'
password = 'a*****6' # 网易邮箱授权码

# 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.')

# 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
base64_str = ('\x00' + username + '\x00' + password).encode()
base64_str = base64.b64encode(base64_str)
authCommand = 'AUTH PLAIN '.encode() + base64_str + '\r\n'.encode()
clientSocket.send(authCommand)
recv_auth = clientSocket.recv(1024)
print(recv_auth.decode())

# Send MAIL FROM command and print server response.
mailCommand = 'MAIL FROM: <' + fromaddr + '>\r\n'
clientSocket.send(mailCommand.encode())
recv_from = clientSocket.recv(1024).decode()
print(recv_from)
if recv_from[:3] != '250':
    print('250 reply not received from server.')

# Send RCPT TO command and print server response.
rcptCommand = 'RCPT TO: <' + toaddr + '>\r\n'
clientSocket.send(rcptCommand.encode())
recv_rcpt = clientSocket.recv(1024).decode()
print(recv_rcpt)
if recv_rcpt[:3] != '250':
    print('250 reply not received from server.')

# Send DATA command and print server response.
clientSocket.send('DATA\r\n'.encode())
recv_data = clientSocket.recv(1024).decode()
print(recv_data)
if (recv_data[:3] != '354'):
    print('354 reply not received from server')

# Send message data.
send_msg = 'from: ' + fromaddr + '\r\n'
send_msg += 'to: ' + toaddr + '\r\n'
send_msg += 'subject: ' + msg + '\r\n'
send_msg += 'content-type: text/plain\t\n'
send_msg += '\r\n' + msg
clientSocket.send(send_msg.encode())

# Message ends with a single period.
clientSocket.send(endmsg.encode())
recv = clientSocket.recv(1024).decode()
print(recv)
if (recv[:3] != '250'):
    print('250 reply not received from server')

# Send QUIT command and get server response.
clientSocket.send('QUIT\r\n'.encode())

# close
clientSocket.close()

结果:


bb.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,658评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,482评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,213评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,395评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,487评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,523评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,525评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,300评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,753评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,048评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,223评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,905评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,541评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,168评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,417评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,094评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,088评论 2 352

推荐阅读更多精彩内容