Forum Discussion
for Send Email via iRule Procedures .
I used https://devcentral.f5.com/wiki/iRules.Send-Email-via-iRule-Procedures.ashx . But getting error Some fields below contain errors. Correct them before continuing. while applying irule to the VIP
- cjuniorNacreous
Hello,
I think there is a bit of interpretation missing from this iRule content, and you should be going through a method overload problem.See this line:
call thisiRule::sendEmail $errorSubject $errorBody
"thisiRule" means the iRule name what you are creating.
and in this other line:
catch {call procLibrary::sendEmail $subject $body "email1@myorg.org email2@myorg.org"}
Indicates that the overload method sendEmail, has to be in another irule e.g. "procLibrary"
So, try creating the methods in different libraries (iRules), e.g.:
"thisiRule" content:
this Irule sends an email to the F5 admin via the mailserver.myorg.org mailserver. This iRule calls the procedure in the procLibrary iRule. when HTTP_RESPONSE { set error 0 if {$error} { set errorSubject "F5 Email Notification." set errorBody "There was an event that happened. Check your F5 local log!" call thisiRule::sendEmail $errorSubject $errorBody } else { Do something cool } } proc sendEmail {sourceSubject sourceBody} { set currentTime [clock format [clock seconds] -format {%H:%M:%S}] set todaysDate [clock format [clock seconds] -format {%m-%d:%Y}] set subject ${sourceSubject} set body "${sourceBody}\r\n\r\n ${currentTime}hrs on ${todaysDate}.\r\n\r\n This is an automated email sent via the this iRule iRule.\r\n\r\nSincerely,\r\nYour F5 Support Team" log local0. $body catch {call procLibrary::sendEmail $subject $body "email1@myorg.org email2@myorg.org"} }
"procLibrary" irule content:
This procedure library procLibrary sends an email using a sideband connection to your organizations email server. It has 3 input parameters; subject, body and additional email addresses. The calling procedure needs to seperate the additional emails with a " ". Example "email1@myorg.org email2@myorg.org". proc sendEmail {sourceSubject sourceEmailBody sourceAddEmailAddress} { upvar 1 $sourceSubject n1 upvar 1 $sourceEmailBody n2 upvar 1 $sourceAddEmailAddress n3 set email_debug 0 set hostName [info hostname] set mailFrom "root@$hostname" set mailTo "admin@myorg.org" set mailServer "xxx.xxx.xxx.xxx:25" set subject $sourceSubject set emailBody $sourceEmailBody set addEmailAddress "" if {$sourceAddEmailAddress ne ""} { append sourceAddEmailAddress "${mailTo}" foreach emailAddress $sourceAddEmailAddress { set emailConn [connect -timeout 2000 -idle 10 -status conn_status $mailServer] if {$email_debug} {log local0. "connect_status: $conn_status"} set emailData "HELO mailserver.myorg.org\r\nMAIL FROM: $mailFrom\r\nRCPT To: ${emailAddress}\r\nDATA\r\nSUBJECT: \r\n\r\n\r\n$emailBody\r\n.\r\n" set send_info [send -timeout 2000 -status send_status $emailConn $emailData] if {$email_debug} {log local0. "emailData: $emailData"} if {$email_debug} {log local0. "send_status: $send_status"} set recv_data [recv -timeout 2000 -status recv_status $emailConn] if {$email_debug} {log local0. "recv_Data: $recv_data"} close $emailConn if {$email_debug} {log local0. "EmailTo: $emailAddress"} } } else { if {$email_debug} {log local0. "connect_status: $conn_status"} set emailData "HELO mailserver.myorg.org\r\nMAIL FROM: $mailFrom\r\nRCPT To: ${emailAddress}\r\nDATA\r\nSUBJECT: \r\n\r\n\r\n$emailBody\r\n.\r\n" set send_info [send -timeout 2000 -status send_status $emailConn $emailData] if {$email_debug} {log local0. "emailData: $emailData"} if {$email_debug} {log local0. "send_status: $send_status"} set recv_data [recv -timeout 2000 -status recv_status $emailConn] if {$email_debug} {log local0. "recv_Data: $recv_data"} close $emailConn } }
Particulary, I prefer to rewrite all this content to one iRule, if use it to simple thing.
I hope it helps you.- jomedusaAltostratus
I am trying to do something similar and have created 2 irules, I can see log entries that the "event" is occuring, but I never see that the second irule is called. I am going to attempt to combine into a single one. Has anyone had success using the above?
- cjuniorNacreous
Hello,
I'm not sure issues you are facing, so did you write the rule library name in front of procedure on the call statement?
e.g.
call procLibrary::sendEmail
Please, check if this short example makes more sense to you:
# Some virtual server ltm virtual vs_devcentral { destination 172.30.30.101:http ip-protocol tcp mask 255.255.255.255 profiles { http { } tcp { } } rules { irule_devcentral } source 0.0.0.0/0 } # iRule with events ltm rule irule_devcentral { when HTTP_REQUEST { log local0. "This is from irule_devcentral" call irule_lib_dc::externalProcedure() } } # Library with procedures ltm rule irule_lib_dc { proc externalProcedure() { log local0. "This is from externalProcedure() into irule_lib_dc" HTTP::respond 200 content "<html><head></head><body>Voila!</body></html>" Connection close } }
The test:
[root@bigipdelta:Active:Standalone] tmp # curl -v http://172.30.30.101 * Rebuilt URL to: http://172.30.30.101/ * Trying 172.30.30.101... * Connected to 172.30.30.101 (172.30.30.101) port 80 (#0) > GET / HTTP/1.1 > Host: 172.30.30.101 > User-Agent: curl/7.47.1 > Accept: */* > * HTTP 1.0, assume close after body < HTTP/1.0 200 OK < Server: BigIP < Connection: close < Content-Length: 45 < * Closing connection 0 <html><head></head><body>Voila!</body></html>
Log:
[root@bigipdelta:Active:Standalone] tmp # tail /var/log/ltm Jan 15 14:38:13 bigipdelta info tmm[11153]: Rule /Common/irule_devcentral <HTTP_REQUEST>: This is from irule_devcentral Jan 15 14:38:13 bigipdelta info tmm[11153]: Rule /Common/irule_devcentral <HTTP_REQUEST>: This is from externalProcedure() into irule_lib_dc
Regards.
- IbbyVKNimbostratus
I am trying to make the simplest imaginable iRule that sends an email when a VIP gets hit. I do not want to use multiple iRules. How do I write one like that?
Recent Discussions
Related Content
* Getting Started on DevCentral
* Community Guidelines
* Community Terms of Use / EULA
* Community Ranking Explained
* Community Resources
* Contact the DevCentral Team
* Update MFA on account.f5.com