imaplib --- IMAP4 協(xié)議客戶端?

源代碼: Lib/imaplib.py


本模塊定義了三個(gè)類: IMAP4IMAP4_SSLIMAP4_stream 。這三個(gè)類封裝了與IMAP4服務(wù)器的連接并實(shí)現(xiàn)了 RFC 2060 當(dāng)中定義的大多數(shù)IMAP4rev1客戶端協(xié)議。其與IMAP4( RFC 1730 )服務(wù)器后向兼容,但是 STATUS 指令在IMAP4中不支持。

imaplib 模塊提供了三個(gè)類,其中 IMAP4 是基類:

class imaplib.IMAP4(host='', port=IMAP4_PORT, timeout=None)?

這個(gè)類實(shí)現(xiàn)了實(shí)際的 IMAP4 協(xié)議。 當(dāng)其實(shí)例被實(shí)例化時(shí)會(huì)創(chuàng)建連接并確定協(xié)議版本 (IMAP4 或 IMAP4rev1)。 如果未指明 host,則會(huì)使用 '' (本地主機(jī))。 如果省略 port,則會(huì)使用標(biāo)準(zhǔn) IMAP4 端口 (143)。 可選的 timeout 形參指定連接嘗試的超時(shí)秒數(shù)。 如果未指定超時(shí)或?yàn)?None,則會(huì)使用全局默認(rèn)的套接字超時(shí)。

IMAP4 類支持 with 語(yǔ)句。 當(dāng)這樣使用時(shí),IMAP4 LOGOUT 命令會(huì)在 with 語(yǔ)句退出時(shí)自動(dòng)發(fā)出。 例如:

>>>
>>> from imaplib import IMAP4
>>> with IMAP4("domain.org") as M:
...     M.noop()
...
('OK', [b'Nothing Accomplished. d25if65hy903weo.87'])

在 3.5 版更改: 添加了對(duì) with 語(yǔ)句的支持。

在 3.9 版更改: 添加了可選的 timeout 形參。

有三個(gè)異常被定義為 IMAP4 類的屬性:

exception IMAP4.error?

任何錯(cuò)誤都將引發(fā)該異常。 異常的原因會(huì)以字符串的形式傳遞給構(gòu)造器。

exception IMAP4.abort?

IMAP4 服務(wù)器錯(cuò)誤會(huì)導(dǎo)致引發(fā)該異常。 這是 IMAP4.error 的子類。 請(qǐng)注意關(guān)閉此實(shí)例并實(shí)例化一個(gè)新實(shí)例通常將會(huì)允許從該異常中恢復(fù)。

exception IMAP4.readonly?

當(dāng)一個(gè)可寫(xiě)郵箱的狀態(tài)被服務(wù)器修改時(shí)會(huì)引發(fā)此異常。 此異常是 IMAP4.error 的子類。 某個(gè)其他客戶端現(xiàn)在會(huì)具有寫(xiě)入權(quán)限,將需要重新打開(kāi)該郵箱以重新獲得寫(xiě)入權(quán)限。

另外還有一個(gè)針對(duì)安全連接的子類:

class imaplib.IMAP4_SSL(host='', port=IMAP4_SSL_PORT, keyfile=None, certfile=None, ssl_context=None, timeout=None)?

這是一個(gè)派生自 IMAP4 的子類,它使用經(jīng) SSL 加密的套接字進(jìn)行連接 (為了使用這個(gè)類你需要編譯時(shí)附帶 SSL 支持的 socket 模塊)。 如果未指定 host,則會(huì)使用 '' (本地主機(jī))。 如果省略了 port,則會(huì)使用標(biāo)準(zhǔn)的 IMAP4-over-SSL 端口 (993)。 ssl_context 是一個(gè) ssl.SSLContext 對(duì)象,它允許將 SSL 配置選項(xiàng)、證書(shū)和私鑰打包放入一個(gè)單獨(dú)的 (可以長(zhǎng)久存在的) 結(jié)構(gòu)體中。 請(qǐng)閱讀 安全考量 以獲取最佳實(shí)踐。

keyfilecertfilessl_context 的舊式替代品 —— 它們可以指向 PEM 格式的私鑰和證書(shū)鏈文件用于 SSL 連接。 請(qǐng)注意 keyfile/certfile 形參不能與 ssl_context 共存,如果 keyfile/certfilessl_context 一同被提供則會(huì)引發(fā) ValueError。

