<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://rt-wiki.bestpractical.com/index.php?action=history&amp;feed=atom&amp;title=ValidateEmail</id>
	<title>ValidateEmail - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://rt-wiki.bestpractical.com/index.php?action=history&amp;feed=atom&amp;title=ValidateEmail"/>
	<link rel="alternate" type="text/html" href="https://rt-wiki.bestpractical.com/index.php?title=ValidateEmail&amp;action=history"/>
	<updated>2026-08-22T13:09:47Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>https://rt-wiki.bestpractical.com/index.php?title=ValidateEmail&amp;diff=4147&amp;oldid=prev</id>
		<title>Admin: 2 revisions imported</title>
		<link rel="alternate" type="text/html" href="https://rt-wiki.bestpractical.com/index.php?title=ValidateEmail&amp;diff=4147&amp;oldid=prev"/>
		<updated>2016-04-06T20:39:40Z</updated>

		<summary type="html">&lt;p&gt;2 revisions imported&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;This patch applies to 3.6.3, but should work on other versions without much (if any) modification.&lt;br /&gt;
&lt;br /&gt;
== Problem ==&lt;br /&gt;
&lt;br /&gt;
Users mistype addresses in the [[Requestor]], [[CC]], and [[AdminCC]] address fields, causing the notifications to fail and preventing that person from seeing the ticket.&lt;br /&gt;
&lt;br /&gt;
As far as I could tell, RT does not validate addresses typed into those fields, and offers no hooks for administrators to create their own validation.&lt;br /&gt;
&lt;br /&gt;
== Solution ==&lt;br /&gt;
&lt;br /&gt;
I created a Mason component to perform the email validation, the same way custom fields are validated. First, emails without &amp;#039;@&amp;#039; signs are invalid in my environment, so I reject them. Second, I connect to the local SMTP server and submit the email address as a recipient. If the recipient is accepted, then I consider it a valid address. (No actual message is sent during the validation.)&lt;br /&gt;
&lt;br /&gt;
== Details ==&lt;br /&gt;
&lt;br /&gt;
First, create /opt/rt3/local/html/Elements/[[ValidateEmails]]. You should customize the first part of this file, where the SMTP server is specified.&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;%INIT&amp;amp;gt;&lt;br /&gt;
 sub check_address&lt;br /&gt;
 {&lt;br /&gt;
         my $address = shift;&lt;br /&gt;
 &lt;br /&gt;
         my $REQUIRE_AT_SIGN = 1;&lt;br /&gt;
         my $SMTP_HOST = &amp;#039;smtp.messiah.edu&amp;#039;;&lt;br /&gt;
         my $SMTP_FROM = &amp;#039;nobody@messiah.edu&amp;#039;;&lt;br /&gt;
 &lt;br /&gt;
         return 0 if ($REQUIRE_AT_SIGN &amp;amp;amp;&amp;amp;amp; $address !~ /\@/);&lt;br /&gt;
 &lt;br /&gt;
         # check address against specified SMTP server&lt;br /&gt;
         use Net::SMTP;&lt;br /&gt;
         my $smtp = Net::SMTP-&amp;amp;gt;new($SMTP_HOST);&lt;br /&gt;
 &lt;br /&gt;
         $smtp-&amp;amp;gt;mail($SMTP_FROM);&lt;br /&gt;
         my $valid = $smtp-&amp;amp;gt;to($address);&lt;br /&gt;
         $smtp-&amp;amp;gt;quit;&lt;br /&gt;
         return $valid;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 my $valid = 1;&lt;br /&gt;
 foreach my $field (@{$EmailFields})&lt;br /&gt;
 {&lt;br /&gt;
         my $value = $ARGSRef-&amp;amp;gt;{$field};&lt;br /&gt;
         foreach my $address (split /,/, $value)&lt;br /&gt;
         {&lt;br /&gt;
                 # trim whitespace&lt;br /&gt;
                 $address =~ s/^\s+//;&lt;br /&gt;
                 $address =~ s/\s+$//;&lt;br /&gt;
 &lt;br /&gt;
                 next if $address eq &amp;quot;&amp;quot;;&lt;br /&gt;
                 unless (check_address($address))&lt;br /&gt;
                 {&lt;br /&gt;
                         $valid = 0;&lt;br /&gt;
                         $m-&amp;amp;gt;notes(&amp;quot;InvalidField-$field&amp;quot;&lt;br /&gt;
                                 =&amp;amp;gt; &amp;quot;Bad address ($address)&amp;quot;);&lt;br /&gt;
                 }&lt;br /&gt;
         }&lt;br /&gt;
 }&lt;br /&gt;
 $m-&amp;amp;gt;notes(&amp;#039;ValidEmails&amp;#039;, $valid);&lt;br /&gt;
 return $valid;&lt;br /&gt;
 &amp;amp;lt;/%INIT&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;%ARGS&amp;amp;gt;&lt;br /&gt;
 $EmailFields =&amp;amp;gt; [ &amp;quot;Requestors&amp;quot;, &amp;quot;Cc&amp;quot;, &amp;quot;AdminCc&amp;quot; ]&lt;br /&gt;
 $ARGSRef&lt;br /&gt;
 &amp;amp;lt;/%ARGS&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Next, to configure the Create Ticket page to require validation, copy /opt/rt3/share/html/Ticket/Create.html to /opt/rt3/local/html/Ticket/Create.html and make the following modifications:&lt;br /&gt;
&lt;br /&gt;
 --- Create.html.orig    2007-02-20 10:19:32.000000000 -0500&lt;br /&gt;
 +++ Create.html 2007-02-20 10:32:04.000000000 -0500&lt;br /&gt;
 @@ -250,6 +250,10 @@&lt;br /&gt;
      CustomFields =&amp;amp;gt; $CFs,&lt;br /&gt;
      ARGSRef =&amp;amp;gt; \%ARGS&lt;br /&gt;
  );&lt;br /&gt;
 +my $ValidEmails = $m-&amp;amp;gt;comp(&lt;br /&gt;
 +    &amp;#039;/Elements/ValidateEmails&amp;#039;,&lt;br /&gt;
 +    ARGSRef =&amp;amp;gt; \%ARGS&lt;br /&gt;
 +);&lt;br /&gt;
 &lt;br /&gt;
  # if no due date has been set explicitly, then use the&lt;br /&gt;
  # queue&amp;#039;s default if it exists&lt;br /&gt;
 @@ -297,7 +301,7 @@&lt;br /&gt;
  # }}}&lt;br /&gt;
 &lt;br /&gt;
  if ((!exists $ARGS{&amp;#039;AddMoreAttach&amp;#039;}) and ($ARGS{&amp;#039;id&amp;#039;} eq &amp;#039;new&amp;#039;)) { # new ticket?&lt;br /&gt;
 -    if ($ValidCFs) {&lt;br /&gt;
 +    if ($ValidCFs and $ValidEmails) {&lt;br /&gt;
          $m-&amp;amp;gt;comp(&amp;#039;Display.html&amp;#039;, %ARGS);&lt;br /&gt;
          $RT::Logger-&amp;amp;gt;crit(&amp;quot;After display call; error is $@&amp;quot;);&lt;br /&gt;
          $m-&amp;amp;gt;abort();&lt;br /&gt;
 @@ -308,6 +312,11 @@&lt;br /&gt;
              my $msg = $m-&amp;amp;gt;notes(&amp;#039;InvalidField-&amp;#039; . $CF-&amp;amp;gt;Id) or next;&lt;br /&gt;
              push @results, $CF-&amp;amp;gt;Name . &amp;#039;: &amp;#039; . $msg;&lt;br /&gt;
          }&lt;br /&gt;
 +       foreach my $field (&amp;quot;Requestors&amp;quot;, &amp;quot;Cc&amp;quot;, &amp;quot;AdminCc&amp;quot;)&lt;br /&gt;
 +       {&lt;br /&gt;
 +           my $msg = $m-&amp;amp;gt;notes(&amp;quot;InvalidField-$field&amp;quot;) or next;&lt;br /&gt;
 +           push @results, $field . &amp;quot;: &amp;quot; . $msg;&lt;br /&gt;
 +       }&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Finally, restart Apache and try it out. The Create Ticket page should now reject any email addresses that your SMTP server would reject.&lt;br /&gt;
&lt;br /&gt;
TODO - there are other places where email addresses can be entered. They should be validated too.&lt;br /&gt;
&lt;br /&gt;
Email me at [mailto:jlong@messiah.edu jlong@messiah.edu] if you have questions or comments on this page.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
</feed>