Diff
Logged in as anonymous

Differences From Artifact [043f24ad99]:

To Artifact [c3fdca9cf0]:


︙︙
65
66
67
68
69
70
71
72

73
74
75
76
77
78
79
	/// Initializes the mail server: sets up the Telegram API client and
	/// validates all required configuration values.
	///
	/// # Arguments
	/// * `settings` - Parsed application configuration.
	///
	/// # Errors
	/// Returns an error if required configuration values are missing or invalid.

	pub fn new (settings: config::Config) -> Result<MailServer> {
		let api_key = settings.get_string("api_key")
			.context("[smtp2tg.toml] missing \"api_key\" parameter.\n")?;
		let mut recipients = HashMap::new();
		for (name, value) in settings.get_table("recipients")
			.context("[smtp2tg.toml] missing table \"recipients\".\n")?
		{







|
>







65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
	/// Initializes the mail server: sets up the Telegram API client and
	/// validates all required configuration values.
	///
	/// # Arguments
	/// * `settings` - Parsed application configuration.
	///
	/// # Errors
	/// Returns an error if required configuration values are missing or invalid,
	/// Telegram API client creation fails, or the address regex cannot be built.
	pub fn new (settings: config::Config) -> Result<MailServer> {
		let api_key = settings.get_string("api_key")
			.context("[smtp2tg.toml] missing \"api_key\" parameter.\n")?;
		let mut recipients = HashMap::new();
		for (name, value) in settings.get_table("recipients")
			.context("[smtp2tg.toml] missing table \"recipients\".\n")?
		{
︙︙
127
128
129
130
131
132
133







134





135
136
137
138
139
140
141
	pub fn get_id (&self, name: &str) -> Result<&ChatPeerId> {
		if self.address.is_match(name) {
			Ok(self.tg.get(name).unwrap_or(&self.tg.default))
		} else {
			bail!("Email address {name:?} is not from an allowed domain.");
	}	}








	/// Attempt to deliver one message





	async fn relay_mail (&self) -> Result<()> {
		if let Some(headers) = &self.headers {
			let mail = mail_parser::MessageParser::new().parse(&self.data)
				.context("Failed to parse mail.")?;

			// Adding all known addresses to recipient list, for anyone else adding default
			// Also if list is empty also adding default







>
>
>
>
>
>
>
|
>
>
>
>
>







128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
	pub fn get_id (&self, name: &str) -> Result<&ChatPeerId> {
		if self.address.is_match(name) {
			Ok(self.tg.get(name).unwrap_or(&self.tg.default))
		} else {
			bail!("Email address {name:?} is not from an allowed domain.");
	}	}

	/// Forwards the buffered email to each distinct destination chat, using the
	/// default chat for allowed addresses without a configured recipient.
	///
	/// Inlines the first plain-text body if the escaped message is below 4096
	/// bytes. Sends remaining text parts and decoded attachments as documents;
	/// HTML body parts are omitted. Leaves the buffered data and envelope intact.
	///
	/// # Errors
	/// Returns an error for a missing envelope, no recipients, a disallowed
	/// address, mail parsing or part extraction failures, or rejected closing
	/// `pre`/`code` tags in text passed to validation. Propagates media-group
	/// construction and Telegram request errors, including diagnostic sends.
	/// Delivery to earlier chats is not rolled back if a later send fails.
	async fn relay_mail (&self) -> Result<()> {
		if let Some(headers) = &self.headers {
			let mail = mail_parser::MessageParser::new().parse(&self.data)
				.context("Failed to parse mail.")?;

			// Adding all known addresses to recipient list, for anyone else adding default
			// Also if list is empty also adding default
︙︙