Como enviar um email usando PHP?

312

Estou usando PHP em um site e quero adicionar a funcionalidade de email.

Eu tenho o WAMPSERVER instalado.

Como envio um email usando PHP?

user590849
fonte
19
Leia o manual
diEcho

Respostas:

443

Usando a mail()função do PHP é possível. Lembre-se de que a função de email não funcionará em um servidor local.

<?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);
?> 

Referência:

Muthu Kumaran
fonte
6
e se eu precisar enviar um email do servidor local. Quero dizer, existe alguma maneira de acessar o servidor de correspondência mais próximo e enviá-lo por mim. Quero dizer, posso encontrar o endereço de um servidor de correspondência do yahoo e, em seguida, utilizo esse servidor para fins de correspondência ... isso é possível?
user590849
19
Você precisa configurar o SMTP no servidor local. Dê uma olhada neste post semelhante, stackoverflow.com/questions/4652566/php-mail-setup-in-xampp
Muthu Kumaran
Olá @MuthuKumaran, se houver spam, existe alguma solução boa para resolvê-lo, responda.
Muhammad Ashikuzzaman
@MuhammadAshikuzzaman Você não pode resolver o problema de spam no PHP. Faça uma nova pergunta no site StackExchange apropriado, se isso ainda for relevante.
Uli Köhler
Como garantir ou verificar se isso funciona no meu servidor local? Se não for possível, sugerimos algumas alternativas. obrigado.
Abhishah901
121

Você também pode usar a classe PHPMailer em https://github.com/PHPMailer/PHPMailer .

Ele permite que você use a função mail ou use um servidor smtp de forma transparente. Ele também lida com emails e anexos baseados em HTML, para que você não precise escrever sua própria implementação.

A classe é estável e é usada por muitos outros projetos como Drupal, SugarCRM, Yii e Joomla!

Aqui está um exemplo da página acima:

<?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';
}
norteo
fonte
4
Se não estiver usando o compositor:use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; require_once('src/PHPMailer.php'); require_once('src/Exception.php');
Wtower 28/01/19
43

Se você estiver interessado em email formatado em html, passe Content-type: text/html;o cabeçalho. Exemplo:

// 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);

Para mais detalhes, verifique a função php mail .

Sumoanand
fonte
Olá, cansei desse código, adicionei 3 destinatários, um Hotmail, um Gmail e um e-mail no meu site. Eu recebi tudo, exceto no Hotmail. Você tem uma idéia de por que não está funcionando no Hotmail?
Antf4
Por favor, verifique a pasta de spam nesse caso.
Sumoanand
Eu já fiz, não está no spam, não está alcançando nada. Li um pouco mais sobre o assunto e parece que o Hotmail requer algum cabeçalho especial ou não permite que o email passe pelos servidores ... Ainda não encontrei a solução.
Antf5
Resolvi meu problema usando o PHPMailer e inserindo os dados da minha conta de email com SSL no objeto de email do PHPMailer.
Antf5
E se a mensagem tiver conteúdo HTML e php?
14

Consulte também o pacote de correio PEAR Pear Mail Page

Parece ser um pouco mais robusto que a função mail () padrão incorporada (se a função padrão não for adequada).

Aqui está um trecho desta página mostrando como é usado. Uso de envio () de correio PEAR

<?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);
?> 
Kevin S
fonte
forneça um link para download do seu link mail.php usado e todos os outros arquivos associados em uma pasta. Obrigado
Muhammad Ashikuzzaman
1
@Ashik O Mail.phparquivo mencionado no meu exemplo faz parte do pacote Pear Mail. Se você baixar e instalar o pacote Pear Mail, poderá incluí-lo Mail.php. Se você clicar no link 'Pear Mail Page' acima, há um link de Download com instruções.
Kevin S
12

Na maioria dos projetos, eu uso o Swift mailer atualmente. É uma abordagem orientada a objetos muito flexível e elegante para enviar e-mails, criada pelas mesmas pessoas que nos deram o popular framework Symfony e o mecanismo de modelos Twig .


Uso básico:

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);
}

