python自动收邮件_Python在工作中的应用——自动发送和收取邮件

导入相关库

import smtplib,ssl

from email.mime.multipart import MIMEMultipart

from email.mime.base import MIMEBase

from email.mime.text import MIMEText

from email.utils import formatdate

from email import encoders

import poplib

from email.parser import Parser

from email.header import decode_header

from email.utils import parseaddr

from email.header import Header

#解析消息头中的字符串,没有这个函数,print出来的会使乱码的头部信息。如'=?gb18030?B?yrXWpL3hufsueGxz?='这种,通过decode,将其变为中文

def decode_str(s):

value, charset = decode_header(s)[0]

if charset:

value = value.decode(charset)

return value

#解码邮件信息分为两个步骤,第一个是取出头部信息:首先取头部信息,主要取出['From','To','Subject']

def get_header(msg):

for header in ['From', 'To', 'Subject']:

value = msg.get(header, '')

if value:

if header == 'Subject': #文章的标题有专门的处理方法

value = decode_str(value)

elif header in ['From','To']:

hdr, addr = parseaddr(value) #地址也有专门的处理方法

name = decode_str(addr)

value=name

print(header + ':' + value)

#头部信息已取出,获取邮件的字符编码,首先在message中寻找编码,如果没有,就在header的Content-Type中寻找

def guess_charset(msg):

charset = msg.get_charset()

if charset is None:

content_type = msg.get('Content-Type', '').lower()

pos = content_type.find('charset=')

if pos >= 0:

charset = content_type[pos+8:].strip()

return charset

#邮件正文部分:取附件,邮件的正文部分在生成器中,msg.walk(),如果存在附件,则可以通过.get_filename()的方式获取文件名称

def get_file(path, msg):

for part in msg.walk():

filename=part.get_filename()

if filename!=None: #如果存在附件

filename = decode_str(filename) #获取的文件是乱码名称,通过一开始定义的函数解码

data = part.get_payload(decode = True) #取出文件正文内容

f = open(path+filename, 'wb') #此处可以自己定义文件保存位置

f.write(data)

f.close()

print('附件',filename,'下载成功')

def get_content(msg):

for part in msg.walk():

content_type = part.get_content_type()

charset = guess_charset(part)

if part.get_filename()!=None: #如果有附件,则直接跳过

continue

email_content_type = ''

content = ''

if content_type == 'text/plain':

email_content_type = 'text'

elif content_type == 'text/html':

print('html 格式 跳过')

continue #不要html格式的邮件

email_content_type = 'html'

if charset:

try:

content = part.get_payload(decode=True).decode(charset)

except AttributeError:

print('type error')

except LookupError:

print("unknown encoding: utf-8")

if email_content_type =='':

continue #如果内容为空,也跳过

print(email_content_type + ' ----- ' + content)

# -------------------- 收取和发送邮件两个函数 --------------------------

def sent_email(from_addr,password, to_addrs,title,content,path=None):

'''

from_addr:发件人邮箱

password:发件人密码(如果是QQ或者网易邮箱,这里写授权码)

to_addrs:收件邮箱列表

title:邮件标题

content:邮件内容

path:如果需要发送附件,这里填写附件的路径

'''

smtp_server = 'smtp.'+ from_addr.split('@')[-1] # 发信服务器

msg = MIMEMultipart() # 创建一封空邮件

msg['From'] = Header(from_addr) # 添加邮件头信息

msg['Subject'] = Header(title) # 添加邮件标题

msg.attach(MIMEText(content,'plain','utf-8')) # 正文内容

if path != None:

# 添加附件

part = MIMEBase('application', "octet-stream")

part.set_payload(open(path, "rb").read()) # 读取附件

encoders.encode_base64(part)

part.add_header('Content-Disposition', 'attachment', filename=path.split('/')[-1])

msg.attach(part) # 把附件添加到邮件中

server = smtplib.SMTP_SSL(smtp_server) # 开启发信服务,这里使用的是加密传输

server.connect(smtp_server,465) # 登录发信邮箱

for to_addr in to_addrs: # 遍历发送给每个账号

msg['To'] = Header(to_addr)

server.login(from_addr, password) # 发送邮件

server.sendmail(from_addr, to_addr, msg.as_string())

server.quit() # 关闭服务器

print('发送成功')

def get_email(email,password,path):

'''

email:邮箱地址

password:密码(如果是qq邮箱或者网易邮箱,这里填授权码)

path:附件保留的位置

'''

server=poplib.POP3_SSL('pop.'+email.split('@')[-1]) #修改对应的邮箱服务器

server.user(email)

server.pass_(password)

resp, mails, octets = server.list() #登录的过程

index = len(mails) #邮件的总数

resp, lines, octets = server.retr(index) #读取最近一封邮件

msg_content = b'\r\n'.join(lines).decode('utf-8','ignore')

msg = Parser().parsestr(msg_content)

#server.dele(index) 删除邮件

get_header(msg) # 显示邮件信息,包括发件人,收件人,标题

get_file(path,msg) # 保留附件

get_content(msg) # 显示文件内容

server.quit()

print('收取成功')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值