Как отправить письмо с помощью PHP?


312

Я использую PHP на веб-сайте, и я хочу добавить функциональность электронной почты.

У меня установлен WAMPSERVER.

Как отправить электронное письмо с использованием PHP?


19

Ответы:


443

С помощью mail()функции PHP это возможно. Помните, что функция почты не будет работать на локальном сервере.

<?php
$to      = 'nobody@example.com';
$subject = 'the subject';
$message = 'hello';
$headers = 'From: webmaster@example.com' . "\r\n" .
    'Reply-To: webmaster@example.com' . "\r\n" .
    'X-Mailer: PHP/' . phpversion();

mail($to, $subject, $message, $headers);
?> 

Ссылка:


6
Что делать, если мне нужно отправить письмо с локального сервера. Я имею в виду, есть ли способ получить доступ к ближайшему почтовому серверу и заставить его отправлять мне письма. я имею в виду, я могу найти адрес почтового сервера Yahoo, а затем я использую этот сервер для почтовых целей ... это возможно?
user590849

19
Вам нужно настроить SMTP на вашем локальном сервере. Взгляните на этот похожий пост, stackoverflow.com/questions/4652566/php-mail-setup-in-xampp
Мутху Кумаран

Здравствуйте @MuthuKumaran, если это идет в спам, есть ли хорошее решение для его решения, пожалуйста, ответьте.
Мухаммед Ашикуззаман

@MuhammadAshikuzzaman Вы не можете решить проблему спама в PHP. Пожалуйста, задайте новый вопрос на соответствующем сайте StackExchange, если это все еще актуально.
Ули Келер

Как убедиться, что это работает на моем локальном сервере? Если нет возможности сделать это, предложите несколько альтернатив, пожалуйста. Спасибо.
abhishah901

121

Вы также можете использовать класс PHPMailer по адресу https://github.com/PHPMailer/PHPMailer .

Это позволяет вам использовать функцию почты или прозрачно использовать SMTP-сервер. Он также обрабатывает электронные письма и вложения на основе HTML, поэтому вам не нужно писать собственную реализацию.

Класс стабилен и используется многими другими проектами, такими как Drupal, SugarCRM, Yii и Joomla!

Вот пример со страницы выше:

<?php
require 'PHPMailerAutoload.php';

$mail = new PHPMailer;

$mail->isSMTP();                                      // Set mailer to use SMTP
$mail->Host = 'smtp1.example.com;smtp2.example.com';  // Specify main and backup SMTP servers
$mail->SMTPAuth = true;                               // Enable SMTP authentication
$mail->Username = 'user@example.com';                 // SMTP username
$mail->Password = 'secret';                           // SMTP password
$mail->SMTPSecure = 'tls';                            // Enable encryption, 'ssl' also accepted

$mail->From = 'from@example.com';
$mail->FromName = 'Mailer';
$mail->addAddress('joe@example.net', 'Joe User');     // Add a recipient
$mail->addAddress('ellen@example.com');               // Name is optional
$mail->addReplyTo('info@example.com', 'Information');
$mail->addCC('cc@example.com');
$mail->addBCC('bcc@example.com');

$mail->WordWrap = 50;                                 // Set word wrap to 50 characters
$mail->addAttachment('/var/tmp/file.tar.gz');         // Add attachments
$mail->addAttachment('/tmp/image.jpg', 'new.jpg');    // Optional name
$mail->isHTML(true);                                  // Set email format to HTML

$mail->Subject = 'Here is the subject';
$mail->Body    = 'This is the HTML message body <b>in bold!</b>';
$mail->AltBody = 'This is the body in plain text for non-HTML mail clients';

if(!$mail->send()) {
    echo 'Message could not be sent.';
    echo 'Mailer Error: ' . $mail->ErrorInfo;
} else {
    echo 'Message has been sent';
}

4
Если не используете композитора:use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; require_once('src/PHPMailer.php'); require_once('src/Exception.php');
Wtower

43

Если вас интересует электронная почта в формате html, обязательно укажите Content-type: text/html;заголовок. Пример:

