2013-04-01 3 views
3

전자 메일을 보내려면 SendGrid로 시작하지만 이미지를 포함시키는 방법을 찾지 못했습니다. SendGrid를 사용하지 않고 내가 포함 된 이미지와 함께 이메일을 보내 다음 코드를 사용했다 : 수정 됨sendgrid 전자 메일을 사용하여 포함 된 이미지를 보내는 방법은 무엇입니까?

var mail = new System.Net.Mail.MailMessage(); 
mail.Subject = "Warning"; 
mail.From = "[email protected]"; 
mail.To.Add("[email protected]"); 
mail.IsBodyHtml = true; 
mail.Body = "<html><body><a href='http://www.mywebsite.com' title='My Website'><img src='cid:my_image' alt='My Image' border='0' /></a><br /><h1>My E-mail Title</h1>E-mail content.</body></html>"; 
var av = AlternateView.CreateAlternateViewFromString(mail.Body, null, "text/html"); 
av.LinkedResources.Add(new LinkedResource(@"C:\my_image.png", "image/png"){ContentId="my_image"}); 
mail.AlternateViews.Add(av); 
var smtp = new SmtpClient("smtp.test.com"); 
smtp.Credentials = new NetworkCredential("user", "pass"); 
smtp.Send(mail); 

--- ---

를 지금은 내 전자 메일을 보내려면 다음 코드를 사용하고 있습니다 (SendGrid 클래스 사용).

var message = SendGrid.GetInstance(); 
message.Subject = "Warning"; 
message.From = new MailAddress("[email protected]"); 
message.To = new MailAddress[] { new MailAddress("[email protected]") }; 
message.Html = "<html><body><a href='http://www.mywebsite.com' title='My Website'><img src='cid:my_image' alt='My Image' border='0' /></a><br /><h1>My E-mail Title</h1>E-mail content.</body></html>"; 
var transportSMTP = SMTP.GetInstance(new NetworkCredential("user", "pass")); 
transportSMTP.Deliver(message); 

콘텐츠 ID (CID)를 사용하여 내 이미지를 전자 메일에 포함하고 연결하는 방법을 알아야합니다.

+0

** 사용중인 코드를 ** 표시 할 수 있습니까 **? – Swift

+0

그리고 왜 같은 코드를 사용할 수 없습니까? – Swift

+0

지금 사용하고있는 코드를 추가했습니다. sendgrid를 사용하여 전자 메일을 보내려면 고유 한 클래스를 사용하고 있습니다. 다운로드 할 링크가 있습니다 : https://github.com/sendgrid/sendgrid-csharp. 기본 .net 클래스를 사용하여 sendgrid로 메일을 보낼 수 있습니까? –

답변

0

내가 방법을 찾고 있어요

var message = SendGrid.GetInstance(); 
message.Subject = "Warning"; 
message.From = new MailAddress("[email protected]"); 
message.To = new MailAddress[] { new MailAddress("[email protected]") }; 
message.Html = "<html><body><a href='http://www.mywebsite.com' title='My Website'><img src='cid:my_image' alt='My Image' border='0' /></a><br /><h1>My E-mail Title</h1>E-mail content.</body></html>"; 

// added  
message.EmbedImage(@"C:\my_image.png","my_image"); 
// added 

var transportSMTP = SMTP.GetInstance(new NetworkCredential("user", "pass")); 
transportSMTP.Deliver(message); 

...

https://github.com/sendgrid/sendgrid-csharp/blob/ca91fad22dfec2cd1219267fe979c1d9a33a522e/SendGrid/SendGridMail/SendGrid.cs#L211

그래서 코드가 될 것이다 .. 나는 SendGrid 고객 지원 엔지니어와 이야기 그리고 그는 나를 여기에 감독 파일 이름 대신 MemoryStream 객체를 추가하는 것은 보이지 않는데, 아직 사용할 수 없습니다.

+0

