以下通过python3 实现接收和发送邮件,网上相关说明文档很多。请自己查阅,这里只写入代码,

# 实例:通过poplib 模块接收指定账号的邮件并进行解码处理,结果可视化。

#!/opt/python3/bin/python3
# _*_ coding:utf-8 _*_
# Author: Yong import smtplib
import email as pop_email
from email.parser import Parser
from email.mime.text import MIMEText
from email.utils import formataddr, parseaddr
from email.header import decode_header
import email, poplib, sys # 接收邮件
def decode_str(s):
'''进行消息解码'''
value, charset = decode_header(s)[0]
# decode_header()返回一个list,因为像Cc、Bcc这样的字段可能包含多个邮件地址,所以解析出来的会有多个元素。上面的代码我们偷了个懒,只取了第一个元素。
if charset:
value = value.decode(charset)
return value def guess_charset(msg):
'''返回字符编码'''
content_type = msg.get('Content-Type', '').lower()
pos = content_type.find('charset=')
if pos >= 0:
charset = content_type[pos + 8:].strip()
return charset def pop_mail(pop_server, logname, logpwd):
'''进行接收邮件'''
tmp_list = []
mail_file = open('mail.txt', 'w', encoding='utf-8')
pop_obj = poplib.POP3(pop_server, 110)
try:
pop_obj.user(logname)
pop_obj.pass_(logpwd)
status, mail_list, oct = pop_obj.list()
for i in mail_list: # 根据邮件索引ID,循环每一个邮件
tmp_dict = {} # 临时存储每一个邮件,格式{'From':'', 'To':'', 'Subject':'', 'content':''}
content_list = pop_obj.retr(bytes.decode(i.split()[0])) # 根据索引ID,提取邮件内容
msg_content = '\n '.join([bytes.decode(text) for text in content_list[1]])
msg = Parser().parsestr(msg_content)
# 进行邮件头信息的提取
for head in ['From','To','Subject']:
value = msg.get(head, '') # 获取指定头的内容
if value:
if head == 'Subject':
mess_value = decode_str(value) # 对主题进行解码
else:
hdr, addr = parseaddr(value) # 获取发件人和接收人的名称和邮箱地址
hdr = decode_str(hdr)
addr = decode_str(addr)
mess_value = '%s <%s>' % (hdr, addr)
tmp_dict[head] = mess_value # 添加到临时字典
# 进行邮件正文内容的提取
if msg.is_multipart(): # 带附件的内容
for part in msg.walk():
if part.get_content_type() == 'text/plain': # 只提取内容正文,不提取附件等其他信息
charset = part.get_charsets()[0] # 获取内容字符集
body = part.get_payload(decode=True) # 获取内容(编码前的)
if charset:
content = body.decode(charset) # 对内容进行解码
else:
content = body # 未解码的直接提取内容
else: # 不带附件的内容
content_type = msg.get_content_type() # 获取内容类型
if content_type == 'text/plain' or content_type == 'text/html':
content = msg.get_payload(decode=True) # 提取内容
charset = guess_charset(msg) # 提取字符集
if charset:
content = content.decode(charset) # 对内容进行解码
else:
content = 'nofound:text/plain,text/html' # 类型没有匹配到
tmp_dict['content'] = content # 添加到临时字典
tmp_list.append(tmp_dict) # 将一封邮件进行处理后,添加到一个列表
pop_obj.quit() # 关闭POP连接
# 循环提取每一份邮件,进行写到文档中
for data in tmp_list:
mail_info = '''
发送者:%s
接收者:%s
主题:%s
内容:
%s
''' % (data['From'].strip(), data['To'].strip() if 'To' in data else '群发邮件', data['Subject'].strip(), data['content'].strip())
mail_file.write(mail_info + '\n')
mail_file.close()
except poplib.error_proto as e:
print('pop Error:', e) if __name__ == '__main__':
'''输出文件mail.txt'''
pop = '接收服务器域名'
name = '登录名'
pwd = '登录密码'
pop_mail(pop, name, pwd)

# 实例:发送邮件

import smtplib
import email as pop_email
from email.parser import Parser
from email.mime.text import MIMEText
from email.utils import formataddr, parseaddr
from email.header import decode_header
import email, poplib, sys def sendmail(message, sendmail_server, logname, logpwd, to_mailer):
# to_mailer 为接收者邮件列表
msg = MIMEText(message, 'plain', 'utf-8')
msg['From'] = formataddr(['管理员(显示的名称)', 'from_mail@aaaa']) # 邮件接收后,发件人显示的名称和邮箱
msg['To'] = formataddr(['jojo', 'to_mail@bbbbb']) # 邮件接收后,收件人显示的名称和邮箱
msg['Subject'] = 'python test'
try:
server = smtplib.SMTP('sendmail_server', 25)
server.login('logname', 'logpwd')
server.sendmail('logname', to_mailer, msg.as_string())
print('邮件发送成功')
server.quit()
except smtplib.SMTPException as e:
print('Error:', e)

 