// multiple recipients
$to  = 'aidan@example.com' . ', '; // note the comma
$to .= 'wez@example.com';

// subject
$subject = 'Birthday Reminders for August';

// message
$message = '
<html>
<head>
  <title>Birthday Reminders for August</title>
</head>
<body>
  <p>Here are the birthdays upcoming in August!</p>
  <table>
    <tr>
      <th>Person</th><th>Day</th><th>Month</th><th>Year</th>
    </tr>
    <tr>
      <td>Joe</td><td>3rd</td><td>August</td><td>1970</td>
    </tr>
    <tr>
      <td>Sally</td><td>17th</td><td>August</td><td>1973</td>
    </tr>
  </table>
</body>
</html>
';

// To send HTML mail, the Content-type header must be set
$headers  = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";

// Additional headers
$headers .= 'To: Mary <mary@example.com>, Kelly <kelly@example.com>' . "\r\n";
$headers .= 'From: Birthday Reminder <birthday@example.com>' . "\r\n";
$headers .= 'Cc: birthdayarchive@example.com' . "\r\n";
$headers .= 'Bcc: birthdaycheck@example.com' . "\r\n";

// Mail it
mail($to, $subject, $message, $headers);

Для более подробной информации, проверьте функцию php mail .


Здравствуйте, я устал от этого кода, я добавил 3 получателей, один Hotmail, один Gmail и один адрес электронной почты моего сайта. Я получил все, кроме Hotmail. У вас есть идея, почему она не работает на Hotmail?
antf

Пожалуйста, проверьте папку со спамом в этом случае.
Sumoanand

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

Я решил свою проблему, используя PHPMailer и введя данные своей учетной записи электронной почты с помощью SSL в объекте электронной почты PHPMailer.
antf

Что делать, если сообщение содержит HTML и php содержимое?

14

Также загляните в почтовый пакет PEAR Pear Mail Page

Кажется, он немного более устойчив, чем стандартная функция mail (), которая встроена (если стандартная функция не подходит).

Вот выдержка из этой страницы, показывающая, как она используется. Использование PEAR Mail send ()

<?php
    include('Mail.php');

    $recipients = 'joe@example.com';

    $headers['From']    = 'richard@example.com';
    $headers['To']      = 'joe@example.com';
    $headers['Subject'] = 'Test message';

    $body = 'Test message';

    $smtpinfo["host"] = "smtp.server.com";
    $smtpinfo["port"] = "25";
    $smtpinfo["auth"] = true;
    $smtpinfo["username"] = "smtp_user";
    $smtpinfo["password"] = "smtp_password";


    // Create the mail object using the Mail::factory method
    $mail_object =& Mail::factory("smtp", $smtpinfo); 

    $mail_object->send($recipients, $headers, $body);
?> 

Пожалуйста, дайте ссылку на скачивание вашей использованной ссылки mail.php и всех других связанных файлов в папке. Спасибо
Мухаммед Ашикуззаман

1
@Ashik Mail.phpФайл, указанный в моем примере, является частью пакета Pear Mail. Если вы скачаете и установите пакет Pear Mail, вы сможете включить его Mail.php. Если вы нажмете на ссылку «Pear Mail Page» выше, появится ссылка «Скачать» с инструкциями.
Кевин С

12

Для большинства проектов я использую почтовую программу Swift в эти дни. Это очень гибкий и элегантный объектно-ориентированный подход к отправке электронных писем, созданный теми же людьми, которые подарили нам популярный фреймворк Symfony и шаблонизатор Twig .


Основное использование:

require 'mail/swift_required.php';

$message = Swift_Message::newInstance()
    // The subject of your email
    ->setSubject('Jane Doe sends you a message')
    // The from address(es)
    ->setFrom(array('jane.doe@gmail.com' => 'Jane Doe'))
    // The to address(es)
    ->setTo(array('frank.stevens@gmail.com' => 'Frank Stevens'))
    // Here, you put the content of your email
    ->setBody('<h3>New message</h3><p>Here goes the rest of my message</p>', 'text/html');

