Project Alouette: je te plume la queue (et je la remplace par mieux)

This commit is contained in:
mdecimus
2025-07-09 20:38:27 +02:00
parent 698ce0de2e
commit d04a4331c3
83 changed files with 3479 additions and 2987 deletions

View File

@@ -18,7 +18,7 @@ use jmap_proto::{
value::{Object, Value},
},
};
use smtp::queue::{ArchivedStatus, Message, spool::SmtpSpool};
use smtp::queue::{ArchivedError, ArchivedErrorDetails, ArchivedStatus, Message, spool::SmtpSpool};
use smtp_proto::ArchivedResponse;
use std::future::Future;
use store::rkyv::option::ArchivedOption;
@@ -121,7 +121,7 @@ impl EmailSubmissionGet for Server {
}
ArchivedStatus::TemporaryFailure(reply)
| ArchivedStatus::PermanentFailure(reply) => {
format_archived_response(&reply.response)
format_archived_error_details(reply)
}
ArchivedStatus::Scheduled => "250 2.1.5 Queued".to_string(),
},
@@ -232,3 +232,17 @@ fn format_archived_response(response: &ArchivedResponse<String>) -> String {
response.message.replace('\n', " "),
)
}
fn format_archived_error_details(response: &ArchivedErrorDetails) -> String {
match &response.details {
ArchivedError::UnexpectedResponse(response) => format_archived_response(&response.response),
ArchivedError::DnsError(details)
| ArchivedError::Io(details)
| ArchivedError::ConnectionError(details)
| ArchivedError::TlsError(details)
| ArchivedError::DaneError(details)
| ArchivedError::MtaStsError(details) => details.to_string(),
ArchivedError::RateLimited => "Rate limited".to_string(),
ArchivedError::ConcurrencyLimited => "Concurrency limited".to_string(),
}
}

View File

@@ -4,14 +4,13 @@
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL
*/
use std::{collections::HashMap, sync::Arc, time::Duration};
use crate::blob::download::BlobDownload;
use common::{
Server,
config::smtp::queue::QueueName,
listener::{ServerInstance, stream::NullIo},
storage::index::ObjectIndexBuilder,
};
use email::{
identity::Identity,
message::metadata::MessageMetadata,
@@ -41,13 +40,12 @@ use smtp::{
queue::spool::SmtpSpool,
};
use smtp_proto::{MailFrom, RcptTo, request::parser::Rfc5321Parser};
use std::future::Future;
use std::{collections::HashMap, sync::Arc, time::Duration};
use store::write::{BatchBuilder, now};
use trc::AddContext;
use utils::{BlobHash, map::vec_map::VecMap, sanitize_email};
use crate::blob::download::BlobDownload;
use std::future::Future;
pub trait EmailSubmissionSet: Sync + Send {
fn email_submission_set(
&self,
@@ -166,10 +164,11 @@ impl EmailSubmissionSet for Server {
match undo_status {
Some(undo_status) if undo_status == "canceled" => {
if let Some(queue_message) = self.read_message(queue_id).await {
if let Some(queue_message) =
self.read_message(queue_id, QueueName::default()).await
{
// Delete message from queue
let message_due = queue_message.next_event().unwrap_or_default();
queue_message.remove(self, message_due).await;
queue_message.remove(self, None).await;
// Update record
let mut new_submission = submission.inner.clone();