mirror of
https://github.com/rustmailer/bichon.git
synced 2026-08-03 07:48:34 +02:00
fix: add tolerant HTML-to-text extraction (#141)
This commit is contained in:
@@ -21,6 +21,7 @@ use crate::modules::envelope::utils::normalize_subject;
|
|||||||
use crate::modules::error::code::ErrorCode;
|
use crate::modules::error::code::ErrorCode;
|
||||||
use crate::modules::error::BichonResult;
|
use crate::modules::error::BichonResult;
|
||||||
use crate::modules::utils::create_hash;
|
use crate::modules::utils::create_hash;
|
||||||
|
use crate::modules::utils::html::extract_text;
|
||||||
use crate::{calculate_hash, raise_error, utc_now};
|
use crate::{calculate_hash, raise_error, utc_now};
|
||||||
use crate::{id, modules::indexer::envelope::Envelope};
|
use crate::{id, modules::indexer::envelope::Envelope};
|
||||||
use async_imap::types::Fetch;
|
use async_imap::types::Fetch;
|
||||||
@@ -48,10 +49,7 @@ pub fn extract_envelope(fetch: &Fetch, account_id: u64, mailbox_id: u64) -> Bich
|
|||||||
let text = if let Some(text) = message.body_text(0).map(|cow| cow.into_owned()) {
|
let text = if let Some(text) = message.body_text(0).map(|cow| cow.into_owned()) {
|
||||||
text
|
text
|
||||||
} else if let Some(html) = message.body_html(0).map(|cow| cow.into_owned()) {
|
} else if let Some(html) = message.body_html(0).map(|cow| cow.into_owned()) {
|
||||||
html2text::config::plain()
|
extract_text(html)
|
||||||
.allow_width_overflow()
|
|
||||||
.string_from_read(html.as_bytes(), 100)
|
|
||||||
.map_err(|e| raise_error!(format!("{:#?}", e), ErrorCode::InternalError))?
|
|
||||||
} else {
|
} else {
|
||||||
String::new()
|
String::new()
|
||||||
};
|
};
|
||||||
@@ -150,10 +148,7 @@ pub fn extract_envelope_from_eml(
|
|||||||
let text = if let Some(text) = message.body_text(0).map(|cow| cow.into_owned()) {
|
let text = if let Some(text) = message.body_text(0).map(|cow| cow.into_owned()) {
|
||||||
text
|
text
|
||||||
} else if let Some(html) = message.body_html(0).map(|cow| cow.into_owned()) {
|
} else if let Some(html) = message.body_html(0).map(|cow| cow.into_owned()) {
|
||||||
html2text::config::plain()
|
extract_text(html)
|
||||||
.allow_width_overflow()
|
|
||||||
.string_from_read(html.as_bytes(), 100)
|
|
||||||
.map_err(|e| raise_error!(format!("{:#?}", e), ErrorCode::InternalError))?
|
|
||||||
} else {
|
} else {
|
||||||
String::new()
|
String::new()
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -0,0 +1,28 @@
|
|||||||
|
use std::panic;
|
||||||
|
use tracing::error;
|
||||||
|
|
||||||
|
pub fn extract_text(html: String) -> String {
|
||||||
|
let result = panic::catch_unwind(|| {
|
||||||
|
html2text::config::plain()
|
||||||
|
.allow_width_overflow()
|
||||||
|
.string_from_read(html.as_bytes(), 100)
|
||||||
|
});
|
||||||
|
|
||||||
|
match result {
|
||||||
|
Ok(Ok(text)) => text,
|
||||||
|
Ok(Err(err)) => {
|
||||||
|
error!("html2text error: {}", err);
|
||||||
|
html
|
||||||
|
}
|
||||||
|
Err(err) => {
|
||||||
|
if let Some(s) = err.downcast_ref::<&str>() {
|
||||||
|
error!("html2text panic: {}", s);
|
||||||
|
} else if let Some(s) = err.downcast_ref::<String>() {
|
||||||
|
error!("html2text panic: {}", s);
|
||||||
|
} else {
|
||||||
|
error!("html2text panic: unknown error");
|
||||||
|
}
|
||||||
|
html
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -26,6 +26,7 @@ use rand::{rng, Rng};
|
|||||||
use super::error::code::ErrorCode;
|
use super::error::code::ErrorCode;
|
||||||
|
|
||||||
pub mod encrypt;
|
pub mod encrypt;
|
||||||
|
pub mod html;
|
||||||
pub mod net;
|
pub mod net;
|
||||||
pub mod rate_limit;
|
pub mod rate_limit;
|
||||||
pub mod shutdown;
|
pub mod shutdown;
|
||||||
|
|||||||
Reference in New Issue
Block a user