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
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.
	/// 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
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.
	///
	/// Attempt to deliver one message
	/// # 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
︙