Invio di e-mail con PHP da un server SMTP


132
$from = "someonelse@example.com";
$headers = "From:" . $from;
echo mail ("borutflis1@gmail.com" ,"testmailfunction" , "Oj",$headers);

Ho difficoltà a inviare e-mail in PHP. Ottengo un errore: SMTP server response: 530 SMTP authentication is required.

Ho avuto l'impressione che puoi inviare e-mail senza SMTP per verificare. So che questa posta verrà probabilmente filtrata, ma al momento non importa.

[mail function]
; For Win32 only.
; http://php.net/smtp
SMTP = localhost
; http://php.net/smtp-port
smtp_port = 25

; For Win32 only.
; http://php.net/sendmail-from
sendmail_from = someonelse@example.com

Questa è l'installazione nel php.inifile. Come devo configurare SMTP? Esistono server SMTP che non richiedono alcuna verifica o devo configurare un server da solo?

Risposte:


169

Quando si invia un messaggio di posta elettronica tramite un server che richiede l'autenticazione SMTP, è necessario specificarlo e impostare l'host, il nome utente e la password (e forse la porta se non è quella predefinita - 25).

Ad esempio, di solito uso PHPMailer con impostazioni simili a queste:

$mail = new PHPMailer();

// Settings
$mail->IsSMTP();
$mail->CharSet = 'UTF-8';

$mail->Host       = "mail.example.com"; // SMTP server example
$mail->SMTPDebug  = 0;                     // enables SMTP debug information (for testing)
$mail->SMTPAuth   = true;                  // enable SMTP authentication
$mail->Port       = 25;                    // set the SMTP port for the GMAIL server
$mail->Username   = "username"; // SMTP account username example
$mail->Password   = "password";        // SMTP account password example

// Content
$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';

$mail->send();

Puoi trovare ulteriori informazioni su PHPMailer qui: https://github.com/PHPMailer/PHPMailer


21
+1 per phpMailer - è l'alternativa alle persone sane alla mail()funzione integrata di PHP .
DSC

8
Vale la pena notare per coloro che si imbattono in questa risposta che PHPMailer è anche incorporato in WordPress e può essere configurato utilizzando il 'phpmailer_init'gancio di azione. È un modo conveniente per configurare WordPress per la posta SMTP o Amazon SES (che supporta le connessioni SMTP).
Matt van Andel,

1
PHP Mailer può essere utilizzato negli script a pagamento?
Luka,

2
@Luka Sì, lo è. Secondo il loro file di licenza, PHPMailer utilizza la licenza LGPL 2.1, che ne consente l'utilizzo commerciale.
Alejandro,

Devo fare qualcosa di speciale per utilizzare questo codice? Dove lo metto? Posso chiamarlo con un modulo HTML5 con una richiesta POST? Come posso inviare un'e-mail dopo aver creato questo oggetto PHPMailer?
Aaron Franke,

53
<?php
ini_set("SMTP", "aspmx.l.google.com");
ini_set("sendmail_from", "YOURMAIL@gmail.com");

$message = "The mail message was sent with the following mail setting:\r\nSMTP = aspmx.l.google.com\r\nsmtp_port = 25\r\nsendmail_from = YourMail@address.com";

$headers = "From: YOURMAIL@gmail.com";

mail("Sending@provider.com", "Testing", $message, $headers);
echo "Check your email now....&lt;BR/>";
?>

o, per maggiori dettagli, continua a leggere .


L'IP che stai utilizzando per inviare la posta non è autorizzato a 550-5.7.1 inviare la posta direttamente ai nostri server. Ottengo questo errore. tutto ciò che voglio è un relay di posta aperto.
Borut Flis,

Non ho un IP statico. Conosci qualche relay di posta aperta.
Borut Flis,

1
Consulta inoltre support.google.com/a/answer/176600?hl=it per i relè SMTP di Google.
Fyrye,

5
Questa è la risposta migliore per i php mail()problemi della funzione Godaddy - 2017 - non dovrebbe scaricare PHPMailer o qualche altra risorsa di terze parti - grazie
soulshined

4
Il link "LEGGI ON" è interrotto
vladkras il

46

Per gli utenti Unix, mail () utilizza effettivamente il comando Sendmail per inviare e-mail. Invece di modificare l'applicazione, è possibile cambiare l'ambiente. msmtp è un client SMTP con sintassi CLI compatibile con Sendmail che significa che può essere usato al posto di Sendmail. Richiede solo una piccola modifica al tuo php.ini.

sendmail_path = "/usr/bin/msmtp -C /path/to/your/config -t"

Quindi anche la funzione lowly mail () può funzionare con bontà SMTP. È super utile se stai cercando di connettere un'applicazione esistente a servizi di posta come sendgrid o mandrill senza modificare l'applicazione.


1
Ottima soluzione, usala su più server ora!
raice,

3
L'implementazione sui container Docker per le app che non utilizzano una libreria di posta.
Batandwa,

Eccellente percorso di migrazione dalla vaniglia mail()a qualcosa che supporta SMTP. Grazie!
Rinogo,

MSMTP è disponibile anche per Windows. I download ovvi hanno la versione 1.4. La versione che ho trovato da qualche parte è 1.6.2. Non so se esiste un 1.8.6 per Windows.
Bilbo,

L'autore ha smesso di fornire file binari di Windows prima del febbraio 2016.
Bilbo,

17

