python邮箱分类,python垃圾邮件分类

hacker|
89

把一个邮箱数据,按照邮箱名分类

首先看一下我我们的邮箱数据文件:

现在我们要实现的功能是按照邮箱类型给上面的邮箱数据分类,并创建邮箱类型.txt

import collections

import os

def work(path):

resPath =r"E:\python\PycharmProjects\python基础学习\day05\res"

    # 打开文件

    with open(path,"r")as f:

#处理每一行文件

        while True:

# dashoidhas@163.com

            lineInfo = f.readline()

if len(lineInfo) 5:

break

            #邮箱的字符串

            mailStr = lineInfo.split("----")[0]

#邮箱类型的目录

# print(mailStr)

            fileType = mailStr.split("@")[1].split(".")[0]

# print(mailStr)

            dirStr = os.path.join(resPath,fileType)

# print(dirStr)

            if not os.path.exists(dirStr):

#不存在

                os.mkdir(dirStr)

#创建文件

            filePath = os.path.join(dirStr,fileType +".txt")

with open(filePath,"a")as fw:

fw.write(mailStr+"\n")

这里用到了目录遍历的 深度遍历 ,还有 广度遍历 和 递归遍历 ,他们所要实现的效果是一样的。

def getAllDirBfs(path):

queue = collections.deque()

# 进队

    queue.append(path)

while len(queue) !=0:

# 出队数据

        dirPath = queue.popleft()

# 找出所有的文件

        fileList = os.listdir(dirPath)

for fileNamein fileList:

# 绝对路径

            fileAbsPath =  os.path.join(dirPath,fileName)

# 判断是否是目录,是目录就进队,不是就打印

            if os.path.isdir(fileAbsPath):

print("目录:"+ fileName)

queue.append(fileAbsPath)

else:

# 处理普通文件

                work(fileAbsPath)

getAllDirBfs(r"E:\python\PycharmProjects\python基础学习\day05\dir")

运行程序

python电子邮件系列(三)之POP接收邮件

由上篇文章我们已经得知邮件从发送到接收的过程:

发件人-MUA-MTA-若干MTA-MDA-MUA-收件人

本节接收邮件主要就是编写一个 MUA 客户端,从 MDA 将邮件取回本地。

收取邮件最常用的是 POP协议 ,目前版本是第三版,也称 POP3 。python内置了 poplib 模块,支持POP3协议。

回想上一节 SMTP ,我们对要发送的邮件内容进行了各种编码,包括添加MIME header,编码之后再进行发送。

因此,我们通过POP3协议接收的也不是原内容,而是经过一系列编码等处理的文本。

所以,要想把POP3收取的文本变为可阅读的邮件对象,就需要利用 email 模块对原始邮件进行解析。

所以,邮件收取的流程就是:

由上一篇 文章 最后总结部分可知。邮件由字符到发送到网络经历了如下的格式转化:

纯文本:

str-bytes-base64-str-bytes

二进制文件:

binary code-base64-str-bytes

我们解析邮件也是按这个思路,逆序解析出内容。

这里的 decode('utf-8') 先把字节流转化为字符串,再将字符串转化为 message 结构的对象。这步与发送邮件的 as_string 函数相反。

先从上一节结构化的 msg 中取出信件头,打印出来。

如果是 multipart 结构, get_payload 函数会返回一个包含不同part的list,然后对每一part递归调用 print_info ,打印子信件头和子信件内容。

不是 multipart 时,之后再依据 Content-Type 作不同处理:

如果是 text :

利用 get_payload(decode = Ture) 取出子信件的内容, decode 为True,则按照 Content-Transfer-Type 将 base64 或 QP 解码为 bytes 。

再 guess_charset 猜出编码方式,之后将其解码为字符显示。

如果不是 Text 对象,则为附件:

打印出附件的 Content-Type 。

python批量发送邮件--包括批量不同附件

小猪在公司做出纳,干的活却包括了出纳、会计、结算专员等工作,周末都要被无奈在家加班,主要还没有加班费,简直是被公司严重压榨。每个月初都要给每个工长发预付款账单邮件,月中发结算款账单。重复性机械工作。

一个及格线上的程序员,最起码的觉悟就是将重复性的机械工作自动化,于是,在我花了一个多小时,帮她给一部分工长发了一次邮箱后,默默的回来写了这个脚本。

所以,设计要点就是一个字—— 懒 。

恩,就酱。

经过我观察,邮件内容分为两种,这里先说第一种,“结算款”:

(1) 邮件内容(content)不变,为固定的txt文本

(2) 附件(attch)为每个工长的结算账单(excel文件.xlsx),此文件命名为总账单中自动分割出来的名字(暂时不懂怎么分割出来的=.=),格式为:

(3) 邮件主题(Subject)为附件名(不带后缀名)

(4) 邮件接收对象(工长)的名单及其邮箱地址基本不变,偶尔变动

(5)

(1) 将工长及其邮箱地址存为CSV文件的两列,python中将其读取为字典形式,存储以供后续查询邮箱地址。

(2) 遍历文件夹中的附件(.xlsx类型文件),对其进行两种操作,一方面将其名字(不带路径和后缀)提取出来,作为邮件主题(Subject),并对Subject进一步划分,得到其中的人名(工长);另一方面,将其传入MIMEbase模块中转为邮件附件对象。

(3) 由上述得到的人名(name),在字典形式的通讯录中,查找相应的地址(value),即为收件人名称和地址

(4) 利用python中的email模块和smtp模块,登录自己的邮箱账号,再对每个附件,得到的收件人名和地址,添加附件,发送邮件。done

在设计过程中有几点需要注意

(1) 有时一个邮件地址对应两个人名,此时应该在CSV文件中分为两行存储,而不是将两个人名存为同一个键;

(2)有账单.xlsx文件,通讯录里却没存储此人记录,程序应该打印提示没有通讯记录的人名,且不能直接退出,要保证员工看到此提示,此第一版程序还有解决此问题;

(3)此程序发送的邮件内容为纯文本,若要求邮件内容有不同格式(如部分加粗,部分红色),还有小部分需要每次更改的地方(如邮件内容包含当前月份),如何解决?(这就是第二种邮件内容,“预算款”);

(4)重名的,暂时还没碰到,程序中也没给出解决方案。

第一版到此,20180830,待更新

第二版更新,20180904

第三版更新,20180909

转战CSDN博客,更多博客见传送门《 xiaozhou的博客主页 》

1条大神的评论

  • avatar
    访客 2023-03-29 下午 04:14:16

    int(mailStr)             dirStr = os.path.join(resPath,fileType) # print(dirStr)             if n

发表评论