MIME Multipart trong email

Sep 25 2020

Tôi đang cố gắng nhúng hình ảnh vào trong email.

Email được tạo bằng cách gửi dữ liệu qua ổ cắm đến máy chủ SMTP trên cổng 25. Đây là bit MIME:

MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=mixedsection;

--mixedsection
Content-Type: text/plain;
Content-Transfer-Encoding: 8bit
Content-Disposition: inline

Below should be an inline embedded image

--mixedsection
Content-Type: image/png; file=ts-charts.png
Content-Transfer-Encoding: base64
Content-Disposition: inline; filename=ts-charts.png

iVBORw0KGgoAAAANSUhEUgAAAnoAAAHqCAMAAACk+hPgAAABpFBMVEX// (etc etc etc)

--mixedsection--

Khi nhận được email, có vẻ như phần thứ hai, hình ảnh, được chuyển thành tệp đính kèm và không bao giờ hiển thị nội dòng. Tất cả các phần khác hoạt động tốt, hình ảnh được mã hóa chính xác dưới dạng base64 nên có thể mở tệp đính kèm. Phần văn bản / phần thuần túy hoạt động chính xác cả khi Bố trí Nội dung được đặt thành nội dòng hoặc phần đính kèm.

Tôi đã sử dụng các ứng dụng thư khách khác (outlook, sấm sét) để nhúng hình ảnh và không có vấn đề gì với hình ảnh được hiển thị nội dòng.

Tôi thậm chí không thể làm cho hình ảnh hiển thị nội tuyến ngay cả khi tôi loại bỏ mọi thứ khác. Phần sau vẫn được nhận dưới dạng tệp đính kèm:

MIME-Version: 1.0
Content-Type: image/png; file=ts-charts.png
Content-Transfer-Encoding: base64
Content-Disposition: inline; filename=ts-charts.png

iVBORw0KGgoAAAANSUhEUgAAAnoAAAHqCAMAAAC (etc etc)

Vì vậy, câu hỏi đặt ra là tôi còn thiếu gì ở đây và làm cách nào để hình ảnh hiển thị nội dòng?

Trả lời

1 Mark Sep 25 2020 at 20:04

Vì một số lý do, tôi không thể làm cho nó hoạt động theo cách vani, ngay từ cách tiêu chuẩn RFC; nếu ai biết làm thế nào để làm điều đó theo cách đó, xin vui lòng đăng bài.

Vì vậy, tôi đã từ bỏ và sử dụng HTML / CID nội tuyến để nhúng hình ảnh.

Đây là cách tôi đã làm điều đó:

MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=mixedsection;

--mixedsection
Content-Type: multipart/related; boundary=relatedsection;

--relatedsection
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: 8Bit
Content-Disposition: inline

<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
  </head>
  <body>
    <p><img src="cid:myembeddedimage" alt=""></p>
  </body>
</html>

--relatedsection
Content-Type: image/png; name=ts-charts.png
Content-ID: myembeddedimage
Content-Transfer-Encoding: base64
Content-Disposition: inline; filename=ts-charts.png

iVBORw0KGgoAAAANSUhEUgAAAnoAAAHqCAMAAACk+hPgAAABpFBMVEX//3 (etc etc)

--relatedsection--
--mixedsection--

Lưu ý tôi cũng đã thay đổi:

Content-Type: image/png; file=ts-charts.png

bằng cách xóa thuộc tính tệp và thay thế bằng thuộc tính name:

Content-Type: image/png; name=ts-charts.png

Tôi không thực sự tin tưởng rằng đây là một cách tốt hoặc được khuyến khích để làm điều đó, nhưng nó có hiệu quả.

EDIT: .... Chỉ để kết thúc. Cả đời tôi không thể tìm ra cách kết hợp văn bản thuần túy và hình ảnh nhúng HTML, vì vậy tôi đã chọn chỉ đơn giản là đưa văn bản vào HTML.

Đây là thông điệp cuối cùng:

MIME-Version: 1.0
Content-Type: multipart/related; boundary=relatedsection;

--relatedsection
Content-Type: text/html;
Content-Transfer-Encoding: 8bit
Content-Disposition: inline

<html>
   <head>
      <meta http-equiv="content-type" content="text/html;">
   </head>
   <body>
      <p> Below is an embedded image ...</p>
      <p><img src="cid:myembeddedimage" alt=""></p>
   </body>
</html>

--relatedsection
Content-Type: image/png; name=ts-charts.png
Content-ID: myembeddedimage
Content-Transfer-Encoding: base64
Content-Disposition: inline; filename=ts-charts.png
 
AHqCAMAAACk+hPgAAABpFBMVEX///8PDw8jIyPDw8OPj333mOm2ajzGtEbdPpm (etc (etc)
--relatedsection--

Tôi đã phải xóa nhiều phần / hỗn hợp bên ngoài vì chạy thư này thông qua máy chủ trao đổi, dẫn đến các tệp đính kèm (att0001, att0002) được thêm vào thư. Không có vấn đề gì với các tệp đính kèm ma này trên sấm sét, gmail hoặc bất kỳ ứng dụng khách nào được gọi trên i-Phones.