• No se han encontrado resultados

Una aplicaci´ on: correo electr´ onico personalizado

5. Tipos estructurados: secuencias

5.1.10. Una aplicaci´ on: correo electr´ onico personalizado

Vamos a desarrollar un programa((´util)): uno que env´ıa textos personalizados por correo electr´onico. Deseamos enviar una carta tipo a varios clientes, pero adaptando algunos datos de la misma a los propios de cada cliente. Aqu´ı tienes un ejemplo de carta tipo:

Estimado =S =A:

Por la presente le informamos de que nos debe usted la cantidad

de =E euros. Si no abona dicha cantidad antes de 3 d´ıas, su nombre

pasar´a a nuestra lista de morosos.

Deseamos sustituir las marcas ((=S)), ((=A)) y ((=E)) por el tratamiento (se˜nor o se˜nora), el apellido y la deuda, respectivamente, de cada cliente y enviarle el mensaje resultante por correo electr´onico. Nuestro programa pedir´a los datos de un cliente, personalizar´a el escrito, se lo enviar´a por correo electr´onico y a continuaci´on, si lo deseamos, repetir´a el proceso para un nuevo cliente.

Antes de empezar a desarrollar el programa nos detendremos para aprender lo b´asico del m´odulo smtplib, que proporciona funciones para usar el protocolo de env´ıo de correo electr´onico SMTP (siglas de((Simple Mail Transfer Protocol)), o sea, ((Protocolo Sencillo de Transferencia de Correo)))1. Lo mejor ser´a que estudiemos un ejemplo de uso de la librer´ıa y que analicemos lo que hace paso a paso.

ejemplo smtp.py ejemplo smtp.py

1 from smtplib import SMTP

2

3 servidor = SMTP (’alu-mail.uji.es’) # Cambia la cadena por el nombre de tu servidor.

4 remitente = ’[email protected]

5 destinatario = ’[email protected]

6 mensaje = ’From: %s\nTo: %s\n\n’ % (remitente, destinatario)

7 mensaje += ’Hola.\n’

8 mensaje += ’Hasta luego.\n’

9

10 servidor.sendmail (remitente, destinatario, mensaje)

Vamos por partes. La primera l´ınea importa la funci´on SMTP del m´odulo smtplib. La l´ınea 3 crea una conexi´on con la m´aquina servidora (v´ıa la llamada a SMTP ), que en nuestro ejemplo es [email protected], y devuelve un objeto que guardamos en la variable servidor . Las l´ıneas 4 y 5 guardan las direcciones de correo del remitente y del destinatario en sendas variables, mientras que las tres l´ıneas siguientes definen el mensaje que vamos a enviar. As´ı, la l´ınea 6 define las denominadas ((cabeceras)) (((headers))) del correo y son obligatorias en el protocolo SMTP (respetando, adem´as, los saltos de l´ınea que puedes apreciar al final de las cadenas). Las dos l´ıneas siguientes constituyen el mensaje en s´ı mismo. Finalmente, la ´ultima l´ınea se encarga de efectuar el env´ıo del correo a trav´es de la conexi´on almacenada en servidor y el m´etodo sendmail . Eso es todo. Si ejecutamos el programa y tenemos permiso del servidor, [email protected] recibir´a un correo de [email protected] con el texto que hemos almacenado en mensaje.

Nuestro programa presentar´a el siguiente aspecto: spam.py

1No pierdas de vista que el objetivo de esta secci´on es aprender el manejo de cadenas. No te despistes tratando

1 from smtplib import SMTP 2

3 servidor = SMTP (’alu-mail.uji.es’)

4 remitente = ’[email protected]

5 texto = ’Estimado =S =A:\n\n’

6 texto += ’Por la presente le informamos de que nos debe usted la ’

7 texto += ’cantidad de =E euros. Si no abona dicha cantidad antes ’

8 texto += ’de 3 d´ıas, su nombre pasar´a a nuestra lista de morosos.’

9

10 seguir = ’s’

11 while seguir == ’s’:

12 destinatario = raw_input (’Direcci´on del destinatario: ’)

13 tratamiento = raw_input (’Tratamiento: ’)

14 apellido = raw_input (’Apellido: ’)

