因为往来邮件量比较大,为了统计分析两年的变化情况,决定把邮件从Outlook读取并写入MySQL,然后通过Excel查询分析。这里分享一下完整的提取Email信息的思路和代码。

另外,如果不用数据库,也可以利用同样的思路直接保存到Excel文件,不过需要注意的是,每个单元格最多存储3.2万字符,一般也足够了。

第一步:创建数据库。

通过MySQL可视化客户端新建数据库,字符集选择utf8,字符集校对选择utf8_general_ci。

第二步:通过Python脚本创建数据表。

字段长度可以修改,需要考虑Email各种信息的不同长度,也需要注意字段类型的匹配。

比如发件人可能只需要很少字符,但邮件正文就可能几万的字符。

# -*- coding: utf-8 -*-

import pymysql

# 1.链接数据库(用户名和密码对应数据库访问user/password)

conn = pymysql.connect(

host='127.0.0.1',

port=3306,

user='xxxx',

passwd='xxxx',

db='myemail_zl',

charset='utf8')

def connect_mysql(conn):

# 判断链接是否正常

conn.ping(True)

# 建立操作游标

cursor=conn.cursor()

# 设置数据输入输出编码格式

cursor.execute('set names utf8')

return cursor

# 建立链接游标

cur=connect_mysql(conn)

# 2、添加数据库表头

# ID, 根级目录, 一级目录, 二级目录, 接收时间, 发件人, 收件人, 抄送人, 邮件主题, 邮件ID, 会话主题, 会话ID, 会话历史记录ID, 邮件内容

cur.execute('''CREATE TABLE IF NOT EXISTS email_box2 (

ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,

根级目录 VARCHAR(255),

一级目录 VARCHAR(255),

二级目录 VARCHAR(255),

接收时间 VARCHAR(100),

发件人 VARCHAR(200),

收件人 VARCHAR(2550),

抄送人 VARCHAR(2550),

邮件主题 VARCHAR(255),

邮件ID VARCHAR(255),

会话主题 VARCHAR(255),

会话ID VARCHAR(255),

会话历史记录ID VARCHAR(2550),

邮件内容 MEDIUMTEXT

) DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci''')

# 3、提交&关闭链接

conn.commit()

conn.close()

print ('Done!')

第三步:打开Outlook并运行如下代码,即可把指定的邮件信息写入连接的数据库。

1、这里只读取两级目录(如下图)。

若二级目录还有子项,则可参考读取二级目录的代码,另外,SQL语句/字段都需要改动。

2、说明:

>> 根级目录:Outlook绑定的邮箱账户名称,也可以是Outlook连接的邮件存档名称。

>> 一级目录:是与收件箱(Inbox)同级的目录;

>>二级目录:是一级目录的子目录,就是自建的二级文件夹。

# -*- coding: utf-8 -*-

import pymysql

from win32com.client.gencache import EnsureDispatch as Dispatch

# import win32com.client

# 连接MySQL

conn = pymysql.connect(

host='127.0.0.1',

port=3306,

user='xxxx',

passwd='xxxx',

db='myemail_zl',

charset='utf8')

def connect_mysql(conn):

#判断链接是否正常

conn.ping(True)

#建立操作游标

cursor=conn.cursor()

#设置数据输入输出编码格式

cursor.execute("SET NAMES UTF8")

return cursor

#建立链接游标

cur=connect_mysql(conn)

# SQL语句

insert_sql = 'insert into email_box2 (根级目录,一级目录,二级目录,接收时间,发件人,收件人,抄送人,邮件主题,邮件ID,会话主题,会话ID,会话历史记录ID,邮件内容) values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)'

# 连接Outlook

outlook = Dispatch("Outlook.Application")

mapi = outlook.GetNamespace("MAPI")

Accounts = mapi.Folders # 根级目录(邮箱名称,包括Outlook读取的存档名称)

for Account_Name in Accounts:

