Domanda

SmtpClient () ti consente di aggiungere allegati alle tue e-mail, ma cosa succede se vuoi far apparire un'immagine quando la posta si apre, invece di allegarla?

Come ricordo, può essere fatto con circa 4 righe di codice, ma non ricordo come e non riesco a trovarlo sul sito MSDN.

EDIT: non sto usando un sito web o altro, nemmeno un indirizzo IP. Le immagini si trovano su un disco rigido. Una volta inviati, dovrebbero far parte della posta. Quindi, suppongo che potrei voler usare un tag ... ma non sono troppo sicuro, dal momento che il mio computer non sta trasmettendo.

È stato utile?

Soluzione

Una soluzione che viene spesso citata è quella di aggiungere l'immagine come Allegato alla posta, e quindi fare riferimento a essa nel corpo di posta HTML utilizzando un riferimento cid: .

Tuttavia, se si utilizza invece la raccolta LinkedResources , le immagini incorporate verranno comunque visualizzate correttamente, ma non verranno visualizzate come allegati aggiuntivi alla posta. Questo è ciò che vogliamo che accada , quindi è quello che faccio qui:

using (var client = new SmtpClient())
{
    MailMessage newMail = new MailMessage();
    newMail.To.Add(new MailAddress("you@your.address"));
    newMail.Subject = "Test Subject";
    newMail.IsBodyHtml = true;

    var inlineLogo = new LinkedResource(Server.MapPath("~/Path/To/YourImage.png"), "image/png");
    inlineLogo.ContentId = Guid.NewGuid().ToString();

    string body = string.Format(@"
            <p>Lorum Ipsum Blah Blah</p>
            <img src=""cid:{0}"" />
            <p>Lorum Ipsum Blah Blah</p>
        ", inlineLogo.ContentId);

    var view = AlternateView.CreateAlternateViewFromString(body, null, "text/html");
    view.LinkedResources.Add(inlineLogo);
    newMail.AlternateViews.Add(view);

    client.Send(newMail);
}

NOTA: questa soluzione aggiunge un AlternateView al tuo MailMessage di tipo text / html . Per completezza, è inoltre necessario aggiungere un AlternateView di tipo text / plain , contenente una versione in testo semplice dell'e-mail per client di posta non HTML.

Altri suggerimenti

L'e-mail HTML e le immagini sono allegati, quindi è solo un caso di riferimento alle immagini tramite i loro ID di contenuto, ad esempio

    Dim A As System.Net.Mail.Attachment = New System.Net.Mail.Attachment(txtImagePath.Text)
    Dim RGen As Random = New Random()
    A.ContentId = RGen.Next(100000, 9999999).ToString()
    EM.Body = "<img src='cid:" + A.ContentId +"'>" 

Qui sembrano esserci esempi esaurienti: Invia email con immagini incorporate

Quando dici 4 righe di codice, ti riferisci a questo ?

System.Net.Mail.Attachment inline = new System.Net.Mail.Attachment(@"imagepath\filename.png");
inline.ContentDisposition.Inline = true;

Che dire della conversione di immagini nelle stringhe Base64? AFAIK questo può essere facilmente incorporato nel corpo della posta.

Dai un'occhiata qui .

La soluzione già pubblicata è la migliore che abbia trovato, la completerò con, ad esempio, se hai più immagini.

        string startupPath = AppDomain.CurrentDomain.RelativeSearchPath;
        string path = Path.Combine(startupPath, "HtmlTemplates", "NotifyTemplate.html");
        string body = File.ReadAllText(path);

        //General tags replacement.
        body = body.Replace("[NOMBRE_COMPLETO]", request.ToName);
        body = body.Replace("[ASUNTO_MENSAJE]", request.Subject);

        //Image List Used to replace into the template.
        string[] imagesList = { "h1.gif", "left.gif", "right.gif", "tw.gif", "fb.gif" };

        //Here we create link resources one for each image. 
        //Also the MIME type is obtained from the image name and not hardcoded.
        List<LinkedResource> imgResourceList = new List<LinkedResource>();
        foreach (var img in imagesList)
        {
            string imagePath = Path.Combine(startupPath, "Images", img);
            var image = new LinkedResource(imagePath, "image/" + img.Split('.')[1]);
            image.ContentId = Guid.NewGuid().ToString();
            image.ContentType.Name = img;
            imgResourceList.Add(image);
            body = body.Replace("{" + Array.IndexOf(imagesList, img) + "}", image.ContentId);
        }

        //Altern view for managing images and html text is created.
        var view = AlternateView.CreateAlternateViewFromString(body, null, "text/html");
        //You need to add one by one each link resource to the created view
        foreach (var imgResorce in imgResourceList)
        {
            view.LinkedResources.Add(imgResorce);
        }

        ThreadPool.QueueUserWorkItem(o =>
        {
            using (SmtpClient smtpClient = new SmtpClient(servidor, Puerto))
            {
                smtpClient.EnableSsl = true;
                smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
                smtpClient.Timeout = 50000;
                smtpClient.UseDefaultCredentials = false;
                smtpClient.Credentials = new System.Net.NetworkCredential()
                {
                    UserName = UMail,
                    Password = password
                };
                using (MailMessage mailMessage = new MailMessage())
                {
                    mailMessage.IsBodyHtml = true;
                    mailMessage.From = new MailAddress(UMail);
                    mailMessage.To.Add(request.ToEmail);
                    mailMessage.Subject = "[NAPNYL] " + request.Subject;
                    mailMessage.AlternateViews.Add(view);
                    smtpClient.Send(mailMessage);
                }
            }
        });

Come puoi vedere hai una serie di nomi di immagini, è importante che le immagini si trovino nella stessa cartella perché punta alla stessa cartella di output.

Alla fine l'e-mail viene inviata come asincrona, quindi l'utente non deve attendere l'invio.

Il processo di visualizzazione di un'immagine sul client all'apertura della posta è una funzione client. Fintanto che il client sa come rendere l'immagine & amp; non ha bloccato alcun contenuto di immagine, lo aprirà immediatamente. Non è necessario eseguire alcuna operazione speciale durante l'invio dell'email per aprirla sul client, purché sia ??stato specificato correttamente il tipo di allegato mime dell'immagine.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top