Download as pdf or txt
Download as pdf or txt
You are on page 1of 5

第⼆⼗三章 邮件的⾃动收发

⾃动收发协议
. POP3
. SMTP

创建 POP3 客户端的使⽤⽅法
POP3_SSL(hostname, port=995, keyfile, certfile, context)
#返回客户端对象

登录邮箱
import poplib
mailpop = poplib.POP3_SSL('pop.sina.com') #POP3 服务器地址
a = mailpop.user('chaoxiangedu@sina.com') #账户名
b = mailpop.pass_('1bc9624d4ec512a9') #授权码
print(a,'\n',b,'\n',mailpop)

获取邮箱中的邮件
import poplib
mailpop = poplib.POP3_SSL('pop.sina.com')
mailpop.user('chaoxiangedu@sina.com')
mailpop.pass_('1bc9624d4ec512a9')
a = mailpop.list(2) #返回邮件对象 open ⽂件
print(a)

获取邮件内容 (⽹⻚形式)
import poplib
mailpop = poplib.POP3_SSL('pop.sina.com')
mailpop.user('chaoxiangedu@sina.com')
mailpop.pass_('1bc9624d4ec512a9')
mail = mailpop.retr(3)
print(mail)
#包含 3 部分的数据内容。
# 第 1 部分表示邮件对象获取成功及⽂件内容⼤⼩
# 第 2 部分为邮件的信息, 邮件信息为⼀个列表类型(其中⼜包含了 2 部分, 第 1 部分为邮件接收信息; 邮箱服务器的 MID,
邮件类型, 内容类型, 邮件摘要, 邮件接收⼈和邮件发送⼈信息等. 第 2 部分为邮件主体部分)
#第 3 部分为邮件内容的字节总数

下载邮件内容
import poplib
mailpop = poplib.POP3_SSL('pop.sina.com')
mailpop.user('chaoxiangedu@sina.com')
mailpop.pass_('1bc9624d4ec512a9')
mail = mailpop.retr(1)[1]
f= open('邮件.html','wb')
for line in mail:
f.write(line)
f.close()

解析邮件头信息
要求: 通过头部信息获取发件⼈信息

import poplib
import re
mailpop = poplib.POP3_SSL(host='pop.sina.com')
mailpop.user(user='chaoxiangedu@sina.com')
mailpop.pass_( pswd='89a4becf383cfd42')
2
a = mailpop.list()
1
for i in range(1,len(a[1])+1):
mail = mailpop.retr(which=str(i))[1]
for line in mail:
if 'X-Sender:' in str(line):
print(re.findall('X-Sender: (.+)\'', str(line)))
break
if 'From:' in str(line):
print(re.findall('From: .+<(.+)>', str(line)))
break

邮件发送
SMTP_SSL(host, port=25, local_hostname)

登录邮件
import smtplib
mailsmtp = smtplib.SMTP_SSL('smtp.sina.com')
mailsmtp.login('chaoxiangedu@sina.com', '1bc9624d4ec512a9')
print(mailsmtp)

邮件发送
sendmail(from_addr, to_addrs, msg)
#参数 msg 的数据类型为 str

邮件发送的内容
使⽤ email 库
格式:
. MIME(多功能因特⽹邮政扩展程序) 格式
. RFC2822 格式
#MIME 消息由邮件头和邮件体组成

创建邮件内容
MIMITEXT(_text, _subtype, _charset)

发送邮件
import smtplib
from email.mime.text import MIMEText
mailsmtp = smtplib.SMTP_SSL('smtp.sina.com')
mailsmtp.login('chaoxiangedu@sina.com', '1bc9624d4ec512a9')
msg = MIMEText('学习邮件发送', 'plain', 'utf-8')
msg['Subject'] = 'Python 办公⾃动化' #添加邮件主题
msg['from'] = 'chaoxiangedu@sina.com' #添加邮件发送⼈

mailsmtp.sendmail('chaoxiangedu@sina.com', '13672090629@sina.cn', msg.as_string())


#参数 msg.as_string() 表示以字符串形式返回整个格式化消息

邮件附件
⽂本附件
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
mailsmtp = smtplib.SMTP_SSL('smtp.sina.com')

mailsmtp.login('chaoxiangedu@sina.com', '1bc9624d4ec512a9')
meg = MIMEMultipart() #构建⼀个多模块邮件对象
meg.attach(MIMEText('正在学习邮件收发', 'plain', 'utf-8'))
meg['From'] = 'chaoxiangedu@sina.com'
meg['Subject'] = 'Python 办公⾃动化'
att1 = MIMEText(open('a.txt', 'rb').read(), 'plain', 'utf-8')
att1["Content-Disposition"] = 'attachment; filename="a.txt"'#attachment 表示以附件的形式
meg.attach(att1)
mailsmtp.sendmail('chaoxiangedu@sina.com', '13672090629@sina.cn', meg.as_string())

