master_service = master_service_init("lda",
MASTER_SERVICE_FLAG_STANDALONE |
MASTER_SERVICE_FLAG_DONT_LOG_TO_STDERR,
- &argc, &argv, "a:d:ef:km:p:");
+ &argc, &argv, "a:d:ef:km:p:r:");
memset(&ctx, 0, sizeof(ctx));
ctx.pool = pool_alloconly_create("mail deliver context", 256);
while ((c = master_getopt(master_service)) > 0) {
switch (c) {
case 'a':
- /* destination address */
+ /* original recipient address */
ctx.dest_addr = optarg;
break;
case 'd':
/* input path */
path = t_abspath(optarg);
break;
+ case 'r':
+ /* final recipient address */
+ ctx.final_dest_addr = optarg;
+ break;
default:
print_help();
return EX_USAGE;
t_strconcat(user, "@", ctx.set->hostname, NULL);
}
}
+ if (ctx.final_dest_addr == NULL)
+ ctx.final_dest_addr = ctx.dest_addr;
if (mail_deliver(&ctx, &storage) < 0) {
if (storage == NULL) {
/* Destination user */
struct mail_user *dest_user;
- /* Destination email address */
+ /* Original recipient address */
const char *dest_addr;
+ /* Final recipient address (typically same as dest_addr) */
+ const char *final_dest_addr;
/* Mailbox where mail should be saved, unless e.g. Sieve does
something to it. */
const char *dest_mailbox_name;
dctx.src_envelope_sender = client->state.mail_from;
dctx.dest_user = client->state.dest_user;
dctx.dest_addr = rcpt->address;
+ dctx.final_dest_addr = rcpt->address;
dctx.dest_mailbox_name = *rcpt->detail == '\0' ? "INBOX" : rcpt->detail;
dctx.save_dest_mail = array_count(&client->state.rcpt_to) > 1 &&
client->state.first_saved_mail == NULL;