一、简单邮件传输协议(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: 无法发送邮件")
我们使用三个引号来设置邮件信息,标准邮件需要三个头部信息: From, To, 和 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 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或者类似软件打开,样子都是我们常见的表格形式。
件的定义:
逗号分隔值(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文件可以直接