none
Problema al mandar una imagen en el cuerpo del correo no se ve la imagen RRS feed

  • Pregunta

  • Utilizo framework 4 con visual studio 2015

    Tengo un formulario en el cual llenan los datos y una vez que le dan clic al botón de enviar llega un correo con la confirmación del registro y los datos del usuario.

    Pero el problema es que no se visualiza la imagen con la que llega el correo

    La imagen se encuentra fisicamente en la siguiente ruta:

    C:\inetpub\wwwroot\mercadotecnia\agendaebs\images\logoemail.jpg

     

    En una variable que la llamo imagen guardo la ruta de la siguiente manera;

    string imagen = @"C:\inetpub\wwwroot\mercadotecnia\agendaebs\images\logoemail.jpg";

     

    Anexo el codigo al momento de dar clic al enviar

     

        clsRegistros objRegistros = new clsRegistros();

        clsConstantes objConstante = new clsConstantes();

        clsEnvioMail objMail = new clsEnvioMail();

        clsEnvioMail objMailAlter = new clsEnvioMail();

        protected void btnEnvia_Click(object sender, EventArgs e)

        {

     

    Creo el cuerpo del correo donde pego la variable imagen de la siguiente manera:

     

                            StringBuilder sCadena = new StringBuilder();

                            sCadena.AppendLine("<img src=" + imagen + "/>");                       

                            sCadena.AppendLine("<BR>");

                            sCadena.AppendLine("<BR>");

                            sCadena.AppendLine("<b><font> " + "Hola " + nombre.ToString() + " " + apellidos.ToString() + ".</font> </b><BR>");

                            sCadena.AppendLine("<b><font>Gracias por registrarte a la sesión Informativa de EGADE Business School, Tecnológico de Monterrey.</font></b><BR>");

                            sCadena.AppendLine("<b><font>Te esperamos el próximo " + fecha.ToString("yyyy-MM-dd").Replace("/", "-") + " a las " + hora.ToString() + " hrs, en tu sesión " + sesion.ToString().ToLower() + " que registraste con nosotros.</font></b><BR>");

                            sCadena.AppendLine("<BR>");

                            sCadena.AppendLine("<b><font>Te enviamos el link de tu sesión " + link.ToString() + "</font></b><BR>");

     

    Mando llamar los objetos el cual llevan el titulo del correo, para quien va dirigido y al fina los direcciona a una pagina llama Confirma.aspx

                           objMail.EnvioMail(correo.ToString(), "", "Confirmación de registro Agenda EGADE", sCadena.ToString());

                            objMailAlter.EnvioMail("roberto.valenzo@itesm.mx", "", "Regsitro formulario Agenda EBS", sCadena2.ToString());

                            objRegistros.actualizaRegstros(nombre, apellidos, correo, telefono, sesion, fecha, hora, estatus, comentarios, fechareg);

                            limpiaControles();

     

                            Response.Redirect("Confirma.aspx");

    }

    viernes, 16 de marzo de 2018 17:05

Respuestas

  • Estás embebiendo en el correo la RUTA de la imagen (no la imagen propiamente dicha). Pero esa ruta apunta a C:. Lógicamente, quien reciba el correo no tiene la imagen en su disco C:, por lo que no puede verla dentro del correo. Esa técnica solo funciona cuando la imagen está en una ruta http:... en un servidor público. Entonces al abrir el correo se puede descargar de ese servidor (si tienen conexión a Internet y si el lector de correo lo autoriza). Pero no vale con una imagen que solo existe en el disco del equipo remitente.

    Para hacer lo que quieres, tendrías que embeber los bytes de la imagen dentro del mensaje (usando un linkresource), y meter en el "src" de la imagen un código que la presente desde ese recurso. Hay un ejemplo en la primera respuesta de este post:

    https://stackoverflow.com/questions/18358534/send-inline-image-in-email

    viernes, 16 de marzo de 2018 18:36
    Moderador

