Adjuntar la lista de archivos y correo electrónico utilizando la conexión segura -- python campo con email campo con ssl camp codereview Relacionados El problema

Attach list of files and email using secure connection


4
vote

problema

Español

¿Puedo usar esta función para adjuntar de manera confiable una lista de archivos de Excel a un correo electrónico y crear una conexión segura para transmitir dicho correo electrónico? Mi programación de Python es autodidacta y pongo esta función junto con muchas búsquedas de Google. (Esta función funciona, lo uso, pero me gustaría tener a alguien con más experiencia, mirarlo, si es posible)

¿Dónde puedo mejorar mi código? (¿Estoy usando los módulos correctos?)

  Table1  
Original en ingles

Can I use this function to reliably attach a list of excel files to an email and create a secure connection to transmit said email? My python programming is self taught and I put this function together with a lot of google searches. (This function works, I use it, but I would like to have someone with more experience look it through, if possible)

Where can I improve my code? (Am I using the correct modules?)

import datetime import smtplib from email.MIMEMultipart import MIMEMultipart from email.MIMEText import MIMEText from email.MIMEBase import MIMEBase from email import Encoders  sMDY = datetime.date.today().strftime('%m/%d/%y') lpath = 'C:/Path/to/my/excel/files/' flist = ['excelfile_1.xlsx', 'excelfile_2.xlsx']  def EMAIL_FILES(flist):     uname = 'username'     pword = 'password'      emailfrom = 'sender@domain.com'     emailto = [         'recipient_1@domain.com',         'recipient_2@domain.com',         ]      body = ["The information transmitted is ..."]     subject = ('Subject with date %s' % sMDY)      msg = MIMEMultipart()     msg['From'] = emailfrom     msg['To'] = ', '.join(emailto)     msg['Subject'] = subject      msg.attach(MIMEText(''.join(body)))      ### ATTACH FILES     for item in flist:         part = MIMEBase('application', "octet-stream")          part.set_payload(open(lpath + item, "rb").read())          Encoders.encode_base64(part)          part.add_header('Content-Disposition',                         'attachment; filename="%s"' % item)         msg.attach(part)       ### SECURE CONNECTION     server = smtplib.SMTP('smtp.domain.com:25')     server.ehlo()     server.starttls()     server.ehlo()     server.login(uname, pword)      server.sendmail(emailfrom, emailto, msg.as_string())     server.quit() 
        

Lista de respuestas

4
 
vote

En general, el código se ve bien. Solo tengo algunos comentarios misceláneos.

Organización de Código

  • Los nombres de la función deben ser nombrados lower_case_with_underscores por PEP 8 .
  • dividiría la composición del mensaje y enviaría funciones separadas.
  • Es una buena práctica para evitar la incorporación de contraseñas en su código fuente. Sugiero almacenar la información de la cuenta en una yaml archivo, o al menos como constantes en un módulo de Python separado.
  • Los parámetros son codificados por duros, por lo que la función es de utilidad limitada. La función podría aceptar parámetros con valores predeterminados:

      def compose_email(from='sender@example.com',                   to=['recipient_1@example.com','recipient_2@example.com'],                   attachments=[])     …  def send_email(msg, username, password)     …   

Contenido de correo

  • El tipo MIME para archivos .xlsx es 9988776655544332 .
  • Concatenando las rutas de archivo usando os.path.join(lpath, item)3 le permitiría no tener que preocuparse por el separador del componente de la ruta. Personalmente, elegiría pasar caminos completos a la función, para evitar asumir que todos están en algún directorio codificado:

      def EMAIL_FILES(attachments):     …     for path in attachments:         with open(path, 'rb') as f:             part = MIMEBase('application', 'vnd.openxmlformats-officedocument.spreadsheetml.sheet')             part.set_payload(f.read())             part.add_header('Content-Disposition',                 'attachment; filename="%s"' % os.path.basename(path))             Encoders.encode_base64(part)             msg.attach(part)     …  EMAIL_FILES([os.path.join('C:/Path/to/my/excel/files/', f) for f in     ['excelfile_1.xlsx', 'excelfile_2.xlsx'] ])   
  • Estoy desconcertado por la razón por la cual definió body como una lista de cadenas, solo para unirse a todos en una larga cadena. Si el cuerpo contiene contenido no trivial, considere escribirlo como una " "" Longstring "" ". Además, es posible que deba codificar el MIMEText usando Encoders.encode_quopri() .
 

