PHP Почта без STMP: mail () и сбой эха PHPMailer при отправке - PullRequest
0 голосов
/ 05 февраля 2020

Я пытаюсь отправить электронное письмо с нашего веб-сайта, размещенного на BlueHost, с приложением. Мы выяснили, что по состоянию на август 2015 года наш оригинальный сценарий больше не отправлял электронные письма на нашу электронную почту.

Перемотка вперед, мы пытаемся исправить эту проблему, но нам не везет. Первоначально в нашем коде использовался старый подход mail (). Ниже приведена попытка исправить этот подход (который не возвращает ошибок PHP / log):

<?php
if(!isset($_POST["email"]) && !isset($_POST["name"]))
{
    echo "Error: Form Not Submitted.\n Name and email are mandatory!Please Click the back button to return to the website.\n";
    //Set Variables
    $company = $_POST["company"];
    $address = $_POST["address"];
    $phone = $_POST["phone"];
    $name = $_POST["name"];
    $position = $_POST["position"];
    $visitor_email = $_POST["email"];
    $message = $_POST["message"];
    $submitVar = $_POST["submit"];
    echo "$company, $address, $phone, $name, $position, $visitor_email, $message \r\n";
}
else{
    //Set Variables
    $company = $_POST["company"];
    $address = $_POST["address"];
    $phone = $_POST["phone"];
    $name = $_POST["name"];
    $position = $_POST["position"];
    $visitor_email = $_POST["email"];
    $message = $_POST["message"];
    echo "$company, $address, $phone, $name, $position, $visitor_email, $message \r\n";

    if(IsInjected($visitor_email))
    {
        echo "Bad email value!";
        exit;
    }

    //***Lay out Message***//   
    $to = "example@att.net";
    $email_from = $visitor_email;
    $email_subject = "Website Form Submission from $company";
    $email_body = "Dear Email Target,\n\n $message\n\nSincerely,\n\n$name\n$position\n\n$company\n$address\n$phone";

    //***Attatch the file***//
    $filename = $_FILES['attachment1']['tmp_name'];
    $filetype = $_FILES['attachment1']['tmp_type'];
    $filesize = $_FILES['attachment1']['tmp_size'];  // get size of the file for size validation
    if($filesize > 0){
        $handle = fopen($filename, "r");
        $content = fread($handle, $filesize);
        fclose($handle);
        $attachment = chunk_split(base64_encode($content));
    }

    //*** Establish Boundary ***//  
    $boundary = md5(date('r', time()));

    //***Start Header***//
    $headers = "MIME-Version: 1.0\r\n";
    $headers = "X-Mailer: PHP/" . phpversion()."\r\n";
    $headers .= "From: ".$name." <".$email_from.">\r\n";
    $headers .= "To: ".$email."\r\n";
    $headers .= "Subject: $email_subject\r\n";
    $headers .= "Reply-To: ".$visitor_email."\r\n";
    $headers .= "Content-Type: multipart/mixed"; 
    $headers .= "boundary = \"".$boundary."\"\r\n\r\n";

    //***Message Section***//
    $body = "--$boundary\r\n"; 
        $body .= "Content-Type: text/plain; charset=ISO-8859-1\r\n"; 
        $body .= "Content-Transfer-Encoding: base7\r\n\r\n";  
        $body .= $email_body;

    //***Attachment Section***//;
    if($filesize > 0){
        $body .= "--$boundary\r\n"; 
        $body .="Content-Type:".$filetype."; name=\"".$filename."\"\r\n"; 
        $body .="Content-Disposition: attachment; filename=".$filename."\r\n"; 
        $body .="Content-Transfer-Encoding: base64\r\n"; 
        $body .="X-Attachment-Id: ".rand(1000, 99999)."\r\n\r\n";  
        $body .= $attachment."\r\n\r\n"; // Attaching the encoded file with email 
    }

    //***End Email***///
    $body .= "--$boundary--";

    //Send the email!
    $test = mail($to, $email_subject, $body, $headers);
    if($test){
        echo "TRUE";
        //done. redirect to thank-you page.
        header("Location: ./Sales_Quotes.html"); 
        echo '<h5 class="contentHeader simple">Form Submitted!</h5>';
        /* Redirect browser */
        exit();/*Good Practice*/
    } else {
        die("Error: PHP mail() failure!\r\n"
        .$to."\r\n"
        .$email_subject."\r\n"
        .$body."\r\n"
        .$headers."\r\n");
    }
}

