Skip to content

Commit 7ea1237

Browse files
mkurzJeremy Harris
authored andcommitted
Events: raise msg:fail:internal & msg:complete for -Mrm. Bug 2310
1 parent b291f36 commit 7ea1237

File tree

7 files changed

+98
-11
lines changed

7 files changed

+98
-11
lines changed

doc/doc-txt/ChangeLog

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,10 @@ JH/23 Bug 2318: Fix the noerror command within filters. It wasn't working.
112112
The ignore_error flag wasn't being returned from the filter subprocess so
113113
was not set for later routers. Investigation and fix by Matthias Kurz.
114114

115+
JH/24 Bug 2310: Raise a msg:fail:internal event for each undelivered recipient,
116+
and a msg:complete for the whole, when a message is manually reoved using
117+
-Mrm. Developement by Matthias Kurz, hacked on by JH.
118+
115119

116120
Exim version 4.91
117121
-----------------

src/src/deliver.c

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -851,7 +851,7 @@ if (action)
851851
if (!(s = expand_string(action)) && *expand_string_message)
852852
log_write(0, LOG_MAIN|LOG_PANIC,
853853
"failed to expand event_action %s in %s: %s\n",
854-
event, transport_name, expand_string_message);
854+
event, transport_name ? transport_name : US"main", expand_string_message);
855855

856856
event_name = event_data = NULL;
857857

@@ -6240,17 +6240,23 @@ if (process_recipients != RECIP_IGNORE)
62406240
{
62416241
uschar * save_local = deliver_localpart;
62426242
const uschar * save_domain = deliver_domain;
6243+
uschar * addr = new->address, * errmsg = NULL;
6244+
int start, end, dom;
62436245

6244-
deliver_localpart = expand_string(
6245-
string_sprintf("${local_part:%s}", new->address));
6246-
deliver_domain = expand_string(
6247-
string_sprintf("${domain:%s}", new->address));
6246+
if (!parse_extract_address(addr, &errmsg, &start, &end, &dom, TRUE))
6247+
log_write(0, LOG_MAIN|LOG_PANIC,
6248+
"failed to parse address '%.100s': %s\n", addr, errmsg);
6249+
else
6250+
{
6251+
deliver_localpart =
6252+
string_copyn(addr+start, dom ? (dom-1) - start : end - start);
6253+
deliver_domain = dom ? CUS string_copyn(addr+dom, end - dom) : CUS"";
62486254

6249-
(void) event_raise(event_action,
6250-
US"msg:fail:internal", new->message);
6255+
event_raise(event_action, US"msg:fail:internal", new->message);
62516256

6252-
deliver_localpart = save_local;
6253-
deliver_domain = save_domain;
6257+
deliver_localpart = save_local;
6258+
deliver_domain = save_domain;
6259+
}
62546260
}
62556261
#endif
62566262
}

src/src/exim.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4449,6 +4449,12 @@ if (msg_action_arg > 0 && msg_action != MSG_DELIVER && msg_action != MSG_LOAD)
44494449
int yield = EXIT_SUCCESS;
44504450
set_process_info("acting on specified messages");
44514451

