Estoy intentando eliminar 2 archivos que se crearon para adjuntar y enviar por correo electrónico.

El siguiente código funciona perfectamente, crea el archivo y lo envía al correo electrónico especificado, sin embargo, cuando intento eliminar los archivos

if os.path.exists(filename):
    os.remove(filename)

if os.path.exists(filenameZip):
    os.remove(filenameZip)

Aparece el siguiente error:

PermissionError at /apptest/sendemailwithattachments/
[WinError 32] The process cannot access the file because it is being used by another process: '00671245sasa-myInstitutionNameHere.zip'

Aquí está el código que estoy usando para generar los archivos y enviar el correo electrónico

myJson = json.dumps(request.data);
filename = sfOppID + "-" + institution + ".json"
file = open(filename,"w")
file.write(myJson)
file.close()

filenameZip = sfOppID + "-" + institution + ".zip"
if myResponse['successFile']:
    file = open(filenameZip,"wb")
    file.write(response.content)
    file.close()

sender_email = "myEmail@hotmail.com"
receiver_email = "receiver@domain.com, " + customenv.otheremail
message = MIMEMultipart()
message["From"] = sender_email
message['To'] = receiver_email
message['Subject'] = "sending mail using python"
attachment = open(filename,'rb')
obj = MIMEBase('application','octet-stream')
obj.set_payload((attachment).read())
encoders.encode_base64(obj)
obj.add_header('Content-Disposition',"attachment; filename= "+filename)
message.attach(obj)

# IF THERE IS A ZIP FILE
if myResponse['successFile']:
    attachment = open(filenameZip,'rb')
    obj = MIMEBase('application','octet-stream')
    obj.set_payload((attachment).read())
    encoders.encode_base64(obj)
    obj.add_header('Content-Disposition',"attachment; filename= "+filenameZip)
    message.attach(obj)

my_message = message.as_string()
email_session = smtplib.SMTP('smtp.live.com',587)
email_session.starttls()
email_session.login(sender_email,'meEmailPassword')
email_session.sendmail(sender_email,receiver_email.split(','),my_message)
email_session.quit()

Me pregunto qué puedo hacer, ya que lo único que puedo pensar es programar un trabajo para eliminar estos archivos.

¿O hay alguna manera de verificar una vez que el correo electrónico se haya enviado al 100% y luego intentar eliminar los archivos?

0
Manza 20 ene. 2021 a las 09:54

1 respuesta

La mejor respuesta

Debe cerrar un archivo cada vez que lo abra. En su código, faltaba cerrar archivos en:

attachment = open(filename,'rb')

Y

attachment = open(filenameZip,'rb')

Si desea cerrarlos automáticamente, use el administrador de contexto: with

1
Tom Chen 22 ene. 2021 a las 03:12