As I wrote before, test what exactly happens. Add these logging rules and put them on top before all others:
/ip firewall filter
add action=log chain=forward connection-state=new dst-port=56789 log-prefix=step2 protocol=tcp
/ip firewall mangle
add action=log chain=prerouting connection-state=new dst-port=56789 log-prefix=step1 protocol=tcp
add action=log chain=postrouting connection-state=new dst-port=56789 log-prefix=step3 protocol=tcp
/ip firewall nat
add action=src-nat chain=srcnat dst-port=56789 log=yes log-prefix=step4 protocol=tcp to-addresses=<wan_ip>
Then on SMTP server run this (it's any random outside address and exact port you have in above rules):
And this is what you should see in log:
21:51:43 firewall,info step1 prerouting: in:<lan> out:(none), src-mac xx:xx:xx:xx:xx:xx, proto TCP (SYN), <dmz_ip>:<random_port>->1.2.3.4:56789, len 52
21:51:43 firewall,info step2 forward: in:<lan> out:<wan>, src-mac xx:xx:xx:xx:xx:xx, proto TCP (SYN), <dmz_ip>:<random_port>->1.2.3.4:56789, len 52
21:51:43 firewall,info step3 postrouting: in:(none) out:<wan>, src-mac xx:xx:xx:xx:xx:xx, proto TCP (SYN), <dmz_ip>:<random_port>->1.2.3.4:56789, len 52
21:51:43 firewall,info step4 srcnat: in:(none) out:<wan>, src-mac xx:xx:xx:xx:xx:xx, proto TCP (SYN), <dmz_ip>:<random_port>->1.2.3.4:56789, len 52
21:51:46 firewall,info step1 prerouting: in:<lan> out:(none), src-mac xx:xx:xx:xx:xx:xx, proto TCP (SYN), <dmz_ip>:<random_port>->1.2.3.4:56789, NAT (<dmz_ip>:<random_port>-><wan_ip>:<random_port>)->1.2.3.4:56789, len 52
21:51:46 firewall,info step2 forward: in:<lan> out:<wan>, src-mac xx:xx:xx:xx:xx:xx, proto TCP (SYN), <dmz_ip>:<random_port>->1.2.3.4:56789, NAT (<dmz_ip>:<random_port>-><wan_ip>:<random_port>)->1.2.3.4:56789, len 52
21:51:46 firewall,info step3 postrouting: in:(none) out:<wan>, src-mac xx:xx:xx:xx:xx:xx, proto TCP (SYN), <dmz_ip>:<random_port>->1.2.3.4:56789, NAT (<dmz_ip>:<random_port>-><wan_ip>:<random_port>)->1.2.3.4:56789, len 52
Check what's different in your case and you should find the problem.