实例:实现指定邮箱自动接收且进行自动匹配字典库关键字进行回复,对读取过的邮件有记录功能不再进行处理,测试代码如下:

#!/opt/python3/bin/python3
# _*_ coding:utf-8 _*_
# Author: Yong import smtplib
import email as pop_email
from email.parser import Parser
from email.mime.text import MIMEText
from email.utils import formataddr, parseaddr
from email.header import decode_header
import email, poplib, sys, os
import json # 发送邮件
def sendmail(message, sendmail_server, logname, logpwd, to_mailer, sub):
# to_mailer 为接收者邮件列表
msg = MIMEText(message, 'plain', 'utf-8')
msg['From'] = formataddr(['赵勇', logname]) # 邮件接收后,发件人显示的名称和邮箱
msg['To'] = formataddr([to_mailer[0], to_mailer[1].strip('>')]) # 邮件接收后,收件人显示的名称和邮箱
msg['Subject'] = sub
msg['Accept-Language'] = 'zh-CN'
msg['Accept-Charset'] = 'ISO-8859-1, utf-8'
try:
server = smtplib.SMTP(sendmail_server, 25)
server.login(logname, logpwd)
server.sendmail(logname, to_mailer, msg.as_string())
print('邮件发送成功')
server.quit()
except smtplib.SMTPException as e:
print('Error:', e) # 接收邮件
def decode_str(s):
'''进行消息解码'''
value, charset = decode_header(s)[0]
# decode_header()返回一个list,因为像Cc、Bcc这样的字段可能包含多个邮件地址,所以解析出来的会有多个元素。上面的代码我们偷了个懒,只取了第一个元素。
if charset:
value = value.decode(charset)
return value def guess_charset(msg):
'''返回字符编码'''
content_type = msg.get('Content-Type', '').lower()
pos = content_type.find('charset=')
if pos >= 0:
charset = content_type[pos + 8:].strip()
return charset def pop_mail(pop_server, logname, logpwd):
'''进行接收邮件'''
if os.path.isfile(save_file):
with open(save_file) as f:
index_list = json.load(f)
else:
index_list = []
pop_obj = poplib.POP3(pop_server, 110)
try:
mail_index = []
pop_obj.user(logname)
pop_obj.pass_(logpwd)
status, mail_list, oct = pop_obj.list()
for i in mail_list: # 根据邮件索引ID,循环每一个邮件
tmp_dict = {} # 临时存储每一个邮件,格式{'From':'', 'To':'', 'Subject':'', 'content':''}
i = bytes.decode(i)
if i in index_list:
continue
else:
index_list.append(i)
content_list = pop_obj.retr(i.split()[0]) # 根据索引ID,提取邮件内容
# content_list = pop_obj.retr(i) # 根据索引ID,提取邮件内容
msg_content = '\n'.join([bytes.decode(text) for text in content_list[1]])
msg = Parser().parsestr(msg_content)
# 进行邮件头信息的提取
for head in ['From','To','Subject']:
value = msg.get(head, '') # 获取指定头的内容
if value:
if head == 'Subject':
mess_value = decode_str(value) # 对主题进行解码
else:
hdr, addr = parseaddr(value) # 获取发件人和接收人的名称和邮箱地址
hdr = decode_str(hdr)
addr = decode_str(addr)
mess_value = '%s <%s>' % (hdr, addr) tmp_dict[head] = mess_value # 添加到临时字典
# 进行邮件正文内容的提取
if msg.is_multipart(): # 带附件的内容
for part in msg.walk():
if part.get_content_type() == 'text/plain': # 只提取内容正文,不提取附件等其他信息
charset = part.get_charsets()[0] # 获取内容字符集
body = part.get_payload(decode=True) # 获取内容(编码前的)
if charset:
content = body.decode(charset) # 对内容进行解码
else:
content = body # 未解码的直接提取内容
else: # 不带附件的内容
content_type = msg.get_content_type() # 获取内容类型
if content_type == 'text/plain' or content_type == 'text/html':
content = msg.get_payload(decode=True) # 提取内容
charset = guess_charset(msg) # 提取字符集
if charset:
content = content.decode(charset) # 对内容进行解码
else:
content = 'nofound:text/plain,text/html' # 类型没有匹配到
tmp_dict['content'] = content # 添加到临时字典
mail_index.append(tmp_dict)
pop_obj.quit()
with open(save_file, 'w') as f:
f.write(json.dumps(index_list))
return mail_index except poplib.error_proto as e:
print('pop Error:', e) if __name__ == '__main__':
custom_dict = {
'名字': '勇',
'年龄': 38,
'性别': '汉'
}
smtp = 'smtp.263xmail.com'
pop = 'pop.263xmail.com'
name = 'xxx@xxx.com'
pwd = 'xxx'
save_file = 'mail_save.json'
pop_content = pop_mail(pop, name, pwd)
if len(pop_content) == 0:
exit('当前没有新邮件')
for mail in pop_content:
mail_info = '''
————————————————————————————————————————————————
发送者:%s
接收者:%s
主题:%s
内容:
%s
''' % (mail['From'].strip(), mail['To'].strip() if 'To' in mail else '群发邮件', mail['Subject'].strip(), mail['content'].strip()) to_mail = mail['From'].split('<')
sub = 'To: %s' % mail['Subject']
for key,value in custom_dict.items():
if key in mail['content']:
mess = str(value) + '\n\n\n' + mail_info
break
else:
mess = '没有匹配到字典数据,请自定义'
sendmail(mess, smtp, name, pwd, to_mail, sub)

  

