计网知识的小实践
1.首先打开win10的telnet服务
2.打开邮箱(qq)的SMTP服务
获得授权码后记下来,待会输入的密码填这个
3.打开win10的控制台(或者PowerShell)
4.输入命令(发邮件)
telnet smtp.qq.com 25
helo smtp
算是建立TCP连接
接着登录
auth login
输入用户名:base64转码后的用户名(注意指@前的部分)
输入密码:base64转码后的密码
小提示:在命令行内用鼠标右键粘贴
到这里就登录成功了
设置发送方邮箱:mail from: yourEmail@qq.com
设置收件方邮箱:rcpt to: recipientsEmail@qq.com
标识传数据:date
邮件:
from:发件人(可不填)
to:收件人(可不填)
subject:主题
空一行开始输入正文,用单独一行的 . 结束
在命令行中输入错误是改不了的,发过去就是错的了,所以我这里输错了几次。。。
这时就在目标邮箱中收到了邮件,在qq邮箱的已发送中也可找到。
5.简易python版
from socket import *
import base64
# Mail content
subject = "I love computer networks!"
contenttype = "text/plain"
msg = "I love computer networks!"
endmsg = "\r\n.\r\n"
# Choose a mail server (e.g. Google mail server) and call it mailserver
mailserver = "smtp.163.com"
# Sender and reciever
fromaddress = "******@163.com"
toaddress = "******@qq.com"
# Auth information (Encode with base64)
username = base64.b64encode(fromaddress.encode()).decode()
password = base64.b64encode("******".encode()).decode()
# 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.')
# Auth
clientSocket.sendall('AUTH LOGIN\r\n'.encode())
recv = clientSocket.recv(1024).decode()
print(recv)
if (recv[:3] != '334'):
print('334 reply not received from server')
clientSocket.sendall((username + '\r\n').encode())
recv = clientSocket.recv(1024).decode()
print(recv)
if (recv[:3] != '334'):
print('334 reply not received from server')
clientSocket.sendall((password + '\r\n').encode())
recv = clientSocket.recv(1024).decode()
print(recv)
if (recv[:3] != '235'):
print('235 reply not received from server')
# Send MAIL FROM command and print server response.
clientSocket.sendall(('MAIL FROM: <' + fromaddress + '>\r\n').encode())
recv = clientSocket.recv(1024).decode()
print(recv)
if (recv[:3] != '250'):
print('250 reply not received from server')
# Send RCPT TO command and print server response.
clientSocket.sendall(('RCPT TO: <' + toaddress + '>\r\n').encode())
recv = clientSocket.recv(1024).decode()
print(recv)
if (recv[:3] != '250'):
print('250 reply not received from server')
# Send DATA command and print server response.
clientSocket.send('DATA\r\n'.encode())
recv = clientSocket.recv(1024).decode()
print(recv)
if (recv[:3] != '354'):
print('354 reply not received from server')
# Send message data.
message = 'from:' + fromaddress + '\r\n'
message += 'to:' + toaddress + '\r\n'
message += 'subject:' + subject + '\r\n'
message += 'Content-Type:' + contenttype + '\t\n'
message += '\r\n' + msg
clientSocket.sendall(message.encode())
# Message ends with a single period.
clientSocket.sendall(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.sendall('QUIT\r\n'.encode())
# Close connection
clientSocket.close()
6.IMAP(收邮件)/pop3
telnet imap.qq.com 143
登录邮箱
a01 login username password
password用授权码
- 列出所有信箱
a02 list “” *
- 列出inbox信箱中的信息
a03 select inbox
其中184 EXISTS表示邮件总数但是比我在qq邮箱中只显示118篇,RECENT前面的数字“0”表示新邮件数目(就是未读邮件)。
- 查看邮箱内容(信头)
a4 fetch 3 body[header]
然后就是一堆看不懂的文字
根据其中的时间可以在邮箱中找到
- 请求信件的内容
a5 fetch 3 body[text]
接下来还是一堆码
- 退出邮箱
a06 logout
Telnet 安全隐患
虽然Telnet较为简单实用也很方便,但是在格外注重安全的现代网络技术中,Telnet并不被重用。原因在于Telnet是一个明文传送协议,它将用户的所有内容,包括用户名和密码都明文在互联网上传送,具有一定的安全隐患,因此许多服务器都会选择禁用Telnet服务。如果我们要使用Telnet的远程登录,使用前应在远端服务器上检查并设置允许Telnet服务的功能。