Как удалить ВСЕ файлы электронной почты с помощью os.remove ()?

В настоящее время мы используем TFS в качестве системы заявок для поддержки билетов. Я написал код ниже, чтобы пользователь мог отправить электронное письмо в папку, а затем получить доступ к веб-странице, чтобы отправить форму, создать заявку в службу поддержки TFS и назначить ее пользователю. Цель состоит в том, чтобы удалить электронные письма из папки после отправки формы и создания заявки в службу поддержки.

Проблема, с которой я сталкиваюсь, состоит в том, что, когда я пытаюсь удалить электронные письма после того, как Билет поддержки TFS был создан, он удаляет некоторые файлы, но затем застревает на последнем и отображает следующее сообщение об ошибке.

"PermissionError: [WinError 32] Процесс не может получить доступ к файлу, поскольку он используется другим процессом: 'C: Users b4bw3 Documents Python simple-salesforce Email Delete_Me1.msg'"

Если я удалю часть кода, которая создает билет TFS, он переименует электронное письмо и удалит его после того, как это будет сделано, как ожидалось. Похоже, что зависание с TFS. Я в тупике и мне нужна помощь.

Есть предположения? Кстати, это моя первая попытка Python, так что будьте осторожны. :)

«»»

# -*- coding: utf-8 -*-

import extract_msg
import cgi
import json
from tfs import TFSAPI
import os, sys
import requests
import glob

import cgitb
cgitb.enable()

form = cgi.FieldStorage()
associate = form.getvalue('associate')

login = json.load(open('login.json'))
personal_access_token = login['tfs_login']
client = TFSAPI("https://url/", project="LoanSystems/", pat=personal_access_token)

os.chdir('C:\Users\b4bw3\Documents\Python\simple-salesforce\Email')


def e2tfs():
    associate = form.getvalue('associate')
    i=1
    for file in os.listdir():
        src = file
        dst = "Delete_Me"+str(i)+".msg"
        os.rename(src,dst)
        msg = extract_msg.Message(dst)
        msg_sender = msg.sender
#        msg_date = msg.date
        msg_subj = msg.subject
        msg_message = msg.body
        i+=1

        fields = {'System.Title' : 'E2TFS: {}'.format(msg_subj),
                  'Microsoft.VSTS.CMMI.Symptom': 'Body: {}'.format(msg_message),
                  'Microsoft.VSTS.TCM.ReproSteps': 'TBD',
                  'Regions.Custom.DocumentationArea': 'Unknown',
                  'Regions.Custom.Application': 'nCino',
                  'Regions.Custom.Channel': 'Email',
                  'Microsoft.VSTS.CMMI.FoundInEnvironment': 'Production',
                  'Regions.Custom.ImpactedAssociate': 'Sender: {}'.format(msg_sender),
                  'Regions.Custom.Associate_Role': 'ALL USERS',
                  'Regions.Custom.BusinessGroupsImpacted2': 'All Business Groups',
                  'AFS.phase.dev': 'ALL USERS',
                  'Regions.Custom.PriorityCustomField': 'High',
                  'Regions.Custom.CaseOwner': associate          
                  }      


        client.create_workitem('Support Ticket', fields=fields)

        query_tfs = "SELECT [System.Id], [System.Title] FROM workitems WHERE [System.CreatedDate] = @today AND [System.CreatedBy] = @me AND [System.WorkItemType] = 'Support Ticket'"

        wiql = client.run_wiql(query_tfs)


        # Get all found workitems
        workitems = wiql.workitems
        tfs_number = workitems[-1]['Id']
        print(f"Support Ticket {tfs_number} was created.
")

        #Create a link to the Support Ticket
        url = 'https://sfdctfs/tfs/LoanSystems/SalesForce%20COE/_workitems/edit/' + str(tfs_number)
        print("<a target=_blank href="" + url + ""> Click Here to View in a New Tab</a></br></p>
")


    filelist = glob.glob('C:\Users\b4bw3\Documents\Python\simple-salesforce\Email\*.msg')    
    for files in filelist:
#        print(f'{files} to be removed
')
        os.remove(files)
#        print(f'{files} file was removed
')




print("Content-type:text/html

")
print("<html>")
print("<head>")
print("<title>Email to TFS</title>")
print("</head>")
print("<body>")
print("<h2>Email to TFS</h2> <br />")
print('<a href="http://localhost:8000/cgi-bin/case.py">Click here</a> if you need to create a "Support Ticket" from a "Case Assignment."<br /><br />')
print("1. Drag and drop the email(s) to the designated folder.<br />")
print(ƈ. Select an Associate below to assign as the "Case Owner" on the "Support Ticket(s)."<br />')
print(Ɖ. Click the "Submit" button to generate a "Support Ticket(s)" in TFS. <br /><br />')
print("<form action ="/cgi-bin/template.py">")
print("Associate: <select name="associate"> <br /> ")
print("<option value="--None--">--None--</option>")
print("<option value="April">April</option>")
print("<option value="Mac">Mac</option>")
print("<option value="Michael">Michael</option>")
print("<option value="Chris">Chris</option>")
print("<input type = "submit" value = "Submit">")
print("</form><br />")
print("</body>")
print("</html>")
if associate != None:
    e2tfs()
print("<i>**Remember to remove the emails out of the directory when you're done.</i>")

«»»

Я попытался добавить close () внизу метода e2tfs (), но получил следующую ошибку:

Возникла проблема в скрипте Python. Вот последовательность вызовов функций, приводящих к ошибке, в порядке их возникновения.

C: Users b4bw3 Documents Python simple-salesforce cgi-bin template2.py in ()

     70 print("</html>")
     71 if associate != None:
=>   72     e2tfs()
     73 print("<i>**Remember to remove the emails out of the directory when you're done.</i>")
     74  

e2tfs = C: Users b4bw3 Documents Python simple-salesforce cgi-bin template2.py в e2tfs ()

     40     for files in filelist:
     41         print(f'{files} to be removed
')
=>   42         files.close()
     43         os.remove(files)
     44         print(f'{files} file was removed
')

files = r'C: Users b4bw3 Documents Python simple-salesforce Email Delete_Me1.msg ', files.close undefined AttributeError: у объекта' str 'нет атрибута' close 'args = ("объект" str' не имеет атрибута 'close' ",) with_traceback =

'''
    filelist = glob.glob('C:\Users\b4bw3\Documents\Python\simple-salesforce\Email\*.msg')


    for files in filelist:
        print(f'{files} to be removed
')
        files.close()
        os.remove(files)
        print(f'{files} file was removed
')
'''

Всего 1 ответ


Похоже, что это текущая ошибка для msg-экстрактора. Я нашел ссылку ниже, которая объясняет в деталях.

https://github.com/mattgwwalker/msg-extractor/issues/85?_pjax=%23js-repo-pjax-container

Я добавил следующую строку кода в конец моего метода, и он работает как шарм.

msg.close()

Есть идеи?

10000