pythonemail解析
1. python正則表達式是什麼
Python正則表達式是一個特殊的字元序列,是一種用來匹配字元串的強有力的武器。它的設計思想是用一種描述性的語言來給字元串定義一個規則,凡是符合規則的字元串,我們就認為它「匹配」了,否則,該字元串就是不合法的。
判斷一個字元串是否是合法的Email的方法是:
1、創建一個匹配Email的正則表達式;
2、用該正則表達式去匹配用戶的輸入來判斷是否合法。
因為正則表達式也是用字元串表示的,所以,要首先了解如何用字元來描述字元。
在正則表達式中,如果直接給出字元,就是精確匹配。用 d 可以匹配一個數字, w 可以匹配一個字母或數字。
2. demo鍦╬ython涓鐨勭敤娉
demo鏄鎸囨紨紺虹▼搴忥紝閫氬父鐢ㄦ潵婕旂ず涓縐嶆妧鏈鎴栧伐鍏風殑浣跨敤鏂規硶銆傚湪Python涓錛宒emo涔熸槸涓涓闈炲父閲嶈佺殑姒傚康銆備笅闈㈡垜灝嗕負澶у朵粙緇峆ython涓璬emo鐨勭敤娉曘
3銆乨emo紼嬪簭鐨勫垎鏋
浠ヤ笂紼嬪簭浣滀負Python涓婕旂ず閭浠跺彂閫佸姛鑳界殑涓涓猟emo紼嬪簭錛屾兜鐩栦簡閭浠跺彂閫佺殑鍏ㄨ繃紼嬶紝鍏朵腑錛岄氳繃email妯″潡鍒涘緩浜嗛偖浠跺疄渚嬶紝騫墮氳繃smtplib妯″潡鎻愪緵鐨凷MTP鍗忚榪涜屼簡閭浠剁殑鍙戦併
4銆乨emo紼嬪簭鐨勭敤閫
榪欎釜demo紼嬪簭鍙浠ュ府鍔╂柊鎵嬩簡瑙Python涓鐨勯偖浠跺彂閫佸姛鑳斤紝鏇村ソ鍦扮悊瑙e拰瀛︿範Python涓鐨勯偖浠舵ā鍧椼傚傛灉鎯寵佽嚜宸變嬌鐢≒ython鏉ュ彂閫侀偖浠訛紝鍙浠ラ氳繃淇鏀硅demo涓鐨勫彂浠朵漢銆佹敹浠朵漢銆佷富棰樸佹f枃銆丼MTP鏈嶅姟鍣ㄥ湴鍧銆佺鍙d互鍙婅處鎴蜂俊鎮絳夊弬鏁幫紝鏉ュ疄鐜拌嚜宸辯殑閭浠跺彂閫佸姛鑳姐
3. 用Python發送郵件,可以群發,帶有多個附件
'''''
函數說明:Send_email_text()函數實現發送帶有附件的郵件,可以群發,附件格式包括:xlsx,pdf,txt,jpg,mp3等
參數說明:
1.subject:郵件主題
2.content:郵件正文
3.filepath:附件的地址,輸入格式為["","",...]
4.receive_email:收件人地址,輸入格式為["","",...]
'''
defSend_email_text(subject,content,filepath,receive_email):
importsmtplib
fromemail.mime.multipartimportMIMEMultipart
fromemail.mime.textimportMIMEText
fromemail.mime.
sender="發送方郵箱"
passwd="填入發送方密碼"
receivers=receive_email#收件人郵箱
msgRoot=MIMEMultipart()
msgRoot['Subject']=subject
msgRoot['From']=sender
iflen(receivers)>1:
msgRoot['To']=','.join(receivers)#群發郵件
else:
msgRoot['To']=receivers[0]
part=MIMEText(content)
msgRoot.attach(part)
##添加附件部分
forpathinfilepath:
if".jpg"inpath:
#jpg類型附件
jpg_name=path.split("\")[-1]
part=MIMEApplication(open(path,'rb').read())
part.add_header('Content-Disposition','attachment',filename=jpg_name)
msgRoot.attach(part)
if".pdf"inpath:
#pdf類型附件
pdf_name=path.split("\")[-1]
part=MIMEApplication(open(path,'rb').read())
part.add_header('Content-Disposition','attachment',filename=pdf_name)
msgRoot.attach(part)
if".xlsx"inpath:
#xlsx類型附件
xlsx_name=path.split("\")[-1]
part=MIMEApplication(open(path,'rb').read())
part.add_header('Content-Disposition','attachment',filename=xlsx_name)
msgRoot.attach(part)
if".txt"inpath:
#txt類型附件
txt_name=path.split("\")[-1]
part=MIMEApplication(open(path,'rb').read())
part.add_header('Content-Disposition','attachment',filename=txt_name)
msgRoot.attach(part)
if".mp3"inpath:
#mp3類型附件
mp3_name=path.split("\")[-1]
part=MIMEApplication(open(path,'rb').read())
part.add_header('Content-Disposition','attachment',filename=mp3_name)
msgRoot.attach(part)
try:
s=smtplib.SMTP()
s.connect("smtp.mail.aliyun.com")#這里我使用的是阿里雲郵箱,也可以使用163郵箱:smtp.163.com
s.login(sender,passwd)
s.sendmail(sender,receivers,msgRoot.as_string())
print("郵件發送成功")
exceptsmtplib.SMTPExceptionase:
print("Error,發送失敗")
finally:
s.quit()
4. 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 。
5. 有關python正則表達式的問題
163郵箱格式
ret = re.match(r"^[a-zA-z]{1}w{5,17}@163.com$", email)
原意是想匹配一個前三個字元為字母、後三個字元為數字的163郵箱:
ret=re.match(r'^[a-zA-z]{3}[0-9]{3}@163.com$", email)
或ret=re.match(r'^[a-zA-z]{3}d{3}@163.com$", email)
? * + {} 都是量詞的使用,表示前面字元或字元串重復的次數
?重復0或1次
* 重復0或多次
+ 重復1或多次
{n} 重復n次
{n,} 至少重復n次
{n,m} 重復次數≥n 且 ≤m