Skip to content

Commit

Permalink
Support other image types.
Browse files Browse the repository at this point in the history
  • Loading branch information
Brad Vogel authored and Brad Vogel committed May 28, 2015
1 parent c5b88a7 commit 50900e4
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 15 deletions.
6 changes: 1 addition & 5 deletions README.md
Expand Up @@ -2,7 +2,7 @@

Base64 images are generally a [bad idea](https://sendgrid.com/blog/embedding-images-emails-facts/) because they aren't supported in most email clients. This Nodemailer plugin will take base64 images in your email html in the form:

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

and replace it with a CID-referenced attachment that works in all email clients.

Expand Down Expand Up @@ -39,10 +39,6 @@ transporter.sendMail({
});
```

## TODO

* Extend to GIFs

## License

**MIT**
4 changes: 2 additions & 2 deletions src/plugin.js
Expand Up @@ -11,13 +11,13 @@ var plugin = function(mail, done) {

var attachments = {};

html = replaceBase64Images(html, function(base64) {
html = replaceBase64Images(html, function(mimeType, base64) {
if (attachments[base64]) return attachments[base64].cid;

var randomCid = crypto.randomBytes(8).toString('hex');

attachments[base64] = {
contentType: 'image/png',
contentType: mimeType,
cid: randomCid,
content: base64,
encoding: 'base64',
Expand Down
4 changes: 2 additions & 2 deletions src/replaceBase64Images.js
@@ -1,6 +1,6 @@
var replaceBase64Images = function(html, getCid) {
return html.replace(/(<img[\s\S]*? src=")data:image\/png;base64,([\s\S]*?)("[\s\S]*?>)/g, function(g, start, base64, end) {
return start + 'cid:' + getCid(base64) + end;
return html.replace(/(<img[\s\S]*? src=")data:(image\/(?:png|jpe?g|gif));base64,([\s\S]*?)("[\s\S]*?>)/g, function(g, start, mimeType, base64, end) {
return start + 'cid:' + getCid(mimeType, base64) + end;
});
};

Expand Down
31 changes: 25 additions & 6 deletions test/replaceBase64ImagesSpec.js
@@ -1,25 +1,44 @@
var replaceBase64Images = require('../src/replaceBase64Images');

describe('replaceBase64Images', function() {
var replacer = function(contents) {
return contents.split('').reverse().join('');
var replacer = function(mimeType, contents) {
// Make up a fake string to very parameters were passed correctly.
return mimeType + '-' + contents.split('').reverse().join('');
};

it('should replace a single source', function() {
var html = '<img src="data:image\/png;base64,abc">';
var expected = '<img src="cid:cba">';
var expected = '<img src="cid:image\/png-cba">';
expect(replaceBase64Images(html, replacer)).toBe(expected);
});

it('should handle gifs', function() {
var html = '<img src="data:image\/png;base64,abc">';
var expected = '<img src="cid:image\/png-cba">';
expect(replaceBase64Images(html, replacer)).toBe(expected);
});

it('should handle jpegs', function() {
var html = '<img src="data:image\/jpg;base64,abc">';
var expected = '<img src="cid:image\/jpg-cba">';
expect(replaceBase64Images(html, replacer)).toBe(expected);
});

it('should handle attributes on the HTML tag', function() {
var html = '<img style="test" src="data:image\/png;base64,abc" width="100%">';
var expected = '<img style="test" src="cid:cba" width="100%">';
var expected = '<img style="test" src="cid:image\/png-cba" width="100%">';
expect(replaceBase64Images(html, replacer)).toBe(expected);
});

it('should replace multiple sources', function() {
var html = '<img src="data:image\/png;base64,abc"><br><img src="data:image\/png;base64,def">';
var expected = '<img src="cid:cba"><br><img src="cid:fed">';
var html = '<img src="data:image\/png;base64,abc"><br><img src="data:image\/jpeg;base64,def">';
var expected = '<img src="cid:image\/png-cba"><br><img src="cid:image\/jpeg-fed">';
expect(replaceBase64Images(html, replacer)).toBe(expected);
});

it('should ignore other mimetypes', function() {
var html = '<img src="data:image\/bad;base64,abc">';
var expected = '<img src="data:image\/bad;base64,abc">';
expect(replaceBase64Images(html, replacer)).toBe(expected);
});

Expand Down

0 comments on commit 50900e4

Please sign in to comment.