Invia e-mail utilizzando il server SMTP GMail da una pagina PHP


389

Sto cercando di inviare un'e-mail tramite il server SMTP di GMail da una pagina PHP, ma viene visualizzato questo errore:

autenticazione fallita [SMTP: il server SMTP non supporta l'autenticazione (codice: 250, risposta: mx.google.com al tuo servizio, [98.117.99.235] DIMENSIONE 35651584 8BITMIME STARTTLS ENHANCEDSTATUSCODES PIPELINING)]

Qualcuno può aiutare? Ecco il mio codice:

<?php
require_once "Mail.php";

$from = "Sandra Sender <sender@example.com>";
$to = "Ramona Recipient <ramona@microsoft.com>";
$subject = "Hi!";
$body = "Hi,\n\nHow are you?";

$host = "smtp.gmail.com";
$port = "587";
$username = "testtest@gmail.com";
$password = "testtest";

$headers = array ('From' => $from,
  'To' => $to,
  'Subject' => $subject);
$smtp = Mail::factory('smtp',
  array ('host' => $host,
    'port' => $port,
    'auth' => true,
    'username' => $username,
    'password' => $password));

$mail = $smtp->send($to, $headers, $body);

if (PEAR::isError($mail)) {
  echo("<p>" . $mail->getMessage() . "</p>");
 } else {
  echo("<p>Message successfully sent!</p>");
 }
?>

Risposte:


357
// Pear Mail Library
require_once "Mail.php";

$from = '<fromaddress@gmail.com>';
$to = '<toaddress@yahoo.com>';
$subject = 'Hi!';
$body = "Hi,\n\nHow are you?";

$headers = array(
    'From' => $from,
    'To' => $to,
    'Subject' => $subject
);

$smtp = Mail::factory('smtp', array(
        'host' => 'ssl://smtp.gmail.com',
        'port' => '465',
        'auth' => true,
        'username' => 'johndoe@gmail.com',
        'password' => 'passwordxxx'
    ));

$mail = $smtp->send($to, $headers, $body);

if (PEAR::isError($mail)) {
    echo('<p>' . $mail->getMessage() . '</p>');
} else {
    echo('<p>Message successfully sent!</p>');
}

141
cos'è Mail.php?? da dove ottengo questo file?
Zain Shaikh,

18
qualcuno potrebbe darmi un link dove posso ottenere il file Mail.php. Perché l'ho provato e non avrebbe funzionato Grazie
Yoosuf

11
Dove sono i simboli @ in questo esempio sopra? Non ne vedo uno solo lì dentro!
darkAsPitch

6
Ritengo che myaccount.gmail.com sia uguale a myaccount@gmail.com negli standard di posta elettronica.
Volo Sherwin,

3
Non è necessario includere @gmail se si specifica il server. Digita solo il myaccountnome utente.
Jack,

106

Utilizzando Swift mailer , è abbastanza facile inviare una mail tramite le credenziali di Gmail:

<?php
require_once 'swift/lib/swift_required.php';

$transport = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, "ssl")
  ->setUsername('GMAIL_USERNAME')
  ->setPassword('GMAIL_PASSWORD');

$mailer = Swift_Mailer::newInstance($transport);

$message = Swift_Message::newInstance('Test Subject')
  ->setFrom(array('abc@example.com' => 'ABC'))
  ->setTo(array('xyz@test.com'))
  ->setBody('This is a test mail.');

$result = $mailer->send($message);
?>

2
Ha funzionato "al primo" cambiando semplicemente GMAIL_USERNAME, GMAIL_PASSWORD e gli indirizzi Da e A. Nessun'altra soluzione ha funzionato per me. Grazie.
Marco Muciño,

7
Sono d'accordo, Swift Mailer è una soluzione di drop della posta molto più facile che scherzare con Pera. Non dimenticare di abilitare l'estensione php_openssl di PHP.
Soth

1
Bella soluzione con SwiftMailer! +1
Amal Murali,

1
Arrrgh. icant fa funzionare swiftmailer. non so come usare quel "compositore", quindi ho appena scaricato lo zip di swiftmailer da github, quindi ho abilitato open_ssl e poi ho fornito la mia e-mail e la mia password gmail ma non funzionava ancora.
boi_echos,

3
ah scusa per la mia stupidità. devi aprire il tuo account Gmail perché c'è un'e-mail che ti dice di abilitare "un'app meno sicura". allora ora funziona
heheh


33

Non consiglio Pear Mail. Non è stato aggiornato dal 2010. Leggi anche i file di origine; il codice sorgente è quasi obsoleto, scritto in stile PHP 4 e molti errori / bug sono stati pubblicati (Google it). Sto usando Swift Mailer.

Swift Mailer si integra in qualsiasi applicazione Web scritta in PHP 5, offrendo un approccio flessibile ed elegante orientato agli oggetti per l'invio di e-mail con una moltitudine di funzionalità.

