python学习-第29课-邮件处理&数据处理

一、简单邮件传输协议(SMTP)

1.1.SMTP说明

简单邮件传输协议(SMTP)是一种协议,用于在邮件服务器之间发送电子邮件和路由电子邮件。
Python提供smtplib模块,该模块定义了一个SMTP客户端会话对象,可用于使用SMTP或ESMTP侦听器守护程序向任何互联网机器发送邮件。
这是一个简单的语法,用来创建一个SMTP对象,稍后将演示如何用它来发送电子邮件 

import smtplib
smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )

参数说明:

  • host: SMTP 服务器主机。 你可以指定主机的ip地址或者域名如:runoob.com,这个是可选参数。
  • 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协议中定义的格式。

1.2.使用Python发送纯文本电子邮件

示例

import smtplib
from email.mime.text import MIMEText
from email.header import Header

sender = 'biankm_gz@163.com' 
receivers = ['biankm_yl@qq.com','121295926@qq.com'] # 接收邮件,可设置为你的QQ邮箱或者其他邮箱

# 三个参数:第一个为文本内容,第二个 plain 设置文本格式,第三个 utf-8 设置编码
message = MIMEText('Python 邮件发送测试...', 'plain', 'utf-8')
message['From'] = Header("Python测试", 'utf-8')  # 发送者
message['To'] = Header("测试", 'utf-8')  # 接收者

subject = 'Python SMTP 邮件测试'
message['Subject'] = Header(subject, 'utf-8')

try:
    smtpObj = smtplib.SMTP('localhost')
    smtpObj.sendmail(sender, receivers, message.as_string())
    print("邮件发送成功")
except smtplib.SMTPException:
    print("Error: 无法发送邮件")

我们使用三个引号来设置邮件信息,标准邮件需要三个头部信息: FromTo, 和 Subject ,每个信息直接使用空行分割。

我们通过实例化 smtplib 模块的 SMTP 对象 smtpObj 来连接到 SMTP 访问,并使用 sendmail 方法来发送信息。

1.3.使用第三方服务器发送邮件

如果我们本机没有 sendmail 访问,也可以使用其他服务商的 SMTP 访问(QQ、网易、Google等)。
 

import smtplib
from email.mime.text import MIMEText
from email.header import Header

# 第三方 SMTP 服务
mail_host = "smtp.163.com"  # 设置服务器
mail_user = "XXXX"  # 用户名
mail_pass = "XXXXXX"  # 口令

sender = 'biankm_gz@163.com'
receivers = ['2302841770@qq.com']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱

message = MIMEText('Python 邮件发送测试...', 'plain', 'utf-8')
message['From'] = Header("SMTP测试", 'utf-8')
message['To'] = Header("测试", 'utf-8')

subject = 'Python SMTP 邮件测试'
message['Subject'] = Header(subject, 'utf-8')

try:
    smtpObj = smtplib.SMTP()
    smtpObj.connect(mail_host, 25)  # 25 为 SMTP 端口号
    smtpObj.login(mail_user, mail_pass)
    smtpObj.sendmail(sender, receivers, message.as_string())
    print("邮件发送成功")
except smtplib.SMTPException:
    print("Error: 无法发送邮件")

1.4.发送HTML格式的邮件

Python发送HTML格式的邮件与发送纯文本消息的邮件不同之处就是将MIMEText中_subtype设置为html。

import smtplib
from email.mime.text import MIMEText
from email.header import Header

sender = 'biankm_gz@163.com'
receivers = ['biankm_yl@qq.com','2302841770@qq.com']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱

mail_msg = """
<p>Python 邮件发送测试...</p>
<p><a href="http://www.runoob.com">这是一个链接</a></p>
"""
message = MIMEText(mail_msg, 'html', 'utf-8')
message['From'] = Header("HTML邮件发送测试", 'utf-8')
message['To'] = Header("测试", 'utf-8')

subject = 'Python SMTP 邮件测试'
message['Subject'] = Header(subject, 'utf-8')

try:
    smtpObj = smtplib.SMTP('localhost')
    smtpObj.sendmail(sender, receivers, message.as_string())
    print("邮件发送成功")
except smtplib.SMTPException:
    print("Error: 无法发送邮件")

1.5.发送带附件的邮件

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header

sender = 'biankm_gz@163.com'
receivers = ['2302841770@qq.com','biankm_xx@163.com']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱

# 创建一个带附件的实例
message = MIMEMultipart()
message['From'] = Header("邮件教程", 'utf-8')
message['To'] = Header("测试", 'utf-8')
subject = 'Python SMTP 邮件测试'
message['Subject'] = Header(subject, 'utf-8')

# 邮件正文内容
message.attach(MIMEText('这是Python 邮件发送测试……', 'plain', 'utf-8'))

