mirror of
https://git.proxmox.com/git/proxmox
synced 2025-10-04 18:25:05 +00:00
notify: use proxmox-sendmail forward implementation
moves to depending on `proxmox-sendmail` for forwarding mails via `sendmail` too. Signed-off-by: Shannon Sterz <s.sterz@proxmox.com> Reviewed-by: Lukas Wagner <l.wagner@proxmox.com> Tested-by: Lukas Wagner <l.wagner@proxmox.com>
This commit is contained in:
parent
043fec42f8
commit
6e600c74a8
@ -39,7 +39,7 @@ proxmox-uuid = { workspace = true, features = ["serde"] }
|
|||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = ["sendmail", "gotify", "smtp", "webhook"]
|
default = ["sendmail", "gotify", "smtp", "webhook"]
|
||||||
mail-forwarder = ["dep:mail-parser", "dep:proxmox-sys"]
|
mail-forwarder = ["dep:mail-parser", "dep:proxmox-sys", "proxmox-sendmail/mail-forwarder"]
|
||||||
sendmail = ["dep:proxmox-sys", "dep:base64", "dep:proxmox-sendmail"]
|
sendmail = ["dep:proxmox-sys", "dep:base64", "dep:proxmox-sendmail"]
|
||||||
gotify = ["dep:proxmox-http"]
|
gotify = ["dep:proxmox-http"]
|
||||||
pve-context = ["dep:proxmox-sys"]
|
pve-context = ["dep:proxmox-sys"]
|
||||||
|
@ -1,6 +1,4 @@
|
|||||||
use std::io::Write;
|
use proxmox_sendmail::Mail;
|
||||||
use std::process::{Command, Stdio};
|
|
||||||
|
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
use proxmox_schema::api_types::COMMENT_SCHEMA;
|
use proxmox_schema::api_types::COMMENT_SCHEMA;
|
||||||
@ -148,7 +146,7 @@ impl Endpoint for SendmailEndpoint {
|
|||||||
}
|
}
|
||||||
#[cfg(feature = "mail-forwarder")]
|
#[cfg(feature = "mail-forwarder")]
|
||||||
Content::ForwardedMail { raw, uid, .. } => {
|
Content::ForwardedMail { raw, uid, .. } => {
|
||||||
forward(&recipients_str, &mailfrom, raw, *uid)
|
Mail::forward(&recipients_str, &mailfrom, raw, *uid)
|
||||||
.map_err(|err| Error::NotifyFailed(self.config.name.clone(), err.into()))
|
.map_err(|err| Error::NotifyFailed(self.config.name.clone(), err.into()))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -163,51 +161,3 @@ impl Endpoint for SendmailEndpoint {
|
|||||||
self.config.disable.unwrap_or_default()
|
self.config.disable.unwrap_or_default()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Forwards an email message to a given list of recipients.
|
|
||||||
///
|
|
||||||
/// ``sendmail`` is used for sending the mail, thus `message` must be
|
|
||||||
/// compatible with that (the message is piped into stdin unmodified).
|
|
||||||
#[cfg(feature = "mail-forwarder")]
|
|
||||||
fn forward(mailto: &[&str], mailfrom: &str, message: &[u8], uid: Option<u32>) -> Result<(), Error> {
|
|
||||||
use std::os::unix::process::CommandExt;
|
|
||||||
|
|
||||||
if mailto.is_empty() {
|
|
||||||
return Err(Error::Generic(
|
|
||||||
"At least one recipient has to be specified!".into(),
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
let mut builder = Command::new("/usr/sbin/sendmail");
|
|
||||||
|
|
||||||
builder
|
|
||||||
.args([
|
|
||||||
"-N", "never", // never send DSN (avoid mail loops)
|
|
||||||
"-f", mailfrom, "--",
|
|
||||||
])
|
|
||||||
.args(mailto)
|
|
||||||
.stdin(Stdio::piped())
|
|
||||||
.stdout(Stdio::null())
|
|
||||||
.stderr(Stdio::null());
|
|
||||||
|
|
||||||
if let Some(uid) = uid {
|
|
||||||
builder.uid(uid);
|
|
||||||
}
|
|
||||||
|
|
||||||
let mut process = builder
|
|
||||||
.spawn()
|
|
||||||
.map_err(|err| Error::Generic(format!("could not spawn sendmail process: {err}")))?;
|
|
||||||
|
|
||||||
process
|
|
||||||
.stdin
|
|
||||||
.take()
|
|
||||||
.unwrap()
|
|
||||||
.write_all(message)
|
|
||||||
.map_err(|err| Error::Generic(format!("couldn't write to sendmail stdin: {err}")))?;
|
|
||||||
|
|
||||||
process
|
|
||||||
.wait()
|
|
||||||
.map_err(|err| Error::Generic(format!("sendmail did not exit successfully: {err}")))?;
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
Loading…
Reference in New Issue
Block a user