Sending mail with embedded image in Ruby

1.5k Views Asked by At

I want to send a mail with an attached image and embed this image in html. As a source for tag , What should I write and is there any missing header parts such a content_type ?

When I am doing real test, I send to a mail to my gmail account. I can see there is an attachment with name "unnamed" and I could not display image even when I download.

Gem: Pony

require 'pony'
Pony.override_options = { :via => :test }
Pony.mail(
    :to => 'foo@bar',
    :from => '[email protected]',
    :subject => 'test123',
    :body =>   "<h1><strong>Dear X, check the newsletter ,<br></strong></h1> <img src='attached image' />",
    :attachments => {"happy_image.jpg" => File.read("happy_image.jpg")}
)
puts Mail::TestMailer.deliveries

output:

Date: Tue, 06 Dec 2016 17:23:05 +0300

From: [email protected]

To: foo@bar

Message-ID: <[email protected]>

Subject: test123

Mime-Version: 1.0

Content-Type: multipart/mixed;

boundary="--==_mimepart_5846c9caf15a_5983c9fd8989e5";

charset=UTF-8

Content-Transfer-Encoding: 7bit





----==_mimepart_5846c9caf15a_5983c9fd8989e5

Content-Type: text/plain;

charset=UTF-8

Content-Transfer-Encoding: 7bit



<h1><strong>Dear X, check the newsletter ,<br></strong></h1> <img src='' />

----==_mimepart_5846c9caf15a_5983c9fd8989e5

Content-Type: image/jpeg;

 filename=happy_image.jpg

Content-Transfer-Encoding: base64

Content-Disposition: attachment;

filename=happy_image.jpg

Content-ID: <happy_image.jpg@MW7BIQ12TKYHQC>



/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQE

BQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/

2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU

FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAHiAuMDASIAAhEBAxEB/8QA

HwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUF

BAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkK

FhcYGQ==



----==_mimepart_5846c9caf15a_5983c9fd8989e5--
1

There are 1 best solutions below

4
Constant Meiring On

You should be able to BASE64 encode the image, and use the resulting string as the src of the img tag.

For example:

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAWQAAAD8CAYAAAB..."/>

Also make sure that your content type is set as text/html instead of text/plain. Looking at the mail, it seems that it's set to the latter, hence why images don't render and tags render as text. Add the following to your arguments to use text/html content type:

:headers => { 'Content-Type' => 'text/html' }