用python搭建邮箱,自动收发邮箱

it2026-04-08  2

搭建邮件日报实战

1、我们需要一个开源的Linux系统

然后通过shell脚本,自动生成要发送的内容

2、我们通过python 编写邮件发送程序

发送邮件的协议是SMTP,首先我们先到邮箱的设置页面开启我们的服务

发送邮箱

# -*- coding: utf-8 -*- from email.mime.text import MIMEText from email.header import Header from smtplib import SMTP_SSL import xlrd import sys def send_mail(receiver): host_server = 'smtp.qq.com' # QQ邮箱的SMTP服务器 sender_qq = '960751327' # 发件人的QQ号码 pwd = '*******' # QQ邮箱的授权码 sender_qq_mail = '960751327@qq.com' # 发件人邮箱地址 data = xlrd.open_workbook('filename.xlsx') # 打开文件 table = data.sheets()[0] content = [] content = table.row_values(0) mail_content = str(content[0]) + ' ' + str(content[1]) + ' ' + str(content[2]) + ' ' + str(content[3]) # 邮件正文内容 mail_title = '测试文件' # 设置邮件标题 smtp = SMTP_SSL(host_server) # SSL 登录 smtp.set_debuglevel(0) # set_debuglevel()是用来调试的。参数值为1表示开启调试模式,参数值为0关闭调试模式 smtp.ehlo(host_server) # 连接服务器 smtp.login(sender_qq, pwd) # 邮箱登录 msg = MIMEText(mail_content, "plain", 'utf-8') # 填写正文内容 msg["Subject"] = Header(mail_title, 'utf-8') # 填写邮件标题 msg["From"] = sender_qq_mail # 发送者邮箱地址 msg["To"] = receiver # 接收者邮件地址 try: smtp.sendmail(sender_qq_mail, receiver, msg.as_string()) # 发送邮件函数 smtp.quit() # 发送邮件结束 print("Successfully Send!") # 输出成功标志 except: print("The sever is busy,please continue later.") if __name__ == "__main__": try: receiver = sys.argv[1] except: receiver = '313281592@qq.com' # 收件人邮箱地址 send_mail(receiver) # 调用函数,发送邮件

接收邮箱

import poplib # 解析邮件 from email.parser import Parser from email.header import decode_header from email.utils import parseaddr # 解析消息头中的字符串 # 没有这个函数,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'] ''' From: "=?gb18030?B?anVzdHpjYw==?=" <justonezcc@sina.com> To: "=?gb18030?B?ztLX1Ly6tcTTys/k?=" <392361639@qq.com> Subject: =?gb18030?B?dGV4dMTjusM=?= ''' # 如上述样式,均需要解码 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 + ' < ' + 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(msg): for part in msg.walk(): filename = part.get_filename() if filename != None: # 如果存在附件 filename = decode_str(filename) # 获取的文件是乱码名称,通过一开始定义的函数解码 data = part.get_payload(decode=True) # 取出文件正文内容 # 此处可以自己定义文件保存位置 path = filename f = open(path, 'wb') f.write(data) f.close() print(filename, 'download') 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) # get_file(msg) if __name__ == '__main__': email = '960751327@qq.com' password = '********' server = poplib.POP3_SSL('pop.qq.com') server.user(email) server.pass_(password) # 登录的过程 resp, mails, octets = server.list() index = len(mails) # 邮件的总数 # 此处的循环是取最近的几封邮件 for i in range(index - 2, index + 1): resp, lines, octets = server.retr(i) # 取邮件 msg_content = b'\r\n'.join(lines).decode('utf-8', 'ignore') msg = Parser().parsestr(msg_content) # http-server.dele(index) 删除邮件 get_header(msg) get_file(msg) get_content(msg) server.quit()

当我们在发送的过程遇到一些问题要怎么解决

发送含正文同时含附件的邮件

当我们在发送的过程遇到一些问题要怎么解决

最新回复(0)