///How To Send Email With Perl, Part II

How To Send Email With Perl, Part II

How To Send Email With Perl, Part II

Part I contained an introduction and a working Perl script for sending email. Part II assumes you understand the basic concepts presented in Part I.

The script accompanying this part of the tutorial can send text or HTML email, form user’s choice or your choice. It can be used as an auto-responder and can send personalized emails. (Something to consider before sending HTML email is that some email programs can’t display HTML formatted pages.)

The script is too large to be embedded within this article. I’ll be referring to it throughout. You can download it at http://willmaster.com/possibilities/demo/mailseries/part2.shtml

Please download the script before continuing. Without the script to refer to, the rest of this article can be confusing.

Unlike the basic script of Part I, this script uses Perl module “strict” to enforce certain variable naming conventions, which is good programming practice, and to be usable on servers that run mod_perl. (mod_perl is an Apache server module that speeds up Perl programs by a considerable amount. Apache software is used by virtually all Unix/Linux servers.)


First, the script checks whether or not an email address was specified as part of the script’s URL, in the manner presented in Part I. If yes, the script stores the email address where it can be referred to and used a bit later.

Then, in this order, the program:

1. Checks for and stores the values of any form fields

that might have been submitted to it.

2. Checks if any required form fields have been left

blank and whether or not the submitted address is

a valid email address, and displays error messages

as appropriate.

3. Sends the email, either plain text or HTML.

4. Displays the thankyou page in the user’s browser.

Now, some details about each of the above four steps.

1. Form Field Values

The subroutine ParseValues is where the program checks for and stores the values of form fields. It stores the values in the %In hash variable, the key being the form field name and the value being the form field value.

If a form is used to submit information to the program, the method can be either POST or GET.

A form is not required for this program. An email address can be submitted in the manner of the script in Part I.

2. Checking For Required Fields

If a form is used to submit information to the script, it can have a hidden field name=”required” with a value containing the field name(s) that are required to have information before the form can successfully be submitted. If more than one form field name is required, separate them with a comma. Example:

<input type=”hidden” name=”required”

value=”firstname, email”>

The subroutine CheckRequired ensures that all required form fields contain information. The subroutine also uses another subroutine, ValidEmail, to verify that the email address stored in $In{email} is a validly formatted address. If appropriate, subroutine CheckRequired presents an error message to the user.

Subroutine WebPageErrorMessage is where error message web pages are sent to the user’s browser. You’ll notice that the last line of the subroutine is

goto BOTTOM;

That lines tells the script to jump to the label named “BOTTOM” located near the bottom of the script. (The label could be named anything you please. By convention, it is all capital letters. I chose “BOTTOM” simply because it is descriptive of where the label is located.)

The goto label method is used instead of the exit() function so the script can run within mod_perl.

3. Sending the Email

The email is sent within subroutine SendEmail. It has a number of useful features, each addressed below.

Email can be sent whether or not a form is used to submit information to the script. For reference, a complete example auto-responder’s web page form is near the end of this article.

Email Address —

If you use a form to submit information to the script, there must be a form field name=”email” that will contain the email address where the email will be sent to. Example:

Email: <input type=”text” name=”email”>

Type of Email —

As previously stated, the script can send plain text or HTML email.

If a form is used to submit information to the script, you can specify plain text or HTML email with a hidden, radio, or checkbox name=”html” field. To specify HTML, the value is “yes”. Otherwise, “no”. Here is an example of each:

Hidden (to specify HTML):

<input type=”hidden” name=”html” value=”yes”>

Hidden (to specify plain text):

<input type=”hidden” name=”html” value=”no”>


<input type=”checkbox” name=”html” value=”yes”>

Check for HTML email

Radio buttons:

<input type=”radio” name=”html” value=”yes”>HTML

<input type=”radio” name=”html” value=”no”>plain text

If no name=”html” form field is present, plain text email is assumed.

Personalization —

If you use a form to submit information to the script, the information typed into the form fields can be used to personalize the outgoing email.

When you specify the text of the outgoing email (see below), use the form field name enclosed between double square brackets to mark the place where that form field’s contents shall be inserted. Here is an example of such a placeholder:


The above placeholder will be replaced with the information typed into a form field name=”firstname”, like:

First Name: <input type=”text” name=”firstname”>

If no information exists to replace a placeholder with, the placeholder will be removed before the email is sent.

Specifying and Formatting the Plain Text Email —

Put the plain text email between the lines containing the characters: THE_PLAIN_EMAIL

You’ll notice that the plain text email is formatted almost exactly the same as the email in the script presented in Part I of this tutorial. The differences are that the placeholder [[email]] is used in the “To:” header line and that additional placeholders may be used in the email body content.

A placeholder may be used more than once in the same email.

Specifying and Formatting the HTML Email —

Put the HTML email between the lines containing the characters: THE_HTML_EMAIL

Like the plain text email, the “To:” header line uses the [[email]] placeholder.

You’ll notice two additional header lines for HTML email:

Mime-Version: 1.0

Content-type: text/html; charset=”iso-8859-1″

The email program that displays the email for the recipient uses those lines to determine the type of email. If the email program is capable of displaying HTML email, it will do so.

The body content of the HTML email begins and ends with HEAD and BODY tags, just like a regular web page. In between, you can format the text as you please. You may use image tags. You can create a form. In fact, you can do anything you would with a regular web page, with two considerations:

~~ All URLs in the body content must be complete

http://… URLs.

~~ Some email programs are limited in the HTML tags

they recognize, which can cause the page to be

displayed differently than you had intended. If this

consideration is important to you, you may wish to

use only basic paragraph, header, and font tags

to format your HTML email.

Like the plain text email, HTML email may have placeholders where specific form field information is to be inserted. A placeholder may be used more than once in the same email.

4. The ThankYou Page

Once the email is sent, a “thank you” page is presented to the user.

If a form is used to submit information to the script, you can specify the thank you page with a hidden field name=”thankyoupage” and the URL of the thank you page as the value. Example:

<input type=”hidden” name=”thankyoupage”


If no thank you page URL is specified, a generic thank you page is presented to the user.

Those were the four main subroutines the script uses to process and respond to the information it receives.

An Example Auto-responder’s Web Page Form

<form method=”POST” action=”/cgi-bin/part2.cgi”>

<input type=”hidden” name=”thankyoupage”


<input type=”hidden” name=”required”

value=”firstname, email”>

First Name:

<input type=”text” name=”firstname”>



<input type=”text” name=”email”>


<input type=”radio” name=”html” value=”yes”>HTML

<input type=”radio” name=”html” value=”no”>plain text


<input type=”submit”>


Still To Come

Still to come in this tutorial:

~~ Obtaining the email content from a file instead of

embedded in the script. (You’ll be able to change

the emails without modifying the script.)

~~ The ability to send both text and HTML formatting

in the same email, so those with HTML email readers

see the HTML content and those with plain text

readers see the plain text content.

~~ The ability to send email with one or more


~~ The ability receive and process email sent to an

email address like subscribe@domain.com

Watch for additional installments.

2010-05-26T17:02:04+00:00 June 9th, 2004|CGI and Perl|0 Comments

About the Author:

Leave A Comment