Index: src/mail.rs ================================================================== --- src/mail.rs +++ src/mail.rs @@ -84,11 +84,11 @@ panic!("[smtp2tg.toml] can't check of domains in \"domains\": {domain}"); } } let domains = domains.into_iter().map(|s| escape(&s)) .collect::>().join("|"); - let address = Regex::new(&format!("^(?P[a-z0-9][-a-z0-9])(@({domains}))$")).stack()?; + let address = Regex::new(&format!("^[a-z0-9][-a-z0-9]*(@({domains}))?$")).stack()?; let relay = match settings.get_string("unknown") .context("[smtp2tg.toml] can't get \"unknown\" policy.\n")?.as_str() { "relay" => true, "deny" => false, @@ -106,21 +106,18 @@ address, }) } /// Returns id for provided email address - pub fn get_id (&self, name_str: &str) -> Result<&ChatPeerId> { - // here we need to store String locally to borrow it after - let mut link = name_str; - let name: String; - if let Some(caps) = self.address.captures(link) { - name = caps["name"].to_string(); - link = &name; - } - match self.tg.get(link) { - Ok(addr) => Ok(addr), - Err(_) => Ok(&self.tg.default), + pub fn get_id (&self, name: &str) -> Result<&ChatPeerId> { + if self.address.is_match(name) { + match self.tg.get(name) { + Ok(addr) => Ok(addr), + Err(_) => Ok(&self.tg.default), + } + } else { + bail!("Doesn't look like address from one of our domains."); } } /// Attempt to deliver one message async fn relay_mail (&self) -> Result<()> { Index: tests/mail.rs ================================================================== --- tests/mail.rs +++ tests/mail.rs @@ -37,7 +37,13 @@ ("unknown@example.com", 0), ]; for (email, id) in cases { assert_eq!(*server.get_id(email)?, ChatPeerId::from(id), "email [{email}] expected to return id [{id}]"); } + let cases = [ + "someone@otherdomain.net", + ]; + for email in cases { + assert!(server.get_id(email).unwrap_err().to_string().contains("Doesn't look like address from one of our domains."), "email [{email}] expected to fail"); + } Ok(()) }