15 euros = raw_input (’Deuda (en euros): ’)

16

17 mensaje = ’From: %s\nTo: %s\n\n’ % (remitente, destinatario)

18 mensaje += texto personalizado

19

20 servidor.sendmail (remitente, destinatario, mensaje)

21 seguir = raw_input (’Si desea enviar otro correo, pulse \’s\’: ’)

En la l´ınea 18 hemos dejado un fragmento de programa por escribir: el que se encarga de personalizar el contenido de texto con los datos que ha introducido el usuario. ¿C´omo perso- nalizamos el texto? Deber´ıamos ir copiando los caracteres de texto uno a uno en una variable auxiliar (inicialmente vac´ıa) hasta ver el car´acter ((=)), momento en el que deberemos estudiar el siguiente car´acter y, en funci´on de cu´al sea, a˜nadir el contenido de tratamiento, apellido o euros.

spam 2.py spam.py

1 from smtplib import SMTP

2

3 servidor = SMTP (’alu-mail.uji.es’)

4 remitente = ’[email protected]

5 texto = ’Estimado =S =A:\n\n’

6 texto += ’Por la presente le informamos de que nos debe usted la ’

7 texto += ’cantidad de =E euros. Si no abona dicha cantidad antes ’

8 texto += ’de 3 d´ıas, su nombre pasar´a a nuestra lista de morosos.’

9

10 seguir = ’s’

11 while seguir == ’s’:

12 destinatario = raw_input (’Direcci´on del destinatario: ’)

13 tratamiento = raw_input (’Tratamiento: ’)

14 apellido = raw_input (’Apellido: ’)

15 euros = raw_input (’Deuda (en euros): ’)

16

17 mensaje = ’From: %s\nTo: %s\n\n’ % (remitente, destinatario)

18 19 personalizado = ’’ 20 i = 0 21 while i < len(texto): 22 if texto[i] != ’=’: 23 personalizado += texto[i] 24 else: 25 if texto[i+1] == ’A’: 26 personalizado += apellido 27 i = i + 1

28 elif texto[i+1] == ’E’:

29 personalizado += euros

30 i = i + 1

31 elif texto[i+1] == ’S’:

32 personalizado += tratamiento

5.1 Cadenas 2006/09/25-15:31 34 else: 35 personalizado += ’=’ 36 i = i + 1 37 mensaje += personalizado 38

39 servidor.sendmail (remitente, destinatario, mensaje)

40 seguir = raw_input (’Si desea enviar otro correo, pulse \’s\’: ’)

. . . ejercicios . . . . · 211 El programa no funcionar´a bien con cualquier carta. Por ejemplo, si la variable texto vale ’Hola =A. =’ el programa falla. ¿Por qu´e? ¿Sabr´ıas corregir el programa?

. . . .

Buscando texto en cadenas

Estudiamos los aspectos fundamentales de las cadenas y montamos((a mano)) las operaciones m´as sofisticadas. Por ejemplo, hemos estudiado la indexaci´on y la utilizamos, en combinaci´on con un bucle, para buscar un car´acter determinado en una cadena. Pero esa es una operaci´on muy frecuente, as´ı que Python la trae((de serie)).

El m´etodo find recibe una cadena y nos dice si ´esta aparece o no en la cadena sobre la que se invoca. Si est´a, nos devuelve el ´ındice de su primera aparici´on. Si no est´a, devuelve el valor −1. Atenci´on a estos ejemplos:

>>> c = ’Un ejemplo =A.’  >>> c.find (’=’)  11 >>> c.find (’ejem’)  3 >>> c.find (’z’)  -1 ´

Util, ¿no? Pues hay muchos m´as m´etodos que permiten realizar operaciones complejas con enorme facilidad. Encontrar´as, entre otros, m´etodos para sustituir un fragmento de texto por otro, para saber si todos los caracteres son min´usculas (o may´usculas), para saber si empieza o acaba con un texto determinado, etc. Cuantos m´as m´etodos avanzados conozcas, m´as productivo ser´as. ¿Que d´onde encontrar´as la relaci´on de m´etodos? En la documentaci´on de Python. Acost´umbrate a manejarla.