// Function to validate against any email injection attempts
function IsInjected($str)
{
    $injections = array('(\n+)',
      '(\r+)',
      '(\t+)',
      '(%0A+)',
      '(%0D+)',
      '(%08+)',
      '(%09+)'
      );
    $inject = join('|', $injections);
    $inject = "/$inject/i";
    if(preg_match($inject,$str))
    {
        return true;
    }
    else
    {
        return false;
    }
}
?> 

И локальный хост с Debian 10.2, и BlueHost сообщают мне, что функция mail () завершается сбоем, когда я ее вызываю. Где я go ошибся? Поскольку после 2 дней работы я ни к чему не привел, так как все, кажется, хотят, чтобы я использовал PHPMailer, я также создал второй сценарий с подходом PHPMailer, и он также не работает точно так же (без ошибок log / php, сообщая мне, что вызов не состоялся):

<?php
require_once './PHPMailer.php';
require_once './Exception.php';
use PHPMailer\PHPMailer\PHPMailer;
if(!isset($_POST["email"]) && !isset($_POST["name"]))
{
    echo "Error: Form Not Submitted.\n Name and email are mandatory!Please Click the back button to return to the website.\n";
    //Set Variables
    $company = $_POST["company"];
    $address = $_POST["address"];
    $phone = $_POST["phone"];
    $name = $_POST["name"];
    $position = $_POST["position"];
    $visitor_email = $_POST["email"];
    $message = $_POST["message"];
    $submitVar = $_POST["submit"];
    echo "$company, $address, $phone, $name, $position, $visitor_email, $message \r\n";
}
else{
    //***Set Variables***//
    $company = $_POST["company"];
    $address = $_POST["address"];
    $phone = $_POST["phone"];
    $name = $_POST["name"];
    $position = $_POST["position"];
    $visitor_email = $_POST["email"];
    $message = $_POST["message"];
    echo "$company, $address, $phone, $name, $position, $visitor_email, $message \r\n";

    if(IsInjected($visitor_email))
    {
        echo "Bad email value!";
        exit;
    }

    //***Lay out Message***//   
    $to = "example@att.net";
    $email_from = $visitor_email;
    $email_subject = "Website Form Submission from $company";
    $email_body = "Dear Target,\n\n $message\n\nSincerely,\n\n$name\n$position\n\n$company\n$address\n$phone";

    //***Upload the file***//
    $filename = $_FILES['attachment1']['tmp_name'];
    $filetype = $_FILES['attachment1']['type'];
    $filesize = $_FILES['attachment1']['size'];  // get size of the file for size validation
    if($filesize > 0){
        $attachment = tempnam(sys_get_temp_dir(), hash('sha256', $_FILES['attachment1']['name']));
        if (!(move_uploaded_file($_FILES['attachment1']['tmp_name'], $uploadfile))){
            echo "Failed to Upload File Properly.";
        }
    }

    //***Create the PHPMailer Message***//:
    $mail = new PHPMailer(true);
    $mail -> setFrom($email_from,$name);
    $mail -> To = "sietins@sietins.com";
    $mail -> addAddress("example@att.net", "Mr. Example");
    $mail -> Subject = $email_subject;
    $mail -> Body = $email_body;
    if($filesize > 0){
        //***Attach the file***//
        $mail ->addAttachment($uploadfile,$filename);
    }

    //***Send the email!***//
    if(!$mail->send()){
        echo "TRUE";
        //done. redirect to thank-you page.
        header("Location: ./Sales_Quotes.html"); 
        echo '<h5 class="contentHeader simple">Form Submitted!</h5>';
        /* Redirect browser */
        exit();/*Good Practice*/
    } else {
        die("Error: PHP mail() failure!\r\n"
        .$to."\r\n"
        .$email_subject."\r\n"
        .$email_body."\r\n");
    }
}

// Function to validate against any email injection attempts
function IsInjected($str)
{
    $injections = array('(\n+)',
      '(\r+)',
      '(\t+)',
      '(%0A+)',
      '(%0D+)',
      '(%08+)',
      '(%09+)'
      );
    $inject = join('|', $injections);
    $inject = "/$inject/i";
    if(preg_match($inject,$str))
    {
        return true;
    }
    else
    {
        return false;
    }
}
?> 

Существует ли какое-либо простое решение / исправление вышеизложенного, отвечающее следующим требованиям?