Todas las respuestas

  • Estás embebiendo en el correo la RUTA de la imagen (no la imagen propiamente dicha). Pero esa ruta apunta a C:. Lógicamente, quien reciba el correo no tiene la imagen en su disco C:, por lo que no puede verla dentro del correo. Esa técnica solo funciona cuando la imagen está en una ruta http:... en un servidor público. Entonces al abrir el correo se puede descargar de ese servidor (si tienen conexión a Internet y si el lector de correo lo autoriza). Pero no vale con una imagen que solo existe en el disco del equipo remitente.

    Para hacer lo que quieres, tendrías que embeber los bytes de la imagen dentro del mensaje (usando un linkresource), y meter en el "src" de la imagen un código que la presente desde ese recurso. Hay un ejemplo en la primera respuesta de este post:

    https://stackoverflow.com/questions/18358534/send-inline-image-in-email

    viernes, 16 de marzo de 2018 18:36
    Moderador
  • Hola Tonatiuh he realizado el link resource de la siguiente manera:

        protected void btnEnvia_Click(object sender, EventArgs e)

        {

                if (ddlSesiones.SelectedItem.Value == "En línea")

                {

                    foreach (GridViewRow gvr in gvFechas.Rows)

                    {

                        RadioButton rbnitem = (RadioButton)(gvr.FindControl("rbtnSesion"));

                        if (rbnitem.Checked)

                        {

                            string nombre = txtNombre.Text;

                            string apellidos = txtApellidos.Text;

                            string correo = txtCorreo.Text;

                            string telefono = txtTel.Text;

                            string sesion = ddlSesiones.SelectedItem.Value;

                            DateTime fecha = Convert.ToDateTime(gvr.Cells[1].Text);

                            string hora = Convert.ToString(gvr.Cells[2].Text);

                            string comentarios = txtComenta.Text;

                            int estatus = Convert.ToInt32(objConstante.FECHA_OCUPADA);

                            DateTime fechareg = DateTime.Now;

                            string link = "https://appear.in/ebs-admisiones";

                            string path = @"C:\\Sistemas\\WEB_AGENDAORG\\";

                            string fechacalendario = txtCalendario.Text;

                            string horacalendario = lblHora.Text;

     

     

                            //if(objDuplica.existeRegistro(Convert.ToDateTime(fechacalendario)))

     

                            //////////////////////////////LINK RESOURCE///////////////////////////////

                            Aspose.Email.MailMessage mensaje = new Aspose.Email.MailMessage();

                            mensaje.HtmlBody = "<b>Texto en el cuerpo</b>" + "<br/>Aqui va la imagen <img src=cid:logo>";

                            Aspose.Email.LinkedResource imagenorg = new Aspose.Email.LinkedResource(path + "logoemail.jpg");

                            //////////////////////////////////////////////////////////////////////////

     

                            /////////////////// Cuerpo del correo al registrante//////////////////////

                            StringBuilder sCadena = new StringBuilder();

                            sCadena.AppendLine(imagenorg.ContentId);                       

                            sCadena.AppendLine("<BR>");

                            sCadena.AppendLine("<BR>");

                            sCadena.AppendLine("<b><font> " + "Hola " + nombre.ToString() + " " + apellidos.ToString() + ".</font> </b><BR>");

                            sCadena.AppendLine("<b><font>Gracias por registrarte a la sesión Informativa de EGADE Business School, Tecnológico de Monterrey.</font></b><BR>");

                            sCadena.AppendLine("<b><font>Te esperamos el próximo " + fecha.ToString("yyyy-MM-dd").Replace("/", "-") + " a las " + hora.ToString() + " hrs, en tu sesión " + sesion.ToString().ToLower() + " que registraste con nosotros.</font></b><BR>");

                            sCadena.AppendLine("<BR>");

                            sCadena.AppendLine("<b><font>Te enviamos el link de tu sesión " + link.ToString() + "</font></b><BR>");

                            //////////////////////////////////////////////////////////////////////////

     

                            /////////////////// Cuerpo del correo al administrador//////////////////////

                            StringBuilder sCadena2 = new StringBuilder();

                            sCadena2.AppendLine("<b><font>Se registro " + nombre.ToString() + " " + apellidos.ToString() + "</font></b><BR>");

                            sCadena2.AppendLine("<b><font>Fecha: </font>");

                            sCadena2.AppendLine("<b><font> " + fecha.ToString("yyyy-MM-dd").Replace("/", "-") + "</font> </b><BR>");

                            sCadena2.AppendLine("<b><font>Hora: </font>");

                            sCadena2.AppendLine("<b><font> " + hora.ToString() + " hrs.</font> </b><BR>");

                            sCadena2.AppendLine("<b><font>Correo: </font>");

                            sCadena2.AppendLine("<b><font> " + correo.ToString() + "</font> </b><BR>");

                            sCadena2.AppendLine("<b><font>Teléfono: </font>");

                            sCadena2.AppendLine("<b><font> " + telefono.ToString() + "</font> </b><BR>");

                            sCadena2.AppendLine("<b><font>Sesión: </font>");

                            sCadena2.AppendLine("<b><font> " + sesion.ToString() + "</font> </b><BR>");

                            sCadena2.AppendLine("<b><font>Comentarios: </font>");

                            sCadena2.AppendLine("<b><font> " + comentarios.ToString() + "</font> </b><BR>");

                            //////////////////////////////////////////////////////////////////////////

                           

     

                            objMail.EnvioMail(correo.ToString(), "", "Confirmación de registro Agenda EGADE", sCadena.ToString());

                            //objMailAlter.EnvioMail("roberto.valenzo@itesm.mx", "", "Regsitro formulario Agenda EBS", sCadena2.ToString());

                            objRegistros.actualizaRegstros(nombre, apellidos, correo, telefono, sesion, fecha, hora, estatus, comentarios, fechareg);

                            limpiaControles();

     

                            Response.Redirect("Confirma.aspx");

                        }

                    }

                }

    }

    Solo que ahora veo el id de la imagen anexo imagen:

    miércoles, 21 de marzo de 2018 18:06
  •  ahora veo el id de la imagen

    Estás concatenando el id en medio del texto:

    sCadena.AppendLine(imagenorg.ContentId);

    Para que se viera la imagen tendrías que usar ese id para construir el cid de un <img>, no puede funcionar si te limitas a concatenar el id en medio del texto. Lógicamente, si lo concatenas en el texto, se ve dentro del texto, como se aprecia en la imagen que has adjuntado.

    miércoles, 21 de marzo de 2018 18:27
    Moderador
  • Tendras algun ejemplo ya que la verdad no he encontrado o no entiendo muy bien el tema del CID
    miércoles, 21 de marzo de 2018 19:10
  • Básicamente solo se trata de que la imagen la embebes poniendo <img src="cid:identificador" /> siendo "identificador" el imagenorg.ContentId que estabas usando en tu código. Es decir, ese valor que tú estabas antes concatenando en medio del texto no tiene que ir concatenado dentro del texto, sino dentro del src de la imagen, detrás de la palabra "cid:".

    miércoles, 21 de marzo de 2018 21:29
    Moderador
  • Hola ya lo hice de esta maner pero no se si sea correocto ya que aun no visualizo la imagen o me haga falta algo mas:

                            string path = "C:\\Sistemas\\WEB_AGENDAORG\\";

     

                            //if(objDuplica.existeRegistro(Convert.ToDateTime(fechacalendario)))

     

                            //////////////////////////////LINK RESOURCE///////////////////////////////

                            Aspose.Email.LinkedResource imagenorg = new Aspose.Email.LinkedResource(path + "logoemail.png");

                            //////////////////////////////////////////////////////////////////////////

     

                            /////////////////// Cuerpo del correo al registrante//////////////////////

                            StringBuilder sCadena = new StringBuilder();

                            sCadena.AppendLine("<img src=\"cid:" + imagenorg.ContentId + "\"> ");                      

                            //////////////////////////////////////////////////////////////////////////


    viernes, 23 de marzo de 2018 15:50
  • Asi a simple vista tiene bastante buen aspecto. Si no funciona, abre el codigo HTML del correo que te ha generado y mira a ver que es lo que ha escrito, puede que se detecte algun fallo que no sea evidente al ver el codigo fuente del programa que lo genera.
    viernes, 23 de marzo de 2018 16:29
    Moderador