Mail.php & Smtp Authentication Issue

2019-02-20 17:36发布

问题:

I've been trying to utilize a mail.php file from the jquery contactable plugin (found on google!) to use on my website. Although the script provided is fairly simple I'm running into issues with integrating it with my Host's SMTP requirement. Here is the original script without SMTP authentication:

<?php
    // Assign contact info
    $name = stripcslashes($_POST['name']);
    $emailAddr = stripcslashes($_POST['email']);
    $issue = stripcslashes($_POST['issue']);
    $comment = stripcslashes($_POST['message']);
    $subject = stripcslashes($_POST['subject']);    

    // Set headers
    $headers  = 'MIME-Version: 1.0' . "\r\n";
    $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";

    // Format message
    $contactMessage =  
    "<div>
    <p><strong>Name:</strong> $name <br />
    <strong>E-mail:</strong> $emailAddr <br />
    <strong>Issue:</strong> $issue </p>

    <p><strong>Message:</strong> $comment </p>

    <p><strong>Sending IP:</strong> $_SERVER[REMOTE_ADDR]<br />
    <strong>Sent via:</strong> $_SERVER[HTTP_HOST]</p>
    </div>";

    // Send and check the message status
    $response = (mail('mymail@mymail.com', $subject, $contactMessage, $headers) ) ? "success" : "failure" ;
    $output = json_encode(array("response" => $response));

    header('content-type: application/json; charset=utf-8');
    echo($output);

?>

I've tried using suggestions from Google and played around with it for hours. Here is the latest version based on my nil-understanding of php thus far. -__- (Based on this: http://blog.geek4support.com/php-mail-script-with-smtp-authentication-how-to-send-mails-by-php-mail-script-using-smtp-authetication/)

<?php
 require_once "Mail.php";

    // Assign contact info
    $name = stripcslashes($_POST['name']);
    $emailAddr = stripcslashes($_POST['email']);
    $issue = stripcslashes($_POST['issue']);
    $comment = stripcslashes($_POST['message']);
    $subject = stripcslashes($_POST['subject']);    


 $host = "mail.mywebsite.com";
 $username = "mywebsitemail@mywebsiteaddress.com";
 $password = "mymailpassword";

    // Set headers
    $headers  = 'MIME-Version: 1.0' . "\r\n";
    $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";

    // Format message
    $contactMessage =  
    "<div>
    <p><strong>Name:</strong> $name <br />
    <strong>E-mail:</strong> $emailAddr <br />
    <strong>Issue:</strong> $issue </p>

    <p><strong>Message:</strong> $comment </p>

    <p><strong>Sending IP:</strong> $_SERVER[REMOTE_ADDR]<br />
    <strong>Sent via:</strong> $_SERVER[HTTP_HOST]</p>
    </div>";

 $smtp = Mail::factory('smtp',
   array ('host' => $host,
     'auth' => true,
     'username' => $username,
     'password' => $password));


 $response = ($smtp->send('mymail@mymail.com', $subject, $contactMessage, $headers))  ? "success": "failure";
$output = json_encode(array("response" => $response));  
    header('content-type: application/json; charset=utf-8');
    echo($output);

 ?>

I've actually run into a bit of a problem. My host doesn't support PHPMailer :-(. Only PearMail with SMTP. They have suggested tweaking the code listed above and incorporating my existing one with it. Exactly, what I've been trying to do before posting this online. Back to square 1, any ideas?

Comments, suggestions, anything would be most appreciated! :-)

回答1:

For sending mails, try PHPMailer, it's tested, everybody uses it, and it just works. It also has a lot of features and configuration options.

The latest version is this one, as for sending mails using SMTP with PHPMailer this is all the code you need

// Data received from POST request
$name = stripcslashes($_POST['name']);
$emailAddr = stripcslashes($_POST['email']);
$issue = stripcslashes($_POST['issue']);
$comment = stripcslashes($_POST['message']);
$subject = stripcslashes($_POST['subject']);   

// Send mail
$mail = new PHPMailer();
$mail->IsSMTP(); // telling the class to use SMTP

// SMTP Configuration
$mail->SMTPAuth = true;                  // enable SMTP authentication
$mail->Host = "myhost"; // SMTP server
$mail->Username = "yourusername@gmail.com";
$mail->Password = "yourpassword";            
//$mail->Port = 465; // optional if you don't want to use the default 

$mail->From = "my@email.com";
$mail->FromName = "My Name";
$mail->Subject = $subject;
$mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test
$mail->MsgHTML($issue . "<br /><br />" . $comment);

// Add as many as you want
$mail->AddAddress($emailAddr, $name);

// If you want to attach a file, relative path to it
//$mail->AddAttachment("images/phpmailer.gif");             // attachment

$response= NULL;
if(!$mail->Send()) {
    $response = "Mailer Error: " . $mail->ErrorInfo;
} else {
    $response = "Message sent!";
}

$output = json_encode(array("response" => $response));  
header('content-type: application/json; charset=utf-8');
echo($output);


回答2:

This my test script for getting around the disabled PHP mail() function. It uses PearMail. The print statements are for testing in a browser, you may want to remove them.

<?php
/*
 * Script to send an email as the PHP mail() function is disabled.
 * The hosting company requires SMTP authentication etc.
 * need to install the pear mail package in the cPanel
 *
 * Use the support@myserver.com as the sending/from email 
 * (or maybe the welcome one?)
 *
 * Sunday, 11 october 2015 
 * G O’Rilla
 *
 * 
 */
 function pearMail( $e_mail, $subject, $content ) {
 /*
 // To ignore the Strict Standards (which are non fatal) change your error 
 // reporting level in the php.ini file or better, inline with error_reporting()
 */
 error_reporting(E_ERROR | E_PARSE);
# To use installed modules (cPanel - PHP Extensions and Applications Package Installer)
# Add “/home/myaccount/php” to the include path. To do this, add the following code to your script:
ini_set("include_path", '/home/myaccount/php:' . ini_get("include_path")  );

require_once 'Mail.php';

#Server host only allows SMTP authentication
/*
 * Use below setting for SMTP Authentication.
 * --
 * SMTP Host : myserver.com
 * SMTP User : Use domain email Address [xyz@myserver.com]
 * SMTP Password : Use domain email password.
 * SMTP Port : 25 
*/
//print "Start Script <br>";
$params = array();
$params["host"] = “myserver.com";              # - The server to connect. Default is localhost - use your domain name.
$params["port"] = 25;                            # - The port to connect. Default is 25.
// Error: return fron mailer: Failed to set sender: welcome@theappflap.com 
//[SMTP: Invalid response code received from server (code: 550, response: 
// Access denied - Invalid HELO name (See RFC2821 4.1.1.1))] 
// sever requires authentication so TRUE 
$params["auth"] = TRUE;                         # - Whether or not to use SMTP authentication. Default is FALSE.
$params["username"] = "support@myserver.com";  #- The username to use for SMTP authentication.
$params["password"] = “********”;                #- The password to use for SMTP authentication.

print_r ( $params );
//Other parameters assuming default values will do
#$params["localhost"] - The value to give when sending EHLO or HELO. Default is localhost
#$params["timeout"] - The SMTP connection timeout. Default is NULL (no timeout).
#$params["verp"] - Whether to use VERP or not. Default is FALSE.
#$params["debug"] - Whether to enable SMTP debug mode or not. Default is FALSE.
# Mail internally uses Net_SMTP::setDebug .
#$params["persist"] - Indicates whether or not the SMTP connection should persist over multiple calls to the send() method.
#$params["pipelining"] - Indicates whether or not the SMTP commands pipelining should be used.

 $rc = $mailer = & Mail::factory( "smtp", $params ); # creates a mailer instance
 if ( $rc == NULL ) {
     print "<br>Failed to create mail instance <br>";
 }
 else {
     print "<br>mail instance created <br>";
 }

 $recipients = $email; //'support@myserver.com';

$headers['From']    = 'welcome@myserver.com'; 
$headers['To']      = $email; //'support@myserver.com';   // Input param
$headers['Subject'] = $subject;  //'TAF: Test message';        // Input param

$body = $content;  //'This is a test using PEAR mailer';       // Input param

print ( "recipients: " . $e_mail . " subject: " . $subject . " content: " . $content . "<br>");

$rc = $mailer->send( $recipients, $headers, $body );
print ( "return from mailer; " . $rc );

//print "<br>End Script";
 }
?>


标签: php smtp