phpmailler error sending email

2

How can I send more than one 'email' with 'phpmailler' it always gives this error 'Mail error: You must provide at least one email address.' I'm developing a newsletter system that will select all the registered emails but it always does. detail I get the emails by a 'variable' and step it to send who will receive the emails.

My code:

$nome       = "leonardo";   // Pega o valor do campo Nome
$assunto    = "sadasdsad";  // Pega o valor do campo Telefone
$email      = "[email protected]";   // Pega o valor do campo Email
$mensagem   = "asdasdsadsadsadsad"; // Pega os valores do campo Mensagem

// Variável que junta os valores acima e monta o corpo do email

$Vai        = "Nome: $nome\n\nE-mail: $email\n\nAssunto: $assunto\n\nMensagem: $mensagem\n";


require_once("phpmailer/class.phpmailer.php");
$mysqli = mysqli_connect("localhost","root", "", "projeto") or die(mysqli_connect_error());
$query = "SELECT * FROM newsletter";
$result = $mysqli->query($query);
$emails = array();
while($row = $result->fetch_array()){
   $emails[] = $row['mail'];
}

define('GUSER', '[email protected]'); // <-- Insira aqui o seu GMail
define('GPWD', 'gmail123');     // <-- Insira aqui a senha do seu GMail

function smtpmailer($para, $de, $de_nome, $assunto, $corpo) { 
    global $error;
    $mail = new PHPMailer();
    $mail->IsSMTP();        // Ativar SMTP
    $mail->SMTPDebug = 0;       // Debugar: 1 = erros e mensagens, 2 = mensagens apenas
    $mail->SMTPAuth = true;     // Autenticação ativada
    $mail->SMTPSecure = 'ssl';  // SSL REQUERIDO pelo GMail
    $mail->Host = 'smtp.gmail.com'; // SMTP utilizado
    $mail->Port = 465;          // A porta 587 deverá estar aberta em seu servidor
    $mail->Username = GUSER;
    $mail->Password = GPWD;
    $mail->SetFrom($de, $de_nome);
    $mail->Subject ="gmail - Contato";
    $mail->Body = $corpo;
    if(count($para) > 1){
      foreach($para as $email){
        $mail->AddAddress($email);
      }
    }else{
        $mail->AddAddress($para);
      }

    if(!$mail->Send()) {
        $error = 'Mail error: '.$mail->ErrorInfo; 
        return false;
    } else {
        $error = 'Mensagem enviada!';
        return true;
    }
}
var_dump($emails);
// Insira abaixo o email que irá receber a mensagem, o email que irá enviar (o mesmo da variável GUSER), 
//o nome do email que envia a mensagem, o Assunto da mensagem e por último a variável com o corpo do email.

 if (smtpmailer($emails, '$email', '$nome', '$assunto', $Vai)) {


    echo"<script type=\"text/javascript\">alert(\"Sua Mensagem foi Enviada com Sucesso!\");
            history.go(-1);
         </script>\n";

}
if (!empty($error)) echo $error;
    
asked by anonymous 17.11.2015 / 19:24

2 answers

2

To get your job done, first hit the email array, the code below will store only the first email in the database.

$query = "SELECT * FROM newsletter";
$result = $mysqli->query($query);
$row = $result->fetch_array();
$mail = $row['mail'];

Change the code to:

$query = "SELECT * FROM newsletter";
$result = $mysqli->query($query);
$emails = $result->fetch_all();

or:

$query = "SELECT * FROM newsletter";
$result = $mysqli->query($query);
$emails = array();
while($row = $result->fetch_array()){
   $emails[] = $row['mail'];
}

To send the same email to multiple people it is necessary to make a foreach iterating $emails and inside the loop call AddAddress

change:

$mail->AddAddress($para);

To:

if(count($para) > 1){
  foreach($para as $email){
    $mail->AddAddress($email);
  }
}else{
    $mail->AddAddress($para);
}

and the call should look like this:

if (smtpmailer('$para', '$email', '$nome', '$assunto', $Vai)) {

The $to = array($mail); line is no longer required.

    
17.11.2015 / 19:37
0

Do not pass email as array, pass as CSV, comma-separated values:

[email protected], [email protected]

To transform the $to array into CSV use the implode

$to = array($mail);
$to = implode($to, ",");
    
17.11.2015 / 19:27