| If you wish to only allow e-mail addresses at the domain
names in @referers to receive form results, you probably do not need to change
this variable. However, if you get any 'Error: Bad/No Recipient' messages when
running FormMail, you may have to revisit @recipients and make sure you have
correctly listed all domains or configured this variable.
@recipients is the most important variable you need to configure. It is an
array of regular expressions defining all valid recipients that can be
specified. In order for an e-mail to be sent to the recipient defined in a form,
the recipient e-mail address must match one of the elements in the @recipients
array.
SIMPLE SETUP:
For the most simple setup, place any domain name that you wish to send form
results to in the @referers array. Warning: This allows those domains to also
access your FormMail script and utilize it to process their own forms, but
likely this is what you intended anyway. If so, you can leave: @recipients = &fill_recipients(@referers); NO, THAT IS NOT WHAT I
INTENDED!
Another alternative, then, is to set @recipients equal to the return value of
the fill-recipients function and pass this function all of the domains to which
e-mail may be addressed: @recipients = &fill_recipients('domain.com',
'sub.domain.com','another.com');You are now
allowing e-mail to any username (provided it contains only A-Z, a-z, 0-9, _, -
or .) at those three domains.
Similarly, since @recipients is just an array, you could even do: @recipients = (&fill_recipients('domain.com','sub.domain.com'),
'^otheruser1@otherhost\.com',
'^otheruser2@otherhost\.com');This would allow any
recipient at domain.com and sub.domain.com similar to the previous example, but
would also allow your friends otheruser1 and otheruser2 on otherhost.com to use
your FormMail! Of course, you will need to add otherhost.com into your @referers
array if a form is on their host!
HOW DOES THAT WORK?
When the fill_recipients function is called on an array of domain names, it
turns them into regular expressions. These regular expressions will only allow
e-mail messages to go to a recipient with an e-mail address in the following
format:
[A-Za-z0-9_-\.]+@domain.com
where domain.com is specified in @referers. For any IP addresses in
@referers, the following address formats are valid:
[A-Za-z0-9_-\.]+@[192.168.1.1]
where 192.168.1.1 is the specified IP address in @referers.
What this means in english is that the only valid addresses are those to
usernames that include only letters, numbers, underscores, dashes or periods and
an exact domain name or IP address that was specified in the @referers array.
Depending on your needs, this may be too broad or not broad enough.
WHAT IF YOU NEED MORE FLEXIBILITY??
The way FormMail validates a recipient address is to check the supplied
recipient(s) in the submitted form against each element in the array @recipients
(which is a list of Perl regular expressions). If any valid recipients are
found, they will receive a copy of the message.
Using the examples of @referers = ('domain.com','192.168.1.1'); and the
default usage of setting @recipients = &fill_recipients(@referers), the
contents of @recipients are now the same as if you had written: @recipients = ('^[\w\-\.]+\@domain\.com',
'^[\w\-\.]+\@\[192\.168\.1\.1\]');What these regular
expressions instruct FormMail to do is require that any e-mail address passed in
as a recipient of the form submission match at least one of those two formats.
The following are examples of valid and invalid recipients for this exact setup:
VALID: user@domain.com, First.Last@domain.com,
Last-First@domain.com, user_name@domain.com,
user023@domain.com, user@[192.168.1.1],
First.Last@[192.168.1.1], user023@[192.168.1.1],
Last-First@[192.168.1.1], user_name@[192.168.1.1], etc. INVALID: (using
these in your form field 'recipient' will trigger error) user%name@domain.com, user(name)@domain.com,
first:last@domain.com ,
domain.com, user@192.168.1.1,
user@newdomain.com, user@sub.domain.com,
user@domainname.com Essentially, it only allows A-Z, a-z, 0-9, _, - and .
in the local address area (before the @, represented as [\w\-\.]+ in regular
expression speak) and requires the domain name to match exactly. When mailing to
an IP address, it must be enclosed in [].
BUT I NEED TO MATCH MORE CHARACTERS IN THE USERNAME!
Let's say you need to be able to deliver e-mail to an address like:
last:first@domain.com
This requires that the ':' character now be allowed into the portion of the
recipient field before the domain name. You could then modify @recipients to
read: @recipients = ('^[\w\-\.\:]+\@domain\.com');BUT BE CAREFUL!!!!
Allowing certain characters could be VERY dangerous, especially if the
characters are: %, <, >, (, ) or any newlines. You can read: http://web.nps.navy.mil/~miller/percent-hack.html for
information on exactly why the % character could be dangerous. And the document
that prompted 1.91 explains why some of the others could lead to problems: http://www.monkeys.com/anti-spam/formmail-advisory.pdf
I ONLY WANT CERTAIN ADDRESSES TO WORK!
Let's say you only want yourself@yourdomain.com to be able to receive any
form submissions. You should then set the @recipients array to: @recipients = ('^yourself\@yourdomain\.com');Now the only valid
recipient is that one e-mail address.
If there are several, simply do: @recipients = ('^user1\@yourdomain\.com',
'^user2\@their\.domain\.com');CAN I USE SOMETHING EASIER?
Prior versions of FormMail recommended settings for @recipients like:
@recipients = ('domain.com','192.168.1.1'); OR
@recipients = ('^joe@somewhereelse.com');The first is bad because it can
be easily tricked by submitting a recipient such as
spamvictim%elsewhere.com@domain.com. The second is MUCH better, but since it is
used as a regular expression, and '.' can mean ANY character, a hacker could use
joe@somewhereelseXcom to get past a valid recipient check. This is not a very
big deal in most cases.
WHAT IS THIS ^ CHARACTER AND WHY SO MANY \'s??
In regular expressions, the ^ means "beginning of string". By default,
FormMail places a $ at the end of the match, which means "end of string". By
using both ^ and $ in regular expression matching, FormMail can match a string
exactly. You only need to worry about including the ^, which is STRONGLY
recommended for all regular expressions in the array.
The \ character is used to escape a character that otherwise means something
special in regular expressions. For instance, you now see every '.' being
escaped with a '\', as '.' means ANY CHARACTER, whereas '\.' requires that it
match ONLY a period.
If you need a regular expression matching solution even more specific than
the above examples explain, I recommend picking up a book on
Perl. |