可選的 timeout 形參指明連接嘗試的超時(shí)秒數(shù)。 如果參數(shù)未給出或?yàn)?None,則會(huì)使用全局默認(rèn)的套接字超時(shí)設(shè)置。

在 3.3 版更改: 增加了 ssl_context 形參。

在 3.4 版更改: 本類現(xiàn)在支持使用 ssl.SSLContext.check_hostname服務(wù)器名稱指示 (參閱 ssl.HAS_SNI)進(jìn)行主機(jī)名檢查。

3.6 版后已移除: keyfilecertfile 已棄用并轉(zhuǎn)而推薦 ssl_context。 請(qǐng)改用 ssl.SSLContext.load_cert_chain(),或讓 ssl.create_default_context() 為你選擇系統(tǒng)所信任的 CA 證書(shū)。

在 3.9 版更改: 添加了可選的 timeout 形參。

第二個(gè)子類允許由子進(jìn)程所創(chuàng)建的連接:

class imaplib.IMAP4_stream(command)?

這是一個(gè)派生自 IMAP4 的子類,它可以連接 stdin/stdout 文件描述符,此種文件是通過(guò)向 subprocess.Popen() 傳入 command 來(lái)創(chuàng)建的。

定義了下列工具函數(shù):

imaplib.Internaldate2tuple(datestr)?

解析一個(gè) IMAP4 INTERNALDATE 字符串并返回對(duì)應(yīng)的本地時(shí)間。 返回值是一個(gè) time.struct_time 元組或者如果字符串格式錯(cuò)誤則為 None。

imaplib.Int2AP(num)?

將一個(gè)整數(shù)轉(zhuǎn)換為使用字符集 [A .. P] 的字節(jié)串表示形式。

imaplib.ParseFlags(flagstr)?

將一個(gè) IMAP4 FLAGS 響應(yīng)轉(zhuǎn)換為包含單獨(dú)旗標(biāo)的元組。

imaplib.Time2Internaldate(date_time)?

date_time 轉(zhuǎn)換為 IMAP4 INTERNALDATE 表示形式。 返回值是以下形式的字符串: "DD-Mmm-YYYY HH:MM:SS +HHMM" (包括雙引號(hào))。 date_time 參數(shù)可以是一個(gè)代表距離紀(jì)元起始的秒數(shù) (如 time.time() 的返回值) 的數(shù)字 (整數(shù)或浮點(diǎn)數(shù)),一個(gè)代表本地時(shí)間的 9 元組,一個(gè) time.struct_time 實(shí)例 (如 time.localtime() 的返回值),一個(gè)感知型的 datetime.datetime 實(shí)例,或一個(gè)雙引號(hào)字符串。 在最后一種情況下,它會(huì)被假定已經(jīng)具有正確的格式。

請(qǐng)注意 IMAP4 消息編號(hào)會(huì)隨郵箱的改變而改變;特別是在使用 EXPUNGE 命令執(zhí)行刪除后剩余的消息會(huì)被重新編號(hào)。 因此高度建議通過(guò) UID 命令來(lái)改用 UID。

模塊的最后有一段測(cè)試,其中包含的用法示例更加廣泛。

參見(jiàn)

描述該協(xié)議的文檔,實(shí)現(xiàn)該協(xié)議的服務(wù)器源代碼,由華盛頓大學(xué) IMAP 信息中心提供 (源代碼) https://github.com/uw-imap/imap (不再維護(hù))。

IMAP4 對(duì)象?

所有 IMAP4rev1 命令都表示為同名的方法,可以為大寫(xiě)或小寫(xiě)形式。

命令的所有參數(shù)都會(huì)被轉(zhuǎn)換為字符串,只有 AUTHENTICATE 例外,而 APPEND 的最后一個(gè)參數(shù)會(huì)被作為 IMAP4 字面值傳入。 如有必要 (字符串包含 IMAP4 協(xié)議中的敏感字符并且未加圓括號(hào)或雙引號(hào)) 每個(gè)字符串都會(huì)被轉(zhuǎn)碼。 但是,LOGIN 命令的 password 參數(shù)總是會(huì)被轉(zhuǎn)碼。 如果你想讓某個(gè)參數(shù)字符串免于被轉(zhuǎn)碼 (例如: STOREflags 參數(shù)) 則要為該字符串加上圓括號(hào) (例如: r'(\Deleted)')。

