整体文章目录
一、 当前章节目录
二、使用FTP传输文件
文件传送协议(File Transfer Protocol,FTP)是一个将数据文件从一台主机传送到另外一台主机上的传输协议。这是Internet上最早的应用协议之一。
2.1 FTP的工作原理和Python库支持
- FTP协议的工作原理是FTP的客户端连接FTP的服务器端,并给出用户名和密码进行认证。
- 在Python标准库中,ftplib提供了对于FTP客户端实现的支持。
- FTP协议和HTTP协议有点相似,都可以获取文档数据。但是两者也有本质的区别,使得其成为不同类型的协议。最大的区别在于前者是将命令和数据分开传输的,这称为带外数据。而后者控制信息和数据信息是放在一起的,这称为带内数据。
2.2 FTP的登录和退出
In [1]: import ftplib
In [2]: ftp = ftplib.FTP()
In [3]: ftp
Out[3]: <ftplib.FTP at 0x1faf990ed00>
In [4]: ftp = ftplib.FTP("192.168.1.106")
In [5]: ftp.quit()
Out[5]: '221 Goodbye.'
In [6]: ftp = ftplib.FTP()
In [7]: ftp.connect("192.168.1.106")
Out[7]: '220 Microsoft FTP Service'
In [8]: ftp.login()
Out[8]: '230 User logged in.'
In [9]: ftp.quit()
Out[9]: '221 Goodbye.'
In [10]: ftp.getwelcome()
Out[10]: '220 Microsoft FTP Service'
In [11]: ftp.sendcmd("PASV")
Out[11]: '227 Entering Passive Mode (192,168,31,128,202,86).'
2.3 FTP的数据传输
In [12]: ftp.pwd()
Out[12]: '/'
In [13]: ftp.mkd("python_book")
Out[13]: 'python_book'
In [14]: fp = open('D:\FtpSiter\python_book\simple_server.py', 'rb')
In [15]: ftp.storbinary("STOR simple_server.py", fp)
Out[15]: '226 Transfer complete.'
In [16]: ftp.retrlines("LIST")
07-04-21 01:13PM <DIR> localuser
07-05-21 03:41PM <DIR> python_book
07-05-21 03:57PM 0 simple_server.py
Out[16]: '226 Transfer complete.'
In [17]: ftp.set_debuglevel(2)
In [17]: ftp.sendcmd("UMASK")
*cmd* 'UMASK'
*put* 'UMASK\r\n'
*get* '500 Command not understood.\n'
*resp* '500 Command not understood.'
---------------------------------------------------------------------------
error_perm Traceback (most recent call last)
# 省略部分输出
error_perm: 500 Command not understood.
In [18]: ftp.sendcmd("QUIT")
*cmd* 'QUIT'
*put* 'QUIT\r\n'
*get* '221 Goodbye.\n'
*resp* '221 Goodbye.'
Out[18]: '221 Goodbye.'
三、使用POP3获取邮件
3.1 POP3协议介绍
- 接收邮件用得最多的协议是POP协议,默认使用TCP的110端口。
- POP3仍然是采用的服务器端-客户端工作模式。
- 一个典型的邮件客户端获取邮件的步骤如下:
- 使用DNS协议来解析POP3服务器的IP地址。
- 使用TCP协议来连接邮件服务器的110端口(默认情况下)。
- 当客户端连上POP3服务器后,将通过USER命令来传送邮箱账号,通过PASS命令来传送邮箱密码。提供这些信息来完成用户认证。
- 当完成用户认证后,可以使用STAT命令来获取POP3服务器中此账号的邮箱统计资料,包括邮件的总数和邮件大小等。
- 同时可以使用LIST命令列出POP3服务器中的已有邮件数量。
- 邮件客户端可以通过RETR命令来获取邮件,并使用DELE命令来设置删除标志。
- 所以的邮件获取完毕后,可以使用QUIT命令中断和POP3邮件服务器的连接。同时,服务器会删除已设置为删除标志的邮件。
3.2 poplib模块的使用
In [1]: import poplib
In [2]: pop = poplib.POP3("pop.163.com")
In [3]: pop.getwelcome
Out[3]: <bound method POP3.getwelcome of <poplib.POP3 object at 0x000001B747290070>>
# 需要开通邮箱pop
In [4]: pop.user("2008hchl@ pop.163.com")
Out[4]: b'+OK core mail'
# 此为开通pop时的授权码
In [5]: pop.pass_("******")
Out[5]: b'+OK 1 message(s) [18067 byte(s)]'
In [6]: pop.stat()
Out[6]: (1, 18067)
In [7]: resp, items, octets = pop.list()
In [8]: import random
In [9]: id, size = random.choice(items).decode().split(' ')
In [10]: resp, items, octets = pop.retr(id)
四、使用SMTP发送邮件
4.1 SMTP协议介绍
4.2 smtplib模块的使用
In [1]: import smtplib
In [2]: smtp = smtplib.SMTP("smtp.163.com")
In [3]: smtp.login("2008hchl@", "******")
Out[3]: (235, b'Authentication successful')
In [4]: smtp.noop()
Out[4]: (250, b'OK')
In [5]: FROM='2008hchl@'
In [6]: TO='2008hchl@'
In [7]: SUBJECT="Hello"
In [8]: BODY = "Hello, Python.\n"
In [9]: body = "".join((
"From:%s"%FROM,
"TO:%s"%TO,
"Subject:%s"%SUBJECT))+BODY
In [10]: print(body)
From:2008hchl@TO:2008hchl@Subject:HelloHello, Python.
In [11]: smtp.sendmail(FROM,[TO],body)
Out[11]: {}
In [12]: smtp.quit()
Out[12]: (221, b'Bye')
五、使用Telnet远程登录
5.1 Telnet协议介绍和Python库支持
5.2 telnetlib模块的使用
In [1]: import telnetlib
In [2]: telnet = telnetlib.Telnet()
In [3]: telnet.open("192.168.31.128")
In [4]: telnet.read_until("login:")
In [5]: telnet.write("user\n")
In [6]: telnet.read_until("Password:")
In [7]: telnet.write("password\n")
In [8]: telnet.write("ls\n")
In [9]: telnet.write("exit\n")
In [10]: telnet.read_all()
六、习题
习题:
- POP3与SMTP协议分别是什么?它们有什么不同?
- 使用Python编写一个发送邮件的小程序。
答案: