Python3 网络编程——FTP编程&Mail编程

FTP编程

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()

Mail编程

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)

你可能感兴趣的:(python)