每條命令均返回一個(gè)元組: (type, [data, ...]) 其中 type 通常為 'OK''NO',而 data 為來(lái)自命令響應(yīng)的文本,或?yàn)閬?lái)自命令的規(guī)定結(jié)果。 每個(gè) data 均為 bytes 或者元組。 如果為元組,則其第一部分是響應(yīng)的標(biāo)頭,而第二部分將包含數(shù)據(jù) (例如: 'literal' 值)。

以下命令的 message_set 選項(xiàng)為指定要操作的一條或多條消息的字符串。 它可以是一個(gè)簡(jiǎn)單的消息編號(hào) ('1'),一段消息編號(hào)區(qū)間 ('2:4'),或者一組以逗號(hào)分隔的非連續(xù)區(qū)間 ('1:3,6:9')。 區(qū)間可以包含一個(gè)星號(hào)來(lái)表示無(wú)限的上界 ('3:*')。

IMAP4 實(shí)例具有下列方法:

IMAP4.append(mailbox, flags, date_time, message)?

message 添加到指定的郵箱。

IMAP4.authenticate(mechanism, authobject)?

認(rèn)證命令 --- 要求對(duì)響應(yīng)進(jìn)行處理。

mechanism 指明要使用哪種認(rèn)證機(jī)制 —— 它應(yīng)當(dāng)在實(shí)例變量 capabilities 中以 AUTH=mechanism 的形式出現(xiàn)。

authobject 必須是一個(gè)可調(diào)用對(duì)象:

data = authobject(response)

它將被調(diào)用以便處理服務(wù)器連續(xù)響應(yīng);傳給它的 response 參數(shù)將為 bytes 類型。 它應(yīng)當(dāng)返回 base64 編碼的 bytes 數(shù)據(jù) 并發(fā)送給服務(wù)器。 或者在客戶端中止響應(yīng)時(shí)返回 None 并應(yīng)改為發(fā)送 *。

在 3.5 版更改: 字符串形式的用戶名和密碼現(xiàn)在會(huì)被執(zhí)行 utf-8 編碼而不限于 ASCII 字符。

IMAP4.check()?

為服務(wù)器上的郵箱設(shè)置檢查點(diǎn)。

IMAP4.close()?

關(guān)閉當(dāng)前選定的郵箱。 已刪除的消息會(huì)從可寫(xiě)郵箱中被移除。 在 LOGOUT 之前建議執(zhí)行此命令。

IMAP4.copy(message_set, new_mailbox)?

message_set 消息拷貝到 new_mailbox 的末尾。

IMAP4.create(mailbox)?

新建名為 mailbox 新郵箱。

IMAP4.delete(mailbox)?

刪除名為 mailbox 的舊郵箱。

IMAP4.deleteacl(mailbox, who)?

刪除郵箱上某人的 ACL (移除任何權(quán)限)。

IMAP4.enable(capability)?

啟用 capability (參見(jiàn) RFC 5161)。 大多數(shù)功能都不需要被啟用。 目前只有 UTF8=ACCEPT 功能受到支持 (參見(jiàn) RFC 6855)。

3.5 新版功能: enable() 方法本身,以及 RFC 6855 支持。

IMAP4.expunge()?

從選定的郵箱中永久移除被刪除的條目。 為每條被刪除的消息各生成一個(gè) EXPUNGE 響應(yīng)。 返回包含按接收時(shí)間排序的 EXPUNGE 消息編號(hào)的列表。

IMAP4.fetch(message_set, message_parts)?

獲取消息(的各個(gè)部分)。 message_parts 應(yīng)為加圓標(biāo)號(hào)的消息部分名稱字符串,例如: "(UID BODY[TEXT])"。 返回的數(shù)據(jù)是由消息部分封包和數(shù)據(jù)組成的元組。

IMAP4.getacl(mailbox)?

獲取 mailboxACL。 此方法是非標(biāo)準(zhǔn)的,但是被 Cyrus 服務(wù)器所支持。

IMAP4.getannotation(mailbox, entry, attribute)?

提取 mailbox 的特定 ANNOTATION。 此方法是非標(biāo)準(zhǔn)的,但是被 Cyrus 服務(wù)器所支持。

IMAP4.getquota(root)?