사실, 그렇습니다. 유사한 질문에서이 anser를보십시오 : http://stackoverflow.com/a/27362265/292230. 파일 이름 대신 MemoryStream을 사용하여 LinkedResource를 인스턴스화 할 수 있습니다. – Prutswonder

+0

DB에서 이미지를로드하는 데 'MemoryStream'을 사용하고 있지만 EmbedImage를 사용하지 않고 첨부 된 이미지는 Outlook에서는 제대로 작동하지만 Gmail에서는 제대로 작동하지 않습니다. 나는 모든 종류의'EmbedImage()'호출을 사용하지 않았다. Outlook은 항상 작동하지만 Gmail은 절대 사용하지 않는다. 나는 창문에서 뛰어 내릴 준비가되어있다. – ajeh

3

나는 이것에 대해 조금도 저글링을했다. 해결 방법은 먼저 이미지를 첨부 한 다음 이메일의 파일 이름과 함께 나중에 소스 코드로 삽입하는 것입니다. 어떻게 작동하는지 SendGrid를 통해 이메일에 포함 된 이미지를 전송하고 저장 템플릿을 사용하여 어려움을 겪고있는 사람들을위한

var myMessage = new SendGridMessage(); 
myMessage.AddTo("[email protected]"); 
myMessage.From = "[email protected]"; 
myMessage.Subject ="Forgotten Password"; 
string body = @"<div><img src='cid:email_reset' alt='Email Reset Header' border='0' /></div>" + 
       @"<p>Content...</p>"; 

string att = Request.PhysicalApplicationPath + @"Content\files\images\email_reset.jpg"; 
var attachment = new Attachment(att, new ContentType("image/jpeg")); 
var linkedResource = new LinkedResource(att, new ContentType("image/jpeg")); 
myMessage.AddAttachment(attachment.ContentStream, attachment.Name); 
myMessage.EmbedImage(attachment.Name, "email_reset"); 

myMessage.Text = WebUtility.HtmlDecode(Regex.Replace(body, "<[^>]*(>|$)", string.Empty)); 
myMessage.Html = body; 

// Authenticate and Send the email 
+1

linkedResource는 어디서나 사용됩니까? 그것은 중복 된 코드로 보인다? – Sam

0

은 여기 :

/* In my case the images reside in the SQL DB as BLOBs but for this example it does not matter. 
All you need is an array of bytes with your image. 
*/ 
var imageContent = File.ReadAllBytes("Images\\logo_eml.jpg"); 
using (MemoryStream s = new MemoryStream(imageContent)) 
{ 
    ContentType ctype = new ContentType("image/jpg"); 
    var attachment = new System.Net.Mail.Attachment(s, ctype); 
    var linkedResource = new LinkedResource(s, ctype); 
    attachment.Name = "cibc_ins_logo_eml.jpg"; 
    emailMsg.AddAttachment(attachment.ContentStream, attachment.Name); 
    emailMsg.EmbedImage(attachment.Name, linkedResource.ContentId + ".jpg"); 

    values.Add("%embedLogo%", linkedResource.ContentId + ".jpg"); 
} 

string templateJSON = "{\"to\": [\"%to%\"],\r \"sub\": {\":name\": [\"%name%\"],\":embedLogo\": [\"%embedLogo%\"]},\r \"category\": [\"Quotes\"],\r \"filters\": {\"templates\": {\"settings\": {\"enable\": 1,\"template_id\": \"%templateid%\"}}}}" 
emailMsg.Headers.Add("x-smtpapi", SubstituteTemplate(templateJSON, values)); 

마지막 줄은 값을 대체합니다. 제 경우에는 단순히 정규 표현식을 대체합니다. 이 코드는 특정 JSON에 %embedLogo%을 에 저장되어있는 linkedResource.ContentId+".jpg"의 값이 Dictionary<string,string> 인 것으로 대체해야합니다.

다음은 저장된 HTML 템플릿에 필요한 작업은 다음과 같습니다

<img width="227" height="86" src="cid::embedLogo"> 

CID와 두 개의 콜론이 중요하다.

그런 다음 첨부 된 이미지가 Gmail에 표시됩니다.