print(' >> 正在查询的帐户名称:',Account_Name.Name,'\n')

Level_1_Names = Account_Name.Folders # 一级目录集合(与inbox同级)

for Level_1_Name in Level_1_Names:

# 首先,向MySQL提交一级目录的邮件

print(' - 正在查询一级目录:' , Level_1_Name.Name)

Mail_1_Messages = Level_1_Name.Items # 一级文件夹的mail合集

for xx in Mail_1_Messages: # xx = 'mail' # 开始查看单个邮件的信息

Root_Directory_Name_1 = Account_Name.Name # 记录根目录名称

Level_1_FolderName_1 = Level_1_Name.Name # 记录一级目录名称

Level_2_FolderName_1 = '' # 一级目录肯定没有二级目录,顾留为空

if (hasattr(xx, 'ReceivedTime')):

ReceivedTime_1 = str(xx.ReceivedTime)[:-6] # 接收时间

else:

ReceivedTime_1 = ''

if (hasattr(xx, 'SenderName')): # 发件人

SenderName_1 = xx.SenderName

else:

SenderName_1 = ''

if (hasattr(xx, 'To')): # 收件人

to_to_1 = xx.To

else:

to_to_1 = ''

if (hasattr(xx, 'CC')): # 抄送人

cc_cc_1 = xx.CC

else:

cc_cc_1 = ''

if (hasattr(xx, 'Subject')): # 主题

Subject_1 = xx.Subject

else:

Subject_1 = ''

if (hasattr(xx, 'EntryID')): # 邮件MessageID

MessageID_1 = xx.EntryID

else:

MessageID_1 = ''

if (hasattr(xx, 'ConversationTopic')): # 会话主题

ConversationTopic_1 = xx.ConversationTopic

else:

ConversationTopic_1 = ''

if (hasattr(xx, 'ConversationID')): # 会话ID

ConversationID_1 = xx.ConversationID

else:

ConversationID_1 = ''

if (hasattr(xx, 'ConversationIndex')): # 会话记录相对位置

ConversationIndex_1 = xx.ConversationIndex

else:

ConversationIndex_1 = ''

if (hasattr(xx, 'Body')): # 邮件内容

EmailBody_1 = xx.Body

else:

EmailBody_1 = ''

# 写入MySQL

cur.execute(insert_sql, (Root_Directory_Name_1, Level_1_FolderName_1, Level_2_FolderName_1, ReceivedTime_1, SenderName_1, to_to_1, cc_cc_1, Subject_1, MessageID_1, ConversationTopic_1, ConversationID_1, ConversationIndex_1, EmailBody_1))

# 然后,判断当前查询的一级邮件目录是否有二级目录(若有多级目录,可以参考此段代码)

if Level_1_Name.Folders:

Level_2_Names = Level_1_Name.Folders # 二级目录的集合(比如,自建目录的子集)

for Level_2_Name in Level_2_Names:

print(' - - 正在查询二级目录:' , Level_1_Name.Name , '//' , Level_2_Name.Name)

Mail_2_Messages = Level_2_Name.Items # 二级目录的邮件集合

for yy in Mail_2_Messages: # xx = 'mail' # 开始查看单个邮件的信息

Root_Directory_Name_2 = Account_Name.Name # 记录根目录名称

Level_1_FolderName_2 = Level_1_Name.Name # 记录一级目录名称

Level_2_FolderName_2 = Level_2_Name.Name # 记录二级目录名称

if (hasattr(yy, 'ReceivedTime')):

ReceivedTime_2 = str(yy.ReceivedTime)[:-6] # 接收时间

else:

ReceivedTime_2 = ''

if (hasattr(yy, 'SenderName')): # 发件人

SenderName_2 = yy.SenderName

else:

SenderName_2 = ''

if (hasattr(yy, 'To')): # 收件人

to_to_2 = yy.To

else:

to_to_2 = ''

if (hasattr(yy, 'CC')): # 抄送人