python3 - pop 接收邮件/ smtp 发送邮件的更多相关文章

  1. 吴裕雄--天生自然 PYTHON3开发学习:SMTP发送邮件

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

  2. Python 用POP接收邮件

    一.简介 POP(Post Office Protocal)最长用的POP版本是POP3,因此本文是以POP3为主.POP3非常简单,可以用来从邮件服务器上下载邮件,然后删除这些邮件.功能非常有限,后 ...

  3. Python中使用SMTP发送邮件以及POP收取邮件

    假设我们自己的电子邮件地址是from@163.com,对方的电子邮件地址是to@sina.com(这里的地址虚拟的),现在我们用Outlook或者Foxmail之类的软件写好邮件,填上对方的Email ...

  4. python3:利用smtplib库和smtp.qq.com邮件服务器发送邮件

    python3:利用smtplib库和smtp.qq.com邮件服务器发送邮件 使用qq的邮件服务器需要注意的两个地方主要是: 1.协议问题 使用465端口 SSL 协议 2.口令问题 出现SMTPA ...

  5. Python3 SMTP发送邮件

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式. python的smtplib提供了一 ...

  6. python3使用SMTP发送邮件

    环境:python3 ,IDE : pycharm 非常奇怪的是,用163发送邮件,如果电脑连校园网发送,会被当成垃圾邮件拒绝 如果用手机开热点就可以正常发送 代码如下 #!/usr/bin/pyth ...

  7. 吴裕雄--天生自然python学习笔记:Python3 SMTP发送邮件

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式. python的smtplib提供了一 ...

  8. 通过Java发送邮件和接收邮件的工具类

    一.第一种 使用SMTP协议发送电子邮件 第一步:加入mail.jar包 (1)简单类型 package com.souvc.mail; import java.util.Date; import j ...

  9. 常用邮件 smtp pop

    常用的邮箱服务器(SMTP.POP3)地址.端口  sina.com: POP3服务器地址:pop3.sina.com.cn(端口:110) SMTP服务器地址:smtp.sina.com.cn(端口 ...

随机推荐

  1. 01将图片嵌入到Markdown文档中

    将图片内嵌入Markdown文档中 将图片嵌入Markdown文档中一直是一个比较麻烦的事情.通常的做法是将图片存入本地某个路径或者网络存储空间,使用URL链接的形式插入图片: ![image][ur ...

  2. vue.js笔记1.0

    事件: 事件冒泡行为: 1.@click="show($event)" show:function (ev) { ev.cancelBubble=true; } 2.@click. ...

  3. Python学习笔记:PyInstaller(exe程序打包)

    PyInstaller可以将Python程序打包成一个exe程序来独立运行,用户使用时只需要执行这个exe文件即可,不需要在机器上再安装Python及其他包就可运行了.另外,PyInstaller相较 ...

  4. Python学习笔记:re模块(正则表达式)

    本文是部分内容参考自:http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html,虽然这篇博客是基于Python2.4的老版本,但是基础的P ...

  5. 打印机增强软件pdfpro

     http://3dx.pc6.com/gm1/pdfpro.zip    

  6. [转] vuex最简单、最直白、最全的入门文档

    前言 我们经常用element-ui做后台管理系统,经常会遇到父组件给子组件传递数据,下面一个简单的例子,点击按钮,把弹框显示变量数据通过子组件的props属性传递,子组件通过$emit事件监听把数据 ...

  7. 程序员是天生的软件UI设计师

    一个软件项目,谁才是软件开发的主体,是软件UI设计师?还是程序员? 这还用问吗?当然是程序员拉.引用以下alienbat知友的一段评论:对于软件开发而言,码农的工作是必需的.设计师的工作是可选的. 举 ...

  8. webdriver高级应用- 启动FireFox的同时打开Firebug

    1. 首先本机Firefox浏览器需要安装一下firebug插件,具体怎么安装这里不赘述,网上教程很多. 2. 具体自动化实现的代码如下: #encoding=utf-8 from selenium ...

  9. 大数据学习——sparkRDD

    https://www.cnblogs.com/qingyunzong/p/8899715.html 练习1:map.filter //通过并行化生成rdd val rdd1 = sc.paralle ...

  10. 一个关于python装饰器参数的问题

    看到廖雪峰python教程上,python装饰器一章 https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3 ...