Invia e-mail utilizzando SMTP, sendmail, postfix o un'implementazione di trasporto personalizzata personalizzata.

Supporta server che richiedono nome utente e password e / o crittografia.

Proteggi dagli attacchi di iniezione di intestazione senza rimuovere il contenuto dei dati di richiesta.

Invia e-mail HTML / multipart conformi a MIME.

Utilizzare plug-in basati su eventi per personalizzare la libreria.

Gestisci allegati di grandi dimensioni e immagini incorporate / incorporate con un uso di memoria insufficiente.

È un open source gratuito che puoi scaricare Swift Mailer e caricare sul tuo server. (L'elenco delle funzionalità viene copiato dal sito Web del proprietario).

L'esempio funzionante di Gmail SSL / SMTP e Swift Mailer è qui ...

// Swift Mailer Library
require_once '../path/to/lib/swift_required.php';

// Mail Transport
$transport = Swift_SmtpTransport::newInstance('ssl://smtp.gmail.com', 465)
    ->setUsername('username@gmail.com') // Your Gmail Username
    ->setPassword('my_secure_gmail_password'); // Your Gmail Password

// Mailer
$mailer = Swift_Mailer::newInstance($transport);

// Create a message
$message = Swift_Message::newInstance('Wonderful Subject Here')
    ->setFrom(array('sender@example.com' => 'Sender Name')) // can be $_POST['email'] etc...
    ->setTo(array('receiver@example.com' => 'Receiver Name')) // your email / multiple supported.
    ->setBody('Here is the <strong>message</strong> itself. It can be text or <h1>HTML</h1>.', 'text/html');

// Send the message
if ($mailer->send($message)) {
    echo 'Mail sent successfully.';
} else {
    echo 'I am sure, your configuration are not correct. :(';
}

Spero che questo possa essere d'aiuto. Buona codifica ... :)


1
Questo non funziona più, ricevo sempre il messaggio di ritorno "535-5.7.8 Nome utente e password non accettati". Le mie credenziali vanno bene e ho impostato "Consenti app meno sicure" su ON. Qualcuno sa una soluzione a questo?
AndrewB,

Swift non sembra funzionare in PHP 5.x - non capisce ?? coalescenza - esplode e basta.
HerrimanCoder

28
<?php
date_default_timezone_set('America/Toronto');

require_once('class.phpmailer.php');
//include("class.smtp.php"); // optional, gets called from within class.phpmailer.php if not already loaded

$mail             = new PHPMailer();

$body             = "gdssdh";
//$body             = eregi_replace("[\]",'',$body);

$mail->IsSMTP(); // telling the class to use SMTP
//$mail->Host       = "ssl://smtp.gmail.com"; // SMTP server
$mail->SMTPDebug  = 1;                     // enables SMTP debug information (for testing)
                                           // 1 = errors and messages
                                           // 2 = messages only
$mail->SMTPAuth   = true;                  // enable SMTP authentication
$mail->SMTPSecure = "ssl";                 // sets the prefix to the servier
$mail->Host       = "smtp.gmail.com";      // sets GMAIL as the SMTP server
$mail->Port       = 465;                   // set the SMTP port for the GMAIL server
$mail->Username   = "user@gmail.com";  // GMAIL username
$mail->Password   = "password";            // GMAIL password

$mail->SetFrom('contact@prsps.in', 'PRSPS');

//$mail->AddReplyTo("user2@gmail.com', 'First Last");

$mail->Subject    = "PRSPS password";

//$mail->AltBody    = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test

$mail->MsgHTML($body);

$address = "user2@yahoo.co.in";
$mail->AddAddress($address, "user2");

//$mail->AddAttachment("images/phpmailer.gif");      // attachment
//$mail->AddAttachment("images/phpmailer_mini.gif"); // attachment

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

?>

Perché imposti l'host due volte e qual è quello giusto?
Emile Bergeron,

Dove trovo il file class.phpmailer.php ?? Solo incollare il codice non è così utile, per favore includi anche una descrizione più dettagliata del codice!
Gene

Mentre parte della sintassi è obsoleta, PHPMailer ha finito per essere la soluzione migliore per me, +1
zoltar

20

SwiftMailer può inviare e-mail utilizzando server esterni.

ecco un esempio che mostra come utilizzare un server Gmail:

require_once "lib/Swift.php";
require_once "lib/Swift/Connection/SMTP.php";

//Connect to localhost on port 25
$swift =& new Swift(new Swift_Connection_SMTP("localhost"));


//Connect to an IP address on a non-standard port
$swift =& new Swift(new Swift_Connection_SMTP("217.147.94.117", 419));


//Connect to Gmail (PHP5)
$swift = new Swift(new Swift_Connection_SMTP(
    "smtp.gmail.com", Swift_Connection_SMTP::PORT_SECURE, Swift_Connection_SMTP::ENC_TLS));

14

Il codice come elencato nella domanda necessita di due modifiche

$host = "ssl://smtp.gmail.com";
$port = "465";

La porta 465 è necessaria per una connessione SSL.


6

Invia posta utilizzando la libreria phpMailer tramite Gmail Scarica i file della libreria da Github

<?php
/**
 * This example shows settings to use when sending via Google's Gmail servers.
 */
//SMTP needs accurate times, and the PHP time zone MUST be set
//This should be done in your php.ini, but this is how to do it if you don't have access to that
date_default_timezone_set('Etc/UTC');
require '../PHPMailerAutoload.php';
//Create a new PHPMailer instance
$mail = new PHPMailer;
//Tell PHPMailer to use SMTP
$mail->isSMTP();
//Enable SMTP debugging
// 0 = off (for production use)
// 1 = client messages
// 2 = client and server messages
$mail->SMTPDebug = 2;
//Ask for HTML-friendly debug output
$mail->Debugoutput = 'html';
//Set the hostname of the mail server
$mail->Host = 'smtp.gmail.com';
// use
// $mail->Host = gethostbyname('smtp.gmail.com');
// if your network does not support SMTP over IPv6
//Set the SMTP port number - 587 for authenticated TLS, a.k.a. RFC4409 SMTP submission
$mail->Port = 587;
//Set the encryption system to use - ssl (deprecated) or tls
$mail->SMTPSecure = 'tls';
//Whether to use SMTP authentication
$mail->SMTPAuth = true;
//Username to use for SMTP authentication - use full email address for gmail
$mail->Username = "username@gmail.com";
//Password to use for SMTP authentication
$mail->Password = "yourpassword";
//Set who the message is to be sent from
$mail->setFrom('from@example.com', 'First Last');
//Set an alternative reply-to address
$mail->addReplyTo('replyto@example.com', 'First Last');
//Set who the message is to be sent to
$mail->addAddress('whoto@example.com', 'John Doe');
//Set the subject line
$mail->Subject = 'PHPMailer GMail SMTP test';
//Read an HTML message body from an external file, convert referenced images to embedded,
//convert HTML into a basic plain-text alternative body
$mail->msgHTML(file_get_contents('contents.html'), dirname(__FILE__));
//Replace the plain text body with one created manually
$mail->AltBody = 'This is a plain-text message body';
//Attach an image file
$mail->addAttachment('images/phpmailer_mini.png');
//send the message, check for errors
if (!$mail->send()) {
    echo "Mailer Error: " . $mail->ErrorInfo;
} else {
    echo "Message sent!";
}

5

Ho avuto anche questo problema. Ho impostato le impostazioni corrette e ho abilitato app meno sicure, ma non ha ancora funzionato. Alla fine ho abilitato questo https://accounts.google.com/UnlockCaptcha e ha funzionato per me. Spero che questo aiuti qualcuno.



4

Per installare Mail.php di PEAR in Ubuntu, esegui il seguente set di comandi:

    sudo apt-get install php-pear
    sudo pear install mail
    sudo pear install Net_SMTP
    sudo pear install Auth_SASL
    sudo pear install mail_mime

0

Ho una soluzione per gli account GSuite che non ha il suffisso "@ gmail.com". Inoltre penso che funzionerà per gli account GSuite con @ gmail.com ma non l'ho mai provato. Per prima cosa dovresti avere i privilegi per modificare l'opzione "allos¿w less secure app" per il tuo account GSuite. Se si dispone dei privilegi (è possibile verificare le impostazioni dell'account-> sicurezza), è necessario disattivare "autenticazione a due fasi", andare alla fine della pagina e impostare su "sì" per consentire applicazioni meno sicure. È tutto. Se non si dispone dei privilegi per modificare tali opzioni, la soluzione per questo thread non funzionerà. Controlla https://support.google.com/a/answer/6260879?hl=en per apportare modifiche all'opzione "consenti meno ...".


0

Ho provato il suggerimento offerto da @shasi kanth, ma non ha funzionato. Ho letto la documentazione e sono state apportate alcune modifiche. Quindi sono riuscito a inviare posta tramite Gmail usando questo codice, dove il venditore / autoload.php è ottenuto dal compositore con il compositore richiede "swiftmailer / swiftmailer: ^ 6.0":

<?php
     require_once 'vendor/autoload.php';
     $transport = (new Swift_SmtpTransport('smtp.gmail.com', 465, 'ssl'))->setUsername ('SendingMail')->setPassword ('Password');

     $mailer = new Swift_Mailer($transport);

     $message = (new Swift_Message('test'))
      ->setFrom(['Sending mail'])
      ->setTo(['Recipient mail'])
      ->setBody('Message')
  ;

     $result = $mailer->send($message);
    ?>

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.