Files
cloudflare_temp_email/frontend/src/utils/email-parser.js
2024-06-01 20:08:42 +08:00

83 lines
3.3 KiB
JavaScript

import PostalMime from 'postal-mime';
function humanFileSize(size) {
const i = size === 0 ? 0 : Math.floor(Math.log(size) / Math.log(1024));
return parseFloat((size / Math.pow(1024, i)).toFixed(2)) + ' ' + ['B', 'KB', 'MB', 'GB', 'TB'][i];
}
export async function processItem(item) {
// Try to parse the email using mail-parser-wasm
item.originalSource = item.source;
try {
const { parse_message } = await import('mail-parser-wasm');
const parsedEmail = parse_message(item.raw);
item.source = parsedEmail.sender || item.source;
item.subject = parsedEmail.subject || '';
item.message = parsedEmail.body_html || parsedEmail.text || '';
item.text = parsedEmail.text || '';
item.attachments = parsedEmail.attachments?.map((a_item) => {
const blob = new Blob(
[a_item.content],
{ type: a_item.content_type || 'application/octet-stream' }
);
const blob_url = URL.createObjectURL(blob);
if (a_item.content_id && a_item.content_id.length > 0) {
item.message = item.message.replace(`cid:${a_item.content_id}`, blob_url);
}
return {
id: a_item.content_id || Math.random().toString(36).substring(2, 15),
filename: a_item.filename || a_item.content_id || "",
size: humanFileSize(a_item.content?.length || 0),
url: blob_url,
blob: blob
}
}) || [];
} catch (error) {
console.log('Error parsing email with mail-parser-wasm');
console.error(error);
}
if (item.subject && item.subject.length > 0 && item.message && item.message.length > 0) {
return item;
}
// Fallback to PostalMime
try {
const parsedEmail = await PostalMime.parse(item.raw);
item.source = parsedEmail.from.address || item.source;
if (parsedEmail.from.address && parsedEmail.from.name) {
item.source = `${parsedEmail.from.name} <${parsedEmail.from.address}>`;
}
item.subject = parsedEmail.subject || 'No Subject';
item.message = parsedEmail.html || parsedEmail.text || item.raw;
item.text = parsedEmail.text || '';
item.attachments = parsedEmail.attachments?.map((a_item) => {
const blob = new Blob(
[a_item.content],
{ type: a_item.mimeType || 'application/octet-stream' }
);
const blob_url = URL.createObjectURL(blob)
if (a_item.contentId && a_item.contentId.length > 0) {
item.message = item.message.replace(`cid:${a_item.contentId}`, blob_url);
}
return {
id: a_item.contentId || Math.random().toString(36).substring(2, 15),
filename: a_item.filename || a_item.contentId || "",
size: humanFileSize(a_item.content?.length || 0),
url: blob_url,
blob: blob
}
}) || [];
} catch (error) {
console.log('Error parsing email with PostalMime');
console.error(error);
item.subject = 'No Subject';
item.message = item.raw;
}
return item;
}
export function getDownloadEmlUrl(raw) {
return URL.createObjectURL(
new Blob([raw], { type: 'text/plain' }
))
}