# 构造附件1,传送当前目录下的 test01.txt 文件
att1 = MIMEText(open('test01.txt', 'rb').read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
# 这里的filename可以任意写,写什么名字,邮件中显示什么名字
att1["Content-Disposition"] = 'attachment; filename="test01.txt"'
message.attach(att1)

# 构造附件2,传送当前目录下的 test02.txt 文件
att2 = MIMEText(open('test02.txt', 'rb').read(), 'base64', 'utf-8')
att2["Content-Type"] = 'application/octet-stream'
att2["Content-Disposition"] = 'attachment; filename="test02.txt"'
message.attach(att2)

try:
    smtpObj = smtplib.SMTP('localhost')
    smtpObj.sendmail(sender, receivers, message.as_string())
    print("邮件发送成功")
except smtplib.SMTPException:
    print("Error: 无法发送邮件")

1.6.在 HTML 文本中添加图片

import smtplib
from email.mime.text import MIMEText
from email.header import Header
from smtplib import SMTP_SSL

from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText


#qq邮箱smtp服务器
host_server = 'smtp.qq.com'
#sender_qq为发件人的qq号码
sender_qq = '769728683@qq.com'
#pwd为qq邮箱的授权码
pwd = 'h******mk*****' #
#发件人的邮箱
sender_qq_mail = '769728683@qq.com'
#收件人邮箱
receiver = ['yiibai.com@gmail.com','h****u@qq.com']

#邮件的正文内容
mail_content = ""
#邮件标题
mail_title = 'Maxsu的邮件'

#邮件正文内容
#msg = MIMEMultipart()
msg = MIMEMultipart('related')
msg["Subject"] = Header(mail_title, 'utf-8')
msg["From"] = sender_qq_mail
msg["To"] = Header("接收者测试", 'utf-8') ## 接收者的别名

msgAlternative = MIMEMultipart('alternative')
msg.attach(msgAlternative)


#邮件正文内容
mail_body = """
 <p>你好,Python 邮件发送测试...</p>
 <p>这是使用python登录qq邮箱发送HTML格式和图片的测试邮件:</p>
 <p><a href='http://www.baidu.com'>百度</a></p>
 <p>图片演示:</p>
 <p><img src="cid:send_image"></p>
"""

#msg.attach(MIMEText(mail_body, 'html', 'utf-8'))
msgText = (MIMEText(mail_body, 'html', 'utf-8'))
msgAlternative.attach(msgText)


# 指定图片为当前目录
fp = open('test.png', 'rb')
msgImage = MIMEImage(fp.read())
fp.close()

# 定义图片 ID,在 HTML 文本中引用
msgImage.add_header('Content-ID', '<send_image>')
msg.attach(msgImage)


#ssl登录
smtp = SMTP_SSL(host_server)
#set_debuglevel()是用来调试的。参数值为1表示开启调试模式,参数值为0关闭调试模式
smtp.set_debuglevel(1)
smtp.ehlo(host_server)
smtp.login(sender_qq, pwd)

smtp.sendmail(sender_qq_mail, receiver, msg.as_string())
smtp.quit()

二、yagmail模块

2.1.安装yagmail

pip install yagmail

2.2.发送格式

yag = SMTP(args.user, args.password)
yag.send(to=args.to, subject=args.subject, contents=args.contents, attachments=args.attachments)

参数

args.user  是邮箱账号
args.password 是邮箱密码
args.to 是收件人邮箱
args.subject 是主题
args.contents 是邮箱正文
args.attachments 是附件

2.3.示例

import yagmail

#链接邮箱服务器
yag = yagmail.SMTP( user="biankm_gz@163.com", password="1234", host='smtp.163.com')

# 邮箱正文
contents = ['This is the body, and here is just text http://somedomain/image.png',
            'You can find an audio file attached.', '/local/path/song.mp3']

# 发送邮件
yag.send('biankm_xx@163.com', 'subject', contents)

 

三、数据处理

3.1.csv数据处理

csv文件的定义: 
逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。通常,所有记录都有完全相同的字段序列。
如一下格式:
27,20,14,15,14,12,94,64,37,1015,1013,1009,7,5,2,21,8,35,0.00,,,152
.csv文件可以直接用excel或者类似软件打开,样子都是我们常见的表格形式。

示例

import csv

fileName="csvtest.csv"
with open(fileName, "r", encoding="utf-8") as f:
    text = csv.reader(f)
    for i in text:
        print(i)
print("####"*10)
with open(fileName, "r", encoding="utf-8") as f:
    for i in f.readlines():
        print(i.split(","))

3.2.excel数据处理

python提供有第三方库来支持对excel的操作,python处理excel文件用的第三方模块库有xlrd、xlwt、xluntils和pyExcelerator,除此之外,python处理excel还可以用win32com和openpyxl模块。下面我们先安装第三方库
Pip  install xlrd
Pip  install  xlwt
Pip install  xluntils
Pip install pyExcelerator
Xlrd只能进行读取excel文件,没法进行写入文件,xlwt可以写入文件,但是不能在已有的excel的文件上进行修改,如果有这个需求,就需要使用xluntils模块了,pyExcelerator模块与xlwt类似,也可以用来生成excel文件

3.2.1. xlrd模块

示例1:

import xlrd

def readExcel():
    data = xlrd.open_workbook('test.xlsx')
    table = data.sheets()[0] # 打开第一张表
    nrows = table.nrows # 获取表的行数
    for i in range(nrows): # 循环逐行打印
        print(table.row_values(i))#通过row_values来获取每行的值

readExcel()

示例2:

读取单表文件复杂例子:
# 打开一个workbook
workbook = xlrd.open_workbook('testdata.xlsx')
# 抓取所有sheet页的名称
worksheets = workbook.sheet_names()
print(workbook.sheets())
print('worksheets is {0}'.format(worksheets))
# 定位到sheet1
# worksheet1 = workbook.sheet_by_name(u'Sheet1')
worksheet1 = workbook.sheets()[1]
"""
#通过索引顺序获取
worksheet1 = workbook.sheets()[0]
"""
"""
#遍历所有sheet对象
for worksheet_name in worksheets:
worksheet = workbook.sheet_by_name(worksheet_name)
"""
# 遍历sheet1中所有行row
num_rows = worksheet1.nrows
for curr_row in range(num_rows):
    row = worksheet1.row_values(curr_row)
    print('row%s is %s' % (curr_row, row))
# 遍历sheet1中所有列col
num_cols = worksheet1.ncols
for curr_col in range(num_cols):
    col = worksheet1.col_values(curr_col)
    print('col%s is %s' % (curr_col, col))
# 遍历sheet1中所有单元格cell
for rown in range(num_rows):
    for coln in range(num_cols):
        cell = worksheet1.cell_value(rown, coln)
        print(cell)

3.2.2. xlwt模块

示例1

'''
写入excel文件
'''
import xlwt
#创建workbook和sheet对象
workbook=xlwt.Workbook()#注意Workbook的开头W要大写
sheet1=workbook.add_sheet('sheet1',cell_overwrite_ok=True)
sheet2=workbook.add_sheet('sheet2',cell_overwrite_ok=True)
sheet3=workbook.add_sheet('sheet3',cell_overwrite_ok=True)

#向sheet页中写入数据
sheet1.write(0,0,'this should overwrite1')
sheet1.write(0,1,'xlwt write test')
sheet2.write(0,0,'this should overwrite2')
sheet2.write(1,2,'bbbbbbbbbbbbb')

#-----------使用样式-----------------------------------
#初始化样式
style = xlwt.XFStyle()
#为样式创建字体
font = xlwt.Font()
font.name = 'Times New Roman'
font.bold = True
#设置样式的字体
style.font = font
#使用样式
sheet3.write(0,1,'some bold Times text',style)

#保存该excel文件,有同名文件时直接覆盖
workbook.save('test2.xls')
print('创建excel文件完成!')

示例2:EXCLE处理超链接

import codecs

import xlwt
book=xlwt.Workbook()
sheet_index=book.add_sheet('index')
line=0
for i in range(9):
    link='HYPERLINK("{0}.txt","{1}_11111")'.format(i,i)
    sheet_index.write(line,0,xlwt.Formula(link))
    line += 1
book.save('simple2.xls')
#设置超链接所指向的文件
for i in range(9):
    file = str(i)+".txt"
    with codecs.open(file,'w') as f:
        f.write(str(i)*10)

3.2.3. xlutils模块

示例:

#打开一个workbook
import xlrd
import xlutils.copy

rb=xlrd.open_workbook('aaa111.xls')
wb=xlutils.copy.copy(rb)
#获取sheet对象,通过sheet_by_index()获取的sheet对象没有
ws=wb.get_sheet(0)
#写入数据
ws.write(2,2,'changed')

#添加sheet页
wb.add_sheet('sheettest02',cell_overwrite_ok=True)

#利用保存时同名覆盖达到修改excel文件的目的,注意未被修改的内容保持不变
wb.save('aaa111.xls')

Python进行修改excel文件

sv文件的定义:

逗号分隔值(Comma-Separated ValuesCSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进字那样被解读的数据。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。通常,所有记录都有完全相同的字段序列。

如一下格式:

27,20,14,15,14,12,94,64,37,1015,1013,1009,7,5,2,21,8,35,0.00,,,152

.csv文件可以直接用excel或者类似软件打开,样子都是我们常见的表格形式。

件的定义:

逗号分隔值(Comma-Separated ValuesCSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。通常,所有记录都有完全相同的字段序列。

如一下格式:

27,20,14,15,14,12,94,64,37,1015,1013,1009,7,5,2,21,8,35,0.00,,,152

.csv文件可以直接

 

 

转载于:https://my.oschina.net/u/3865353/blog/1826960

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值