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

273

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

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

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

Теги:
email
wampserver
wamp

14 ответов

377
Лучший ответ

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

<?php
$to      = '[email protected]';
$subject = 'the subject';
$message = 'hello';
$headers = 'From: [email protected]' . "\r\n" .
    'Reply-To: [email protected]' . "\r\n" .
    'X-Mailer: PHP/' . phpversion();

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

Ссылка:

  • 5
    Что делать, если мне нужно отправить письмо с локального сервера. Я имею в виду, есть ли способ получить доступ к ближайшему почтовому серверу и заставить его отправлять мне письма. я имею в виду, я могу найти адрес почтового сервера Yahoo, а затем я использую этот сервер для почтовых целей ... это возможно?
  • 16
    Вам нужно настроить SMTP на вашем локальном сервере. Посмотрите на этот похожий пост, stackoverflow.com/questions/4652566/php-mail-setup-in-xampp
Показать ещё 5 комментариев
111

Вы также можете использовать класс 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 = '[email protected]';                 // SMTP username
$mail->Password = 'secret';                           // SMTP password
$mail->SMTPSecure = 'tls';                            // Enable encryption, 'ssl' also accepted

$mail->From = '[email protected]';
$mail->FromName = 'Mailer';
$mail->addAddress('[email protected]', 'Joe User');     // Add a recipient
$mail->addAddress('[email protected]');               // Name is optional
$mail->addReplyTo('[email protected]', 'Information');
$mail->addCC('[email protected]');
$mail->addBCC('[email protected]');

$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';
}
  • 2
    Если не используете composer: use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; require_once('src/PHPMailer.php'); require_once('src/Exception.php');
38

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

// multiple recipients
$to  = '[email protected]' . ', '; // note the comma
$to .= '[email protected]';

// 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 <[email protected]>, Kelly <[email protected]>' . "\r\n";
$headers .= 'From: Birthday Reminder <[email protected]>' . "\r\n";
$headers .= 'Cc: [email protected]' . "\r\n";
$headers .= 'Bcc: [email protected]' . "\r\n";

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

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

  • 0
    Здравствуйте, я устал от этого кода, я добавил 3 получателей, один Hotmail, один Gmail и один адрес электронной почты моего сайта. Я получил все, кроме Hotmail. У вас есть идея, почему она не работает на Hotmail?
  • 0
    Пожалуйста, проверьте папку со спамом в этом случае.
Показать ещё 3 комментария
15

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

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

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

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

    $recipients = '[email protected]';

    $headers['From']    = '[email protected]';
    $headers['To']      = '[email protected]';
    $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);
?> 
  • 0
    Пожалуйста, дайте ссылку на скачивание вашей использованной ссылки mail.php и всех других связанных файлов в папке. Спасибо
  • 1
    @Ashik Файл Mail.php, Mail.php в моем примере, является частью пакета Pear Mail. Если вы загрузите и установите пакет Pear Mail, вы сможете включить Mail.php . Если вы нажмете на ссылку «Pear Mail Page» выше, появится ссылка «Скачать» с инструкциями.
12

Для большинства проектов я использую Swift mailer в наши дни. Это очень гибкий и элегантный объектно-ориентированный подход к отправке писем, созданных теми же людьми, которые предоставили нам популярную инфраструктуру 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('[email protected]' => 'Jane Doe'))
    // The to address(es)
    ->setTo(array('[email protected]' => '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, см. официальную документацию.

  • 0
    Привет. Вы сказали 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 .
Показать ещё 1 комментарий
7

Попробуйте следующее:

<?php
$to = "[email protected]";
$subject = "My subject";
$txt = "Hello world!";
$headers = "From: [email protected]" . "\r\n" .
"CC: [email protected]";

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

Это очень простой метод отправки текстового сообщения электронной почты с использованием почтовой функции.

<?php
$to = '[email protected]';
$subject = 'This is subject';
$message = 'This is body of email';
$from = "From: FirstName LastName <[email protected]>";
mail($to,$subject,$message,$from);
5

Полный пример кода.

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

<?php
// Multiple recipients
$to = '[email protected], [email protected]'; // 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 <[email protected]>, Kelly <[email protected]>';
$headers[] = 'From: Birthday Reminder <[email protected]>';
$headers[] = 'Cc: [email protected]';
$headers[] = 'Bcc: [email protected]';

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

Вы можете использовать почтовую веб-службу, такую ​​как Postmark, Sendgrid и т.д.

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

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

2

Родная функция 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  = "[email protected]"
  $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();
}

Отлично работает

  • 1
    Спасибо за ваш ответ. У вас есть то же предложение, что и @norteo, указанный в его ответе. Помните, что версия 5.2 устарела и не получает обновлений безопасности. Для v6 вы можете напрямую потребовать: use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; require_once('src/PHPMailer.php'); require_once('src/Exception.php');
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 = "[email protected]";
    $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 = "[email protected]";
        $mail->Password = "demopassword";
        $mail->SetFrom("[email protected]", "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);
}


?>

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

1

Отправлено электронной почтой с помощью этого script

<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("[email protected]",$subject,$message,"From: $from\n");
    echo "Thank you for sending an email";
    }
  }
?>

Как только вы нажмете кнопку "Отправить письмо", электронное письмо будет отправлено на сайт [email protected]

0

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

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 = '[email protected]';  // sender gmail host              
    $mail->Password = 'password'; // sender gmail host password                          
    $mail->SMTPSecure = 'tls';  // for encrypted connection                           
    $mail->Port = 587;   // port for SMTP     

    $mail->setFrom('[email protected]', "Sender"); // sender email and name
    $mail->addAddress('[email protected]', "Receiver");  // receiver 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;
}
?>
0

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню