星期五, 7月 10, 2009

SMTP in Python - 2 (從EHLO取資訊)

由於某些SMTP server會限制信件大小,也可直接在交談中取得關於限制大小的資訊。

首先來看一下SMTP有所謂的extension,就是ESMTP,提供了強的conversation。

如何分辨server是否支援呢?

在conversation開始時,用ehlo而回傳正常資訊的,就是有支援ESMTP,

否則沒支援的話就用原本的helo來打招呼。

不同於前例使用sendmail()函式來寄送此資訊,而是要在sendmail()之前就得知檔案超過大小才行。


try:
s = smtplib.SMTP(server)
code = s.ehlo()[0]
usesesmtp = 1
if not (200 <= code <= 299):
usesesmtp = 0
code = s.helo()[0]
if not (200 <= code <= 299):
raise SMTPHeloError(code, resp)

此例中先用s.eclo()[0]來得知ehlo測試後的return code,

如果在不在正常範圍內(200~299),再改用s.helo()[0]來進行conversation。

如果真的都不行了,就raise exception來處理。


if usesesmtp and s.has_extn('size'):
print "Maximum message size is", s.esmtp_features['size']
if len(message) > int(s.esmtp_features['size']):
print "Message too large; aborting."
sys.exit(2)
s.sendmail(frmaddr, toaddrs, message)

此段會在server支援esmtp而且server有回傳max size後執行,

可以直接用s.esmtp_features['size']來取得此變數,

如果信件長度過大,則離開程式。

以下是執行結果:

cacaegg@cacabook:~/workspace/NetworkProgram/src/SMTP$ ehlo.py localhost cacaegg@localhost cacaegg@localhost
Maximum message size is 10240000
Message successfully sent to 1 recipient(s)


附件:完整python檔

沒有留言: