Jump to content

Recommended Posts

Hi all, I am a total beginner at pretty much everything to do with Web development, but sadly especially beginner at PHP. I'm keen to learn though (even it if takes me a while to understand!).

 

I am trying to add a simple form to a webpage that allows a visitor to fill in their name, then their email address plus a couple of other fields and click on a "submit" button. This will then send a basic email with the users information to a set email address.

 

I've downloaded and installed "Formmail.php" into my website, I've created some inputs in the HTML, the HTML loads fine, I can see the form fields, but for the love of all things holy when I click "submit" I cannot get it to send email out.

 

I am totally ignorant at how PHP (or any other scripting language) works, and especially ignorant at how Formmail.php works. I cannot figure out where it is asking for any SMTP server to use to send email (is it even using one?), or how it is is sending email? I realise the error I'm getting is something to do with authentication, but can't see how to get it to authenticate properly? I have an SMTP server I can use (if needed), with authentication credentials ready - but as said above, ignorance of how this is supposed to work is playing a big part with my failures here.

 

The specific error I get when clicking on the "submit" button is this:

 

  Warning: mail() [function.mail]: SMTP server response: 530 SMTP authentication is required. in D:\Websites\synergytraining.co.uk\formmail.php on line 224

    There was an unknown error while sending email.

    « go back

 

So I guess it cannot authenticate with the email address I want to send to? I'm unsure as to how to do this though. I have tried changing some of the User Config setting below to no avail - I'd really appreciate some kind soul to help me please.

 

Current Formmail.php code I have installed is below.

 

Kind regards in advance.

 

 

 

<?php
/**
* PHP version 5
*/
# Copyright (c) 2002 Eli Sand

# PHP FormMail v2.0 20030305

# Initialize variables
$auth = NULL;
$deny = NULL;
$must = NULL;
$post = NULL;
$http = NULL;
$form = NULL;
$list = NULL;

# Fix for magic quotes when enabled
if (get_magic_quotes_gpc()) {
    foreach ($_POST as $key => $value) {
        $_POST["$key"] = stripslashes($value);
    }
}

# Detect any Windows operating system
if (strstr(php_uname(), 'Windows')) {
    $IS_WINDOWS = TRUE;
}

# USER CONFIGURABLE SETTINGS

# Authorized email address masks that can be used as the recipient
$auth = "*@127.0.0.1, *@localhost, *@".str_replace('www.','',$_SERVER['SERVER_NAME']);

# Email address masks that will be rejected if in the email field
# $deny = "nobody@*, anonymous@*, postmaster@*";

# DO NOT EDIT ANYTHING PAST THIS POINT
# Functions

# Trim leading and trailing white space from array values
function array_trim(&$value, $key) {
    $value = trim($value);
}

# Show an error message to the user
function error_msg($error, $required = FALSE) {
    global $post;

    if (!empty($post['missing_fields_redirect']) && $required) {
        header('Location: ' . $post['missing_fields_redirect']);
    }
    elseif (!empty($post['error_redirect'])) {
        header('Location: ' . $post['error_redirect']);
    }
    else {
        echo "<html>\r\n";
        echo "\t<head>\r\n";
        echo "\t\t<title>Form Error</title>\r\n";
        echo "\t\t<style type=\"text/css\">* {font-family: \"Verdana\", \"Arial\", \"Helvetica\", monospace;}</style>\r\n";
        echo "\t</head>\r\n";
        echo "\t<body>\r\n";
        echo "\t\t<p>${error}</p>\r\n\t\t<p><small>« <a href=\"javascript: history.back();\">go back</a></small></p>\r\n";
        echo "\t</body>\r\n";
        echo "</html>\r\n";
    }

    exit();
}

# Basic pattern matching on an entire array
function pattern_grep($input, $array) {
    foreach ($array as $value) {
        $value = addcslashes($value, '^.[]$()|{}\\');
        $value = str_replace('*', '.*', $value);
        $value = str_replace('?', '.?', $value);
        $value = str_replace('+', '.+', $value);

        if (eregi('^' . $value . '$', $input)) {
            return TRUE;
        }
    }

    return FALSE;
}

# Main
# Check to make sure the info was posted
if ($_SERVER['REQUEST_METHOD'] == 'POST') {

    $post = array(
        'recipient'            => $_POST['recipient'],
        'email'                => $_POST['email'],
        'subject'            => $_POST['subject'],
        'realname'            => $_POST['realname'],
        'required'            => $_POST['required'],
        'env_report'            => $_POST['env_report'],
        'sort'                => $_POST['sort'],
        'redirect'            => $_POST['redirect'],
        'error_redirect'        => $_POST['error_redirect'],
        'missing_fields_redirect'    => $_POST['missing_fields_redirect']
    );

    $http = array(
        'REMOTE_USER'            => $_SERVER['REMOTE_USER'],
        'REMOTE_ADDR'            => $_SERVER['REMOTE_ADDR'],
        'HTTP_USER_AGENT'        => $_SERVER['HTTP_USER_AGENT']
    );

    if (isset($must['required'])) {
        $post['required']            = $must['required'] . ',' . $_POST['required'];
    }
    if (isset($must['env_report'])) {
        $post['env_report']            = $must['env_report'] . ',' . $_POST['env_report'];
    }
    if (isset($must['redirect'])) {
        $post['redirect']            = $must['redirect'];
    }
    if (isset($must['error_redirect'])) {
        $post['error_redirect']            = $must['error_redirect'];
    }
    if (isset($must['missing_fields_redirect'])) {
        $post['missing_fields_redirect']    = $must['missing_fields_redirect'];
    }

    if (($auth = explode(',', $auth))) {
        array_walk($auth, 'array_trim');
    }
    if (($deny = explode(',', $deny))) {
        array_walk($deny, 'array_trim');
    }

    if ($_POST['security_code'] != $_SESSION['security_code']) {
        error_msg("Invalid security code.");
    }
    else {
        unset($_POST['security_code']);
        unset($_SESSION['security_code']);
    }

    # Check for missing required fields
    if ((!empty($post['required'])) && ($list = explode(',', $post['required']))) {
        $list[] = 'recipient';
        $list[] = 'email';

        array_walk($list, 'array_trim');

        foreach ($list as $value) {
            if (!empty($value) && empty($_POST["$value"])) {
                error_msg("You have left a required field blank.", TRUE);
            }
        }
    }

    # Check the email addresses submitted
    if (pattern_grep($post['email'], $deny)) {
        error_msg("You have specified a banned email address.");
    }
    if (!eregi('^([a-zA-Z0-9\.\_\-]+)\@((([a-zA-Z0-9\-]+)\.)+([a-zA-Z]+))$', $post['email'])) {
        error_msg("You have specified an invalid email address.");
    }

    # Check if the recipients email address is authorized
    if ((!empty($post['recipient'])) && ($list = explode(',', $post['recipient']))) {
        array_walk($list, 'array_trim');

        foreach ($list as $value) {
            if (!eregi('^([a-zA-Z0-9\.\_\-]+)\@((([a-zA-Z0-9\-]+)\.)+([a-zA-Z]+))$', $value)) {
                error_msg("The recipients email address is invalid.");
            }
            if (!pattern_grep($value, $auth)) {
                error_msg("The recipients email address is unauthorized.");
            }
        }
    }
    else {
        error_msg("There was an unknown error while checking the recipients email address.");
    }

    # Sort the fields
    if ((!empty($post['sort'])) && ($list = explode(',', $post['sort']))) {
        array_walk($list, 'array_trim');

        foreach ($list as $value) {
            $form["$value"] = $_POST["$value"];
        }
    }
    else {
        $form = $_POST;
    }

    # Create the message
    $subject = empty($post['subject']) ? "Web Reply" : $post['subject'];

    foreach ($form as $key => $value) {
        if (!array_key_exists($key, $post)) {
            $message .= "${key}: ${value}\r\n\r\n";
        }
    }

    $message .= "Submitted by: <" . $post['email'] . "> on " . date('l, F jS, Y @ g:i:s a (O)') . "\r\n";

    if (!empty($post['env_report'])) {
        if (($list = explode(',', $post['env_report']))) {
            $message .= "Sender Details:\r\n";

            array_walk($list, 'array_trim');

            foreach ($list as $value) {
                if (array_key_exists($value, $http)) {
                    $message .= "\t${value}: " . $http["$value"] . "\r\n";
                }
            }
        }
    }

    # Send out the email
    if (mail($post['recipient'], $subject, $message, "From: " . $post['email'] . "\r\nReply-To: " . $post['email'] . "\r\nX-Mailer: PHP FormMail")) {

        if (!empty($post['redirect'])) {
            header('Location: ' . $post['redirect']);
        }
        else {
            echo "<html>\r\n";
            echo "\t<head>\r\n";
            echo "\t\t<title>Thank you</title>\r\n";
            echo "\t\t<style type=\"text/css\">* {font-family: \"Verdana\", \"Arial\", \"Helvetica\", monospace;}</style>\r\n";
            echo "\t</head>\r\n";
            echo "\t<body>\r\n";
            echo "\t\t<p>Thank you for filling out the form.</p>\r\n\t\t<p><small>« <a href=\"javascript: history.back();\">go back</a></small></p>\r\n";
            echo "\t</body>\r\n";
            echo "</html>\r\n";
        }
    }
    else error_msg("There was an unknown error while sending email.");
}
else error_msg("Invalid request method used.");

it is likely you need to set

ini_set("sendmail_from", $from);

 

try asking also in the 3rd party scripts section, you might get a better response.

 

Could anyone offer any help / advice on how to implement the above into "formmail.php"? Bear in mind that I know nothing!

 

Many thanks,

That form is a bit complex for a beginner, I don't know if you really want to learn PHP if you rather want to get the job done by compiling a website. If you belong to the former I recommend looking for a tutorial explaining how to build a quite simple contact form. I've built my first form with the book HeadFirst PHP & MySQL, that book is a good start and will teach you how to build a simple contact form.

Thanks Spiderwell, I added this in (obviously changing the "sending@from.com" bit to an actual email address):

 

# Send out the email
ini_set("sendmail_from", "sending@from.com"); 
    if (mail($post['recipient'], $subject, $message, "From: " . $post['email'] . "\r\nReply-To: " . $post['email'] . "\r\nX-Mailer: PHP FormMail")) {

 

but it made no difference sadly.

 

RE: php.ini - I cannot find this file anywhere, wondering if that may be a big part of the issue?

 

have you tried to send mail with hard coded values first?, something like this:

 

mail("myownemailaddress@blah.com", "my subject", "my body", "from@me.text.com")

 

try it in its own page, thus keeping the non sending issue seperate from all the other code.

SMTP server response: 530 SMTP authentication is required.

 

PHP's mail() function doesn't support SMTP authentication. You'll need to look into using a class such as PEAR::mail or PHPMailer if you need to authenticate to send mail.

Also, by putting arbitrarily entered (from the form) email addresses into both the To: and From: fields, you are likely triggering your mail server's relaying restrictions and it wants your script to authenticate against a valid mail box hosted on the mail server before accepting the email.

 

When either (or both) the To: or the From: field is a valid email address @your_domain and hosted on the sending mail server, you are satisfying the most commonly used relaying restrictions. When the To: address is your mail box on the sending mail server, the mail server will accept an email from php running on your_domain and/or when the From: address is your mail box on the sending mail server, the mail server will accept an email from php running on your_domain.

OK, I've found an error in the log of my SMTP server showing that authentication isn't being given when the form attempts to send email.

 

I've added in c:\php\php.ini authentication as given by "some" website:

 

[mail function]

; For Win32 only.

SMTP = localhost

smtp_port = 25

username = user

password = pass

 

but it is still failing.

 

Can anyone help with how / where to setup correct authentication, or is it impossible to do with [mail function]? as Pikachu2000 said below?

 

If it is impossible, can anyone help me re-configure the form to use something that does support authenticaiton?

 

 

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.