i just cut small part from James and put it in smtp proxy codeshare. hoping it might be easier for you to see how it works.
[root@ve1023:Active] config b virtual bar list
virtual bar {
snat automap
destination 172.28.19.79:25
ip protocol 6
rules myrule
}
[root@ve1023:Active] config b rule myrule list
rule myrule {
when CLIENT_ACCEPTED {
set chelo ""
set cfrom ""
set crcpt ""
TCP::respond "220\r\n"
log local0. "client accepted"
TCP::collect
}
when CLIENT_DATA {
set cdata [TCP::payload]
if { [ string length $cdata ] <= 0 } {
return
}
if { not ( $cdata contains "\r\n" ) } {
log local0. "get $cdata so far"
return
}
if { $cdata starts_with "HELO" } {
set chelo [TCP::payload]
log local0. "get helo $cdata"
TCP::respond "250 OK\r\n"
TCP::payload replace 0 [string length $chelo] ""
return
}
if { $cdata starts_with "MAIL FROM:" } {
set cfrom [TCP::payload]
log local0. "get from $cfrom"
TCP::respond "250 OK\r\n"
TCP::payload replace 0 [string length $cfrom] ""
return
}
if { $cdata starts_with "RCPT TO:" } {
set crcpt "$crcpt[TCP::payload]"
log local0. "get rcpt $crcpt"
set rcptaddr [regsub -all \[\\r\\n\\s\] [TCP::payload] ""]
set rcptaddr [findstr $rcptaddr ":" 1]
set rcptdomain [findstr $rcptaddr "@" 1]
log local0. "get rcpt domain $rcptdomain"
TCP::respond "250 OK\r\n"
TCP::payload replace 0 [string length [TCP::payload]] ""
if {$rcptdomain equals "abc.com"} {
log local0. "foo1"
pool foo1
} else {
log local0. "foo2"
pool foo2
}
return
}
if { $cdata starts_with "DATA" } {
log local0. "get data $cdata"
TCP::payload replace 0 0 $chelo$cfrom$crcpt
}
log local0. "payload [TCP::payload]"
TCP::release
TCP::collect
}
when SERVER_CONNECTED {
log "server connected"
TCP::collect
}
when SERVER_DATA {
set sdata [TCP::payload]
if { $sdata starts_with "220" } {
log local0. "get data $sdata"
TCP::payload replace 0 [string length $sdata] ""
return
}
if { $sdata contains "\r\n354 " } {
log local0. "get data $sdata"
TCP::payload replace 0 [string length $sdata] "354\r\n"
}
if { [ string length $sdata ] <= 0 } {
return
}
log local0. "payload [TCP::payload]"
TCP::release
TCP::collect
}
when CLIENT_CLOSED {
log local0. "client closed"
}
}
[root@ve1023:Active] config b pool foo1 list
bpool foo1 {
members 200.200.200.101:25 {}
}
[root@ve1023:Active] config b pool foo2 list
pool foo2 {
members 200.200.200.102:25 {}
}
[root@ve1023:Active] config tail -f /var/log/ltm
Jan 13 04:07:34 local/tmm info tmm[26866]: Rule myrule CLIENT_ACCEPTED: client accepted
Jan 13 04:07:39 local/tmm info tmm[26866]: Rule myrule CLIENT_DATA: get helo HELO me
Jan 13 04:08:08 local/tmm info tmm[26866]: Rule myrule CLIENT_DATA: get from MAIL FROM:goldenretriever@f5.com
Jan 13 04:08:19 local/tmm info tmm[26866]: Rule myrule CLIENT_DATA: get rcpt RCPT TO:superman@abc.com
Jan 13 04:08:19 local/tmm info tmm[26866]: Rule myrule CLIENT_DATA: get rcpt domain abc.com
Jan 13 04:08:19 local/tmm info tmm[26866]: Rule myrule CLIENT_DATA: foo1
[root@ve1023:Active] config tail -f /var/log/ltm
Jan 13 04:09:27 local/tmm info tmm[26866]: Rule myrule CLIENT_ACCEPTED: client accepted
Jan 13 04:09:29 local/tmm info tmm[26866]: Rule myrule CLIENT_DATA: get helo HELO me
Jan 13 04:09:37 local/tmm info tmm[26866]: Rule myrule CLIENT_DATA: get from MAIL FROM:goldenretriever@f5.com
Jan 13 04:09:48 local/tmm info tmm[26866]: Rule myrule CLIENT_DATA: get rcpt RCPT TO:santa@xyz.com
Jan 13 04:09:48 local/tmm info tmm[26866]: Rule myrule CLIENT_DATA: get rcpt domain xyz.com
Jan 13 04:09:48 local/tmm info tmm[26866]: Rule myrule CLIENT_DATA: foo2