Bien, cuando hablamos del mundo en la web y que queremos tener nuestro sitio propio, comenzamos con la primera pregunta ¿En donde hospedar nuestro material? Hay sitios de alojamiento como GoDaddy que es muy famoso, este sitio se encuentra alojado en los servidores de Hosting México, el punto es que sino importa mucho la empresa en la que tu sitio se aloje, si importa mucho el servidor de internet que utiliza, los dos mas grandes ejemplos que he encontrado son IIS o Apache, la situación esta en que depende mucho del tipo de servidor que podrás realizar ciertas tareas como en este caso enviar correos, así que ya tomarás el ejemplo que mas te convenga dependiendo de tu servidor.
En ambos casos utilizaremos un proyecto en común, este es simplemente un proyecto que tiene unos cuantos textBox y un botón, nada del otro mundo, pero para evitar cualquier detalle descarga aquí el proyecto común
Enviar correos vía ASP.NET
Haciéndolo por esta vía lo primero que tenemos que hacer es crear en el proyecto que recién descargamos un servicio web de ASP.
En el nuevo archivo del servicio web ASP que acabas de crear, solo inserta el siguiente código (si solo quieres insertar la función adelante, solo recuerda usar la librería «System.Net.Mail”).
using System; using System.Web; using System.Web.Services; using System.Net.Mail; [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] public class Servicio : System.Web.Services.WebService { public Servicio () { } [WebMethod] public bool MandarCorreo(string correoEmpresa, string tema, string contenido) { try { MailMessage mensaje = new MailMessage(); mensaje.From = new MailAddress("contactoclientes5tosol@gmail.com"); mensaje.To.Add(new MailAddress(correoEmpresa)); mensaje.Subject = tema; mensaje.Body = contenido; mensaje.IsBodyHtml = false; SmtpClient smtp = new SmtpClient(); smtp.EnableSsl = true; smtp.Send(mensaje); return true; } catch { return false; } } } |
La función es sencilla ya que conoces la librería, simplemente por medio de la función pides los parámetros que utilizarás, estos son el correo al que vas a enviar la información, el título y su contenido, como ves no es la gran cosa, algo importante es que TODOS los métodos web de un servicio web deben regresar un valor, en este caso coloqué una variable booleana para cumplir con el requisito y que además nos permitirá verificar que todo está en orden al mandar llamar esa función.
Ya con el servicio web y su función corre tu proyecto y en el archivo Web.config, inserta tres líneas parecidas a estas.
<system.net> <mailSettings> <smtp> <network host="smtp.gmail.com" port="587" userName="micorreo@gmail.com" password="micontraseña"/> </smtp> </mailSettings> </system.net> |
De esta forma estarás configurando el servicio del correo web que usarás para mandar la información, es decir, este correo se encargará de esa tarea.
Después de haberlo hecho así, ejecuta el servicio web y copia la url de este.
Ya con la URL que tienes, solo agrega la referencia del servicio y copia esa dirección
Ya por último solo debes insertar el llamado al servicio web desde el evento clic del botón para que quede de la siguiente manera.
private void Button_Click(object sender, RoutedEventArgs e) { string cadena = "Dejaron el siguiente mensaje en tu sitio: " + txtMensaje.Text + " y puedes contestar al siguiente correo: " + txtCorreo.Text; Servicio1.ServicioSoapClient miServicio = new Servicio1.ServicioSoapClient(); miServicio.MandarCorreoCompleted += miServicio_MandarCorreoCompleted; miServicio.MandarCorreoAsync(txtDestino.Text, txtTitulo.Text, cadena); } |
En donde solo creas una frase y después invocas al método para simplemente después confirmar tu envío de la siguiente manera, cuando el método se haya completado.
private void Button_Click(object sender, RoutedEventArgs e) { string cadena = "Dejaron el siguiente mensaje en tu sitio: " + txtMensaje.Text + " y puedes contestar al siguiente correo: " + txtCorreo.Text; Servicio1.ServicioSoapClient miServicio = new Servicio1.ServicioSoapClient(); miServicio.MandarCorreoCompleted += miServicio_MandarCorreoCompleted; miServicio.MandarCorreoAsync(txtDestino.Text, txtTitulo.Text, cadena); } |
En donde solo creas una frase y después invocas al método para simplemente después confirmar tu envío de la siguiente manera, cuando el método se haya completado.
void miServicio_MandarCorreoCompleted(object sender, Servicio1.MandarCorreoCompletedEventArgs e) { if (e.Result) { MessageBox.Show("Tu mensaje ha sido enviado"); } else { MessageBox.Show("Hubo un error, tu mensaje no se envío"); } } |
En donde solo creas una frase y después invocas al método para simplemente después confirmar tu envío de la siguiente manera, cuando el método se haya completado.
void miServicio_MandarCorreoCompleted(object sender, Servicio1.MandarCorreoCompletedEventArgs e) { if (e.Result) { MessageBox.Show("Tu mensaje ha sido enviado"); } else { MessageBox.Show("Hubo un error, tu mensaje no se envío"); } } |
Enviar correos vía PHP
Bien, para quienes contamos con un servidor Apache, usar PHP es por mucho la mejor opción (por no decir la única), además de que es mucho mas sencillo, así que comienza por descargar el proyecto común que está al inicio de este artículo.
Ya que lo tienes, solo crea por medio d cualquier bloc de notas o editor de código el siguiente script de PHP
<?php $recipient = "tucorreo@hotmail.com"; //correo que va a recibir $mail_body = $_POST['mensaje']; //mensaje del correo $subject = "Correo de contacto"; //titulo del correo $header = ""; mail($recipient, $subject, $mail_body, null); //comando para el correo ?> |
Recuerda al momento de guardar tu archivo que debes guardarlo con la extensión PHP y ya que lo hayas guardado, solo añadelo dentro de la carpeta ClientBin de tu proyecto.
Ya que tienes tu script adentro de tu proyecto, solo inserta el siguiente código dentro del evento clic de tu botón.
private void Button_Click(object sender, RoutedEventArgs e) { WebClient cliente = new WebClient(); cliente.Headers["Content-Type"] = "application/x-www-form-urlencoded"; cliente.UploadStringCompleted += new UploadStringCompletedEventHandler(cliente_UploadStringCompleted); string Mensaje = "Acabas de recibir un correo con el siguiente mensaje: " + txtMensaje.Text + " Su dirección de correo es: " + txtCorreo.Text; string argumentos = String.Format("mensaje={0}", Mensaje); cliente.UploadStringAsync(new Uri("Correo.php", UriKind.Relative), "Post", argumentos); } |
En donde estas usando un objeto de tipo web client para mandar los datos entre tu aplicación y tu script PHP, como puedes ver, el título del correo aquí lo asignamos desde el script, solo le estamos mandando el cuerpo del correo, ya para finalizar solo debes crear el handler que confirme el envío de tu correo.
void cliente_UploadStringCompleted(object sender, UploadStringCompletedEventArgs e) { if (e.Error == null) { MessageBox.Show("Tu correo ha sido enviado, muchas gracias."); } else { MessageBox.Show("Error de envío : " + e.Error.ToString()); } } |
Y es así como puedes aprovechar una de las funcionalidades mas básicas y necesarias de cualquier página web, el envío de correos en la forma de contacto, espero te sirvan tanto como a nosotros.
Excelente aporte, de gran ayuda.
Ojala y pudieras hacer algo sobre Estados en Expression Blend.
Buenas, estoy aprendiendo y en local me funciona todo, pero a la hora de publicar no..
Que hago mal ??? como Publico??
Gracias por tu tiempo.
Estoy asumiendo que publicaste bien en tu maquina, tienes un servicio de hosting y quieres poner ahi tu servicio web, al hacerlo ese servicio web nada mas no responde y/o te marca un error, hasta aqui voy correcto? Si estoy bien, mandame por favor por correo unos pantallazos para cual es el problema
Oye tengo un problema para publicar en hosting,de forma local me funciona bien, por ahi creo que para hospedar el servicio se sigue una configuración diferente, tienes algo de material sobre ello.
Hola Rogelio, pues primero debes comenzar por ver si tu servicio de hosting te lo permite, y la segunda parte creo que debe ser la mas confusa, como publicar el servicio web de manera adecuada, hace tiempo hice una entrada al respecto, aquí esta la liga http://aminespinoza.com/publicar-mi-aplicacin-web-parte-3/
Amigo buen aporte, pero no encuentro en que parte explicas la autentifacion del correo de salida del formulario, resulta que algunos servidores o servicios de hosting, como el que yo uso con no salen los correos y me explicaron que en los servidores de ellos te exigen que tus formularios de envio de correo esten autentificados al parecer es agregarle al codigo del servidor de salida tambien usuario y contraseña de la cuenta de correo como una medida de seguridad, parece que si el formulario esta en php usas un tipo de autentificacion o codigo y si es en asp .net es diferente podrias explicar esta parte?
Así es, hace algunos años esto no era necesario, ahora, lo que necesitas es permitir al correo una regla de acceso por medio de las aplicaciones para que puedan hacer una petición y enviar por medio de sus servicios.
disculpa se me fue mal el link de arriba !
Excelente artículo!
Por supuesto que lo primero que se debe consultar, es si el servicio de hosting, permite implementarlo, si no, será un gasto en vano.
Saludos!
Muy bien explicado todo el proceso para el funcionamiento de envío de correos, sinceramente nunca he tenido la necesidad de realizar algo similar, ya que los servicios de Alojamiento Web que contratamos son en hosting administrado y ya vienen con todas estas configuraciones.
Saludos.
muy buen blog!! tengo una pregunta.. puedo enviar parámetros desde el php hacia el silverlight?? lo he conseguido con el comando «echo».. el problema es que se guarda todo en una sola cadena de texto, por ejemplo: NOMBREapellidosPROFESIONedadSUELDO
en la función
void cliente_UploadStringCompleted(object sender, UploadStringCompletedEventArgs e)
puedo separarlo utilizando algún split.. pero no creo que sea lo mas adecuado, porque lo que quiero recibir es la consulta de una tabla… entonces lo ideal seria pasar una matriz o vector.
gracias!!
¿Lo estás haciendo desde Silverlight? La plataforma para mi gran dolor murió hace ya un buen rato. 🙁
A que te refieres con que murió? yo aprendí hace muchos años con el VB6 y ahora que quiero hacer una aplicacion web veo que lo único que se parece un poco es Silverlight, lo que veo un poco engorroso las conexiones con bases de datos… por eso intento hacerlo con PHP.. y todo perfecto.. pero a la hora de pasar las variables de php a silverlight se me juntan todas en una cadena.
Hola Amin, podrías aconsejarme algún lenguaje para hacer aplicaciones web que sea parecido al vb6, porque ahora que ya le estaba cogiendo el truco a silverlight resulta que ni microsoft le va a dar soporte al navegador.