html 이메일에 이미지 포함
gif 이미지가 포함된 multipart/관련 html 메일을 보내려고 합니다.이 이메일은 Oracle PL/SQL을 사용하여 생성됩니다.시도가 실패하고 이미지가 빨간색 X로 표시됩니다(Outlook 2007 및 yahoo 메일).
얼마 전부터 html 메일을 보내고 있습니다만, 메일의 gif 이미지를 몇 개 사용하고 싶다고 생각하고 있습니다.웹 서버 중 하나에 저장하여 링크하기만 하면 됩니다.그러나 많은 사용자의 이메일 클라이언트는 자동으로 표시되지 않고 이메일마다 설정을 변경하거나 수동으로 다운로드해야 합니다.
그래서 제 생각은 이미지를 심는 것입니다.질문은 다음과 같습니다.
- 내가 여기서 뭘 잘못하고 있는 거지?
- 매립 방식이 올바른 방식입니까?
- 더 많은 이미지를 사용해야 할 경우 다른 옵션은 없습니까?첨부 파일은 일반적으로 로고와 아이콘으로 메시지 내용을 이해하지 못하기 때문에 작동하지 않습니다.또한 이메일의 일부 요소는 온라인 시스템에 링크되어 있기 때문에 정적 PDF를 생성하여 첨부하는 것은 (어차피) 작동하지 않습니다.
단편:
MIME-Version: 1.0
To: me@gmail.com
BCC: me@yahoo.com
From: email@yahoo.com
Subject: Test
Reply-To: email@yahoo.com
Content-Type: multipart/related; boundary="a1b2c3d4e3f2g1"
--a1b2c3d4e3f2g1
content-type: text/html;
<html>
<head><title>My title</title></head>
<body>
<div style="font-size:11pt;font-family:Calibri;">
<p><IMG SRC="cid:my_logo" alt="Logo"></p>
... more html here ...
</div></body></html>
--a1b2c3d4e3f2g1
Content-Type: image/gif;
Content-ID:<my_logo>
Content-Transfer-Encoding: base64
Content-Disposition: inline
[base64 image data here]
--a1b2c3d4e3f2g1--
대단히 고맙습니다.
BTW: 네, base64 데이터가 올바른 것을 확인했습니다.이미지를 HTML 자체에 삽입하여(헤더 데이터 작성에 같은 용도를 사용), Firefox/IE로 표시할 수 있기 때문입니다.
또한 이것은 스팸용이 아닙니다.이메일은 매일 그것을 예상하고 있는 특정 클라이언트에 송신됩니다.콘텐츠는 데이터 중심이며 광고가 아닙니다.
직접 삽입해 보십시오. 이렇게 하면 전자 메일의 다양한 위치에 여러 이미지를 삽입할 수 있습니다.
<img src="data:image/jpg;base64,{{base64-data-string here}}" />
그리고 이 투고를 다른 사람에게 유용하게 하기 위해:base64 데이터 문자열이 없는 경우 이미지 파일에서 http://www.motobit.com/util/base64-decoder-encoder.asp에서 쉽게 생성할 수 있습니다.
이메일 소스 코드는 다음과 같습니다만, 그 경계에 대해서는 말씀드릴 수 없습니다.
To: email@email.de
Subject: ...
Content-Type: multipart/related;
boundary="------------090303020209010600070908"
This is a multi-part message in MIME format.
--------------090303020209010600070908
Content-Type: text/html; charset=ISO-8859-15
Content-Transfer-Encoding: 7bit
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-15">
</head>
<body bgcolor="#ffffff" text="#000000">
<img src="cid:part1.06090408.01060107" alt="">
</body>
</html>
--------------090303020209010600070908
Content-Type: image/png;
name="moz-screenshot.png"
Content-Transfer-Encoding: base64
Content-ID: <part1.06090408.01060107>
Content-Disposition: inline;
filename="moz-screenshot.png"
[base64 image data here]
--------------090303020209010600070908--
//편집: 아, 제 포스트의 첫 번째 코드 스니펫을 삽입하여 Thunderbird로 이메일을 쓰면 Thunderbird가 자동으로 제 포스트의 두 번째 코드와 거의 동일하게 HTML 코드를 변경합니다.
다른 솔루션은 이미지를 첨부 파일로 첨부한 후 cid를 사용하여 html 코드를 참조하는 것입니다.
HTML 코드:
<html>
<head>
</head>
<body>
<img width=100 height=100 id="1" src="cid:Logo.jpg">
</body>
</html>
C# 코드:
EmailMessage email = new EmailMessage(service);
email.Subject = "Email with Image";
email.Body = new MessageBody(BodyType.HTML, html);
email.ToRecipients.Add("abc@xyz.com");
string file = @"C:\Users\acv\Pictures\Logo.jpg";
email.Attachments.AddFileAttachment("Logo.jpg", file);
email.Attachments[0].IsInline = true;
email.Attachments[0].ContentId = "Logo.jpg";
email.SendAndSaveCopy();
여기에 있는 답변 중 유용하다고 생각되지 않는 답변이 있기 때문에 해결책을 제시합니다.
문제는 지금 하시는 게 예요.
multipart/related
이 경우 좋지 않은 콘텐츠 유형으로 간주됩니다.하고 .multipart/mixed
그 에 ★★★★★★★★★★★★★★★★★★★★」multipart/alternative
(어느 쪽인가 하면)메시지 구조는 다음과 같습니다.
[Headers] Content-type:multipart/mixed; boundary="boundary1" --boundary1 Content-type:multipart/alternative; boundary="boundary2" --boundary2 Content-Type: text/html; charset=ISO-8859-15 Content-Transfer-Encoding: 7bit [HTML code with a href="cid:..."] --boundary2 Content-Type: image/png; name="moz-screenshot.png" Content-Transfer-Encoding: base64 Content-ID: <part1.06090408.01060107> Content-Disposition: inline; filename="moz-screenshot.png" [base64 image data here] --boundary2-- --boundary1--
그럼 될 거야
정상적으로 동작하지 않는 경우는, 다음의 몇개의 툴을 사용해 이미지를 HTML 테이블로 변환할 수 있습니다(단, 이미지의 사이즈에 주의해 주세요).
- http://stylecampaign.com/blog/2009/12/bypass-image-blocking-by-converting-images-to-html/
- http://neil.fraser.name/software/img2html/
오래된 투고인 것은 알지만, 현재 답변에서는 Outlook 및 많은 이메일 프로바이더가 인라인 이미지 또는 CID 이미지를 지원하지 않는다는 사실을 다루지 않습니다.이미지를 전자 메일에 배치하는 가장 효과적인 방법은 이미지를 온라인으로 호스팅하고 해당 이미지에 대한 링크를 전자 메일에 배치하는 것입니다.작은 이메일 목록의 경우 공용 드롭다운 상자가 올바르게 작동합니다.이것에 의해, 전자 메일 사이즈도 작아집니다.
Base64를 사용하여 이미지를 html에 삽입하는 것은 훌륭합니다.단, base64 문자열로 인해 이메일 크기가 커질 수 있습니다.
그러므로,
1) 이미지가 많은 경우 이미지를 서버에 업로드하고 서버에서 이미지를 로드하면 이메일 크기가 작아집니다.(Google을 통해 많은 무료 서비스를 받을 수 있습니다.)
2) 메일에 이미지가 적은 경우 base64 문자열을 사용하는 것은 매우 좋은 옵션입니다.
기존 답변에서 제공되는 옵션 외에 명령어를 사용하여 Linux에서 base64 문자열을 생성할 수도 있습니다.
base64 test.jpg
이러한 솔루션 중 하나를 사용할 수 없는 경우: 이메일로 인라인 이미지 전송@T30이 제공하는 솔루션에 기재된 절차에 따라 아웃룩에 의해 차단되지 않고 인라인 이미지를 표시할 수 있었습니다(이전 방법에서는 차단되었습니다).델과 같이 교환을 사용하고 있는 경우는, 다음의 조작도 실시합니다.
service = new ExchangeService(ExchangeVersion);
service.AutodiscoverUrl("email@domain.com");
SmtpClient smtp = new SmtpClient(service.Url.Host);
교환 서비스 URL 호스트를 전달해야 합니다.이 솔루션 이외에는 삽입 이미지를 쉽게 전송할 수 있습니다.
[ Insert / Picture ]메뉴 기능을 사용하여 이미지 파일을 삽입하면 Outlook과 Outlook Express 모두 이러한 멀티파트 이미지 이메일 형식을 생성할 수 있습니다.
물론 이메일 유형은 HTML(일반 텍스트가 아님)로 설정해야 합니다.
다른 방법(드래그/드롭 또는 명령줄 호출 등)을 사용하면 이미지가 첨부 파일로 전송됩니다.
그런 다음 자신에게 이메일을 보내면 포맷 방법을 볼 수 있습니다.:)
FWIW, 명령줄 모드에서 인라인 이미지를 실행하는 스탠드아론 윈도 실행 파일을 찾고 있는데 없는 것 같습니다.많은 사람들이 올라간 길입니다적절한 형식의 .eml 파일을 전달하면 Outlook Express를 사용할 수 있습니다.
인라인 이미지가 완전히 준거하려면 3개의 경계가 필요합니다.
모든 것이 내부로 들어갑니다.
multipart/mixed
.그 후 를 사용합니다.
multipart/related
억제하다multipart/alternative
이미지 첨부 파일 머리글을 참조하십시오.마지막으로 다운로드 가능한 첨부파일을 다음 마지막 경계 안에 포함시킵니다.
multipart/mixed
.
Martyn Davies의 이 문제에 대한 세 가지 접근법에 대한 찬반 양론이 실린 블로그 게시물이 실제로 있습니다.https://sendgrid.com/blog/embedding-images-emails-facts/에서 읽을 수 있습니다.
CSS 배경 이미지를 사용한 네 번째 접근 방식을 추가하고 싶습니다.
더하다
<div id="myImage"></div>
이메일 본문 및 css 클래스에 다음과 같은 정보를 제공합니다.
#myImage {
background-image: url('data:image/png;base64,iVBOR...[some more encoding]...rkggg==');
width: [the-actual-image-width];
height: [the-actual-image-height];
}
이를 실현하기 위한 작업 코드는 다음과 같습니다.
using System;
using Outlook = Microsoft.Office.Interop.Outlook;
namespace ConsoleApp2
{
class Program
{
static void Main(string[] args)
{
Method1();
Method2();
}
public static void Method1()
{
Outlook.Application outlookApp = new Outlook.Application();
Outlook.MailItem mailItem = outlookApp.CreateItem(Outlook.OlItemType.olMailItem);
mailItem.Subject = "This is the subject";
mailItem.To = "john@example.com";
string imageSrc = "D:\\Temp\\test.jpg"; // Change path as needed
var attachments = mailItem.Attachments;
var attachment = attachments.Add(imageSrc);
attachment.PropertyAccessor.SetProperty("http://schemas.microsoft.com/mapi/proptag/0x370E001F", "image/jpeg");
attachment.PropertyAccessor.SetProperty("http://schemas.microsoft.com/mapi/proptag/0x3712001F", "myident"); // Image identifier found in the HTML code right after cid. Can be anything.
mailItem.PropertyAccessor.SetProperty("http://schemas.microsoft.com/mapi/id/{00062008-0000-0000-C000-000000000046}/8514000B", true);
// Set body format to HTML
mailItem.BodyFormat = Outlook.OlBodyFormat.olFormatHTML;
string msgHTMLBody = "<html><head></head><body>Hello,<br><br>This is a working example of embedding an image unsing C#:<br><br><img align=\"baseline\" border=\"1\" hspace=\"0\" src=\"cid:myident\" width=\"\" 600=\"\" hold=\" /> \"></img><br><br>Regards,<br>Tarik Hoshan</body></html>";
mailItem.HTMLBody = msgHTMLBody;
mailItem.Send();
}
public static void Method2()
{
// Create the Outlook application.
Outlook.Application outlookApp = new Outlook.Application();
Outlook.MailItem mailItem = (Outlook.MailItem)outlookApp.CreateItem(Outlook.OlItemType.olMailItem);
//Add an attachment.
String attachmentDisplayName = "MyAttachment";
// Attach the file to be embedded
string imageSrc = "D:\\Temp\\test.jpg"; // Change path as needed
Outlook.Attachment oAttach = mailItem.Attachments.Add(imageSrc, Outlook.OlAttachmentType.olByValue, null, attachmentDisplayName);
mailItem.Subject = "Sending an embedded image";
string imageContentid = "someimage.jpg"; // Content ID can be anything. It is referenced in the HTML body
oAttach.PropertyAccessor.SetProperty("http://schemas.microsoft.com/mapi/proptag/0x3712001E", imageContentid);
mailItem.HTMLBody = String.Format(
"<body>Hello,<br><br>This is an example of an embedded image:<br><br><img src=\"cid:{0}\"><br><br>Regards,<br>Tarik</body>",
imageContentid);
// Add recipient
Outlook.Recipient recipient = mailItem.Recipients.Add("john@example.com");
recipient.Resolve();
// Send.
mailItem.Send();
}
}
}
나에게 큰 도움이 된 Pavel Perna의 투고에 대한 추가 힌트(명성에 대해서는 코멘트를 할 수 없기 때문에 답변으로 이 글을 투고합니다)Microsoft Exchange 의 일부 버전에서는, 인라인 컨텐츠의 디스포지션이 삭제되고 있습니다(Microsoft 의 이 투고 참조).이미지는 Outlook에 표시되는 메일의 일부가 아닙니다.이 문제를 해결하려면 "Content-Disposition: Attachment"를 사용하십시오.Outlook 2016은 "Content-Disposition: Attachment"를 사용하지만 이미지를 메일 메시지에 사용된 첨부 파일로 표시하지 않습니다.
Context를 사용하여 문제를 해결합니다.요청:
<img width="150" height="60" src="@($"{Context.Request.Scheme}://{Context.Request.Host}{Context.Request.PathBase}/images/logo.png")" />
제 경우 Content-ID를 사용했을 때 첨부파일로도 그 이미지를 가지고 있었습니다.그것은 최선의 해결책이 아니었습니다.
언급URL : https://stackoverflow.com/questions/6706891/embedding-image-in-html-email
'programing' 카테고리의 다른 글
WordPress, jQuery UI CSS 파일? (0) | 2023.02.23 |
---|---|
MongoDB: 문서의 ID를 "공개"로 사용해도 안전한가? (0) | 2023.02.23 |
JSON.stringify 반환 [] (0) | 2023.02.23 |
커스텀 포스트 타입의 「전면」슬래그와 같은 타이틀의 WordPress 페이지가 있다. (0) | 2023.02.23 |
Angular $http로 다운로드 받은 파일 이름을 얻는 방법 (0) | 2023.02.23 |