npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

partial-emlx-converter

v3.0.4

Published

Convert .emlx and .partial.emlx files created by Apple’s Mail.app to .eml

Downloads

68

Readme

📧 .emlx and .partial.emlx to .eml converter

Actions Status codecov npm version

This script converts .emlx and .partial.emlx files written by Apple’s Mail.app into fully self-contained, “stand alone” .eml files which can be imported and opened by a great variety of email applications (Mail.app, Thunderbird, …).

Apple uses these formats for internal storage (see ~/Library/Mail/Vx), and under normal circumstances you will not come in contact with those files. Unfortunately, one of my IMAP mailboxes went out of service and I was not able to copy all the messages to a different account with Mail.app, even though all mails and attachments were there (see here for the story).

That’s why I created this script.

Installation

With Homebrew

This is the easiest way if you’re not a Node.js developer. Install the script and all dependencies with Homebrew:

$ brew install qqilihq/partial-emlx-converter/partial-emlx-converter

I would like to make this script available in the Homebrew core repository as well, but for this the project needs more ⭐️ and 🍴 — please help!

With NPM/Yarn

Use a current version of Node.js (currently built and tested with v10.15.3 LTS) and run the following command to install the script globally with npm:

$ npm install --global partial-emlx-converter

Usage

Run the script with at least two arguments: (1) Path to the directory which contains the .emlx and .partial.emlx files, (2) path to the existing directory where the results should be written to.

$ partial-emlx-converter /path/to/input /path/to/result

Optionally, you can specify --ignoreErrors as third argument. This way, the conversion will not be aborted in case there’s an error for a file (see the log output for details in this case).

Build

Use a current version of Node.js (currently built and tested with v10.15.3 LTS). Install the dependencies, run the tests, and compile the TypeScript code with yarn or npm:

$ yarn
$ yarn test
$ yarn build

Releasing to NPM

Commit all changes and run the following:

$ npm login
$ npm version <update_type>
$ npm publish

… where <update_type> is one of patch, minor, or major. This will update the package.json, and create a tagged Git commit with the version number.

After releasing a new version, remember to update the Homebrew formula here.

About the file formats

Disclaimer: I figured out the following by reverse engineering. I cannot give any guarantee about the correctness. If you feel, that something should be corrected, please let me know.

.emlx and .partial.emlx are similar to .eml, with the following peculiarities:

.emlx

These files start with a line which contains the length of the actual .eml payload:

2945
Return-Path: <[email protected]>
X-Original-To: [email protected]

The number 2945 denotes, that the actual .eml payload is 2945 characters long, starting from the second line.

At the end, these files contain an XML property list epilogue, which holds some Mail.app-specific meta data. Using the given character length at the file’s beginning, this epilogue can be stripped away easily and an .eml file can be created.

Edit: Later, I found those additional sources, which basically confirm my findings:

.partial.emlx

Mail.app uses this format to save emails which contain attachments. Attachments are saved as separate, regular files relative to the .partial.emlx file. Afaik, Apple does this due to Spotlight indexing.

Mail.app’s internal file structure looks as follows (nested into two further hierarchies of directories named with number 0 to 9):

Attachments/
  1234/
    1.2/
      image001.jpg
    2/
      file.zip
  …
Messages/
  1234.partial.emlx
  …

1234 is obviously the email’s ID. The Attachments directory contains the raw attachment files, whereas Messages contains the messages stripped of their attachments (and .emlx files, for messages which did not contain any attached files in first place).

The subdirectories 1.2 and 2 in above’s example are numbered according to their positions within the corresponding email’s Multipart hierarchy.

To convert a .partial.emlx file into an .eml file, the separated attachments need to be re-integrated into the file.

Credits

Without the following modules I would probably be still working on this script (or have given up on the way). Thank you for saving me so much time!

Beside that, here are some resources which I found very helpful during development:

Contributing

Pull requests are very welcome. Feel free to discuss bugs or new features by opening a new issue. In case you submit any bug fixes, please provide corresponding test cases and make sure that existing tests do not break.


Copyright (c) 2018 – 2023 Philipp Katz