Glophy Zone Backup

利用Python整批發信 PDF 列印 E-mail
作者 曾正男   
2012/09/27, 週四

使用Python 整批發信並不是一個很困難的事情,在網路上也可以找到許多關於整批發信的討論文章。但是整批發信這件事牽扯到許多小細節,從名單的整理,信件是否要夾帶附件,信件內容是否要隨收件者置換,中文編碼問題以及整批發信時如何避免被當作垃圾信件。這些小細節缺了一個變可能讓整批發信這件事變得很困難。適逢教師節教學發展中心要發電子賀卡給政大校內的老師,我們數位學習組實做了一次整批發信的業務,特別把細節整理如下方便有整批發信需求的人參考。

整批發信第一個問題是名單,這名單通常都是用excel 格式保存,Python 的xlrd 套件可以讓人很方便操作xls 檔案。 使用的方法如下:

  #open the workbook
import xlrd
wb = xlrd.open_workbook('myworkbook.xls')

使用open_workbook() 這個函式,可以讀取xls 格式的檔案,變數wb 是一個xls 物件。在xls 物件底下,會有許多表張(Sheet),要知道有哪些表張,我們用

  wb.sheet_names()

來取得表張的資訊。要處理特定表張,我們使用下列方式取得表張物件:

  #Get the first sheet either by index or by name
sh = wb.sheet_by_index(0)
sh = wb.sheet_by_name(u'Sheet1')

要知道這個表張的資料範圍(資料的寬度與高度),我們使用

  #show the number of columns
sh.ncols
#show the number of rows
sh.rows

我們可以直接讀取某一行或某一列

  #import the first column of the Sheet
first_column = sh.col_values(0)
#Print the Sheet by rows iteration
for rownum in range(sh.nrows):
print sh.row_values(rownum)

也可以直接讀取某一個cell

  cell_A1 = sh.cell(0,0).value
cell_C4 = sh.cell(rowx=3,colx=2).value

有以上工具我們就可以透過Python 程式對excel 相容檔案進行操作。

再來是信件內容若需要配合收件者的名稱做置換的動作,我們要先寫一封信,用特殊的符號讓程式可以辨識這是要置換的地方,例如$$$ 等比較不太容易出現的字串,然後再用對應的人名作替換。比較麻煩的是編碼問題。假若是中文UTF-8 的編碼方式,我們用

data = open('inmail.txt').read()

data2 = data.decode("utf-8")

的方式將信件讀入,置換後的內容再用

open(outmail,'w').write(data3.encode('UTF-8'))

的方式寫入一個新信件。 

再來是附加檔案。這部份我們是用騙的,把附加的檔案先透過uuencode 的程式編碼成ascii 然後再接上剛才做出來的信件內容,成為新的信件。例如我們要附加一張圖檔card.jpg ,我們用uuencode card.jpg newcard.jpg > attach.txt 把編碼的結果寫入attach.txt 檔案。這裡的newcard.jpg 是會出現在附件中的檔名。然後我們再用cat 指令把 outmail 和 attach.txt 綁在一起。然後用command line 的 mail 指令寄出。例如

(cat outmail attach.txt)| mail -s "your subject" 這個email住址已經被防垃圾郵件程式保護,您需要啟動Javascript才能觀看

這裡還有一個麻煩的事情就是收到信的人,可能會有編碼錯誤的情況。若可以把subject 用正確的base64 編碼,就可以讓閱讀的人減少編碼錯誤的機會。例如"中秋節快樂"的base64 編碼為"iMyMDAxMzsmIzMxMTc5OyYjMzE2ODA7JiMyNDU1NTsmIzI3MTM4Ow==" 。要怎麼編呢?用google 查base64 encode online 就有一堆網站可以幫忙編碼。

最後我們會用到os.system("your system command") 來執行系統命令,以及我們用 time.sleep("random delay time") 來避免對方的郵件系統把我們當作垃圾郵件攻擊。

學會了上列招數,我們就可以整批發信了(其實這招就是發垃圾信的秘訣)。 

 

 

最後更新 ( 2012/09/27, 週四 )
 
< 前一個   下一個 >