python中带附件发送电子邮件_python发送带附件邮件
Python SMTP發送郵件
SMTP(Simple Mail Transfer Protocol)即簡單郵件傳輸協議,它是一組用于由源地址到目的地址傳送郵件的規則,由它來控制信件的中轉方式。
python的smtplib提供了一種很方便的途徑發送電子郵件。它對smtp協議進行了簡單的封裝。
Python創建 SMTP 對象語法如下:
import smtplib
smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )
參數說明:
host: SMTP 服務器主機。 你可以指定主機的ip地址或者域名,這個是可選參數。
port: 如果你提供了 host 參數, 你需要指定 SMTP 服務使用的端口號,一般情況下 SMTP 端口號為25。
local_hostname: 如果 SMTP 在你的本機上,你只需要指定服務器地址為 localhost 即可。
Python SMTP 對象使用 sendmail 方法發送郵件,語法如下:
SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options]
參數說明:
from_addr: 郵件發送者地址。
to_addrs: 字符串列表,郵件發送地址。
msg: 發送消息
開發中我們要發送郵件需要帶附件:
可采用email模塊發送電子郵件附件。發送一個未知MIME類型的文件附件其基本思路如下:
構造MIMEMultipart對象做為根容器
構造MIMEText對象做為郵件顯示內容并附加到根容器
構造MIMEBase對象做為文件附件內容并附加到根容器
a. 讀入文件內容并格式化
b. 設置附件頭
設置根容器屬性
得到格式化后的完整文本
用smtp發送郵件
實例代碼:
def send_report_email(self,file_path,emails):
‘’’’’
@subject:郵件主題
@msg:郵件內容
@toaddrs:收信人的郵箱地址
@fromaddr:發信人的郵箱地址
@smtpaddr:smtp服務地址,可以在郵箱看,比如163郵箱為smtp.163.com
@password:發信人的郵箱密碼
‘’’
fromaddr = config.get('fromaddr',"")
smtpaddr = config.get('smtpaddr',"")
password = config.get('password',"")
# toaddrs = ["Dong_Jie@want-want.com"]
toaddrs = emails
subject = "售貨機結算表"
msg = "本周期售貨機結算表"
mail_msg = MIMEMultipart()
if not isinstance(subject, unicode):
subject = unicode(subject, 'utf-8')
mail_msg['Subject'] = subject
mail_msg['From'] = fromaddr
mail_msg['To'] = ','.join(toaddrs)
mail_msg.attach(MIMEText(msg, 'html', 'utf-8')) # 構造MIMEBase對象做為文件附件內容并附加到根容器
data = open(file_path, 'rb') ## 讀入文件內容并格式化 [方式1]
ctype,encoding = mimetypes.guess_type(file_path)
if ctype is None or encoding is not None:
ctype = 'application/octet-stream'
maintype,subtype = ctype.split('/',1)
file_msg = email.MIMEBase.MIMEBase(maintype, subtype)
file_msg.set_payload(data.read())
Encoders.encode_base64(file_msg)#把附件編碼
data.close()
basename = os.path.basename(file_path)
file_msg.add_header('Content-Disposition','attachment', filename = basename)#修改郵件頭
mail_msg.attach(file_msg)
try:
s = smtplib.SMTP()
s.connect(smtpaddr) # 連接smtp服務器
s.ehlo()
s.starttls()
s.ehlo
s.login(fromaddr, password) # 登錄郵箱
s.sendmail(fromaddr, toaddrs, mail_msg.as_string()) # 發送郵件
s.quit()
_logger.info("郵件發送成功")
except Exception, e:
print "Error: unable to send email"
_logger.info("郵件發送失敗")
其中需要發送的附件需要進行壓縮成zip格式,代碼如下:
def zip_dir(dirname, zipfilename):
filelist = []
if os.path.isfile(dirname):
filelist.append(dirname)
else:
for root, dirs, files in os.walk(dirname):
for name in files:
filelist.append(os.path.join(root, name))
zf = zipfile.ZipFile(zipfilename, "w", zipfile.zlib.DEFLATED)
for tar in filelist:
arcname = tar[len(dirname):]
arcname = arcname.encode('GBK') #兼容windows平臺,轉為gbk,支持簡體和繁體
zf.write(tar, arcname)
zf.close()
還需要配置我們自己的郵件發送服務器和發送郵箱,需要配置在odoo.conf中:
fromaddr = svmaccount@want-want.com
smtpaddr = 10.0.1.239
password = P@ssw0rd
最后手動執行任務測試郵件發送且帶有zip附件,郵件發送成功。
總結
以上是生活随笔為你收集整理的python中带附件发送电子邮件_python发送带附件邮件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 公司外汇备案为啥通不过?(公司外汇备案)
- 下一篇: python抢货程序_写个Python程