簡體   English   中英

如何在Python中發送帶有Excel文件(xlsx)附件的電子郵件

[英]how to send email with Excel file (xlsx)attachment in Python

我需要發一封帶有Excel附件的郵件。我的代碼如下,發郵件是可以的,但是當我收到郵件時,附件不是Excel文件~~好像我附件格式不對~ ~~

我添加了不同的電子郵件地址來接收這封電子郵件,但他們都收到了未知格式的文件

#!/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 = 'me@gmail.com'
receivers = ['aaaaaa@qq.com']  # 接收郵件,可設置為你的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格式文件)

方法一:

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) 

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

方法二:

 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)

結果:收到一個bin格式的文件

方法三:

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

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

試試這個代碼來添加附件:

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

我試圖發送一個 HTML 格式的正文,並添加一個 excel 文件作為附件 - 這花了我很長時間才弄清楚,所以最好的想法是我應該分享我的解決方案!

from email.message import EmailMessage

msg = EmailMessage()
msg['Subject'] = 'This is my subject line'
msg['To'] = xxxxx@xmail.com
msg['From'] = yyyyy@ymail.com

msg.add_alternative(f"""\
        <!DOCTYPE html>
            <html>
                <body>
                    <h3>This is my message!</h3>
                </body>
            </html>""",
    subtype='html')

with open('MyExcelFile.xlsx', 'rb') as fh:
    attachment = fh.read()
    msg.add_related(attachment, maintype='application', subtype='xlsx', filename='MyExcelFile.xlsx')

with smtplib.SMTP_SSL(host='smtp.gmail.com', port=465) as smtp:
    smtp.login('obviouslyfake@gmail.com', 'WhoDoYouThinkIAm')
    smtp.send_message(msg)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM