GithubHelp home page GithubHelp logo

emailjs-mime-parser's People

Contributors

andris9 avatar asutherland avatar drauschenbach avatar felixhammerl avatar gongdao123 avatar greenkeeper[bot] avatar kwarpechowski avatar mash-symc avatar nifgraup avatar xndrdev avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

emailjs-mime-parser's Issues

An in-range update of nodemon is breaking the build 🚨

The devDependency nodemon was updated from 1.18.5 to 1.18.6.

🚨 View failing branch.

This version is covered by your current version range and after updating it in your project the build failed.

nodemon is a devDependency of this project. It might not break your production code or affect downstream projects, but probably breaks your build or test tools, which may prevent deploying or publishing.

Status Details
  • continuous-integration/travis-ci/push: The Travis CI build could not complete due to an error (Details).

Release Notes for v1.18.6

1.18.6 (2018-11-05)

Bug Fixes

Commits

The new version differs by 1 commits.

  • 521eb1e fix: restart on change for non-default signals (#1409) (#1430)

See the full diff

FAQ and help

There is a collection of frequently asked questions. If those don’t help, you can always ask the humans behind Greenkeeper.


Your Greenkeeper Bot 🌴

How-to question on using mime-parser

@felixhammerl and others

I am trying to use emailjs-mime-parser, but I think I am missing some knowledge to implement the steps in the README.

Could you help me to use mime-parser in a simple html page, so I can integrate this library into Zimbra OpenPGP Zimlet. Thanks!!

What I am doing can be found here (and is attached to issue):

https://github.com/Zimbra-Community/pgp-zimlet/blob/stable/test/mimeparser/mimeparser-test.html#L286

Its an simple html page with a textarea that countains a raw email message, doing the steps from the readme and then:

  parser.write(new TextEncoder("utf-8").encode(document.getElementById('input').value));
  //mimeparser.js:75 Uncaught TypeError: Cannot read property 'fromTypedArray' of undefinedMimeParser.write

  parser.write(document.getElementById('input').value);
  //Uncaught TypeError: Cannot read property 'parseHeaderValue' of undefined
  parser.end();

Both cases throw an error and as such, I cannot get the resulting email object. (example attached) What am I missing here?

mimeparser.zip

Converting TypedArrays to text

This library converts text/plain data to Uint8Array by default.

Why not preserve the _bodyBuffer content on the _emitBody call instead of discarding it so we don't have to convert it back to text for representation?

If there is a reason for this behavior you should consider an option to specify how to get the results of the parser.

An in-range update of sinon is breaking the build 🚨

Version 4.1.6 of sinon was just published.

Branch Build failing 🚨
Dependency sinon
Current Version 4.1.5
Type devDependency

This version is covered by your current version range and after updating it in your project the build failed.

sinon is a devDependency of this project. It might not break your production code or affect downstream projects, but probably breaks your build or test tools, which may prevent deploying or publishing.

Status Details
  • continuous-integration/travis-ci/push The Travis CI build could not complete due to an error Details

Commits

The new version differs by 10 commits.

  • 68c37ed Update docs/changelog.md and set new release id in docs/_config.yml
  • cd8ae51 Add release documentation for v4.1.6
  • 29e80be 4.1.6
  • a5c59a5 Update History.md and AUTHORS for new release
  • 0ae60b6 Merge pull request #1653 from mroderick/upgrade-dependencies
  • dcd4191 Upgrade browserify to latest
  • a316f02 Upgrade markdownlint-cli to latest
  • 78ebdb3 Upgrade lint-staged to latest
  • fcf967b Upgrade dependency supports-color
  • 7c3cb4f Enable StaleBot with default configuration (#1649)

See the full diff

FAQ and help

There is a collection of frequently asked questions. If those don’t help, you can always ask the humans behind Greenkeeper.


Your Greenkeeper Bot 🌴

Mail parsing fails when there is corrupted body content

Due to emailjs/emailjs-base64#1 I have emails that are completely unparseble.

While in my case the bug is in the decoder, it is also possible for the email content itself to be corrupted in some way. If this happens I would expect the un-corrupted MimeNode(s) to be to be usable.

Could you please improve your parser error handling to be more resistant to broken data. No need for magic recovery or anything, just being able to get access to the non-broken tree nodes is enough.

Thank you

How to use "charset=binary" by default?

I am trying to decode this message:

Content-Type: application/pkcs7-mime; name=smime.p7m; smime-type=enveloped-data
Content-Description: Enveloped Data
Content-Disposition: attachment; filename=smime.p7m
Content-Transfer-Encoding: base64
From: [email protected]
To: [email protected]
Subject: Example S/MIME encrypted message
Date: Sun, 25 Feb 2018 09:28:14 +0000
Message-Id: <[email protected]>
MIME-Version: 1.0

MIIB3AYJKoZIhvcNAQcDoIIBzTCCAckCAQIxggFuMIIBagIBADAjMB4xHDAJBgNVBAYTAlJVMA8G
A1UEAx4IAFQAZQBzAHQCAQEwPAYJKoZIhvcNAQEHMC+gDzANBglghkgBZQMEAgMFAKEcMBoGCSqG
SIb3DQEBCDANBglghkgBZQMEAgMFAASCAQBDyepahKyM+hceeF7J+pyiSVYLElKyFKff9flMs1VX
ZaBQRcEYpIqw9agD4u+aHlIOJ6AtdCbxaV0M8q6gjM4E5lUFUOqG/QIycdG2asZ0lza/DL8SdxfA
3WE9Ij5IEqFbtnykbfORK+5XWT0nYs/OMN0NKeCwXjElNsezX9IAIgxHgwcVYW+szXpRlarjriAC
TDG/M+Xl5YtyAhmHWFncBSfWM8e2q+AKh3eCal1lH4eXtGICc4rad4f6845YJwXL8DYYS+GdLVAY
EXKuHr0N7g4aHTs9B8EQqHmYdaHWTi3h0ZPkvAE+wwfm9xjvL2z2HrfpYyMTvALrefvSt7sGMIAG
CSqGSIb3DQEHATAdBglghkgBZQMEAQIEEKt6VqFcNz/VYFwu85DTOqGggAQgIHc45LBiYIQqhxNw
hlRk4BxMiyiQRdLcVdCwwkKyX2sAAAAA

So, when I am trying to use parser.content.buffer as an input for further operations I get incorrect result. As I found it is all because your parser does not consider to use charset=binary by default and apply utf-8 decoding to the binary text.

The question is: would it be possible to set any options for your package in order to get all the correct binary data I want? Or it would require a code fix?

Maximum call stack size exceeded - mail with file more than 100ko ...

I have a script that run every hours ...
This script connect to a email address, for getting csv from mail ...
When i write my script, I only receive small file ( 50 - 100 ko ) and my script work perfectly ...
Now we have another automate that send email, but the file is more like 150 - 200ko ...

When i send the body[] in emailjs-mime-parser i have a :

(node:14727) UnhandledPromiseRejectionWarning: RangeError: Maximum call stack size exceeded
    at apply (/home/andrelec1/Projects/data_harvester/node_modules/emailjs-mime-codec/src/charset.js:11:51)
    at base64Decode (/home/andrelec1/Projects/data_harvester/node_modules/emailjs-mime-codec/src/mimecodec.js:87:37)
    at MimeNode._decodeBodyBuffer (/home/andrelec1/Projects/data_harvester/node_modules/emailjs-mime-parser/src/mimeparser.js:77:28)
    at MimeNode._decodeBodyBuffer [as _emitBody] (/home/andrelec1/Projects/data_harvester/node_modules/emailjs-mime-parser/src/mimeparser.js:345:10)
    at MimeNode._emitBody [as finalize] (/home/andrelec1/Projects/data_harvester/node_modules/emailjs-mime-parser/src/mimeparser.js:66:12)
...

My code :

import ImapClient from 'emailjs-imap-client';
import ImapParse from 'emailjs-mime-parser';
import jethro from 'jethro';
import _ from 'lodash';
import { fileSaver } from './fileSaver';

class MailClient {
  #client = null;
  
  constructor(url, port, params) {
    this.#client = new ImapClient(url, port, params);
    this.#client.onerror = this.onError;
    this.crawl();
  };

  onError = (error) => {
    jethro.error('ImapClient', error);
  };

  crawl = () => {
    this.#client.connect().then(this.connect);
  };

  connect = async () => {
    jethro.success('ImapClient', 'Connexion opened success.');
    this.#client.selectMailbox('INBOX').then(this.selectMailBox);
  };

  selectMailBox = async () => {
    jethro.success('ImapClient', 'Open INBOX');
    await this.#client.listMessages('INBOX', '1:*', ['uid', 'flags', 'body', 'body[]', 'envelope', 'bodystructure'])
      .then(this.listMessages)
      .then(this.logout)
    ;
  };

  listMessages = async (mails) => {
    return new Promise(resolve => {
      jethro.success('ImapClient', 'Read all messages in INBOX');
      jethro.success('ImapClient', `${mails.length} mails found.`);

      const mailsPromises = mails.reduce((promiseChain, mail) => {
        return promiseChain.then(async () => {
          jethro.info('ImapClient', `Mail ${mail.uid} extracting`);
          await this.extractData(mail);
          jethro.info('ImapClient', `Mail ${mail.uid} extracted`);
          await this.deleteMail(mail);
          jethro.info('ImapClient', `Mail ${mail.uid} delete`);
        });
      }, Promise.resolve());

      mailsPromises.then(() => {
        resolve();
      });
    });
  };

  extractData = async (mail) => {
    return new Promise(resolve => {
      const parsedMail = ImapParse(mail['body[]']);

      const from = _.find(_.find(parsedMail.headers.from).value).address;
      const fileNode = this.findNodeWithAttachment(parsedMail.childNodes);
      this.saveFile(from, fileNode).then(resolve).catch(() => {
        jethro.error('FileSave', 'error when file is saved to the disk');
      });
    });
  };

  deleteMail = async (mail) => {
    return new Promise(resolve => {
      //this.#client.deleteMessages('INBOX', `${mail.uid}`, { byUid: true }).then(() => {
      jethro.warning('ImapClient', `Mail UID : ${mail.uid} is delete.`);
      resolve();
      //});
    });
  };

  findNodeWithAttachment = (childNodes) => {
    return _.find(childNodes, (childNode) => {
      const potentialNodeContentType = _.find(childNode.headers['content-type']).value;
      const potentialNodeDisposition = _.find(childNode.headers['content-disposition']);
      return ['text/csv', 'application/octet-stream'].includes(potentialNodeContentType) &&
        potentialNodeDisposition.value === 'attachment' &&
        potentialNodeDisposition.params.filename.endsWith('.csv');
    });
  };

  saveFile = (email, fileNode) => {
    return new Promise(resolve => {
      if (fileNode === undefined) {
        jethro.warning('ImapClient', `${email} send mail without csv valid file.`);
        resolve();
      }

      const [folderName] = email.split('@');
      const fileName = _.find(fileNode.headers['content-type']).params.name;
      const data = fileNode.content;
      fileSaver.save(folderName, fileName, data).then(resolve);
    });
  };

  logout = () => {
    this.#client.logout().then(() => {
      jethro.success('ImapClient', 'Logout success.');
      this.close();
    });
  };

  close = () => {
    this.#client.close().then(() => {
      jethro.success('ImapClient', 'Connexion closed success');
    });
  };
}

export default MailClient;

Error in 'extractData()'

How can I restructure message from mimeNodes?

Please tell me how can I get message to show using browser.

I got mimeNodes successfully, but I do not find how to restructure the message.

import imapClient from 'emailjs-imap-client';
import parse from 'emailjs-mime-parser';

const imapClietnt = new (host, port { auth: {user: userName, pass: password}});
imapClient.connect();

const messages = imapClient.lestMessages('INBOX', '1' ['uid', 'flags', 'body.peek[]']);

const myMimeNodes = parse(messages[0]['body[]'])

In case of multipart message, myMimeNodes like as follows.

-- myMimeNodes
-- -- bodystructure: string
-- -- contentType
-- -- -- type: multipart
-- -- -- params
-- -- -- -- boundary: string
-- -- childNodes: Array
-- -- -- MimeNode
-- -- -- -- content: Uint8Array

So how can I get readable text or html?

Emit bodystructure

It would be nice if the parser could emit the bodystructure (the original raw MIME minus body content and multipart preambles). This would enable one to use this parser to produce a MIME store that could support an IMAP server.

Content is undefined if the email contains an attachment

Greetings,

I noticed that when I parse an email that contains an attachment, the content property is undefined (while instead, it works correctly if the email has no attachment). My code is like this (it's actually split between two files, but it gives you an idea):

const parsedEmail = parse(email)
console.log("Email's content: ", parsedEmailObject.content);
                  if (parsedEmailObject.content != null) {
                    //Extract email's body only if it actually exists

                    const bodyAsHTML = new TextDecoder().decode(
                      objectToUInt8array(parsedEmailObject.content)
                    );
                    console.log("HTML body: ", bodyAsHTML); // TODO: what if email isn't in HTML format? How do I detect this? Probably it is enough to inspect the 'contentType' parameter
                    const bodyAsText = extractEmailBodyFromHTML(bodyAsHTML);
                    console.log("Body: ", bodyAsText);
                    domEmail.body(bodyAsText);
                  } else domEmail.body(" ");

If the email doesn't have attachmments, this code correctly extracts the email's body, while if it has attachments, it fails due to parsedEmailObject.content being undefined. My questions are:

  1. How should I extract the email's body when the email has one or more attachments?
  2. How do I extract the attachments?

Thank you for your help,

GTP

Cannot get attachment filename from Content-Disposition header

It seems, this library does not parse attachment filenames from the Content-Disposition header.

I have this in the source of the email:
Content-Type: application/pdf
Content-Disposition: attachment; filename="testfile.pdf"
Content-Transfer-Encoding: base64

In most use cases, this:
node.contentType.params.name
Would get me the attachment filename, however there is no node.contentDisposition.params.name dumping the entire node to the console.log, it looks like this part may be missing from the implementation.

On the other hand, maybe I overlooked something. Regards Barry

How do I use this parser exactly?

Forgive me if this sounds like a dumb question, but I'm new to emailjs. Here is my code:

client.listMessages("INBOX", "1:10", ["uid", "flags", "envelope", "bodystructure", "body[]"]).then((messages) => {
  messages.forEach((message) => {
    console.log(message["body[]"]);
    console.log("------");
  });
});

I can see the content of my email, but I don't know how to parse the result. I'm going to output the messages in HTML, but there's a lot of stuff in there that doesn't need to be viewable, like MIME-Versions and such. I'm confused as to how I would integrate this into my code.

Using emailjs-mime-parser

I imported the library using
const mimeParser = require('emailjs-mime-parser');

Now I am trying to use it with below syntax

mimeParser.parse(event.body);

where event.body is the raw email body received by POST endpoint.

What am I missing?

HELP WANTED

HELP WANTED

Felix is not actively maintaining this library anymore. But this is the only IMAP client for JS that I am aware of, so I feel this library still has its value. Please let me know if you're interested in helping out, either via email or open an issue about that.

The work that's on the horizon is:

  • Adding features as per requests
  • Refactor to allow streaming and cut down memory consumption
  • Stay up to date with developments in the IMAP protocol
  • Maintenance of the other related emailjs libraries
  • Maintenance and update of emailjs.org

Something wrong in your decoding functions

I was trying to decode correctly binary data using latest version of emailjs-mime-parser but failed. In fact I was using it in this and this examples.

So, I made a simple unit test file for your package. Here it is:

import parse from './mimeparser';
//**************************************************************************************
function bufferToHexCodes(inputBuffer, inputOffset = 0, inputLength = inputBuffer.byteLength)
{
	let result = "";
	
	for(const item of (new Uint8Array(inputBuffer, inputOffset, inputLength)))
	{
		const str = item.toString(16).toUpperCase();
		result = result + ((str.length === 1) ? "0" : "") + str;
	}
	
	return result;
}

//**************************************************************************************
context("Test", () =>
{
	it("test 1", () =>
	{
		const testMessage = `Content-Type: application/pkcs7-mime; name=smime.p7m; smime-type=enveloped-data; charset=binary
Content-Description: Enveloped Data
Content-Disposition: attachment; filename=smime.p7m
Content-Transfer-Encoding: base64
From: [email protected]
To: [email protected]
Subject: Example S/MIME encrypted message
Date: Sun, 25 Feb 2018 09:28:14 +0000
Message-Id: <[email protected]>
MIME-Version: 1.0

MIIB3AYJKoZIhvcNAQcDoIIBzTCCAckCAQIxggFuMIIBagIBADAjMB4xHDAJBgNVBAYTAlJVMA8G
A1UEAx4IAFQAZQBzAHQCAQEwPAYJKoZIhvcNAQEHMC+gDzANBglghkgBZQMEAgMFAKEcMBoGCSqG
SIb3DQEBCDANBglghkgBZQMEAgMFAASCAQBDyepahKyM+hceeF7J+pyiSVYLElKyFKff9flMs1VX
ZaBQRcEYpIqw9agD4u+aHlIOJ6AtdCbxaV0M8q6gjM4E5lUFUOqG/QIycdG2asZ0lza/DL8SdxfA
3WE9Ij5IEqFbtnykbfORK+5XWT0nYs/OMN0NKeCwXjElNsezX9IAIgxHgwcVYW+szXpRlarjriAC
TDG/M+Xl5YtyAhmHWFncBSfWM8e2q+AKh3eCal1lH4eXtGICc4rad4f6845YJwXL8DYYS+GdLVAY
EXKuHr0N7g4aHTs9B8EQqHmYdaHWTi3h0ZPkvAE+wwfm9xjvL2z2HrfpYyMTvALrefvSt7sGMIAG
CSqGSIb3DQEHATAdBglghkgBZQMEAQIEEKt6VqFcNz/VYFwu85DTOqGggAQgIHc45LBiYIQqhxNw
hlRk4BxMiyiQRdLcVdCwwkKyX2sAAAAA`;
		
		const expectedText = "308201DC06092A864886F70D010703A08201CD308201C90201023182016E3082016A0201003023301E311C3009060355040613025255300F06035504031E080054006500730074020101303C06092A864886F70D010107302FA00F300D06096086480165030402030500A11C301A06092A864886F70D010108300D060960864801650304020305000482010043C9EA5A84AC8CFA171E785EC9FA9CA249560B1252B214A7DFF5F94CB3555765A05045C118A48AB0F5A803E2EF9A1E520E27A02D7426F1695D0CF2AEA08CCE04E6550550EA86FD023271D1B66AC6749736BF0CBF127717C0DD613D223E4812A15BB67CA46DF3912BEE57593D2762CFCE30DD0D29E0B05E312536C7B35FD200220C47830715616FACCD7A5195AAE3AE20024C31BF33E5E5E58B720219875859DC0527D633C7B6ABE00A8777826A5D651F8797B46202738ADA7787FAF38E582705CBF036184BE19D2D50181172AE1EBD0DEE0E1A1D3B3D07C110A8799875A1D64E2DE1D193E4BC013EC307E6F718EF2F6CF61EB7E9632313BC02EB79FBD2B7BB06308006092A864886F70D010701301D06096086480165030401020410AB7A56A15C373FD5605C2EF390D33AA1A0800420207738E4B06260842A871370865464E01C4C8B289045D2DC55D0B0C242B25F6B00000000";
		
		const root = parse(testMessage);
		
		expect(bufferToHexCodes(root.content.buffer)).to.equal(expectedText);
	});
});
//**************************************************************************************

The expectedText value I got by decoding BASE-64 text from message by my own utility. You could check that expectedText value is 100% correct. Here are indexes (indexes of expectedText string) where we have differences:

355, 362, 363, 479, 636, 637, 692, 693, 714, 715, 738, 739, 774, 775

Please correct the issue or provide me advice how to fix that.

Decoding of Base64 body

The decoding of Base64 body in the body of the MIME node is currently a bit hit-or miss.

Proposed fix:

  • For MIME nodes with charset provided: use the charset provided by the Content-Type used during the encoding
  • For non-text/* MIME nodes without charset: use binary
  • For text/* without charset: fall back to the UTF-8 -> Latin-9 -> binary heuristic

Does that make sense?

An in-range update of sinon is breaking the build 🚨

☝️ Greenkeeper’s updated Terms of Service will come into effect on April 6th, 2018.

Version 4.4.7 of sinon was just published.

Branch Build failing 🚨
Dependency sinon
Current Version 4.4.6
Type devDependency

This version is covered by your current version range and after updating it in your project the build failed.

sinon is a devDependency of this project. It might not break your production code or affect downstream projects, but probably breaks your build or test tools, which may prevent deploying or publishing.

Status Details
  • continuous-integration/travis-ci/push The Travis CI build could not complete due to an error Details

Commits

The new version differs by 7 commits.

  • e060fe9 Update docs/changelog.md and set new release id in docs/_config.yml
  • e9fce06 Add release documentation for v4.4.7
  • f047838 4.4.7
  • cc91fe6 Update History.md and AUTHORS for new release
  • 9fb8577 Emojify the support message :heart:
  • a87ef85 Use existing mini-lib for coloring
  • 1f33fe5 Reduce noisy NPM output from postinstall script

See the full diff

FAQ and help

There is a collection of frequently asked questions. If those don’t help, you can always ask the humans behind Greenkeeper.


Your Greenkeeper Bot 🌴

Base64 encoded Japanese character not decoded as expected

Hi, I tried an email via emailjs-imap-client and parse it. but Japanese charctors were broken only base64 encoded mail. If you need some more test data, I can upload to my server.

Please check it.

Thank you.

Expected Behavior

http://test.serve2you.net/images/expected.png

Current Behavior

http://test.serve2you.net/images/result.png

raw data in MimeNode

"X-Apparently-To: [email protected] via 183.79.150.63; Sun, 29 Apr 2018 15:10:58 +0900
X-YMailISG: LLBZCYkWLDsxwFGjqC2NXRY69rlxy_85oO_xzUMpyyyNugB3
Gd6GV1qGI8lwfuVh6wG1gjCiyb2WjOFm.92tG3oC7drcMZmtGr4bQzLV2kDm
0PzmnhipOi7gF1QxcfoEFcvNjLODLys1cbJmX.fzf3C5Y1vc1DkfKvNibnfy
mpOe0y5isP_GsIpAiot1FcIga_2n2vL6Xtyu52okfUGOAWa1NwfQspHgvK_L
ozZygxTHIv0zceDH.RoApm7hBQ4Erw_pPzGbP_IkuRD.IzlBWLdg31D5PhFb
zIfnnJDaxsu8b5FsVSJvWwlcwrvm8cAn8RVzLljQmun16GdAVhd0f5D1p1vn
nLgGKtPPMZtPpXjd.clC.fM4y_Nt_U3afDrVKEizjVejKXSOtbpaj9ObD5Cx
UYz3c4TV_H3m2j_CB1WFKggrVWyUwjCWxAbzZ7AUYgTUMcXkxZx41UNjVBpH
e_6lersBeoK59SR4tCQqkVXZ9dl6TrnVgRX2aZjERpSxlgzgXOrBiB2WL52e
V69zlIOYHdwkAfdhM7Sbdsxis4bKzxgZIYoSFIbq.BAgwkRgJJVzb2mtAMD8
agieIHMfg.R7nKAMEAuRNynRS4LcaVug0Nxrqjbt9bRhj.g5FTZGnt8wECCu
FTbG7vtka7ziOn0w55Rq7jyaptXSMb5LJcuw6RgeyQL5WNjTdZ1BswLj.y2p
TGj19PSFduxQ5lwid4MT9op1Ma.qXDY9Y5oWytfssRvTN57T_LGCRnunGEF7
sG_JZSpMBN_MXHeLItp1HRrQkwjIEsjHdWB3hDqy32ULwEOFvmXhZjZX033j
8vU1k2OtyKU2Yf34MnwbnANj9CHASH6LQQt6z45QZVD6GdlJRV68edxrD_yg
L0TA6KCFfaNCqBzb1Ug3gmddzf6WLu7cekH98QdMxGifL0AAuEtvZEFZiDQy
ceYJh8T5mFToVmktwaBHgx0WTrjclne6GB9dxnmgHLVYFDO32f3yemu0Fid.
ZBB7hc3dp5ardrMurwmU5iBdpvL_Y84cdhOQPO67oag8oH1CDQiYYPx7HcZq
_M9TAX6kS2Z_5UY3hfpk8hJExTm4nth1R9eBtQLwwejK1m0EndCJ3H1SdBHt
n.2X5yEGu_BmAaf5RwxMn42SH3srrqNTb6ziHm_vNC37RF11ACzCb8f.Vjot
PSHpx4BPX40UyDsz.Qc6uHnIK1n8TTKlYAW24Xjc22T6m.X_tuXVO3KzsUw8
n0M2ffRQh9EGAlgpSHAa0arUaqpSJWcfYDl1bVQT0F9Okaz67lPdL5kNQUSy
p_TwnZoT.5Ryv4ekf.0x7RPHthG6HPhd0l62hflioBHM5QZUWCLWXL1yrz40
tjmLagBKHGTWZfusTsu1yEdK_ECwyzGxaMdg4Rb_qIjJuWW7rCzt_2gJwBVU
EaMB1fPA8LWjPROm_WGiyV1F8QSkxKCASaDbCOsg8KU-
X-Originating-IP: [183.79.208.37]
Received-SPF: pass (n17.f6.bulk.kks.ynwp.yahoo.co.jp: domain of optinmailpf.gu4tcmrvha3do-okb2qjat=[email protected] designates 183.79.208.37 as permitted sender) receiver=n17.f6.bulk.kks.ynwp.yahoo.co.jp; client-ip=183.79.208.37; envelope-from=optinmailpf.gu4tcmrvha3do-okb2qjat=[email protected];
Authentication-Results: mta086.mail.bbt.yahoo.co.jp from=mail.yahoo.co.jp; domainkeys=pass (ok); dkim=pass (ok); [email protected]
Received: from 183.79.208.37 (HELO n17.f6.bulk.kks.ynwp.yahoo.co.jp) (183.79.208.37)
by mta086.mail.bbt.yahoo.co.jp with SMTP; Sun, 29 Apr 2018 15:10:55 +0900
Comments: DKIM? See http://antispam.yahoo.co.jp/efforts_dk.html
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mail.yahoo.co.jp; s=bulk201106; t=1524982167; bh=HHSiOdFpF5RXFDFh6Z4uRDBFb5hMtf2/ZCj9n4mvJQM=; h=Received:Received:Received:X-yahoo-newman-expires:Date:From:Reply-To:To:Message-ID:Subject:Mime-Version:Content-Type:Content-Transfer-Encoding:X-Yahoo-Newman-Property:X-Yahoo-Newman-Id; b=aUtFA6PRy3H472T0SF41feP7bxboFg49gZV4uhp25RxyL+VI3IDSgq1tRJ9qa5siOXCGFvKL7YnfpJhS6S3pYitoG0IGQSse2tgE1oFziiEB7Jz7+3krHwm3064GGpjsqHmKogROHGAM57cPVQrPKIcW749T4uLvup2syebW3Wc=
DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=bulk201106; d=mail.yahoo.co.jp;
b=T6hWpBONMEZhN1mYXXqMI890bdcliIPEML/nptkf1GcTD7y7/qU2c859AnZMfUQsmJjKqB9xK9QlMTzfNt02iZ7PU/b/8lFTVncftxwxSv1l2+bNswmypk+WEy9dF00g/LRndmdUZiFv+a32t9YOgYbJ83gR7qtvMd/Y0N9uqkE=;
Received: from [100.98.128.85] by n17.f6.bulk.kks.ynwp.yahoo.co.jp with NNFMP; 29 Apr 2018 06:09:27 -0000
Received: from [100.97.203.186] by m23.f6.bulk.kks.ynwp.yahoo.co.jp with NNFMP; 29 Apr 2018 06:09:27 -0000
Received: from [127.0.0.1] by worker5184.optin.kks.ynwp.yahoo.co.jp with NNFMP; 29 Apr 2018 06:09:27 -0000
X-yahoo-newman-expires: 1525014000
Date: Sun, 29 Apr 2018 15:09:27 +0900
From: =?UTF-8?B?WWFob28h44Kr44O844OJ?= [email protected]
Reply-To: [email protected]
To: [email protected]
Message-ID: 5ae56197daf4b_d2041902435710de@worker5184.optin.kks.ynwp.yahoo.co.jp.mail
Subject: =?UTF-8?Q?=E3=80=90=E6=AF=8E=E9=80=B1=E6=9C=AB72=E6=99=82=E9=96=93=E9=96=8B=E5=82=AC=E3=80=91=E9=80=B1=E6=9C=AB=E3=81=AA=E3=82=89=E6=9C=80=E5=A4=A710,000=E3=83=9D=E3=82=A4=E3=83=B3=E3=83=88=E3=83=97=E3=83=AC=E3=82=BC=E3=83=B3=E3=83=88=EF=BC=81[Yahoo!?=
=?UTF-8?Q?_JAPAN]?=
Mime-Version: 1.0
Content-Type: text/plain;
charset=UTF-8
Content-Transfer-Encoding: base64
X-Yahoo-Newman-Id: 7ab92d8c-ab1e-4b77-9227-115988e119fc

CuKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKU
geKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKU
geKUgeKUgQoK44CA44CA44CA44CA44CA44CA44CAWWFob28h44Kr44O844OJ
44CA44GK44GZ44GZ44KB5oOF5aCx44Oh44O844OrCgrilIHilIHilIHilIHi
lIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHi
lIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIEKb2tiMnFq
YXTjgZXjgpPjgavjgYrnn6XjgonjgZvjgZfjgabjgYTjgb7jgZnjgIIKCuOB
hOOBpOOCgllhaG9vISBKQVBBTuOCkuOBlOWIqeeUqOOBhOOBn+OBoOOBjeOB
guOCiuOBjOOBqOOBhuOBlOOBluOBhOOBvuOBmeOAggpZYWhvbyEgSkFQQU7j
gqvjg7zjg4njgYvjgonmlrDopo/lhaXkvJrnibnlhbjjga7jgZTmoYjlhoXj
gafjgZnjgIIKCjo6Ou+8ijo6Ou+8ijo6Ou+8ijo6Ou+8ijo6Ou+8ijo6Ou+8
ijo6Ou+8ijo6Ou+8ijo6Ou+8ijo6OgoKICAgICAgICDilI/ilIHilIHilIHi
lIHilIHilIHilIHilIHilIHilIHilIHilJMKICAgICAgICDilIPvvLzmr47p
gLHmnKs3MuaZgumWk+mWi+WCrO+8jyDilIMKICAgICAgICDilJfilIHilIHi
lIHilIHilIHilIHilIHilIHilIHilIHilIHilJsKCiAg44GE44Gk44KC44Gv
5pyf6ZaT5Zu65a6a77y044Od44Kk44Oz44OIOCwwMDDjg53jgqTjg7Pjg4ji
gLvjgIEK44CA6YCx5pyr44Gq44KJ44GV44KJ44Gr5pyf6ZaT5Zu65a6a77y0
44Od44Kk44Oz44OI77yLMiwwMDDjg53jgqTjg7Pjg4jigLvvvIEKCiDilI/i
lIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHi
lIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilJMKIOKUg+KY
heacgOWkpzEwLDAwMOWGhuebuOW9k+OBruacn+mWk+WbuuWumu+8tOODneOC
pOODs+ODiOKAu+ODl+ODrOOCvOODs+ODiOKYhSDilIMKIOKUl+KUgeKUgeKU
geKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKU
geKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUmwoKIOKWvOips+OBl+OB
j+OBr+OBk+OBoeOCiQogIGh0dHBzOi8veWFob28uanAvZUFGVFpKCgogICAg
ICAgICAg77yP77yP4pSP4pST77y877y844CA44CAIAogICAgICAgICAgICAg
IOKUo+KUq+OAgOOAgOOAgOOAgCAKICAgICAgICAgICAgICDilIPilKPilLPi
lLPilJPjgIAgCiAgICAgICAgICAgIOKUj+KUgeKUk+KUg+KUg+KUg+OAgAog
ICAgICAgICAgICDilIPilIHilJvilLvilLvilJsKICAgICAgICAgICAg4pSX
4pSTICAgIOKUj+KUm+OAgAoK44CQ6ZaL5YKs5pyf6ZaT77ya5q+O6YCx6YeR
5pucMTI6MDDvvZ7mnIjmm5wxMTo1OeOAkQoKIArjgIDigLvpgLLlkYjjgZnj
govjg53jgqTjg7Pjg4jjga/jgIHmnJ/plpPlm7rlrprvvLTjg53jgqTjg7Pj
g4jjgafjgZnjgIIK44CAWWFob28hIEpBUEFO44CBTE9IQUNP44CBR1lBTyEg
5Lul5aSW44Gu44K144O844OT44K544Gn5Yip55So44Gn44GN44G+44Gb44KT
44CCCuOAgOacieWKueacn+mZkOOBjOOBguOCiuOBvuOBmeOBruOBp+OBlOaz
qOaEj+OBj+OBoOOBleOBhOOAggoK5pyf6ZaT5Zu65a6a77y044Od44Kk44Oz
44OI44Gr44Gk44GE44Gm44Gv44GT44Gh44KJCmh0dHBzOi8veWFob28uanAv
bkE5cUJJCgo6OjrvvIo6OjrvvIo6OjrvvIo6OjrvvIo6OjrvvIo6OjrvvIo6
OjrvvIo6OjrvvIo6OjrvvIo6OjoKCgrilIDilIDilIDilIDilIDilIDilIDi
lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi
lIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKWWFob28hIEpBUEFO44Kr
44O844OJ44Gv5bm05Lya6LK75rC45bm054Sh5paZ44Gq44Gu44Gn44CBCuOB
iuawl+i7veOBq+OBiueUs+OBl+i+vOOBv+OBhOOBn+OBoOOBkeOBvuOBmeOA
guOBnOOBsuOBiueUs+OBl+i+vOOBv+OBj+OBoOOBleOBhOOAggoK44CA4pa8
WWFob28hIEpBUEFO44Kr44O844OJ44KS55Sz44GX6L6844KA4pa8CuOAgGh0
dHBzOi8veWFob28uanAvZUFGVFpKCgrigLvmnKzjg6Hjg7zjg6vjgajooYzj
gY3pgZXjgYTjgafjgYrnlLPjgZfovrzjgb/jgYTjgZ/jgaDjgYTjgabjgYTj
govloLTlkIjjgavjga/jgZTlrrnotabjgY/jgaDjgZXjgYTjgIIK4pSA4pSA
4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA
4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA
CgpZYWhvbyHjgqvjg7zjg4njgYrjgZnjgZnjgoHmg4XloLHjg6Hjg7zjg6vj
ga/jgIEKWWFob28hIEpBUEFOIElE44Gr44GU55m76Yyy44GV44KM44Gm44GE
44KL44Oh44O844Or44Ki44OJ44Os44K544Gr6YWN5L+h44GX44Gm44GE44G+
44GZ44CCCgrku4rlvozjgZPjga7jg6Hjg7zjg6vjga7phY3kv6HjgpLluIzm
nJvjgZXjgozjgarjgYTmlrnjga/jgIEK44GK5omL5pWw44Gn44GZ44GM5LiL
6YOo44Gr44GC44KL44CM6YWN5L+h44Gu55m76Yyy44O76Kej6Zmk44CN44Gu
VVJM44GL44KJ44CBCllhaG9vISBKQVBBTiBJROOBp+ODreOCsOOCpOODs+OB
l+OBpuaJi+e2muOBjeOCkuOBiumhmOOBhOOBhOOBn+OBl+OBvuOBmeOAggoK
4oC754m55a6a44Gu56uv5pyr44Gn44Gv44CBCuacrOODoeODvOODq+OBruih
qOekuuOChOODquODs+OCr+mBt+enu+OBjOato+OBl+OBj+OBleOCjOOBquOB
hOWgtOWQiOOBjOOBguOCiuOBvuOBmeOAggoK4pahIOeZuuihjO+8muODpOOD
leODvOagquW8j+S8muekvgpodHRwczovL3d3dy55YWhvby5jby5qcC8K4pah
IOS9j+aJgO+8muadseS6rOmDveWNg+S7o+eUsOWMuue0gOWwvuS6leeUujHn
laoz5Y+3CuKWoSDnt6jpm4bvvJpZYWhvbyHjgqvjg7zjg4kKaHR0cHM6Ly9j
YXJkLnlhaG9vLmNvLmpwLwrilqEg55m66KGM5pel77yaMjAxOOW5tDTmnIgy
OeaXpQrilqEg44GK5ZWP44GE5ZCI44KP44GbCmh0dHBzOi8veWFob28uanAv
djAxTVZiCuKWoSDphY3kv6Hjga7nmbvpjLLjg7vop6PpmaQKaHR0cHM6Ly95
YWhvby5qcC84Q1lTVFcK4pahIFlhaG9vISBKQVBBTuOAjOODl+ODqeOCpOOD
kOOCt+ODvOODneODquOCt+ODvOOAjQpodHRwczovL2RvY3MueWFob28uY28u
anAvZG9jcy9pbmZvL3Rlcm1zL2NoYXB0ZXIxLmh0bWwjY2YybmQK4pSA4pSA
4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA
4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA
4pSA4pSA4pSACkNvcHlyaWdodCAoQykgWWFob28gSmFwYW4gQ29ycG9yYXRp
b24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAoK
"

Quoted printable decoding is not correct in a few cases

If you decode this sequence

=E2=80=A6

You should get this character "…"

Instead you get "�"

Which is obviously not the right output. I succeeded in converting it using decodeURIComponent(escape(input)) but this options doesn't work all the time because, I think, should only be applied in some cases.

What I am missing here?

"text-encoding" missing from "dependencies"

Hey,

I know the lib may not be maintained currently, but for whomever will take over at one point: "text-encoding" is missing from the dependencies list and is only listed under devDependencies.

Cheers

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.