In general, the code looks good. I just have a few miscellaneous remarks.

Code organization

  • Function names should be named lower_case_with_underscores by PEP 8.
  • I would split the message composition and sending into separate functions.
  • It is good practice to avoid embedding passwords into your source code. I suggest storing the account information in a YAML file, or at least as constants in a separate Python module.
  • The parameters are hard-coded, so the function is of limited utility. The function could accept parameters with defaults:

    def compose_email(from='sender@example.com',                   to=['recipient_1@example.com','recipient_2@example.com'],                   attachments=[])     xe2x80xa6  def send_email(msg, username, password)     xe2x80xa6 

Mail content

  • The MIME type for .xlsx files is application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.
  • Concatenating file paths using os.path.join(lpath, item) would let you not have to worry about the path component separator. Personally, I would choose to pass full paths to the function instead, to avoid assuming that they are all in some hard-coded directory:

    def EMAIL_FILES(attachments):     xe2x80xa6     for path in attachments:         with open(path, 'rb') as f:             part = MIMEBase('application', 'vnd.openxmlformats-officedocument.spreadsheetml.sheet')             part.set_payload(f.read())             part.add_header('Content-Disposition',                 'attachment; filename="%s"' % os.path.basename(path))             Encoders.encode_base64(part)             msg.attach(part)     xe2x80xa6  EMAIL_FILES([os.path.join('C:/Path/to/my/excel/files/', f) for f in     ['excelfile_1.xlsx', 'excelfile_2.xlsx'] ]) 
  • I'm puzzled by why you defined body as a list of strings, only to join them all into one long string. If the body contains non-trivial content, consider writing it as a """longstring""". Also, you may need to encode the MIMEText using Encoders.encode_quopri().
 
 

Relacionados problema

1  Configuración de la firma de certificado para entornos de desarrollo y producción  ( Configuring certificate signing for development and production environments ) 
El siguiente código funciona, pero hay mucha duplicación, me pregunto si puedo moverme. Me gustaría poder usar Login2 Si en el entorno de desarrollo, de l...

11  Autenticación mutua SSL, con un certificado raíz específico  ( Ssl mutual authentication with one specific root certificate ) 
para una nueva aplicación de servidor que estamos desarrollando; Implementé un método para verificar los certificados SSL. El uso de este método es la autenti...

5  Secure el curl para y maneje la respuesta de la pasarela de pago  ( Secure curl to handle response from payment gateway ) 
Estoy usando una pasarela de pago y estoy tratando de implementar el manejo de la publicación y la respuesta con rizo para que todo suceda en una página. El...

2  Configuración de seguridad de proxy inversa de Apache  ( Apache reverse proxy security configuration ) 
¿Podría alguien compartir algo de luz y verificar si esto está bien para los estándares de seguridad / buena seguridad de Apache? Estoy usando Apache httpd pa...

2  Forzando SSL y WWW usando .htaccess  ( Forcing ssl and www using htaccess ) 
Me gustaría saber si este código en .htaccess para forzar SSL y WWW en URL es correcto, porque con otro código generalmente recibo el bucle de redireccionamie...

10  Aceptar de forma segura un certificado SSL conocido con un nombre de host diferente  ( Safely accepting a known ssl certificate with a different host name ) 
Mi aplicación se comunica con un servidor a través de una red interna a través de HTTPS. El certificado SSL en este servidor está listado para el host como su...

7  Completa Async Openssl Ejemplo  ( Complete async openssl example ) 
Estoy tratando de crear un ejemplo de un cliente y un servidor completamente ASYNC usando SSL. Creo que estos son los supuestos requeridos: La conexión p...

0  Implementación de Auth Token SSL  ( Auth token ssl implementation ) 
<?php define('AES_256_CBC', 'aes-256-cbc'); // both stored in a file on server $encryption_key = openssl_random_pseudo_bytes(32); $iv = openssl_random_pse...

4  Cliente / servidor openssl  ( Openssl client server ) 
Recientemente, he comenzado a caer con OpenSSL para proporcionar el cifrado TLS a la comunicación del socket TCP. A través de la documentación y la gran refer...

6  Nodo.js Protobuf Socket Client con soporte TLS  ( Node js protobuf socket client with tls support ) 
Estoy trabajando con un entorno que me permite ejecutar el código de nodo.js de un solo archivo sin instalar módulos adicionales . Mi tarea es escribir un cl...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos