2010-01-20 13 views
16

Ho l'obbligo di inviare e-mail contenenti sia testo che immagini.
Quindi, ho il file .mhtml che contiene il contenuto che deve essere inviato via email.Invio di e-mail mhtml - C#

Stavo usando Chilkat per questo, ma in Outlook 2007 sta mostrando il file mhtml come allegati diversi (html + immagini).

Qualcuno può suggerirmi qualche altro componente per l'invio di e-mail mhtml.
FYI, sto usando .Net 3.5

Inoltre, non voglio salvare le immagini sul server prima di inviarle.

Grazie!

risposta

11

Uso semplice classe nativa originale MailMessage. Questo previous answer può puntare nella giusta direzione

EDIT: ho costruito un codice simile qualche tempo fa, che cattura una pagina HTML esterna, analizzarlo suo contenuto, prendere tutti i contenuti esterni (css, immagini, ecc) e di inviare tramite e-mail, senza salvare nulla sul disco.

+0

Grazie per la risposta. Ma il post sopra link utilizza LinkedResource che necessita di tutte le immagini da salvare fisicamente sul server, che non voglio :-( – iniki

+1

Questo non è del tutto vero: il primo argomento LinkedResource è un flusso, quindi la tua immagine può essere salvata su alcuni database, ad esempio –

4

Ecco un esempio che utilizza un'immagine come risorsa incorporata.

MailMessage message = new MailMessage(); 
message.From = new MailAddress(fromEmailAddress); 
message.To.Add(toEmailAddress); 
message.Subject = "Test Email"; 
message.Body = "body text\nblah\nblah"; 

string html = "<body><h1>html email</h1><img src=\"cid:Pic1\" /><hr />" + message.Body.Replace(Environment.NewLine, "<br />") + "</body>"; 
AlternateView alternate = AlternateView.CreateAlternateViewFromString(html, null, MediaTypeNames.Text.Html); 
message.AlternateViews.Add(alternate); 

Assembly assembly = Assembly.GetExecutingAssembly(); 
using (Stream stream = assembly.GetManifestResourceStream("SendEmailWithEmbeddedImage.myimage.gif")) { 
    LinkedResource picture = new LinkedResource(stream, MediaTypeNames.Image.Gif); 

    picture.ContentId = "pic1"; // a unique ID 
    alternate.LinkedResources.Add(picture); 

    SmtpClient s = new SmtpClient(); 
    s.Host = emailHost; 
    s.Port = emailPort; 
    s.Credentials = new NetworkCredential(emailUser, emailPassword); 
    s.UseDefaultCredentials = false; 

    s.Send(message); 
} 
} 
+1

Poiché ottengo l'output mhtml dall'utilità Aspose, non ho il controllo sui nomi delle immagini, quindi l'impostazione di ContentId non è fattibile nel mio caso, che suppongo sia la base dell'uso di LinkedResource. – iniki

+0

@iniki non puoi solo pre-processare il contenuto HTML e sostituire le immagini '' src' con i riferimenti 'cid' e usare il contenuto originale (nome file o URI dati) per generare' LinkedResource'? – Keith

2
System.Net would be the one that you are looking for.<br/> 
MailMessage is used to compose new mail.<br/> 
SMTPClient is used to send mail. 
NetworkCredentials would be used to attach username and password for making request to sending mail. 


Venendo alla tua domanda come aggiungere le immagini.
è necessario impostare isHtml=true per MailMessage
Dal momento che si desidera inviare la posta percorsi relativi nel codice HTML non funzioneranno come ../directory/imagename.formate
in tal caso è necessario dare percorso compiuto per la posizione dell'immagine che è websiteUrl/directory/imagename.formate
Per ottenere l'Url completo in modo dinamico è possibile utilizzare in questo modo Request.Uri.GetLeftParth(URIPartial.Authority)+VitrtualToAbsolute.getAbsolute("~")

Non sono sicuro dell'ultima riga da quando ho scritto direttamente qui. Hai solo bisogno di usarlo e avere fortuna ;-)

+0

Che non risponde come inviare e-mail MHTML con immagini incorporate nel MHTML –

0

È necessario impostare il tipo MIME in modo esplicito su multipart/related. Modificare lo MailMessage.Body per includere il contenuto del file MHTML al suo interno. Infine aggiungi un nuovo elemento alla collezione MailMessage.AlternateViews per definire il tipo MIME corretto. Il seguente link da MSDN ha un ottimo esempio di come configurarlo:

MailMessage.AlternateViews Property