Consulte a documentação oficial para obter mais informações sobre como usar o Swift mailer.

John Slegers
fonte
Oi. Você disse Swift_MailTransportquando o seu link para a documentação diz Swift_SendmailTransport. Isso significa que você estava se referindo à versão mais antiga do mailer rápido ou é um erro de digitação, ou talvez eu entenda algo errado? Preciso instalar a versão mais antiga do swift-mailer porque não tenho php7 no meu servidor. Então, eu preciso saber se a documentação da versão atual iria com a versão mais antiga do pacote. Obrigado.
Yevgeniy Afanasyev
1
@YevgeniyAfanasyev: Minha resposta foi a maneira correta de fazer as coisas 2 anos atrás, mas o Swift_MailTransport está obsoleto desde o Swiftmailer v5.4.5 . De qualquer forma, se você não pode usar o PHP 7 em seu projeto, deve usar o Swiftmailer v5.4.9. Essa é a última versão estável que ainda suporta o PHP 5. Para a documentação da versão v5.4.9 ou detalhes sobre as diferenças entre a v5.4.9 e a v6.0.2, entre em contato com Fabien Potencier ou levante um problema no Github .
John Slegers
Muito obrigado. Portanto, não há documentação disponível para a versão mais antiga, quando os distribuidores estão disponíveis. Bom saber.
Yevgeniy Afanasyev
7

este é um método muito básico para enviar email em texto sem formatação usando a função mail.

<?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);

fonte
5

Exemplo de código completo ..

Tente uma vez ..

<?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));
?>
Mr. HK
fonte
5

Para futuros leitores: tente isso se outras respostas não funcionarem (como foi o meu caso):

1.) Baixe o PHPMailer , abra o arquivo zip e extraia a pasta para o diretório do projeto.

3.) Renomeie o diretório extraído para PHPMailer e escreva o código abaixo dentro do seu script php (o script deve estar fora da pasta 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's email and name
    $mail->addAddress('[email protected]', "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;
}
?>
Ahtisham
fonte
5

A função PHP nativa mail()não funciona para mim. Emite a mensagem:

503 Este servidor de email requer autenticação ao tentar enviar para um endereço de email não local

Então, eu costumo usar PHPMailerpacote

Eu baixei a versão 5.2.23 do: GitHub .

Acabei de escolher 2 arquivos e colocá-los na minha raiz PHP de origem

class.phpmailer.php
class.smtp.php

No PHP, o arquivo precisa ser adicionado

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

Depois disso, é apenas código:

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();
}

Ele funciona como um encanto

Paulo Buchsbaum
fonte
2
Obrigado pela sua resposta. Você tem a mesma sugestão que @norteo indicada em sua resposta. Lembre-se de que a v5.2 está obsoleta e não está recebendo atualizações de segurança. Para a v6, você pode solicitar diretamente:use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; require_once('src/PHPMailer.php'); require_once('src/Exception.php');
Wtower 28/01/19
4

A principal maneira de enviar emails do PHP é usar sua mail()função interna, mas existem alguns SDKs prontos para uso que podem facilitar a integração:

  1. Swiftmailer
  2. PHPMailer
  3. Pepipost (funciona sobre HTTP, portanto, o problema do bloco de portas SMTP pode ser evitado)
  4. Enviar correio

PS Eu estou empregado na Pepipost.

Dibya Sahoo
fonte
3
Você trabalha com Pepipost e coloca o Pepipost no no.3. +1
GeneCode 28/01/19
2
@GeneCode, se algo é melhor, então é. Não importa se você trabalha ou não com eles :) O Swiftmailer e o PHPMailer são definitivamente uma das melhores ferramentas de código aberto para o envio de e-mails (por isso eu os mantive em 1 e 2). Mas, ao mesmo tempo, eles têm certas limitações e bloqueadores que tentamos resolver em nosso Pepipost SDK.
Dibya Sahoo
1

Enviou o email com este 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";
    }
  }
?>

Depois de pressionar o botão Enviar email, o email será enviado para [email protected]

Hiren Parghi
fonte
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);
}


?>

O código acima está funcionando para mim.

Pooja Khatri
fonte