Ho migrato WordPress su Docker, e complice Jetpack, il plugin ufficiale dello stesso produttore, alcune mail le invia lui, non il server. Questo mi ha indotto (in retrospettiva direi anche stupidamente) a ritenere che le mail partissero come sempre, ed invece no. Mi accorgo solo dopo giorni che erano arrivati commenti e la form di contatto era stata usata senza che ricevessi alcuna notifica.
Nella pagina di Docker per WordPress in effetti, nel mezzo del “pippone” esplicativo c’era scritto:
This image does not provide any additional PHP extensions or other libraries, even if they are required by popular plugins (e.g. it cannot send e-mails).
Nel mio caso poi c’era anche il discorso del fornitore, per cui ci voleva la configurazione blindata con SPF/DKIM sul dominio, e una procedura per attivare l’SMTP obbligatorio. Parte che tralascio per non fare confusione.
Il problema era lato Docker, non essendoci Sendmail installato nell’immagine di WordPress, come buttare fuori le mail da quel Container?
Fortunatamente dalla versione 5.1 hanno inserito la libreria di PHPMailer, anche se non è attiva.
Per prima cosa ho preparato delle nuove voci di “Environment” sul “docker-compose.yml”
environment:
SMTP_SERVER : hosting
SMTP_PORT: 587
SMTP_USERNAME: pippo
SMTP_PASSWORD: pluto
SMTP_FROM: una@mail
SMTP_FROM_NAME: tosolini.info
A questo punto sono andato a replicare queste variabili dentro “wp-config.php” di WordPress.
/** PHPMailer wp-config.php details */
define( 'SMTP_USER', getenv_docker('SMTP_USERNAME', '') ); // your SMTP Username
define( 'SMTP_PASS', getenv_docker('SMTP_PASSWORD', '') ); // your SMTP Password
define( 'SMTP_HOST', getenv_docker('SMTP_SERVER', '') ); // mail server hostname
define( 'SMTP_FROM', getenv_docker('SMTP_FROM', '') ); // from email address
define( 'SMTP_NAME', getenv_docker('SMTP_FROM_NAME', 'Tosolini info') ); // Website Name
define( 'SMTP_PORT', getenv_docker('SMTP_PORT', '587') ); // use SMTP port number - 25, 465 or 587
define( 'SMTP_SECURE', 'tls' ); // for Encryption use - ssl or tls
define( 'SMTP_AUTH', true ); // to enable SMTP authentication use (true or false)
define( 'SMTP_DEBUG', 0 );
Ed infine, nel file “functions.php” del proprio Tema Grafico, la parte finale di questa catena.
// PHPMailer functions.php details
add_action( 'phpmailer_init', 'my_smtp_phpemailer' );
function my_smtp_phpemailer( $phpmailer ) {
$phpmailer->isSMTP();
$phpmailer->Host = SMTP_HOST;
$phpmailer->Port = SMTP_PORT;
$phpmailer->Username = SMTP_USER;
$phpmailer->Password = SMTP_PASS;
$phpmailer->SMTPAuth = SMTP_AUTH;
$phpmailer->SMTPSecure = SMTP_SECURE;
$phpmailer->From = SMTP_FROM;
$phpmailer->FromName = SMTP_NAME;
}
Da qui in poi tutte le mail di competenza di Docker sono inviate tramite “phpmailer” agganciandosi direttamente all’SMTP del fornitore.
Ecco, questo è un punto importante, il vostro fornitore deve permetter l’utilizzo di un SMTP esterno. Alla peggio si può provare ad utilizzare i classici Gmail e Outlook, se non altro finché lo permettono.
Nel complesso non è una idea che mi piace molto, nel senso che avrei preferito un Relay SMTP dentro Docker, ma allo stesso tempo molte altre immagini hanno già Sendmail installato di base. Quindi il relay ha senso fino ad un certo punto. Ci penserò in futuro se nasce questa esigenza.