以下通过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. Eclipse上进行java web项目的打包

    以下是一个基于maven搭建的Spring Boot项目的目录结构 版权声明:本文为博主原创文章,未经博主允许不得转载. 原文地址: https://www.cnblogs.com/poterliu/ ...

  2. Python基础——赋值机制

    使用id()函数用于获取对象的内存地址. 使用is来判断是不是指向同一个内存. 把一个对象赋值给另一个对象,两个对象都指向同一个内存地址. test=1000 test1=test id(test) ...

  3. SQL防止重复提交和Filter

    /class User package com.neuedu.bean; import java.io.Serializable; public class User implements Seria ...

  4. LeetCode(260) Single Number III

    题目 Given an array of numbers nums, in which exactly two elements appear only once and all the other ...

  5. NordicSemiconductor.nRF_DeviceFamilyPack 更新历史记录

    Version: 8.17.0 (2018-04-27) NordicSemiconductor.nRF_DeviceFamilyPack.8.17.0.packDownload For nRF528 ...

  6. Git命令大总结(纯手办)

    Git完整命令手册地址:http://git-scm.com/docs PDF版命令手册地址:github-git-cheat-sheet.pdf 1.git config -l查看全局用户信息配置 ...

  7. 关于前台jsp页面的js取值问题

    在后程序中传一个字符串到前台页面上,后台代码model.addAttribute("ccc", "cccc"); 在页面js上用下面两种方法取值 1. var ...

  8. JAVA、JDK等入门概念,下载安装JAVA并配置环境变量

    一.概念 Java是一种可以撰写跨平台应用程序的面向对象的程序设计语言,具体介绍可查阅百度JAVA百科,这里不再赘述. Java分为三个体系,分别为: Java SE(J2SE,Java2 Platf ...

  9. HDU 5525 Product 数论

    题意: 给出一个长度为\(n(1 \leq n \leq 10^5)\)的序列\(A_i\),\(N=\prod\limits_{i=1}^{n}i^{A_i}\).求\(N\)的所有约数的乘积. 分 ...

  10. jenkins 之 Android 打包及上传至蒲公英

    准备条件 iMAC,非必须(如果是 安卓 和 苹果 可以在同一台电脑上打包则要 Mac OS 系统的电脑,如果是只是给安卓打包 windows 电脑也是可以的, window 下 需要把 ls 换成 ...