cc_cc_2 = yy.CC

else:

cc_cc_2 = ''

if (hasattr(yy, 'Subject')): # 主题

Subject_2 = yy.Subject

else:

Subject_2 = ''

if (hasattr(yy, 'EntryID')): # 邮件MessageID

MessageID_2 = yy.EntryID

else:

MessageID_2 = ''

if (hasattr(yy, 'ConversationTopic')): # 会话主题

ConversationTopic_2 = yy.ConversationTopic

else:

ConversationTopic_2 = ''

if (hasattr(yy, 'ConversationID')): # 会话ID

ConversationID_2 = yy.ConversationID

else:

ConversationID_2 = ''

if (hasattr(yy, 'ConversationIndex')): # 会话记录相对位置

ConversationIndex_2 = yy.ConversationIndex

else:

ConversationIndex_2 = ''

if (hasattr(yy, 'Body')): # 邮件正文内容

EmailBody_2 = yy.Body

else:

EmailBody_2 = ''

# 写入MySQL

cur.execute(insert_sql, (Root_Directory_Name_2, Level_1_FolderName_2, Level_2_FolderName_2, ReceivedTime_2, SenderName_2,to_to_2, cc_cc_2, Subject_2, MessageID_2, ConversationTopic_2, ConversationID_2, ConversationIndex_2, EmailBody_2))

else:

pass

# 结尾

conn.commit()

conn.close()

print ('\n',' >> Done!')

最后的说明

1、打印的日志像这样:

>> 正在查询的帐户名称: xxx@xx.com

- 正在查询一级目录: 已删除邮件

- 正在查询一级目录: 收件箱

- 正在查询一级目录: 发件箱

- 正在查询一级目录: 已发送邮件

- 正在查询一级目录: 任务

- 正在查询一级目录: 快速步骤设置

- 正在查询一级目录: RSS 源

- 正在查询一级目录: Working Set

- 正在查询一级目录: 产品支持

- - 正在查询二级目录: 产品支持 // #2016/03/14#

- - 正在查询二级目录: 产品支持 // #更新、新品、例会#

2、因设定的字符集是utf8,若邮件信息包含不支持的字符(比如表情字符),则会提示Warning,如下图。

<1> Warning: (1300, "Invalid utf8 character string: 'F09F99'")

<2> Warning: (1366, "Incorrect string value: '\\xF0\\x9F\\x99\\x8F\\xF0\\x9F...' for column '邮件内容' at row 1")

因为提示的不多,而且只是出现在“邮件内容(邮件正文)”,所以代码里面没有具体修改,如果觉着有必要,推荐的思路是把“数据库/表/字段/连接MySQL的URL”的utf8字符集全部改用utf8mb4。

