创建电子邮件但仍然存在的错误消息

时间:2018-04-12 14:16:00

标签: python-2.7

我将以下代码设置为创建电子邮件并附加文件然后发送。它就像一个魅力,但它总是在发送后给我一个错误的最后一个文件。几乎就像它试图两次完成最后一个文件一样。稍后在代码中我移动文件夹中的所有文件,这是我最初认为的问题,但是当我编写错误时捕获它是在这个段中的某个地方。

错误示例,当文件夹中只有一个文件时 - 错误[错误2]没有这样的文件或目录:'C:\ Users \ hlooman \ Desktop \ TestFolder \ ProccessedReports \〜$ TestFile1.xlsx'

path ='C:\Users\hlooman\Desktop\TestFolder\ProccessedReports'
extension = '.xlsx'
for filename in os.listdir(path):
    if os.path.splitext(filename)[1] == extension:
        try:
            msg = MIMEMultipart()
            msg['From'] = os.environ['TEST_EMAIL']
            msg['To'] = os.environ['TEST_EMAIL']
            msg['Subject'] = 'Formated Renewal Report'
            message = 'Attached are the formated reports'
            msg.attach(MIMEText(message))          
            with open(os.path.join(path, filename), "rb") as attachment:
                part = MIMEBase('application', 'octet-stream')
                part.set_payload((attachment).read())
                encoders.encode_base64(part)
                part.add_header('Content-Disposition', "attachment; filename= %s" % filename)          
                msg.attach(part)
                mailserver = smtplib.SMTP('smtp.office365.com',587)
                # identify ourselves to smtp gmail client
                mailserver.ehlo()
                # secure our email with tls encryption
                mailserver.starttls()
                # re-identify ourselves as an encrypted connection
                mailserver.ehlo()
                mailserver.login(os.environ['TEST_EMAIL'], os.environ['TEST_PASS'])
                mailserver.sendmail(os.environ['TEST_EMAIL'],os.environ['TEST_EMAIL'],msg.as_string())
                mailserver.quit()
        except Exception as error2:
            filepath = os.path.join(path, filename)
            log.write(str(d) + " Error " + str(error2) + " occured during email creation of " + str(filepath))
            log.write("\n")
            log.close()

1 个答案:

答案 0 :(得分:1)

而不是

path ='C:\Users\hlooman\Desktop\TestFolder\ProccessedReports'
extension = '.xlsx'
for filename in os.listdir(path):
    if os.path.splitext(filename)[1] == extension:
        # process file

您应该使用glob.glob,它更简单,更易读,并会过滤掉以~开头的不需要的文件,如下所示:

from glob import glob
path = r'C:\Users\hlooman\Desktop\TestFolder\ProccessedReports'
for filename in glob(path + r'\[!~]*.xslx"):
    # process files

glob模式匹配path中以.xlsx结尾的所有文件名,但不以~开头。有关文件名模式匹配的详细信息,请参阅fnmatch module documentation

如果要处理大量文件,可以使用glob.iglob执行相同操作,但返回迭代器而不是列表以节省内存。

您会注意到我使用前缀为r的字符串:这些会取消\等转义字符的特殊含义,这在处理Windows文件路径时会非常烦人。我在前一个例子中使用的双反斜杠是另一种解决这个问题的方法,虽然很笨拙。

我无法对它进行真正的测试,因为我既没有Windows机器也没有Excel,但这应该可以解决问题。如果需要澄清,请不要犹豫。