1010 Нет SMTP . Местный хост предпочитал. Быстрая / простая настройка Должен поддерживать опциональное вложение от пользователя Должен быть жизнеспособным для BlueHost.

Обратите внимание, что это для малого бизнеса в обрабатывающей промышленности. Я в своем уме и уже потратил слишком много времени на это. Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 05 февраля 2020

После большого количества тестирования и отладки окончательный код выглядел следующим образом:

<?php
require_once './PHPMailer.php';
require_once './Exception.php';
use PHPMailer\PHPMailer\PHPMailer;
if(!isset($_POST["email"]) && !isset($_POST["name"]))
{
    echo "Error: Form Not Submitted.\n Name and email are mandatory! Please Click the back button to return to the website.\n";
    //Set Variables
    $company = $_POST["company"];
    $address = $_POST["address"];
    $phone = $_POST["phone"];
    $name = $_POST["name"];
    $position = $_POST["position"];
    $visitor_email = $_POST["email"];
    $message = $_POST["message"];
    $submitVar = $_POST["submit"];
    echo "$company, $address, $phone, $name, $position, $visitor_email, $message \r\n";
}
else{
    //***Set Variables***//
    $company = $_POST["company"];
    $address = $_POST["address"];
    $phone = $_POST["phone"];
    $name = $_POST["name"];
    $position = $_POST["position"];
    $visitor_email = $_POST["email"];
    $message = $_POST["message"];
    //echo "$company, $address, $phone, $name, $position, $visitor_email, $message \r\n";

    if(IsInjected($visitor_email))
    {
        echo "Bad email value!";
        exit;
    }

    //***Lay out Message***//   
    $to = "example@att.net";
    $email_from = $visitor_email;
    $email_subject = "Website Form Submission from $company";
    $email_body = "Dear Target Company,\n\n $message\n\nSincerely,\n\n$name\n$position\n\n$company\n$address\n$phone";

    //***Upload the file***//
    $filename = $_FILES['attachment1']['tmp_name'];
    $filetype = $_FILES['attachment1']['type'];
    $filesize = $_FILES['attachment1']['size'];  // get size of the file for size validation
    if($filesize > 0){
        $attachment = tempnam(sys_get_temp_dir(), hash('sha256', $_FILES['attachment1']['name']));
        if (!(move_uploaded_file($_FILES['attachment1']['tmp_name'], $uploadfile))){
            echo "Failed to Upload File Properly.";
        }
    }

    //***Create the PHPMailer Message***//:
    $mail = new PHPMailer(true);
    $mail -> setFrom($email_from,$name);
    $mail -> To = "example@att.net";
    $mail -> addAddress("example@att.net", "Mr Example");
    $mail -> Subject = $email_subject;
    $mail -> Body = $email_body;
    if($filesize > 0){
        //***Attach the file***//
        $mail ->addAttachment($uploadfile,$filename);
    }

    //***Send the email!***//
    try{
        $mail->send();
        //done. redirect to thank-you page.
        header("Location: ./Sales_Quotes.html"); 
        echo '<h5 class="contentHeader simple">Form Submitted!</h5>';
        /* Redirect browser */
        exit();/*Good Practice*/
    }
    catch (phpmailerException $e) {
        echo "Error: PHPMailer failure!: ";
        echo $e->errorMessage();  //PHPMailer error messages
        echo $mail->ErrorInfo;
    }
    catch (Exception $e) {
        echo "Error: PHPMailer failure!: ";
        echo $e->getMessage();  // other error messages
        echo $mail->ErrorInfo;
    }
}

// Function to validate against any email injection attempts
function IsInjected($str)
{
    $injections = array('(\n+)',
      '(\r+)',
      '(\t+)',
      '(%0A+)',
      '(%0D+)',
      '(%08+)',
      '(%09+)'
      );
    $inject = join('|', $injections);
    $inject = "/$inject/i";
    if(preg_match($inject,$str))
    {
        return true;
    }
    else
    {
        return false;
    }
}
?> 

Оказывается, многие примеры и ответы для PHPMailer имеют неверные или неправильные ссылки , Для тех, кто хочет НЕ использовать SMTP и включать вложение, этот код должен работать (минимально отправлять электронную почту) на BlueHost.

0 голосов
/ 05 февраля 2020

Можно поставить это в начале и в конце вывода почты: Ob_start (); Ob_end_clean ();

...