4452+
/* ACL definitions may be needed when removing a message (-Mrm) because
4453+
event_action gets expanded */
4454+
4455+
if (msg_action == MSG_REMOVE)
4456+
readconf_rest();
4457+
44524458
if (!one_msg_action)
44534459
{
44544460
for (i = msg_action_arg; i < argc; i++)

src/src/queue.c

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1255,6 +1255,38 @@ switch(action)
12551255
else printf("has been removed or did not exist\n");
12561256
if (removed)
12571257
{
1258+
#ifndef DISABLE_EVENT
1259+
for (i = 0; i < recipients_count; i++)
1260+
{
1261+
tree_node *delivered =
1262+
tree_search(tree_nonrecipients, recipients_list[i].address);
1263+
if (!delivered)
1264+
{
1265+
uschar * save_local = deliver_localpart;
1266+
const uschar * save_domain = deliver_domain;
1267+
uschar * addr = recipients_list[i].address, * errmsg = NULL;
1268+
int start, end, dom;
1269+
1270+
if (!parse_extract_address(addr, &errmsg, &start, &end, &dom, TRUE))
1271+
log_write(0, LOG_MAIN|LOG_PANIC,
1272+
"failed to parse address '%.100s'\n: %s", addr, errmsg);
1273+
else
1274+
{
1275+
deliver_localpart =
1276+
string_copyn(addr+start, dom ? (dom-1) - start : end - start);
1277+
deliver_domain = dom
1278+
? CUS string_copyn(addr+dom, end - dom) : CUS"";
1279+
1280+
event_raise(event_action, US"msg:fail:internal",
1281+
string_sprintf("message removed by %s", username));
1282+
1283+
deliver_localpart = save_local;
1284+
deliver_domain = save_domain;
1285+
}
1286+
}
1287+
}
1288+
(void) event_raise(event_action, US"msg:complete", NULL);
1289+
#endif
12581290
log_write(0, LOG_MAIN, "removed by %s", username);
12591291
log_write(0, LOG_MAIN, "Completed");
12601292
}
@@ -1264,9 +1296,8 @@ switch(action)
12641296

12651297
case MSG_MARK_ALL_DELIVERED:
12661298
for (i = 0; i < recipients_count; i++)
1267-
{
12681299
tree_add_nonrecipient(recipients_list[i].address);
1269-
}
1300+
12701301
if (spool_write_header(id, SW_MODIFYING, &errmsg) >= 0)
12711302
{
12721303
printf("has been modified\n");

test/log/5700

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,3 +96,20 @@
9696
1999-03-02 09:44:33 10HmbC-0005vi-00 Completed
9797
1999-03-02 09:44:33 10HmbC-0005vi-00 event msg:complete
9898
1999-03-02 09:44:33 10HmbC-0005vi-00 . finished: 10HmbC-0005vi-00
99+
1999-03-02 09:44:33 10HmbE-0005vi-00 <= CALLER@the.local.host.name U=CALLER P=local S=sss
100+
1999-03-02 09:44:33 10HmbE-0005vi-00 event msg:fail:internal
101+
1999-03-02 09:44:33 10HmbE-0005vi-00 . local_part <userx> domain <domain1> reason <message removed by CALLER>
102+
1999-03-02 09:44:33 10HmbE-0005vi-00 event msg:complete
103+
1999-03-02 09:44:33 10HmbE-0005vi-00 . finished: 10HmbE-0005vi-00
104+
1999-03-02 09:44:33 10HmbE-0005vi-00 removed by CALLER
105+
1999-03-02 09:44:33 10HmbE-0005vi-00 Completed
106+
1999-03-02 09:44:33 10HmbF-0005vi-00 <= CALLER@the.local.host.name U=CALLER P=local S=sss
107+
1999-03-02 09:44:33 10HmbF-0005vi-00 address <usery@domain1> marked delivered by CALLER
108+
1999-03-02 09:44:33 10HmbF-0005vi-00 event msg:fail:internal
109+
1999-03-02 09:44:33 10HmbF-0005vi-00 . local_part <userx> domain <domain1> reason <message removed by CALLER>
110+
1999-03-02 09:44:33 10HmbF-0005vi-00 event msg:fail:internal
111+
1999-03-02 09:44:33 10HmbF-0005vi-00 . local_part <userz> domain <domain1> reason <message removed by CALLER>
112+
1999-03-02 09:44:33 10HmbF-0005vi-00 event msg:complete
113+
1999-03-02 09:44:33 10HmbF-0005vi-00 . finished: 10HmbF-0005vi-00
114+
1999-03-02 09:44:33 10HmbF-0005vi-00 removed by CALLER
115+
1999-03-02 09:44:33 10HmbF-0005vi-00 Completed

test/scripts/5700-events/5700

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,3 +111,23 @@ A message we will cancel from the queue
111111
****
112112
exim -odi -Mg $msg1
113113
****
114+
#
115+
#
116+
#
117+
#
118+
exim -odq userx@domain1
119+
A message we will remove from the queue
120+
****
121+
exim -Mrm $msg1
122+
****
123+
#
124+
#
125+
#
126+
#
127+
exim -odq userx@domain1 usery@domain1 userz@domain1
128+
A message we will remove from the queue that has delivered recipients already.
129+
****
130+
exim -Mmd $msg1 usery@domain1
131+
****
132+
exim -Mrm $msg1
133+
****

test/stdout/5700

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
Message 10HmbE-0005vi-00 has been removed
2+
Message 10HmbF-0005vi-00 has been modified
3+
Message 10HmbF-0005vi-00 has been removed
14

25
******** SERVER ********
36
Listening on port 1224 ...

0 commit comments

Comments
 (0)