FTP(FileTransferProtocal):文件传输协议
用途: 定制一些特殊的上传下载文件的服务。
用户分类: 登陆FTP服务器必须有一个账号。
1.Real账户: 注册账户。
2.Guest账户: 可能临时对某一类人的行为进行授权。
3.Anonymous账户: 匿名账户,允许任何人。
FTP工作流程:
1. 客户端链接远程主机上的FTP服务器。
2. 客户端输入用户名和密码(或者“anonymous”和电子邮件地址)。
3. 客户端和服务器进行各种文件传输和信息查询操作。
4. 客户端从远程FTP服务器退出,结束传输。
FTP文件表示:
分三段表示FTP服务器上的文件。
HOST: 主机地址,类似于 ftp.mozilla.org, 以ftp开头
DIR:目录, 表示文件所在本地的路径,例如 pub/android/focus/1.1-RC1/
File: 文件名称, 例如 Klar-1.1-RC1.apk
如果想完整精确表示ftp上某一个文件,需要上述三部分组合在一起。
# 需要导入相应包,主要是ftplib
import ftplib # 关于FTP的操作都在这个包里边。
import os
import socket
# 三部分精确表示在ftp服务器上的某一个文件
HOST = "ftp.acc.umu.se"
DIR = 'Public/EFLIB/'
FILE = 'README'
# 1. 客户端链接远程主机上的FTP服务器
try:
f = ftplib.FTP()
# 通过设置调试级别可以方便调试
f.set_debuglevel(2)
# 链接主机地址
f.connect(HOST)
except Exception as e:
print(e)
exit()
print("***Connected to host {0}".format(HOST))
# 2. 客户端输入用户名和密码(或者“anonymous”和电子邮件地址)
try:
# 登录如果没有输入用户信息,则默认使用匿名登录
f.login()
except Exception as e:
print(e)
exit()
print("***Logged in as 'anonymous'")
# 3. 客户端和服务器进行各种文件传输和信息查询操作
try:
f.cwd(DIR)# 更改当前目录到指定目录
except Exception as e:
print(e)
exit()
print("*** Changed dir to {0}".format(DIR))
try:
# 从FTP服务器上下载文件
# 第一个参数是ftp命令,第二个参数是回调函数
# 此函数的意思是,执行RETR命令,下载文件到本地后,运行回调函数
f.retrbinary('RETR {0}'.format(FILE), open(FILE, 'wb').write)
except Exception as e:
print(e)
exit()
# 4. 客户端从远程FTP服务器退出,结束传输
f.quit()
MUA(MailUserAgent)邮件用户代理
MTA(MailTransferAgent)邮件传输代理
MDA(MailDeliveryAgent)邮件投递代理
流程(例如利用QQ邮箱给sina邮箱发邮件):
MUA->MTA, 邮件传到服务器上
qq MTA->………->sina MTA, 邮件传到新浪的服务器
sina MTA-> sina MDA, 此时邮件已经在你的邮箱里了
sina MDA -> MUA(Foxmail/Outlook), 邮件下载到本地电脑
编写程序:
发送: MUA->MTA with SMTP,包含MTA->MTA
接受: MDA->MUA with POP3(PostOfficeProtocal v3 ) and IMAP(InternetMessageAccessProtocal v4)
准备工作:
注册邮箱(以qq邮箱为例)
第三方邮箱需要特殊设置, 以qq邮箱为例
进入设置中心
取得授权码
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。
python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。
Python创建 SMTP 对象语法如下:
import smtplib
smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )
参数说明:
host: SMTP 服务器主机。 指定主机的ip地址或者域名,这个是可选参数。
port: 如果你提供了 host 参数, 你需要指定 SMTP 服务使用的端口号,SMTP端口号为25。
local_hostname: 如果SMTP在你的本机上,你只需要指定服务器地址为 localhost 即可。
Python SMTP对象使用sendmail方法发送邮件,语法如下:
SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options]
参数说明:
from_addr: 邮件发送者地址。
to_addrs: 字符串列表,邮件发送地址。
msg: 发送消息
注意一下第三个参数,msg是字符串,表示邮件。我们知道邮件一般由标题,发信人,收件人,邮件内容,附件等构成,发送邮件的时候,要注意msg的格式。这个格式就是smtp协议中定义的格式。
使用email模块构建邮件——纯文本邮件案例
# 导入相应的包
import smtplib
from email.mime.text import MIMEText
# MIMEText三个主要参数
# 1. 邮件内容
# 2. MIME子类型,在此用plain表示text类型
# 3. 邮件编码格式
msg = MIMEText("Hello, Welcome! ", "plain", "utf-8")
# 发送email地址,密码一般需要临时输入,此处偷懒
from_addr = "[email protected]"
# 此处密码是经过申请设置后的授权码,不是qq邮箱密码
from_pwd = "hjpovygcxmrshhcj"
# 收件人信息
to_addr = "[email protected]"
# 输入SMTP服务器地址
# 此处根据不同的邮件服务商有不同的值,如果采用第三方收发邮件,都需要开启授权选项
# 腾讯qq邮箱所的smtp地址是 smtp.qq.com
smtp_srv = "smtp.qq.com"
try:
# 两个参数
# 第一个是服务器地址,但一定是bytes格式,所以需要编码
# 第二个参数是服务器的接受访问端口
srv = smtplib.SMTP_SSL(smtp_srv.encode(), 465) #SMTP协议默认端口25
#登录邮箱发送
srv.login(from_addr, from_pwd)
# 发送邮件
# 三个参数 1.发送地址。2.接受地址,必须是list形式。3.发送内容,作为字符串发送
srv.sendmail(from_addr, [to_addr], msg.as_string())
srv.quit()
except Exception as e:
print(e)
HTML格式邮件发送。准备HTML代码作为内容,把邮件的subtpye设为html发送
案例:
from email.mime.text import MIMEText
mail_content = """
Title
这是一封HTML格式邮件
"""
msg = MIMEText(mail_content, "html", "utf-8")
# 构建发送者地址和登录信息
from_addr = "[email protected]"
from_pwd = "hjpovygcxmrshhcj"
# 构建邮件接受者信息
to_addr = "[email protected]"
smtp_srv = "smtp.qq.com"
try:
import smtplib
srv = smtplib.SMTP_SSL(smtp_srv.encode(), 465)
srv.login(from_addr, from_pwd)
srv.sendmail(from_addr, [to_addr], msg.as_string())
srv.quit()
except Exception as e:
print(e)
发送带附件的邮件。
可以把邮件看作是一个文本邮件和一个附件的合体,一封邮件如果涉及多个部分,需要使用MIMEMultipart格式构建
添加一个MIMEText正文
添加一个MIMEBase或者MEMEText作为附件
案例:
from email.mime.text import MIMEText #构建附件使用
from email.mime.multipart import MIMEBase, MIMEMultipart # 构建基础邮件使用
mail_mul = MIMEMultipart()
# 构建邮件正文
mail_text = MIMEText("Hello, i am xxxx", "plain", "utf-8")
# 把构建好的邮件正文附加入邮件中
mail_mul.attach(mail_text)
# 构建附件,需要从本地读入附件
# 打开一个本地文件, 以rb格式打开
with open("02.html", "rb") as f:
s = f.read()
# 设置附件的MIME和文件名
m = MIMEText(s, 'base64', "utf-8")
m["Content-Type"] = "application/octet-stream"
#注意 1. attachment后分号为英文状态
# 2. filename 后面需要用引号包裹,注意与外面引号错开
m["Content-Disposition"] = "attachment; filename='02.html'"
# 添加到MIMEMultipart
mail_mul.attach(m)
# 发送email地址
from_addr = "[email protected]"
# 此处密码是经过申请设置后的授权码,不是qq邮箱密码
from_pwd = "hjpovygcxmrshhcj"
# 收件人信息
to_addr = "[email protected]"
# 输入SMTP服务器地址
smtp_srv = "smtp.qq.com"
try:
import smtplib
srv = smtplib.SMTP_SSL(smtp_srv.encode(), 465)
#登录邮箱发送
srv.login(from_addr, from_pwd)
# 发送邮件
srv.sendmail(from_addr, [to_addr], mail_mul.as_string())
srv.quit()
except Exception as e:
print(e)
添加邮件头, 抄送等信息。
mail[“From”] 表示发送着信息,包括姓名和邮件
mail[“To”] 表示接收者信息,包括姓名和邮件地址
mail[“Subject”] 表示摘要或者主题信息
案例:
from email.mime.text import MIMEText
from email.header import Header
msg = MIMEText("Hello wold", "plain", "utf-8")
# 用utf8编码是因为很可能内容包含非英文字符
header_from = Header("从小明邮箱发出去的" , "utf-8")
msg['From'] = header_from
# 填写接受者信息
header_to = Header("去小红的地方" , 'utf-8')
msg['To'] = header_to
header_sub = Header("这是xxx的主题", 'utf-8')
msg['Subject'] = header_sub
# 构建发送者地址和登录信息
from_addr = "[email protected]"
from_pwd = "hjpovygcxmrshhcj"
# 构建邮件接受者信息
to_addr = "[email protected]"
smtp_srv = "smtp.qq.com"
try:
import smtplib
srv = smtplib.SMTP_SSL(smtp_srv.encode(), 465)
srv.login(from_addr, from_pwd)
srv.sendmail(from_addr, [to_addr], msg.as_string())
srv.quit()
except Exception as e:
print(e)
同时支持html和text格式。
构建一个MIMEMultipart格式邮件
MIMEMultipart的subtype设置成alternative格式,添加HTML和text邮件
案例:
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
# 构建一个MIMEMultipart邮件
msg = MIMEMultipart("alternative")
# 构建一个HTML邮件内容
html_content = """
Title
这是一封HTML格式邮件
"""
msg_html = MIMEText(html_content, "html", "utf-8")
msg.attach(msg_html)
msg_text = MIMEText("just text content", "plain", "utf-8")
msg.attach(msg_text)
from_addr = "[email protected]"
#from_pwd = input('163邮箱密码: ')
from_pwd = "hjpovygcxmrshhcj"
# 收件人信息:
to_addr = "[email protected]"
# 输入SMTP服务器地址:
smtp_srv = "smtp.qq.com"
try:
import smtplib
# 加密传输
#server = smtplib.SMTP_SSL(smtp_srv.encode(), 465)
# qq邮箱要求使用 TLS加密传输
server = smtplib.SMTP(smtp_srv.encode(), 25) # SMTP协议默认端口是25
server.starttls()
# 设置调试级别, 通过设置调试等级,可以清楚的看到发送邮件的交互步骤
server.set_debuglevel(1)
# 登录发送邮箱
server.login(from_addr, from_pwd)
server.sendmail(from_addr, [to_addr], msg.as_string())
server.quit()
except Exception as e:
print(e)