Archive for December, 2007

Un bonito y util ejercicio

Wednesday, December 12th, 2007

En días pasados, y por la época, me salio la necesidad de organizar un intercambio (si, esos en que se reúnen un grupo de amigos y/o conocidos y se intercambian regalos entre ellos). Como tenia la necesidad de que fuera secreto, decidí que la mejor solución (y la mas Geek), sería crear un programita que hiciera el sorteo por mi, y enviara correo a los interesados sin que yo me enterara de quien le dará a quien. El programita me represento algunos retos pequeños pero divertidos. Quiza lo mas divertido de aprender fue como funciona la clase Random y como podemos mandar Mails usando el SMTP de GMail.

No suena a demasiado dificil hacer un sorteo de intercambio programaticamente. Y en realidad, lo es. Solo que el generador de numeros aleatorios del .Net Framework no es realmente aleatorio. Veran.

Para usarlo empleamos una sentencia mas o menos asi:
Random rnd = new Random(int base)
Donde base es el limite superior para los aleatorios. Para generar un numero aleatorio de una serie (ojo, dije serie) usamos
rnd.Next();
El asunto esta en que, si siempre le damos la misma base, siempre obtendremos los mismos resultados. No podemos crear un objeto Random cada que lo queramos usar, tenemos que usar uno solo y dejar que solito “randomize” la serie. Despues de algunas aproximaciones, lo que termine por hacer es darle una base de los milisegundos de la hora.
Random rnd = new Random(DateTime.Now.Millisecond)
Y como necesitaba que los numeros aleatorios estuvieran dentro de un rango (el tamaño de la lista de participantes), simplemente use el modulo:
rnd.Next() % elQueDa.Count //elQueDa es un ArrayList con mi lista de participantes.
Una vez solucionado ese asunto, tenia que hacer que enviara los mails a los participantes. Para ello, use la bendita clase SmtpClient del framework. En realidad es muy facil de usar. Mi codigo se explica solo:
System.Net.NetworkCredential credential = new System.Net.NetworkCredential
(Properties.Settings.Default.SmtpUserName,Password);
SmtpClient senderClient = new SmtpClient(Properties.Settings.
Default.SmtpAddress,Convert.ToInt32(Properties.Settings.Default.SmtpPort));
senderClient.EnableSsl = Properties.Settings.Default.SmtpEnableSsl;
senderClient.UseDefaultCredentials = false;
senderClient.Credentials = credential;

MailMessage Mail = new MailMessage();
Mail.From = new MailAddress(Properties.Settings.Default.MailFromAddress);
Mail.Subject = Properties.Settings.Default.MailSubject;
senderClient.Send(Mail)
Unicamente hay que preocuparse de cachar las excepciones adecuadas. Por si les paso de noche, Properties.Settings.Default es la forma de acceder a las propiedades guardadas en el archivo de configuracion, asi que no busquen en la documentacion propiedades como SmtpEnableSsl por que yo las di de alta asi en los Settings.

Hay que recordar que GMail trabaja con SSL. Para ello la linea de
senderClient.EnableSsl = Properties.Settings.Default.SmtpEnableSsl;
Y tambien que hay que configurar el puerto (465 o 587, si uno da TimeOut, intentas con el otro).

Y ya, la verdad es que es muy facil hacer este tipo de cosas con el .Net Framework. Si le quieren echar un ojo, aqui encuentran el codigo. Y si les interesa descargarlo para su uso, pueden entrar a esta pagina (hacemos uso de las ventajas del Click Once Deployent). No me esforce demasiado en las validaciones, asi que asegurense de meter bien los datos.