Il problema è che la mail()funzione PHP ha una funzionalità molto limitata. Esistono diversi modi per inviare posta da PHP.

  1. mail()utilizza il server SMTP sul tuo sistema. Esistono almeno due server che è possibile utilizzare su Windows: hMailServer e xmail . Ho trascorso diverse ore a configurarli e ad alzarli. Il primo è più semplice secondo me. Al momento, hMailServer funziona su Windows 7 x64.
  2. mail()utilizza il server SMTP su macchina remota o virtuale con Linux. Naturalmente, un vero servizio di posta come Gmail non consente la connessione diretta senza credenziali o chiavi. È possibile configurare una macchina virtuale o utilizzarne una situata nella propria LAN. La maggior parte delle distribuzioni Linux hanno un mail server pronto all'uso. Configuralo e divertiti. Uso exim4 predefinito su Debian 7 che ascolta la sua interfaccia LAN.
  3. Le biblioteche postali utilizzano connessioni dirette. Le librerie sono più facili da configurare. Ho usato SwiftMailer e invia perfettamente la posta dall'account Gmail. Penso che anche PHPMailer sia abbastanza buono.

Non importa quale sia la tua scelta, ti consiglio di usare un livello di astrazione. Puoi usare la libreria PHP sulla tua macchina di sviluppo che esegue Windows e semplicemente mail()funzionare sulla macchina di produzione con Linux. Il livello di astrazione consente di scambiare i driver di posta in base al sistema su cui è in esecuzione l'applicazione. Crea una MyMailerclasse o un'interfaccia astratta con il send()metodo astratto . Eredita due classi MyPhpMailere MySwiftMailer. Implementare il send()metodo in modo appropriato.


17

Ecco un modo per farlo con PHP PEAR

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

$from = '<your@mail.com>'; //change this to your email address
$to = '<someone@mail.com>'; // change to address
$subject = 'Insert subject here'; // subject of mail
$body = "Hello world! this is the content of the email"; //content of mail

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

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

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

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

Se usi Gmail SMTP, ricorda di abilitare SMTP nel tuo account Gmail, sotto le impostazioni

EDIT: Se non riesci a trovare Mail.php su debian / ubuntu puoi installare php-pear con

sudo apt install php-pear

Quindi installare l'estensione di posta elettronica:

sudo pear install mail
sudo pear install Net_SMTP
sudo pear install Auth_SASL
sudo pear install mail_mime

Quindi dovresti essere in grado di caricarlo semplicemente require_once "Mail.php" altrimenti si trova qui:/usr/share/php/Mail.php


1
require_once ('/usr/share/somewhere/Mail.php');

10

Esistono alcuni server SMTP che funzionano senza autenticazione, ma se il server richiede l'autenticazione, non c'è modo di aggirarlo.

Le funzioni di posta elettronica integrate di PHP sono molto limitate: specificare il server SMTP è possibile solo in Windows. Su * nix,mail() utilizzerà i binari del sistema operativo.

Se si desidera inviare e-mail a un server SMTP arbitrario in rete, prendere in considerazione l'utilizzo di una libreria come SwiftMailer . Ciò ti consentirà di utilizzare, ad esempio, i server in uscita di Google Mail.


2

Nei casi in cui stai ospitando un sito Wordpress su Linux e hai accesso al server, puoi risparmiare alcuni mal di testa installando msmtp che ti consente di inviare via smtp dalla funzione php mail () standard. msmtp è un'alternativa più semplice a postfix che richiede un po 'più di configurazione.

Ecco i passaggi:

Installa msmtp

sudo apt-get install msmtp-mta ca-certificates

Crea un nuovo file di configurazione:

sudo nano /etc/msmtprc

... con le seguenti informazioni di configurazione:

# Set defaults.    
defaults

# Enable or disable TLS/SSL encryption.
tls on
tls_starttls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt

# Set up a default account's settings.
account default
host <smtp.example.net>
port 587
auth on
user <username@example.net>
password <password>
from <address-to-receive-bounces@example.net>
syslog LOG_MAIL

Devi sostituire i dati di configurazione rappresentati da tutto in "<" e ">" (inclusi, rimuovili). Per host / nome utente / password, utilizzare le normali credenziali per l'invio di posta tramite il proprio provider di posta.

Di 'a PHP di usarlo

sudo nano /etc/php5/apache2/php.ini

Aggiungi questa riga singola:

sendmail_path = /usr/bin/msmtp -t

La documentazione completa è disponibile qui:

https://marlam.de/msmtp/


ssmtp è anche una soluzione vedi (guida francese): elliptips.info/guide-debian-7-envoi-de-mails-ligne-de-commande
ıɾuǝʞ

0

Per un altro approccio, puoi prendere un file come questo:

From: Sunday <sunday@gmail.com>
To: Monday <monday@gmail.com>
Subject: Day

Tuesday Wednesday

e invia così:

<?php
$a1 = ['monday@gmail.com'];
$r1 = fopen('a.txt', 'r');
$r2 = curl_init('smtps://smtp.gmail.com');
curl_setopt($r2, CURLOPT_MAIL_RCPT, $a1);
curl_setopt($r2, CURLOPT_NETRC, true);
curl_setopt($r2, CURLOPT_READDATA, $r1);
curl_setopt($r2, CURLOPT_UPLOAD, true);
curl_exec($r2);

https://php.net/function.curl-setopt

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.