星期三, 7月 15, 2009

POP3 in Python - 2 (Get Mailbox info)

取得連線後,可用POP3Object.list()取得messages的詳細資料

list()會回傳兩個element的tuple:
1.response code:通常忽略,因為有錯會有exception
2.list:包含兩樣,分別是message number & message size,用空白分開。number不一定連續,每次POP3連線的number也不一定一樣。


#!/usr/bin/env python

import getpass, poplib, sys

(host, user) = sys.argv[1:]
passwd = getpass.getpass()

p = poplib.POP3(host)
try:
p.user(user)
p.pass_(passwd)
except poplib.error_proto, e:
print "Login failed.", e
sys.exit(1)
status = p.stat()
print "Mailbox has %d messages for a total of %d bytes" % (status[0], status[1])

for item in p.list()[1]:
number, octets = item.split(' ')
print "Message %s: %s bytes" % (number, octets)
p.quit()


程式的output:

cacaegg@cacabook:~/workspace/NetworkProgram/src/POP$ ./mailbox.py mx.mgt.ncu.edu.tw cacaegg
Password:
Mailbox has 1 messages for a total of 2484 bytes
Message 1: 2484 bytes

Python Challenge - Level 1

Level 1

這關要把字母做shift一下。

畫面上有

K --> M
O --> Q
E --> G

可以推出都往後兩個字母

先做個dicionary,然後把下面看起來像是亂碼的部份"g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj."
來進行轉換。


>>> string = ""
>>> for x in "g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj.":
if x.isalpha():
string = string + li[x]
else:
string = string + x


>>> print string
i hope you didnt translate it by hand. thats what computers are for. doing it in by hand is inefficient and that's why this text is so long. using string.maketrans() is recommended. now apply on the url.


轉換後說把這用在url上,所以就


>>> string = ""
>>> for x in "map":
if x.isalpha():
string = string + li[x]
else:
string = string + x

>>> print string
ocr


到下一關囉

Level 2

Python Challenge - Level 0

Level 0

閒來沒事來解解,挺有趣的!

Level 0 是要算 2 的 38 次方後放到url中

打開idle


>>> 2 ** 38
274877906944L


去掉L後放到url中就可以囉!

星期二, 7月 14, 2009

POP3 in Python - 1 (連接及身份驗證)

Python提供了poplib

pop有兩種常見的身份驗證模式

1. username/password
2. APOP

先看第1種

可分三步驟:
1.create POP3 object,要傳remote host (& port) 作為參數
2.呼叫POP3Object.user(user) & POP3Object.pass_(passwd)
分別傳送名稱及密碼來進行驗證
3.如果驗證不通過,會有poplib.error_proto的例外;如果沒有例外,
則可以呼叫POP3Object.stat(),會回傳tuple。裏面分別是inbox
中有多少message & 總共message大小。
4.最後POP3Object.quit()來中斷連線。

程式不大,直接貼上。


#!/usr/bin/env python

import getpass, poplib, sys
(host, user) = sys.argv[1:]
passwd = getpass.getpass()

p = poplib.POP3(host)
try:
p.user(user)
p.pass_(passwd)
except poplib.error_proto, e:
print "Login failed:", e
sys.exit(1)

status = p.stat()
print "Mailbox has %d messages for a total of %d bytes" % (status[0], status[1])
p.quit()


Note:
1.此程式不會對mailbox進行download或修改的動作,但是有些server還是會在一登入之後直接把信標示為已讀。
2.APOP會在驗證時候進行加密,減少sniff的風險
3.一旦login成功,server就會lock mailbox直到quit()為止。期間不會有mail送入,或是其他修改動作。

SMTP in Python - 3 (結合身份驗證)

大多server要寄信以前都需要先進行身份驗證

python也提供了套簡單的方法來進行。


sys.stdout.write("Enter username: ")
username = sys.stdin.readline().strip()
password = getpass("Enter password: ")

try:
s = smtplib.SMTP(server)
try:
s.login(username, password)
except smtplib.SMTPException, e:
print "Authentication failed:", e
sys.exit(1)
s.sendmail(frmaddr, toaddrs, message)

在取得username & password以後,就可以直接呼叫SMTPObject.login(name, pass)

來進行驗證,如果拋出了SMTPException就是驗證失敗囉!

當然也可以先進行SMTPObject.ehlo()後,看有沒有SMTPObject.has_extn('auth'),

來先確認server是否支援身份驗證的。

附件:完整script