python中带附件发送电子邮件_python发送带附件邮件
Python SMTP發(fā)送郵件
SMTP(Simple Mail Transfer Protocol)即簡(jiǎn)單郵件傳輸協(xié)議,它是一組用于由源地址到目的地址傳送郵件的規(guī)則,由它來(lái)控制信件的中轉(zhuǎn)方式。
python的smtplib提供了一種很方便的途徑發(fā)送電子郵件。它對(duì)smtp協(xié)議進(jìn)行了簡(jiǎn)單的封裝。
Python創(chuàng)建 SMTP 對(duì)象語(yǔ)法如下:
import smtplib
smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )
參數(shù)說(shuō)明:
host: SMTP 服務(wù)器主機(jī)。 你可以指定主機(jī)的ip地址或者域名,這個(gè)是可選參數(shù)。
port: 如果你提供了 host 參數(shù), 你需要指定 SMTP 服務(wù)使用的端口號(hào),一般情況下 SMTP 端口號(hào)為25。
local_hostname: 如果 SMTP 在你的本機(jī)上,你只需要指定服務(wù)器地址為 localhost 即可。
Python SMTP 對(duì)象使用 sendmail 方法發(fā)送郵件,語(yǔ)法如下:
SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options]
參數(shù)說(shuō)明:
from_addr: 郵件發(fā)送者地址。
to_addrs: 字符串列表,郵件發(fā)送地址。
msg: 發(fā)送消息
開(kāi)發(fā)中我們要發(fā)送郵件需要帶附件:
可采用email模塊發(fā)送電子郵件附件。發(fā)送一個(gè)未知MIME類(lèi)型的文件附件其基本思路如下:
構(gòu)造MIMEMultipart對(duì)象做為根容器
構(gòu)造MIMEText對(duì)象做為郵件顯示內(nèi)容并附加到根容器
構(gòu)造MIMEBase對(duì)象做為文件附件內(nèi)容并附加到根容器
a. 讀入文件內(nèi)容并格式化
b. 設(shè)置附件頭
設(shè)置根容器屬性
得到格式化后的完整文本
用smtp發(fā)送郵件
實(shí)例代碼:
def send_report_email(self,file_path,emails):
‘’’’’
@subject:郵件主題
@msg:郵件內(nèi)容
@toaddrs:收信人的郵箱地址
@fromaddr:發(fā)信人的郵箱地址
@smtpaddr:smtp服務(wù)地址,可以在郵箱看,比如163郵箱為smtp.163.com
@password:發(fā)信人的郵箱密碼
‘’’
fromaddr = config.get('fromaddr',"")
smtpaddr = config.get('smtpaddr',"")
password = config.get('password',"")
# toaddrs = ["Dong_Jie@want-want.com"]
toaddrs = emails
subject = "售貨機(jī)結(jié)算表"
msg = "本周期售貨機(jī)結(jié)算表"
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')) # 構(gòu)造MIMEBase對(duì)象做為文件附件內(nèi)容并附加到根容器
data = open(file_path, 'rb') ## 讀入文件內(nèi)容并格式化 [方式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服務(wù)器
s.ehlo()
s.starttls()
s.ehlo
s.login(fromaddr, password) # 登錄郵箱
s.sendmail(fromaddr, toaddrs, mail_msg.as_string()) # 發(fā)送郵件
s.quit()
_logger.info("郵件發(fā)送成功")
except Exception, e:
print "Error: unable to send email"
_logger.info("郵件發(fā)送失敗")
其中需要發(fā)送的附件需要進(jìn)行壓縮成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平臺(tái),轉(zhuǎn)為gbk,支持簡(jiǎn)體和繁體
zf.write(tar, arcname)
zf.close()
還需要配置我們自己的郵件發(fā)送服務(wù)器和發(fā)送郵箱,需要配置在odoo.conf中:
fromaddr = svmaccount@want-want.com
smtpaddr = 10.0.1.239
password = P@ssw0rd
最后手動(dòng)執(zhí)行任務(wù)測(cè)試郵件發(fā)送且?guī)в衵ip附件,郵件發(fā)送成功。
總結(jié)
以上是生活随笔為你收集整理的python中带附件发送电子邮件_python发送带附件邮件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: 公司外汇备案为啥通不过?(公司外汇备案)
- 下一篇: 消防备案号在哪里查询(消防备案号)
