From 60083834f802456382ffc63f0c908db3e2676feb Mon Sep 17 00:00:00 2001 From: Sadie Powell Date: Mon, 18 Mar 2024 11:57:08 +0000 Subject: Improve sending email. - Use consistent line endings as expected by the email spec. - Don't require admins to escape . at the start of lines. - Log the reason why sending email fails. --- src/mail.cpp | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/mail.cpp b/src/mail.cpp index 87a030668..762c889a5 100644 --- a/src/mail.cpp +++ b/src/mail.cpp @@ -28,18 +28,18 @@ Mail::Message::Message(const Anope::string &sf, const Anope::string &mailto, con Mail::Message::~Message() { - if (success) + if (error.empty()) Log(LOG_NORMAL, "mail") << "Successfully delivered mail for " << mail_to << " (" << addr << ")"; else - Log(LOG_NORMAL, "mail") << "Error delivering mail for " << mail_to << " (" << addr << ")"; + Log(LOG_NORMAL, "mail") << "Error delivering mail for " << mail_to << " (" << addr << "): " << error; } void Mail::Message::Run() { - FILE *pipe = popen(sendmail_path.c_str(), "w"); - + auto *pipe = popen(sendmail_path.c_str(), "w"); if (!pipe) { + error = strerror(errno); SetExitState(); return; } @@ -53,12 +53,16 @@ void Mail::Message::Run() fprintf(pipe, "Content-Type: %s\r\n", content_type.c_str()); fprintf(pipe, "Content-Transfer-Encoding: 8bit\r\n"); fprintf(pipe, "\r\n"); - fprintf(pipe, "%s", message.c_str()); - fprintf(pipe, "\r\n.\r\n"); - pclose(pipe); + std::stringstream stream(message.str()); + for (Anope::string line; std::getline(stream, line.str()); ) + fprintf(pipe, "%s\r\n", line.c_str()); + fprintf(pipe, "\r\n"); + + auto result = pclose(pipe); + if (result > 0) + error = "Sendmail exited with code " + Anope::ToString(result); - success = true; SetExitState(); } -- cgit