獲取 quota root 的資源使用和限制。 此方法是 rfc2087 定義的 IMAP4 QUOTA 擴(kuò)展的組成部分。

IMAP4.getquotaroot(mailbox)?

獲取指定 mailboxquota roots 列表。 此方法是 rfc2087 定義的 IMAP4 QUOTA 擴(kuò)展的組成部分。

IMAP4.list([directory[, pattern]])?

列出 directory 中與 pattern 相匹配的郵箱名稱。 directory 默認(rèn)為最高層級(jí)的電郵文件夾,而 pattern 默認(rèn)為匹配任何文本。 返回的數(shù)據(jù)包含 LIST 響應(yīng)列表。

IMAP4.login(user, password)?

使用純文本密碼標(biāo)識(shí)客戶。 password 將被轉(zhuǎn)碼。

IMAP4.login_cram_md5(user, password)?

在標(biāo)識(shí)用戶以保護(hù)密碼時(shí)強(qiáng)制使用 CRAM-MD5 認(rèn)證。 將只在服務(wù)器 CAPABILITY 響應(yīng)包含 AUTH=CRAM-MD5 階段時(shí)才有效。

IMAP4.logout()?

關(guān)閉對(duì)服務(wù)器的連接。 返回服務(wù)器 BYE 響應(yīng)。

在 3.8 版更改: 此方法不會(huì)再忽略靜默的任意異常。

IMAP4.lsub(directory='""', pattern='*')?

列出 directory 中抽取的與 pattern 相匹配的郵箱。 directory 默認(rèn)為最高層級(jí)目錄而 pattern 默認(rèn)為匹配任何郵箱。 返回的數(shù)據(jù)為消息部分封包和數(shù)據(jù)的元組。

IMAP4.myrights(mailbox)?

顯示某個(gè)郵箱的本人 ACL (即本人在郵箱中的權(quán)限)。

IMAP4.namespace()?

返回 RFC 2342 中定義的 IMAP 命名空間。

IMAP4.noop()?

NOOP 發(fā)送給服務(wù)器。

IMAP4.open(host, port, timeout=None)?

打開(kāi)連接 hostport 的套接字。 可選的 timeout 形參指定連接嘗試的超時(shí)秒數(shù)。 如果 timeout 未給出或?yàn)?None,則會(huì)使用全局默認(rèn)的套接字超時(shí)。 另外請(qǐng)注意如果 timeout 形參被設(shè)為零,它將引發(fā) ValueError 以拒絕創(chuàng)建非阻塞套接字。 此方法會(huì)由 IMAP4 構(gòu)造器隱式地調(diào)用。 此方法所建立的連接對(duì)象將在 IMAP4.read(), IMAP4.readline(), IMAP4.send()IMAP4.shutdown() 等方法中被使用。 你可以重載此方法。

引發(fā)一個(gè) 審計(jì)事件 imaplib.open,附帶參數(shù) self, host, port。

在 3.9 版更改: 加入 timeout 參數(shù)。

IMAP4.partial(message_num, message_part, start, length)?

獲取消息被截?cái)嗟牟糠帧?返回的數(shù)據(jù)是由消息部分封包和數(shù)據(jù)組成的元組。

IMAP4.proxyauth(user)?

作為 user 進(jìn)行認(rèn)證。 允許經(jīng)權(quán)限的管理員通過(guò)代理進(jìn)入任意用戶的郵箱。

IMAP4.read(size)?

從遠(yuǎn)程服務(wù)器讀取 size 字節(jié)。 你可以重載此方法。

IMAP4.readline()?

從遠(yuǎn)程服務(wù)器讀取一行。 你可以重載此方法。

IMAP4.recent()?

提示服務(wù)器進(jìn)行更新。 如果沒(méi)有新消息則返回的數(shù)據(jù)為 None,否則為 RECENT 響應(yīng)的值。

IMAP4.rename(oldmailbox, newmailbox)?

將名為 oldmailbox 的郵箱重命名為 newmailbox。

IMAP4.response(code)?

如果收到響應(yīng) code 則返回其數(shù)據(jù),否則返回 None。 返回給定的代碼,而不是普通的類型。

IMAP4.search(charset, criterion[, ...])?