python获取outlook邮件内容_Python3读取Outlook邮件并写入MySQL相关推荐

  1. SparkStreaming读取Kafka数据源并写入Mysql数据库

    SparkStreaming读取Kafka数据源并写入Mysql数据库 一.实验环境 本实验所用到的工具有 kafka_2.11-0.11.0.2: zookeeper-3.4.5: spark-2. ...

  2. python 读取邮件内容_Python 如何提取邮件内容

    欢迎关注[无量测试之道]公众号,回复[领取资源], Python编程学习资源干货. Python+Appium框架APP的UI自动化. Python+Selenium框架Web的UI自动化. Pyth ...

  3. python 获取网页的内容

    1.安装pip 我的个人桌面系统用的linuxmint,系统默认没有安装pip,考虑到后面安装requests模块使用pip,所以我这里第一步先安装pip. 1 $ sudo apt install ...

  4. 如何用python获取通达信数据_Python读取通达信本地数据

    一.介绍 python获取股票数据的方法很多,其中 Tushare 财经数据接口包很好用,当然,也可以通过通达信本地的数据获取,这样更为方便. 日线数据存在这路径下 D:\通达信\vipdoc\sh\ ...

  5. python获取文本框内容_jquery获取文本框的内容

    使用jquery获取文本框的内容有以下几种: 1.根据ID取值(id属性): // javascript function getUserName(){ var username= $("# ...

  6. python读取excel文件数据写入MySQL数据库(入门级)

    写入前准备 1.window电脑提前安装好MySQL 2.知道自己MySQL的密码和用户名 3.提前建好要写入的数据库和数据表 1.首先测试写入一条数据进去MySQL在尝试批量写入 1.1第一数据类型 ...

  7. python获取剪切板内容_如何从python中读取(windows)剪贴板中的文本?

    如何从python中读取(windows)剪贴板中的文本? 如何从python中读取(windows)剪贴板中的文本? Foo42 asked 2019-06-22T21:38:33Z 10个解决方案 ...

  8. outlook邮箱邮件内容乱码_VBA:Outlook和Excel综合运用

    很多企业公司使用微软OUTLOOK作为公司邮箱进行业务往来. 我们经常需要将一些表格数据也展示给收件人,但是又不需要将整个工作簿添加为附件,那么最好的方法就是复制指定单元格区域内容然后粘贴进新邮件界面 ...

  9. python 获取li的内容_Python开发案例:爬取四川省统计局数据Matplotlib绘图

    开发环境 Windows 10 企业版 Pycharm 2019.01 EAP Community Edition Python 3.7 前言 四川省统计局提供了过去若干月份的统计数据.统计局提供的数 ...

  10. python获取系统时间函数_python3中datetime库,time库以及pandas中的时间函数区别与详解...

    1介绍datetime库之前 我们先比较下time库和datetime库的区别 先说下time 在 Python 文档里,time是归类在Generic Operating System Servic ...

最新文章

  1. LinkedIn招聘推荐系统中的机器学习的威力
  2. CenterNet2:比强更强的二阶段网络,COCO成绩最高达到56.4mPA
  3. wps 项目进度_平安科技软件+金山WPS测试面试题
  4. Java获取真实的IP地址--转载
  5. C++11标准出现后,函数指针写法汇总
  6. python生成白噪声与纯随机检验——Ljung-Box检验
  7. 《Scikit-Learn与TensorFlow机器学习实用指南》 第3章 分类
  8. 支架预压弹性变形值计算_现浇连续梁桥支架搭设及预压施工技术控制
  9. VMware下安装ubuntu,桥接上网配置静态IP
  10. 改进3D/2D U-NET--添加深度监督deep supervision【Keras】
  11. 过度使用微信,正在让人越来越焦虑
  12. eclipse必备的15的个快捷键
  13. 群晖服务器白群晖有哪些型号,白群晖和黑群晖,有什么区别?
  14. Hi,大家好,这里是iOS用的 Flash 播放器 FlashViewer
  15. RQNOJ-19 篝火晚会
  16. 服务器上qq邮件不能打开方式,qq邮箱打不开解决方法汇总
  17. MTK6577---camera驱动分析
  18. pgpool-II常见错误
  19. Android 报错 : FATAL EXCEPTION:main 解决方法
  20. 【嵌入式基础】用C语言编程、寄存器实现LED流水灯程序;stm32CubeMX+Keil使用HAL库点亮流水灯

热门文章

  1. gta5 apk android,gta5apk
  2. 理解手机中的感应器模块:重力感应/光线感应/电子罗盘/陀螺仪模块功能
  3. Mac下驱动BCM20702A0 USB蓝牙
  4. ERROR: Library projects cannot set applicationId. applicationId is set to 'com.example.baiduditu' in
  5. 如何利用碎片化时间形成知识体系
  6. iOS 开启静音键时APP播放视频没有声音
  7. 计算机编程语言排行榜—TIOBE世界编程语言排行榜(2021年08月份最新版)
  8. excel中统计COUNTIFS的值为0
  9. html将数据永久保存起来,数据保存(永久保存)方式(示例代码)
  10. Oracle 18c安装操作指导手册