Add MSG to EML email conversion support (#367)
- Add new msgconvert converter using libemail-outlook-message-perl - Support conversion from Outlook MSG files to standard EML format - Add msgconvert to Docker dependencies and version checking - Register msgconvert converter in main converter registry Implements feature request #367 for email format conversion
This commit is contained in:
parent
f5f718a84a
commit
5ffb7f4a01
4 changed files with 63 additions and 0 deletions
|
|
@ -59,6 +59,7 @@ RUN apt-get update && apt-get install -y \
|
||||||
libreoffice \
|
libreoffice \
|
||||||
libva2 \
|
libva2 \
|
||||||
libvips-tools \
|
libvips-tools \
|
||||||
|
libemail-outlook-message-perl \
|
||||||
lmodern \
|
lmodern \
|
||||||
mupdf-tools \
|
mupdf-tools \
|
||||||
pandoc \
|
pandoc \
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@ import { convert as convertInkscape, properties as propertiesInkscape } from "./
|
||||||
import { convert as convertLibheif, properties as propertiesLibheif } from "./libheif";
|
import { convert as convertLibheif, properties as propertiesLibheif } from "./libheif";
|
||||||
import { convert as convertLibjxl, properties as propertiesLibjxl } from "./libjxl";
|
import { convert as convertLibjxl, properties as propertiesLibjxl } from "./libjxl";
|
||||||
import { convert as convertLibreOffice, properties as propertiesLibreOffice } from "./libreoffice";
|
import { convert as convertLibreOffice, properties as propertiesLibreOffice } from "./libreoffice";
|
||||||
|
import { convert as convertMsgconvert, properties as propertiesMsgconvert } from "./msgconvert";
|
||||||
import { convert as convertPandoc, properties as propertiesPandoc } from "./pandoc";
|
import { convert as convertPandoc, properties as propertiesPandoc } from "./pandoc";
|
||||||
import { convert as convertPotrace, properties as propertiesPotrace } from "./potrace";
|
import { convert as convertPotrace, properties as propertiesPotrace } from "./potrace";
|
||||||
import { convert as convertresvg, properties as propertiesresvg } from "./resvg";
|
import { convert as convertresvg, properties as propertiesresvg } from "./resvg";
|
||||||
|
|
@ -87,6 +88,10 @@ const properties: Record<
|
||||||
properties: propertiesPandoc,
|
properties: propertiesPandoc,
|
||||||
converter: convertPandoc,
|
converter: convertPandoc,
|
||||||
},
|
},
|
||||||
|
msgconvert: {
|
||||||
|
properties: propertiesMsgconvert,
|
||||||
|
converter: convertMsgconvert,
|
||||||
|
},
|
||||||
dvisvgm: {
|
dvisvgm: {
|
||||||
properties: propertiesDvisvgm,
|
properties: propertiesDvisvgm,
|
||||||
converter: convertDvisvgm,
|
converter: convertDvisvgm,
|
||||||
|
|
|
||||||
47
src/converters/msgconvert.ts
Normal file
47
src/converters/msgconvert.ts
Normal file
|
|
@ -0,0 +1,47 @@
|
||||||
|
import { execFile } from "node:child_process";
|
||||||
|
|
||||||
|
export const properties = {
|
||||||
|
from: {
|
||||||
|
email: ["msg"],
|
||||||
|
},
|
||||||
|
to: {
|
||||||
|
email: ["eml"],
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export function convert(
|
||||||
|
filePath: string,
|
||||||
|
fileType: string,
|
||||||
|
convertTo: string,
|
||||||
|
targetPath: string,
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
options?: unknown,
|
||||||
|
): Promise<string> {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
if (fileType === "msg" && convertTo === "eml") {
|
||||||
|
// Convert MSG to EML using msgconvert
|
||||||
|
// msgconvert will output to the same directory as the input file with .eml extension
|
||||||
|
// We need to use --outfile to specify the target path
|
||||||
|
const args = ["--outfile", targetPath, filePath];
|
||||||
|
|
||||||
|
execFile("msgconvert", args, (error, stdout, stderr) => {
|
||||||
|
if (error) {
|
||||||
|
reject(`error: ${error}`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stdout) {
|
||||||
|
console.log(`stdout: ${stdout}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stderr) {
|
||||||
|
console.error(`stderr: ${stderr}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
resolve("Done");
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
reject(`Unsupported conversion from ${fileType} to ${convertTo}. Only MSG to EML conversion is currently supported.`);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
@ -154,6 +154,16 @@ if (process.env.NODE_ENV === "production") {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
exec("msgconvert --version", (error, stdout) => {
|
||||||
|
if (error) {
|
||||||
|
console.error("msgconvert (libemail-outlook-message-perl) is not installed");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stdout) {
|
||||||
|
console.log(stdout.split("\n")[0]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
exec("bun -v", (error, stdout) => {
|
exec("bun -v", (error, stdout) => {
|
||||||
if (error) {
|
if (error) {
|
||||||
console.error("Bun is not installed. wait what");
|
console.error("Bun is not installed. wait what");
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue