python使用smtplib和email發送騰訊企業郵箱郵件


  公司每天要發送日報,最近沒事搞了一下如何自動發郵件,用的是騰訊企業郵箱,跟大家分享一下我的研究過程吧。

以前弄的發郵件的是用qq郵箱發的,當時在網上查資料最后達到了能發圖片,網頁,自定義收件人展示,主題等比較簡

單的,但沒想到說發送個word附件,后來才發現原來email里的MIMEText就可以,先上代碼吧

# coding:utf8
""" 日報 """
import smtplib import os from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart class MyEmail: def __init__(self): self.user = None self.passwd = None self.to_list = [] self.cc_list = [] self.tag = None self.doc = None def send(self): """ 發送郵件 """
        try: server = smtplib.SMTP_SSL("smtp.exmail.qq.com", port=465) server.login(self.user, self.passwd) server.sendmail("<%s>" % self.user, self.to_list, self.get_attach()) server.close() print("send email successful") except Exception as e: print("send email failed %s" % e) def get_attach(self): """ 構造郵件內容 """ attach = MIMEMultipart() if self.tag is not None: # 主題,最上面的一行
            attach["Subject"] = self.tag if self.user is not None: # 顯示在發件人
            attach["From"] = "發件人姓名,可以自定義<%s>" % self.user if self.to_list: # 收件人列表
            attach["To"] = ";".join(self.to_list) if self.cc_list: # 抄送列表
            attach["Cc"] = ";".join(self.cc_list) if self.doc: # 估計任何文件都可以用base64,比如rar等
            # 文件名漢字用gbk編碼代替
            name = os.path.basename(self.doc).encode("gbk") f = open(self.doc, "rb") doc = MIMEText(f.read(), "base64", "gb2312") doc["Content-Type"] = 'application/octet-stream' doc["Content-Disposition"] = 'attachment; filename="' + name + '"' attach.attach(doc) f.close() return attach.as_string() if __name__ == "__main__": my = MyEmail() my.user = "name@name.com" my.passwd = "password" my.to_list = ["", ] my.cc_list = ["", ] my.tag = "日報" my.doc = u"C:\Documents and Settings\Administrator\Desktop\日報.doc" my.send()
View Code

首先使用騰訊企業郵箱需要使用ssl,不過在smtplib中有這個功能,一般使用SMTP,需要ssl的時候使用SMTP_SSL,在明白這個之前
我費了好大的力氣去找怎么用ssl,后來才發現原來除了換個模塊外別的根本不用變化,
在登錄的時候我用的是@前面的帳號名,一直上不去,一直不知道為什么,第二天心里突然閃過一個想法:把完整郵箱地址當做帳號,一
試,哈哈,登錄成功了
然后就是發送附件了,首先是需要發送一個word文檔,找了半天才發現用
(from email.mime.text import MIMEText)
MIMEText就可以,本來我以為他只能處理文本的txt,原來他不僅可以處理文本,doc,rar都可以用它添加到附件里,只要在初始化的
時候使用base64就可以,后面的參數是doc使用的字符集吧,這個沒研究過,不確定
doc["Content-Type"] = 'application/octet-stream'
doc["Content-Disposition"] = 'attachment; filename=123.doc'

這個指定類型和描述,在描述里可以自定義文件名貌似這個文件名是gbk編碼的,
我的附件名字是中文,先使用u""把文件名聲明為unicode,再轉為gbk,如果使用unicode的話好像不行,文件名會變成系統定義的文件
名,不過文件仍然可以用,下載下來改個名字沒什么區別,使用utf8會出現亂碼
好吧,發現一個漏洞,抄送的郵件沒發出去

server.sendmail("<%s>"%self.user, self.to_list, self.get_attach())
中第二個參數表示的是想要發送到的地址,需要把抄送的地址也放在這個列表里,如下
server.sendmail("<%s>"%self.user, self.to_list + self.cc_list, self.get_attach())
至於在構造郵件時設置的不用變,那個只起到顯示的作用,和發給誰沒關系,只是在郵件內容中說明了一下發給誰,抄送給誰而已,實際
上誰真正收到需要在sendmail里添加


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM