diff --git a/Dockerfile b/Dockerfile index 16b4740..0711ef9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -59,6 +59,7 @@ RUN apt-get update && apt-get install -y \ libreoffice \ libva2 \ libvips-tools \ + libemail-outlook-message-perl \ lmodern \ mupdf-tools \ pandoc \ diff --git a/src/converters/main.ts b/src/converters/main.ts index bc0c27f..63106ff 100644 --- a/src/converters/main.ts +++ b/src/converters/main.ts @@ -14,6 +14,7 @@ import { convert as convertInkscape, properties as propertiesInkscape } from "./ import { convert as convertLibheif, properties as propertiesLibheif } from "./libheif"; import { convert as convertLibjxl, properties as propertiesLibjxl } from "./libjxl"; 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 convertPotrace, properties as propertiesPotrace } from "./potrace"; import { convert as convertresvg, properties as propertiesresvg } from "./resvg"; @@ -87,6 +88,10 @@ const properties: Record< properties: propertiesPandoc, converter: convertPandoc, }, + msgconvert: { + properties: propertiesMsgconvert, + converter: convertMsgconvert, + }, dvisvgm: { properties: propertiesDvisvgm, converter: convertDvisvgm, diff --git a/src/converters/msgconvert.ts b/src/converters/msgconvert.ts new file mode 100644 index 0000000..9d13a8f --- /dev/null +++ b/src/converters/msgconvert.ts @@ -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 { + 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.`); + } + }); +} diff --git a/src/helpers/printVersions.ts b/src/helpers/printVersions.ts index 68af2e0..eb1a591 100644 --- a/src/helpers/printVersions.ts +++ b/src/helpers/printVersions.ts @@ -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) => { if (error) { console.error("Bun is not installed. wait what");