python抓取郵件,python讀取郵箱郵件

本文目錄一覽:

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的博客主頁 》

我用python通過imap收取郵件時為什麼能收取

想用python做一個很簡單的接收郵件的功能,只看python的官方doc()真的很不好懂,經過google之,探索之,稍微總結一下:

要使用imap接收郵件,當然要導入imaplib拉.

import imaplib

然後按常規的,建立鏈接→登錄

conn = imaplib.IMAP4(“imap.xxx.com”,143)

conn.login(“userName”,”password”)

然後我想查看收件箱的郵件,咋辦呢?要先選擇一個目錄,收件箱默認名稱是”INBOX”,IMAP是支持創建文件夾,查看其它文件夾的,如果是自己新建的文件夾,那麼名稱一般會是”INBOX.新建文件夾”,不同的郵箱可能表示方式不一樣,如果你不知道的話,那運行conn.list()查看所有的文件夾.

conn.select(“INBOX”)

選擇後,然後查看文件夾,注意,IMAP的查看其實是一個搜索的過程,IMAP的原始命令是search all(大概的),在python里這麼用:

type, data = conn.search(None, ‘ALL’)

然後返回的是這個收件箱里所有郵件的編號,按接收時間升序排列,最後的表示最近.

search這個很鬼麻煩,因為官方文檔里沒講這個函數的第二個參數怎麼用,於是找了下,可以填的命令有:

於是如果我想找Essh郵件的話,使用

type, data = conn.search(None, ‘(SUBJECT “Essh”)’)

裏面要用一個括號,代表是一個查詢條件,可以同時指定多個查詢條件,例如FROM xxxx SUBJECT “aaa”,注意,命令要用括號罩住(痛苦的嘗試)

search第一個參數是charset的意思,填None表示用默認ASCII,

data里獲取到的是一個只有一個字符串元素的數組,包含很多數字,用空格隔開

[‘1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103’

於是想獲取最後一封的做法是:

msgList = data[0].split()

last = msgList[len(msgList) – 1]

然後把那個郵件獲取回來,用fetch函數

例子:

conn.fetch(last, ‘(RFC822.SIZE BODY[HEADER.FIELDS (SUBJECT)])’)

但是返回的是一串MIME編碼的東東,看不懂,如果能像eml那一操作一封郵件就好了.

方法是有的,用email庫.

import email

然後以RFC822獲取郵件格式,再用email.message_from_string轉換為message對象.就可以當message操作了,()

type,data=connect.fetch(msgList[len(msgList)-1],'(RFC822)’)

msg=email.message_from_string(data[0][1])

content=msg.get_payload(decode=True)

最後content得到就是郵件的內容了

如何用爬蟲爬取郵件附件python

我也遇到了這個問題,我的解決方法是,先將列表按照時間排序後再抓取,每次抓取完記錄最後一條的url,下載再抓取時,遇到這個url,抓取就自動退出。如果解決了您的問題請採納!如果未解決請繼續追問!

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編寫一個程序 可以讀取郵件日誌(mbox.txt),統計每個郵件發出的郵件數量,並輸出結果。

由於工作需要在一大堆日誌裏面提取相應的一些固定字符,如果單純靠手工取提取,數據量大,勞心勞力,於是自然而然想到了用Python做一個對應的提取工具,代替手工提取的繁雜,涉及中文字符,正則表達式不好匹配,但不是不可以實現,這個以後優化時再說。

需求描述:

一個父目錄中存在多個子文件夾,子文件夾下有多個txt形式化的Log日誌,要求從所有地方Log日誌中找出CardType=9, CardNo=0時的CardID的值,並將其統計存儲到一個文本文件中,要求CardID不能夠重複。

需求解析:

首先獲取所有的Log日誌的全路徑,根據路徑分別加載到將各個Log日誌加載到內存中進行提取分析,並將結果存儲到給定的文本文件中。

解決方案:

為了儘可能的簡潔通用,這裡使用配置文件作為輸入變量的依據。不多說,上代碼:

配置文件如下:

103文件夾下有兩個文件:log1.txt和log2.txt, 內容類似如下:

Python代碼實現如下:

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

#!/usr/bin/python

# filename: picktools.py

# codedtime:2015-3-25

import os

import configparser

# 遍歷一個目錄,輸出所有文件名

def itemsbrowse(path):

for home, dirs, files in os.walk(path):

for filename in files:

yield os.path.join(home, filename)

# 給的文件中查找對應的字符串所在行      

def findchars(filename, chars):

file = open(filename, ‘r’)

for eachline in file:

if eachline.find(chars) = 0:

yield eachline

file.close()

# 添加到指定的文件

def addtofile(filename, mygenerator):

file = open(filename, ‘a’)   # 追加方式打開

for line in mygenerator:

file.write(line)

file.close()

# 過濾重複的字符行

def filter(filename):

mylist = []

file = open(filename, ‘r’)

for eachline in file:

mylist.append(eachline.strip())

file.close()

file2 = open(os.path.splitext(filename)[0] + ‘_filter.txt’, ‘w’)

for line in list(set(mylist)):

print(line, file = file2)

#file2.write(line)

file2.close()

def excute():

iniconf = configparser.ConfigParser()

iniconf.read(‘config.ini’)

ifile = iniconf.get(‘setting’, ‘ifilepath’)

ofile = iniconf.get(‘setting’, ‘ofilepath’)

chars = iniconf.get(‘setting’, ‘searchstr’)

for fullname in itemsbrowse(ifile):

mygenerator = findchars(fullname, chars)

addtofile(ofile, mygenerator)

filter(ofile)

if __name__ == ‘__main__’:

excute()

輸出結果:輸出兩個文件result.txt 和result_filter.txt

心得體會:

1、利用Python去處理一些日常的小任務,可以很方便的完成,相比較C/C++來說,這方面生產力高了不少。

2、本文設計對中文字符的處理,所以使用正則表達式不太怎麼方便,但不少不可以,後續版本中會添加對正則的支持!

3、由於初學中,所以代碼寫的不夠精鍊簡潔,後續進行再優化!

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/280628.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-21 13:04
下一篇 2024-12-21 13:04

相關推薦

  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智能、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29

發表回復

登錄後才能評論