在郵箱中搜索匹配的消息。 charset 可以為 None,在這種情況下在發(fā)給服務(wù)器的請(qǐng)求中將不指定 CHARSET。 IMAP 協(xié)議要求至少指定一個(gè)標(biāo)準(zhǔn);當(dāng)服務(wù)器返回錯(cuò)誤時(shí)將會(huì)引發(fā)異常。 charsetNone 對(duì)應(yīng)使用 enable() 命令啟用了 UTF8=ACCEPT 功能的情況。

示例:

# M is a connected IMAP4 instance...
typ, msgnums = M.search(None, 'FROM', '"LDJ"')

# or:
typ, msgnums = M.search(None, '(FROM "LDJ")')
IMAP4.select(mailbox='INBOX', readonly=False)?

選擇一個(gè)郵箱。 返回的數(shù)據(jù)是 mailbox 中消息的數(shù)量 (EXISTS 響應(yīng))。 默認(rèn)的 mailbox'INBOX'。 如果設(shè)置了 readonly 旗標(biāo),則不允許修改該郵箱。

IMAP4.send(data)?

data 發(fā)送給遠(yuǎn)程服務(wù)器。 你可以重載此方法。

引發(fā)一個(gè) 審計(jì)事件 imaplib.send,附帶參數(shù) self, data。

IMAP4.setacl(mailbox, who, what)?

發(fā)送 mailboxACL。 此方法是非標(biāo)準(zhǔn)的,但是被 Cyrus 服務(wù)器所支持。

IMAP4.setannotation(mailbox, entry, attribute[, ...])?

設(shè)置 mailboxANNOTATION。 此方法是非標(biāo)準(zhǔn)的,但是被 Cyrus 服務(wù)器所支持。

IMAP4.setquota(root, limits)?

設(shè)置 quota root 的資源限制為 limits。 此方法是 rfc2087 定義的 IMAP4 QUOTA 擴(kuò)展的組成部分。

IMAP4.shutdown()?

關(guān)閉在 open 中建立的連接。 此方法會(huì)由 IMAP4.logout() 隱式地調(diào)用。 你可以重載此方法。

IMAP4.socket()?

返回用于連接服務(wù)器的套接字實(shí)例。

IMAP4.sort(sort_criteria, charset, search_criterion[, ...])?

sort 命令是 search 的變化形式,帶有結(jié)果排序語(yǔ)句。 返回的數(shù)據(jù)包含以空格分隔的匹配消息編號(hào)列表。

sort 命令在 search_criterion 參數(shù)之前還有兩個(gè)參數(shù);一個(gè)帶圓括號(hào)的 sort_criteria 列表,和搜索的 charset。 請(qǐng)注意不同于 search,搜索的 charset 參數(shù)是強(qiáng)制性的。 還有一個(gè) uid sort 命令與 sort 對(duì)應(yīng),如同 uid searchsearch 對(duì)應(yīng)一樣。 sort 命令首先在郵箱中搜索匹配給定搜索條件的消息,使用 charset 參數(shù)來(lái)解讀搜索條件中的字符串。 然后它將返回所匹配消息的編號(hào)。

這是一個(gè) IMAP4rev1 擴(kuò)展命令。

IMAP4.starttls(ssl_context=None)?

發(fā)送一個(gè) STARTTLS 命令。 ssl_context 參數(shù)是可選的并且應(yīng)為一個(gè) ssl.SSLContext 對(duì)象。 這將在 IMAP 連接上啟用加密。 請(qǐng)閱讀 安全考量 來(lái)了解最佳實(shí)踐。

3.2 新版功能.

在 3.4 版更改: 此方法現(xiàn)在支持使用 ssl.SSLContext.check_hostname服務(wù)器名稱指示 (參見(jiàn) ssl.HAS_SNI) 進(jìn)行主機(jī)名檢查。

IMAP4.status(mailbox, names)?

針對(duì) mailbox 請(qǐng)求指定的狀態(tài)條件。

IMAP4.store(message_set, command, flag_list)?

改變郵箱中消息的旗標(biāo)處理。 commandRFC 2060 的 6.4.6 小節(jié)指明,應(yīng)為 "FLAGS", "+FLAGS" 或 "-FLAGS" 之一,并可選擇附帶 ".SILENT" 后綴。

例如,要在所有消息上設(shè)置刪除旗標(biāo):

typ, data = M.search(None, 'ALL')
for num in data[0].split():
   M.store(num, '+FLAGS', '\\Deleted')
M.expunge()

備注