⽂件附件
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication

mailsmtp = smtplib.SMTP_SSL('smtp.sina.com')
mailsmtp.login('chaoxiangedu@sina.com', '1bc9624d4ec512a9')
meg = MIMEMultipart() #构建⼀个多模块邮件对象
meg['From'] = 'chaoxiangedu@sina.com'
meg['Subject'] = 'Python 办公⾃动化'
meg.attach(MIMEText('正在学习邮件收发', 'plain', 'utf-8'))
att1 = MIMEApplication(open('实验 3.docx', 'rb').read())
att1["Content-Disposition"] = 'attachment; filename="shiyan3.docx"' #不⽀持中⽂显示
meg.attach(att1)

mailsmtp.sendmail('chaoxiangedu@sina.com', '13672090629@sina.cn', meg.as_string())

图⽚附件
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
mailsmtp = smtplib.SMTP_SSL('smtp.sina.com')
mailsmtp.login('chaoxiangedu@sina.com', '1bc9624d4ec512a9')
meg = MIMEMultipart()
meg['From'] = 'chaoxiangedu@sina.com'
meg['Subject'] = 'Python 办公⾃动化'
meg.attach(MIMEText('正在学习邮件收发', 'plain', 'utf-8'))
att1 = MIMEImage(_imagedata = open('识图.jpg','rb').read())
att1["Content-Disposition"] = 'attachment; filename="shitu.jpg"'
meg.attach(att1)

mailsmtp.sendmail('chaoxiangedu@sina.com', '13672090629@sina.cn', meg.as_string())

批量发送⽂件项⽬
import os
import docx
import re
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

mailsmtp = smtplib.SMTP_SSL('smtp.sina.com')
mailsmtp.login('chaoxiangedu@sina.com', '1bc9624d4ec512a9')
meg = MIMEMultipart()
meg['From'] = 'chaoxiangedu@sina.com'
meg['Subject'] = 'Python 办公⾃动化'
for file_name in os.listdir('./ 数据 3'):
file_adr = './ 数据 3/'+ file_name
docD = docx.Document(file_adr)
result = re.findall('地址:(.+)',docD.paragraphs[0].text)
meg.attach(MIMEText('请您查收汽⻋⽂档说明书', 'plain', 'utf-8'))
att = MIMEText(open(file_adr, 'rb').read(), 'base64', 'utf-8')
meg.attach(att)
mailsmtp.sendmail('chaoxiangedu@sina.com', result[0], meg.as_string())
meg._payload.clear()

批量发送薪⽔单项⽬
import os
import openpyxl
import smtplib
import time
from email.mime.text import MIMEText
for file_name in os.listdir('./ 数据 3/ ⼯资'): #遍历⽂件夹中的所有⽂件
file_adr = './ 数据 3/ ⼯资 /'+ file_name #获取每个⽂件的地址
wb = openpyxl.load_workbook(file_adr) #读取每个 excel ⽂件
wb_sheet = wb.active #获取⼯作表
for i in range(wb_sheet.min_row+1,wb_sheet.max_row+1):#遍历⼯作表中存在数据的每⼀⾏
sub = '{} 本⽉的⼯资单'.format(wb_sheet['A'+str(i)].value)#员⼯姓名
info = '{} 您好:\n 这是本⽉的⼯资单明细:'.format(wb_sheet['A'+str(i)].value)
for j in range(wb_sheet.min_column,wb_sheet.max_column):#遍历⼯作表中存在数据的每⼀列
j = openpyxl.utils.get_column_letter(j) #获取列号
print(wb_sheet[j+str(i)].value)
if wb_sheet[j+'1'].value == '邮箱地址': #找到邮箱地址单元格
addr = wb_sheet[j+str(i)].value #获取单元格为 ij 的内容
continue
info += '{}:{}\t'.format(wb_sheet[j+'1'].value,wb_sheet[j+str(i)].value) #其它信息
print(sub)
print(info)
print(addr)
mailsmtp = smtplib.SMTP_SSL('smtp.sina.com')
mailsmtp.login('chaoxiangedu@sina.com', '1bc9624d4ec512a9')
msg = MIMEText(info, 'plain', 'utf-8')
msg['Subject'] = sub
msg['from'] = 'chaoxiangedu@sina.com'
mailsmtp.sendmail('chaoxiangedu@sina.com', addr, msg.as_string())
mailsmtp.close()
time.sleep(3)
wb.close()

You might also like