2017-08-14 147 views
0

我需要發送一封帶有Excel附件的電子郵件 我的代碼如下,可以發送電子郵件, 但是當我收到電子郵件時,附件文件不是Excel文件~~ 看來我重視~~~如何用Excel文件發送電子郵件(xlsx)附件在Python中

我有添加不同的電子郵件地址格式錯誤接收了該郵件, 但他們都收到了未知格式文件

#!/usr/bin/python 
# -*- coding: UTF-8 -*- 
import os 
import datetime 
import sys 
import smtplib 
from email.mime.multipart import MIMEMultipart 
from email.mime.text import MIMEText 
from email.header import Header 
from email.mime.base import MIMEBase 
from email import encoders 

mail_host = "mysever" # 設置服務器 
mail_user = "me" # 用戶名 
mail_pass = "me123" # 口令 

EMAILHOME = u'F:\Workfiles\weekreport\\forupdate' 
sender = '[email protected]' 
receivers = ['[email protected]'] # 接收郵件,可設置爲你的QQ郵箱或者其他郵箱 


def getReceiverlist(filename): 
    lif = open(filename) 
    li = lif.readlines() 
    lif.close() 
    for x in range(len(li)): 
     li[x] = li[x].strip(os.linesep) 
    while '' in li: 
     li.remove('') 
    return li 


def aisendmail(): 
    ret = True 
    try: 
     message = MIMEMultipart() 
     message['From'] = Header("myname", 'utf-8') 
     message['To'] = Header("youname", 'utf-8') 
     message.attach(MIMEText('weekreport', 'plain', 'utf-8')) # 三個參數:第一個爲文本內容,第二個 plain 設置文本格式,第三個 utf-8 設置編碼 

     subject = 'myname-weekreport' 
     message['Subject'] = Header(subject, 'utf-8') 

     att1 = MIMEBase('application', "octet-stream") 
     att1.set_payload(open(u"F:\Workfiles\weekreport\\forupdate\myname_weekreport_20170821.xlsx",'rb').read()) 
     encoders.encode_base64(att1) 
     att1.add_header('Content-Disposition', 'attachment; filename="myname-weekreport"') 
     message.attach(att1) 

     if os.path.exists(EMAILHOME + r'\receivers.txt'): 
      receiverslist = getReceiverlist(EMAILHOME + r'\receivers.txt') 
      print("receicerlist include:", receiverslist) 
      if len(receiverslist) == 0: 
       print"no receiver!!!" 
       receiverslist = receivers 
     else: 
      receiverslist = receivers 

     server = smtplib.SMTP() 
     server.connect(mail_host, 25) # 發件人郵箱中的SMTP服務器,端口是25 
     server.login(mail_user, mail_pass) # 括號中對應的是發件人郵箱賬號、郵箱密碼 
     server.sendmail(sender, receiverslist, message.as_string()) # 括號中對應的是發件人郵箱賬號、收件人郵箱賬號、發送郵件 
     server.quit() # 關閉連接 
    except smtplib.SMTPException: # 如果 try 中的語句沒有執行,則會執行下面的 ret=False 
     ret = False 
    return ret 

result = aisendmail() 
if result: 
    print "郵件發送成功" 
else: 
    print "Error: 無法發送郵件" 

我遵循不同的方式來添加Excel附加換貨如下:但他們都失敗了(這意味着它不能接受Excel格式文件)

方法1:

att1 = MIMEBase('application', 'octet-stream') #'octet-stream': binary data 
att1.set_payload(open(file, 'rb').read()) 
encoders.encode_base64(att1) 
att1.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(file)) 
msg.attach(att1) 

結果: 收到一個未知格式文件

方法2:

with open(u"F:\Workfiles\週報\\forupdate\xxx_週報_20170821.xlsx", "rb") as fil: 
     part = MIMEApplication(
      fil.read(), 
      Name=basename(u"F:\Workfiles\週報\\forupdate\xxx_週報_20170821.xlsx") 
     ) 
     part['Content-Disposition'] = 'attachment; filename="%s"' % basename(u"F:\Workfiles\週報\\forupdate\xxx_週報_20170821.xlsx") 
     message.attach(part) 

結果: 接到倉格式文件

方法3:

att1 = MIMEApplication(open('foo.xlsx','rb').read()) 
att1.add_header('Content-Disposition', 'attachment', filename="foo.xlsx") 
msg.attach(att1) 

結果: 收到一個未知格式文件

回答

0

試試這個代碼添加附件:

with open(f, "rb") as fil: 
      part = MIMEApplication(
       fil.read(), 
       Name=basename(f) 
      ) 
      part['Content-Disposition'] = 'attachment; filename="%s"' % basename(f) 
      msg.attach(part) 
+0

感謝您的答覆,但該版本的Python你使用?,我的是2.7,並且當我添加代碼時,這不是MIMEA應用程序定義,而且來自os.path的basename() –

+0

導入基本名稱 from email.mime.application import MIMEApplication – Some1Else

+0

它無法正常工作,發送完成後,它收到一個bin格式文件,而不是excel格式! –

相關問題