創(chuàng)建包含 ']' 的旗標(biāo) (例如: "[test]") 會(huì)違反 RFC 3501 (IMAP 協(xié)議)。 但是,imaplib 在歷史上曾經(jīng)允許創(chuàng)建這樣的標(biāo)簽,并且流行的 IMAP 服務(wù)器如 Gmail 都會(huì)接受并生成這樣的旗標(biāo)。 有些非 Python 程序也會(huì)創(chuàng)建這樣的旗標(biāo)。 雖然它違反 RFC 并且 IMAP 客戶端和服務(wù)器應(yīng)當(dāng)嚴(yán)格遵守規(guī)范,但是 imaplib 出于向下兼容的理由仍然繼續(xù)允許創(chuàng)建這樣的標(biāo)簽,并且在 Python 3.6 中會(huì)在其被服務(wù)器所發(fā)送時(shí)處理它們,因?yàn)檫@能提升實(shí)際的兼容性。

IMAP4.subscribe(mailbox)?

訂閱新郵箱。

IMAP4.thread(threading_algorithm, charset, search_criterion[, ...])?

thread 命令是 search 的變化形式,帶有針對(duì)結(jié)果的消息串句法。 返回的數(shù)據(jù)包含以空格分隔的消息串成員列表。

消息串成員由零個(gè)或多個(gè)消息編號(hào)組成,以空格分隔,標(biāo)示了連續(xù)的上下級(jí)關(guān)系。

thread 命令在 search_criterion 參數(shù)之前還有兩個(gè)參數(shù);一個(gè) threading_algorithm,以及搜索使用的 charset。 請(qǐng)注意不同于 search,搜索使用的 charset 參數(shù)是強(qiáng)制性的。 還有一個(gè) uid thread 命令與 thread 對(duì)應(yīng),如同 uid searchsearch 對(duì)應(yīng)一個(gè)。 thread 命令首先在郵箱中搜索匹配給定搜索條件的消息,使用 charset 參數(shù)來(lái)解讀搜索條件中的字符串。 然后它將按照指定的消息串算法返回所匹配的消息串。

這是一個(gè) IMAP4rev1 擴(kuò)展命令。

IMAP4.uid(command, arg[, ...])?

執(zhí)行 command arg 并附帶用 UID 所標(biāo)識(shí)的消息,而不是用消息編號(hào)。 返回與命令對(duì)應(yīng)的響應(yīng)。 必須至少提供一個(gè)參數(shù);如果不提供任何參數(shù),服務(wù)器將返回錯(cuò)誤并引發(fā)異常。

IMAP4.unsubscribe(mailbox)?

取消訂閱原有郵箱。

IMAP4.unselect()?

imaplib.IMAP4.unselect() 會(huì)釋放關(guān)聯(lián)到選定郵箱的服務(wù)器資源并將服務(wù)器返回到已認(rèn)證狀態(tài)。 此命令會(huì)執(zhí)行與 imaplib.IMAP4.close() 相同的動(dòng)作,區(qū)別在于它不會(huì)從當(dāng)前選定郵箱中永久性地移除消息。

3.9 新版功能.

IMAP4.xatom(name[, ...])?

允許服務(wù)器在 CAPABILITY 響應(yīng)中通知簡(jiǎn)單的擴(kuò)展命令。

IMAP4 的實(shí)例上定義了下列屬性:

IMAP4.PROTOCOL_VERSION?

在服務(wù)器的 CAPABILITY 響應(yīng)中最新的受支持協(xié)議。

IMAP4.debug?

控制調(diào)試輸出的整數(shù)值。 初始值會(huì)從模塊變量 Debug 中獲取。 大于三的值表示將追蹤每一條命令。

IMAP4.utf8_enabled?

通常為 False 的布爾值,但也可以被設(shè)為 True,如果成功地為 UTF8=ACCEPT 功能發(fā)送了 enable() 命令的話。

3.5 新版功能.

IMAP4 示例?

以下是一個(gè)最短示例(不帶錯(cuò)誤檢查),該示例將打開(kāi)郵箱,檢索并打印所有消息:

import getpass, imaplib

M = imaplib.IMAP4()
M.login(getpass.getuser(), getpass.getpass())
M.select()
typ, data = M.search(None, 'ALL')
for num in data[0].split():
    typ, data = M.fetch(num, '(RFC822)')
    print('Message %s\n%s\n' % (num, data[0][1]))
M.close()
M.logout()