if (Swift_Mailer::newInstance(Swift_MailTransport::newInstance())->send($message)) {
    echo json_encode([
        "status" => "OK",
        "message" => 'Your message has been sent!'
    ], JSON_PRETTY_PRINT);
} else {
    echo json_encode([
        "status" => "error",
        "message" => 'Oops! Something went wrong!'
    ], JSON_PRETTY_PRINT);
}

См. Официальную документацию для получения дополнительной информации о том, как использовать почтовую программу Swift.


Здравствуй. Вы сказали, Swift_MailTransportкогда ваша ссылка на документацию говорит Swift_SendmailTransport. Значит ли это, что вы имели в виду старую версию swift mailer или это опечатка, или, может быть, я что-то неправильно понял? Мне нужно установить более старую версию swift-mailer, потому что у меня нет php7 на моем сервере. Поэтому мне нужно знать, пойдет ли документация для текущей версии со старой версией пакета. Спасибо.
Евгений Афанасьев

1
@YevgeniyAfanasyev: Мой ответ был правильным способом сделать что-то 2 года назад, но Swift_MailTransport устарел с Swiftmailer v5.4.5 . В любом случае, если вы не можете использовать PHP 7 для своего проекта, вам следует использовать Swiftmailer v5.4.9. Это последняя стабильная версия, которая все еще поддерживает PHP 5. Для документации версии v5.4.9 или подробностей о различиях между v5.4.9 и v6.0.2 вы можете связаться с Fabien Potencier или поднять проблему на Github .
Джон Слегерс

Большое спасибо. Таким образом, нет никакой документации, доступной для старой версии, когда доступны дистрибутивы. Хорошо знать.
Евгений Афанасьев

7

это очень простой способ отправки простого текста по электронной почте с помощью функции mail.

<?php
$to = 'SomeOtherEmailAddress@Domain.com';
$subject = 'This is subject';
$message = 'This is body of email';
$from = "From: FirstName LastName <SomeEmailAddress@Domain.com>";
mail($to,$subject,$message,$from);

7

Попробуй это:

<?php
$to = "somebody@example.com";
$subject = "My subject";
$txt = "Hello world!";
$headers = "From: webmaster@example.com" . "\r\n" .
"CC: somebodyelse@example.com";

mail($to,$subject,$txt,$headers);
?>

5

Пример полного кода

Попробуйте один раз ..

<?php
// Multiple recipients
$to = 'johny@example.com, sally@example.com'; // note the comma

// Subject
$subject = 'Birthday Reminders for August';

// Message
$message = '
<html>
<head>
  <title>Birthday Reminders for August</title>
</head>
<body>
  <p>Here are the birthdays upcoming in August!</p>
  <table>
    <tr>
      <th>Person</th><th>Day</th><th>Month</th><th>Year</th>
    </tr>
    <tr>
      <td>Johny</td><td>10th</td><td>August</td><td>1970</td>
    </tr>
    <tr>
      <td>Sally</td><td>17th</td><td>August</td><td>1973</td>
    </tr>
  </table>
</body>
</html>
';

// To send HTML mail, the Content-type header must be set
$headers[] = 'MIME-Version: 1.0';
$headers[] = 'Content-type: text/html; charset=iso-8859-1';

// Additional headers
$headers[] = 'To: Mary <mary@example.com>, Kelly <kelly@example.com>';
$headers[] = 'From: Birthday Reminder <birthday@example.com>';
$headers[] = 'Cc: birthdayarchive@example.com';
$headers[] = 'Bcc: birthdaycheck@example.com';

// Mail it
mail($to, $subject, $message, implode("\r\n", $headers));
?>

5

Для будущих читателей: попробуйте это, если другие ответы не работают (как было со мной):

1.) Загрузите PHPMailer , откройте zip-файл и распакуйте папку в каталог вашего проекта.

3.) Переименуйте извлеченный каталог в PHPMailer и напишите приведенный ниже код внутри вашего php-скрипта (скрипт должен находиться вне папки PHPMailer )

<?php
// PHPMailer classes into the global namespace
use PHPMailer\PHPMailer\PHPMailer; 
use PHPMailer\PHPMailer\Exception;
// Base files 
require 'PHPMailer/src/Exception.php';
require 'PHPMailer/src/PHPMailer.php';
require 'PHPMailer/src/SMTP.php';
// create object of PHPMailer class with boolean parameter which sets/unsets exception.
$mail = new PHPMailer(true);                              
try {
    $mail->isSMTP(); // using SMTP protocol                                     
    $mail->Host = 'smtp.gmail.com'; // SMTP host as gmail 
    $mail->SMTPAuth = true;  // enable smtp authentication                             
    $mail->Username = 'sender@gmail.com';  // sender gmail host              
    $mail->Password = 'password'; // sender gmail host password                          
    $mail->SMTPSecure = 'tls';  // for encrypted connection                           
    $mail->Port = 587;   // port for SMTP     

    $mail->setFrom('sender@gmail.com', "Sender"); // sender's email and name
    $mail->addAddress('receiver@gmail.com', "Receiver");  // receiver's email and name

    $mail->Subject = 'Test subject';
    $mail->Body    = 'Test body';

    $mail->send();
    echo 'Message has been sent';
} catch (Exception $e) { // handle error.
    echo 'Message could not be sent. Mailer Error: ', $mail->ErrorInfo;
}
?>

5

Нативная функция PHP mail()не работает для меня. Выдает сообщение:

503 Этот почтовый сервер требует аутентификации при попытке отправки на нелокальный адрес электронной почты

Итак, я обычно использую PHPMailerпакет

Я скачал версию 5.2.23 с: GitHub .

Я только что выбрал 2 файла и поместил их в мой исходный корень PHP

class.phpmailer.php
class.smtp.php

В PHP файл должен быть добавлен

require_once('class.smtp.php');
require_once('class.phpmailer.php');

После этого это просто код:

require_once('class.smtp.php');
require_once('class.phpmailer.php');
... 
//----------------------------------------------
// Send an e-mail. Returns true if successful 
//
//   $to - destination
//   $nameto - destination name
//   $subject - e-mail subject
//   $message - HTML e-mail body
//   altmess - text alternative for HTML.
//----------------------------------------------
function sendmail($to,$nameto,$subject,$message,$altmess)  {

  $from  = "yourcontact@yourdomain.com";
  $namefrom = "yourname";
  $mail = new PHPMailer();  
  $mail->CharSet = 'UTF-8';
  $mail->isSMTP();   // by SMTP
  $mail->SMTPAuth   = true;   // user and password
  $mail->Host       = "localhost";
  $mail->Port       = 25;
  $mail->Username   = $from;  
  $mail->Password   = "yourpassword";
  $mail->SMTPSecure = "";    // options: 'ssl', 'tls' , ''  
  $mail->setFrom($from,$namefrom);   // From (origin)
  $mail->addCC($from,$namefrom);      // There is also addBCC
  $mail->Subject  = $subject;
  $mail->AltBody  = $altmess;
  $mail->Body = $message;
  $mail->isHTML();   // Set HTML type
//$mail->addAttachment("attachment");  
  $mail->addAddress($to, $nameto);
  return $mail->send();
}

Работает как часы


2
Спасибо за ваш ответ. У вас есть то же предложение, что и @norteo, указанный в его ответе. Помните, что версия 5.2 устарела и не получает обновлений безопасности. Для v6 вы можете напрямую потребовать:use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; require_once('src/PHPMailer.php'); require_once('src/Exception.php');
Wtower

4

Основной способ отправки электронной почты из PHP - это использование встроенной mail()функции, но есть пара готовых к использованию SDK, которые могут упростить интеграцию:

  1. Swiftmailer
  2. PHPMailer
  3. Pepipost (работает через HTTP, поэтому можно избежать проблемы с блокировкой порта SMTP)
  4. Отправить почту

PS Я работаю с Pepipost.


3
Вы работаете с Pepipost и ставите Pepipost под номером 3. +1
GeneCode

2
@GeneCode, если что-то лучше, то так и есть. Неважно, работаете ли вы с ними или нет :) Swiftmailer и PHPMailer, безусловно, являются одним из лучших инструментов с открытым исходным кодом для отправки электронных писем (поэтому я сохранил их в 1 и 2). Но в то же время у них есть определенные ограничения и блокировщики, которые мы пытались устранить в нашем Pepipost SDK.
Дибья Саху

3

Вы можете использовать почтовый веб-сервис, такой как Postmark, Sendgrid и т. Д.

Sendgrid против Postmark против Amazon SES и других провайдеров электронной почты / SMTP API?

Изменить: я просто использую Google Gmail API сейчас. У меня были проблемы с отправкой напоминания по электронной почте в организацию моего работодателя из-за строгих фильтров. Но Gmail работает до тех пор, пока вы не спамите людей.


1

Отправил письмо с этим скриптом

<h2>Test Mail</h2>
<?php

if (!isset($_POST["submit"]))
  {
  ?>
  <form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
  From: <input type="text" name="from"><br>
  Subject: <input type="text" name="subject"><br>
  Message: <textarea rows="10" cols="40" name="message"></textarea><br>
  <input type="submit" name="submit" value="Click To send mail">
  </form>
  <?php
  }

else

  {

  if (isset($_POST["from"]))
    {
    $from = $_POST["from"]; // sender
    $subject = $_POST["subject"];
    $message = $_POST["message"];

    $message = wordwrap($message, 70);

    mail("Test@example.com",$subject,$message,"From: $from\n");
    echo "Thank you for sending an email";
    }
  }
?>

После того, как вы нажмете кнопку «Отправить письмо», электронное письмо будет отправлено на Test@example.com


1
<?php
include "db_conn.php";//connection file
require "PHPMailerAutoload.php";// it will be in PHPMailer
require "class.smtp.php";// it will be in PHPMailer
require "class.phpmailer.php";// it will be in PHPMailer


$response = array();
$params = json_decode(file_get_contents("php://input"));

if(!empty($params->email_id)){

    $email_id = $params->email_id;
    $flag=false;
    echo "something";
    if(!filter_var($email_id, FILTER_VALIDATE_EMAIL))
    {
        $response['ERROR']='EMAIL address format error'; 
        echo json_encode($response,JSON_UNESCAPED_SLASHES);
        return;
    }
    $sql="SELECT * from sales where email_id ='$email_id' ";

    $result = mysqli_query($conn,$sql);
    $count = mysqli_num_rows($result);

    $to = "demo@gmail.com";
    $subject = "DEMO Subject";
    $messageBody ="demo message .";

    if($count ==0){
        $response["valid"] = false;
        $response["message"] = "User is not registered yet";
        echo json_encode($response);
        return;
    }

    else {

        $mail = new PHPMailer();
        $mail->IsSMTP();
        $mail->SMTPAuth = true; // authentication enabled
        $mail->IsHTML(true); 
        $mail->SMTPSecure = 'ssl';//turn on to send html email
        // $mail->Host = "ssl://smtp.zoho.com";
        $mail->Host = "p3plcpnl0749.prod.phx3.secureserver.net";//you can use gmail 
        $mail->Port = 465;
        $mail->Username = "demousername@example.com";
        $mail->Password = "demopassword";
        $mail->SetFrom("demousername@example.com", "Any demo alert");
        $mail->Subject = $subject;

        $mail->Body = $messageBody;
        $mail->AddAddress($to);
        echo "yes";

        if(!$mail->send()) {
           echo "Mailer Error: " . $mail->ErrorInfo;
       } 
       else {
           echo "Message has been sent successfully";
      }
    }

}
else{
    $response["valid"] = false;
    $response["message"] = "Required field(s) missing";
    echo json_encode($response);
}


?>

Приведенный выше код работает на меня.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.