smtplib 抄送邮件_用Python收发电子邮件
電子郵件是最古老的互聯網服務之一,發明于1969年,它已經50歲了!它并不要求收信人發信人同時連接網絡,郵件存放于服務器,所以至今在企業內部還在大量使用。而且它是開放協議,沒有被某大公司壟斷。我們完全可以拿來做一個可靠的消息來源。
比如說我們在遠程主機運行一個耗時較長的任務,或者搭建某個自己寫的后臺服務,當某些事件發生時,就可以發送一個郵件,手機任何一個郵件客戶端都可以接收推送。
國內較好的郵件服務器就是QQ郵件了,它支持SMTP, ftjMAP, 默認都支持SSL的,這點很重要。要知道SMTP, POP密碼都是明文顯示在TCP包里。要開啟SMTP/IMAP, 要在QQ郵件里做一下設置,拿到授權碼,這個就是做為SMTP/IMAP的密碼,而不是QQ密碼。
用IMAP接收郵件
python標準庫里的imaplib就支持IMAP, 連接imap.qq.com即可with IMAP4_SSL("imap.qq.com") as M:M.noop()M.login("111111@qq.com", "gzoyimtltnqsbdba") #qq郵件地址和剛才拿到的授權碼,注意不是QQ號碼和QQ密碼M.select()typ, data = M.search(None, 'ALL') #ALL為所有郵件,可替換為想搜索的字符串count = 10pcount = 1for num in data[0].split():typ, data = M.fetch(num, '(RFC822)') #RFC822 為email標準for response_part in data:if isinstance(response_part, tuple):part = response_part[1].decode('utf-8')msg = email.message_from_string(part) #收到的郵件包parseHeader(msg)parseBody(msg)pcount += 1if pcount > count:break上面的msg包含了郵件本身的所有信息,我們感興趣的有from, to, cc, subject, body等,分別代表了發件人,收件人,抄送列表,標題和郵件主體。python提供了email庫幫助從message里提取。
subject = message.get('Subject')# subject=str(message)# if subject is not None:h = email.header.Header(subject, charset='utf-8')dh = email.header.decode_header(h)subject = str(dh[0][0], encoding="utf-8")subject = encoded_words_to_text(subject)# .encode('utf-8')# print(h)# # 發件人from_sb = encoded_words_to_text(email.utils.parseaddr(message.get('from'))[0])if len(from_sb) == 0:from_sb = encoded_words_to_text(email.utils.parseaddr(message.get('from'))[1])# # 收件人to_sb = email.utils.parseaddr(message.get('to'))[1]# # 抄送人cc = email.utils.parseaddr(message.get_all('cc'))[1]# try:fmt = "ddd, D MMM YYYY HH:mm:ss Z"# date = arrow.get(message['Date'], fmt)date = arrow.get(message['Received'].split(';')[1], fmt)print(f"{from_sb:30} {subject:80} {date.humanize():20}")arrow是python的一個第三方時間庫,humanize可以生成one month ago這樣容易懂的格式。
encoded_words_to_text方法是專門用來處理=?utf-8?q?打頭的字符串的,因為電子郵件設計當初是只考慮ASCII碼的,因為unicode還沒誕生!為了支持unicode,又兼容以前的郵件,所以引入了這樣的字符串格式。
def encoded_words_to_text(encoded_words):if not encoded_words.startswith("=?"):return encoded_wordsencoded_word_regex = r'=?{1}(.+)?{1}([B|Q])?{1}(.+)?{1}='charset, encoding, encoded_text = re.match(encoded_word_regex, encoded_words, flags=re.IGNORECASE).groups()if encoding.upper() == 'B':byte_string = base64.b64decode(encoded_text)elif encoding.upper() == 'Q':byte_string = quopri.decodestring(encoded_text)return byte_string.decode(charset)用smtplib發送郵件
發送相對于接收就很簡單了,在用QQ授權碼登錄http://smtp.qq.com服務器后調用sendemail就可以了,唯一要注意的一點是sendmail的msg參數是指email的所有內容,并沒有提供subject和body的專門參數。所以我們需要用換行符分開。
def send_mail(fromaddr, toaddrs, subject, body):# Add the From: and To: headers at the start!msg = ("From: %srnTo: %srnSubject: %snn%s"% (fromaddr, ", ".join(toaddrs), subject, body))while True: # 從命令行接收郵件內容,直到連按兩下回車try:line = input()except EOFError:breakif not line:breakmsg = msg + lineprint("Message length is", len(msg))server = SMTP_SSL('smtp.qq.com')server.set_debuglevel(1) #打開調試server.login("111111@qq.com", "gzoyimtltnqsbdba")server.sendmail(fromaddr, toaddrs, msg)server.quit()掃碼關注公眾號,獲取更多文章
總結
以上是生活随笔為你收集整理的smtplib 抄送邮件_用Python收发电子邮件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前腿肉和后腿肉的区别(两个部位的猪肉买哪
- 下一篇: 怎样把u盘里的字体安装到电脑(电脑里安装