{"id":122,"date":"2024-03-19T00:00:00","date_gmt":"2024-03-18T23:00:00","guid":{"rendered":"https:\/\/helloblog.io\/it\/acorn-mail-smtp-wordpress-test-cli\/"},"modified":"2026-01-20T06:32:46","modified_gmt":"2026-01-20T05:32:46","slug":"acorn-mail-smtp-wordpress-test-cli","status":"publish","type":"post","link":"https:\/\/helloblog.io\/it\/acorn-mail-smtp-wordpress-test-cli\/","title":{"rendered":"Acorn Mail: SMTP su WordPress senza plugin fragili (e con test via CLI)"},"content":{"rendered":"\n<p>Chiunque abbia dovuto rendere \u201caffidabile\u201d l\u2019invio email su WordPress lo sa: tra differenze di ambiente, credenziali che cambiano, firewall, porte bloccate e plugin SMTP che fanno da scatola nera, finisci facilmente a perdere tempo su un problema che dovrebbe essere banale.<\/p>\n\n\n\n<p>In pi\u00f9, il quadro non \u00e8 sempre rassicurante: i plugin SMTP non solo possono essere instabili, ma possono anche introdurre superfici d\u2019attacco (un esempio citato spesso in questo contesto \u00e8 la vulnerabilit\u00e0 <a href=\"https:\/\/nvd.nist.gov\/vuln\/detail\/CVE-2023-6875\">CVE-2023-6875<\/a>). Anche quando tutto sembra configurato correttamente, \u201ctestare le credenziali\u201d diventa frustrante: pochi log, messaggi d\u2019errore vaghi, e nessun flusso davvero chiaro per capire cosa sta succedendo.<\/p>\n\n\n\n<p>Da qui l\u2019idea di <strong>Acorn Mail<\/strong>, un package open source dell\u2019ecosistema Roots pensato per semplificare configurazione e test SMTP in progetti WordPress che usano <strong>Acorn<\/strong> (il framework\/bridge che porta un\u2019esperienza pi\u00f9 moderna e \u201cLaravel-like\u201d nello sviluppo WordPress, con comandi WP-CLI dedicati).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Cos\u2019\u00e8 Acorn Mail e cosa risolve (davvero)<\/h2>\n\n\n\n<p><strong>Acorn Mail<\/strong> \u00e8 un pacchetto installabile via Composer che punta a due obiettivi pratici:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Configurazione SMTP pi\u00f9 prevedibile e portabile tra ambienti, usando variabili d\u2019ambiente (env).<\/li>\n\n\n<li>Un comando CLI per inviare una mail di test e mostrare in modo pulito gli errori lungo la pipeline di invio.<\/li>\n\n<\/ul>\n\n\n\n<p>Sotto al cofano, quando le credenziali sono presenti (non vuote), Acorn Mail <strong>si aggancia automaticamente all\u2019istanza di <code>PHPMailer<\/code> di WordPress<\/strong> e la configura per usare SMTP. In pratica: niente \u201csettaggi\u201d dispersi in una UI di plugin e meno magia difficile da debuggare.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Installazione: un Composer require e sei operativo<\/h2>\n\n\n\n<p>Acorn Mail si installa affiancandolo ad Acorn tramite Composer:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#24292e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>composer require roots\/acorn-mail\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#B392F0\">composer<\/span><span style=\"color:#9ECBFF\"> require<\/span><span style=\"color:#9ECBFF\"> roots\/acorn-mail<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Una volta installato, la configurazione base passa dalle classiche variabili d\u2019ambiente. Quelle supportate sono:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#24292e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>MAIL_HOST=\nMAIL_PORT=\nMAIL_USERNAME=\nMAIL_PASSWORD=\nMAIL_FROM_ADDRESS=\nMAIL_FROM_NAME=\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#E1E4E8\">MAIL_HOST<\/span><span style=\"color:#F97583\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">MAIL_PORT<\/span><span style=\"color:#F97583\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">MAIL_USERNAME<\/span><span style=\"color:#F97583\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">MAIL_PASSWORD<\/span><span style=\"color:#F97583\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">MAIL_FROM_ADDRESS<\/span><span style=\"color:#F97583\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">MAIL_FROM_NAME<\/span><span style=\"color:#F97583\">=<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-group callout callout-info is-style-info is-layout-flow wp-block-group-is-layout-flow\" style=\"border-width:1px;border-radius:8px;padding-top:1rem;padding-right:1.5rem;padding-bottom:1rem;padding-left:1.5rem\">\n\n<h4 class=\"wp-block-heading callout-title\">Perch\u00e9 env?<\/h4>\n\n\n<p>Nel workflow moderno (local \u2192 staging \u2192 produzione) le variabili d\u2019ambiente ti permettono di cambiare provider\/credenziali senza toccare codice o database, e senza trascinarti dietro configurazioni \u201ca mano\u201d tra installazioni.<\/p>\n\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Configurazione avanzata: pubblicare il file mail.php<\/h2>\n\n\n\n<p>Se ti serve un controllo pi\u00f9 fine rispetto alle sole env, Acorn Mail prevede la pubblicazione del file di configurazione <code>mail.php<\/code> tramite un comando dedicato di Acorn:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#24292e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>wp acorn mail:config\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#B392F0\">wp<\/span><span style=\"color:#9ECBFF\"> acorn<\/span><span style=\"color:#9ECBFF\"> mail:config<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Questo passaggio \u00e8 utile quando vuoi rendere la configurazione pi\u00f9 esplicita o quando il progetto richiede opzioni aggiuntive rispetto alla configurazione minima.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Il punto forte: test SMTP via CLI (con errori leggibili)<\/h2>\n\n\n\n<p>Il \u201cpain point\u201d pi\u00f9 grosso, nella pratica, \u00e8 capire perch\u00e9 l\u2019invio fallisce. Acorn Mail include un comando per inviare una mail di test:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#24292e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>wp acorn mail:test [--to=]\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#B392F0\">wp<\/span><span style=\"color:#9ECBFF\"> acorn<\/span><span style=\"color:#9ECBFF\"> mail:test<\/span><span style=\"color:#E1E4E8\"> [--to=]<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>L\u2019idea \u00e8 semplice ma estremamente efficace: specifichi un destinatario (con <code>--to=<\/code>) e il comando prova a spedire la mail mostrando in output gli errori che emergono durante il processo. Questo rende molto pi\u00f9 rapido isolare problemi tipici come host errato, porta sbagliata, credenziali non valide o handshake TLS che non va a buon fine.<\/p>\n\n\n\n<div class=\"wp-block-group callout callout-warning is-style-warning is-layout-flow wp-block-group-is-layout-flow\" style=\"border-width:1px;border-radius:8px;padding-top:1rem;padding-right:1.5rem;padding-bottom:1rem;padding-left:1.5rem\">\n\n<h4 class=\"wp-block-heading callout-title\">Nota operativa<\/h4>\n\n\n<p>Acorn Mail interviene su <code>PHPMailer<\/code> solo quando le variabili di configurazione risultano presenti (non vuote). Se il test non sembra usare SMTP, la prima cosa da verificare \u00e8 che le env siano caricate correttamente nell\u2019ambiente in cui stai eseguendo WP-CLI.<\/p>\n\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Quando ha senso adottarlo in un progetto WordPress<\/h2>\n\n\n\n<p>Acorn Mail \u00e8 particolarmente sensato se lavori gi\u00e0 con lo stack Roots\/Acorn e vuoi:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Ridurre la dipendenza da plugin SMTP generici (e dai loro pannelli di configurazione).<\/li>\n\n\n<li>Tenere le credenziali fuori dal database e pi\u00f9 allineate alle pratiche DevOps.<\/li>\n\n\n<li>Avere un flusso ripetibile per testare l\u2019invio email durante setup, deploy o troubleshooting.<\/li>\n\n<\/ul>\n\n\n\n<p>In generale, sposta l\u2019invio email verso una configurazione pi\u00f9 \u201cda applicazione\u201d, dove i parametri stanno negli env e la diagnostica passa da strumenti da riga di comando invece che da tentativi alla cieca nel back-office.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Riferimenti ufficiali<\/h2>\n\n\n\n<p>Repository e documentazione del progetto: <strong><a href=\"https:\/\/github.com\/roots\/acorn-mail\">Acorn Mail<\/a><\/strong>.<\/p>\n\n\n<div class=\"references-section\">\n                <h2>Riferimenti \/ Fonti<\/h2>\n                <ul class=\"references-list\"><li><a href=\"https:\/\/roots.io\/announcing-acorn-mail\/\" target=\"_blank\" rel=\"noopener noreferrer\">Announcing Acorn Mail<\/a><\/li><li><a href=\"https:\/\/github.com\/roots\/acorn-mail\" target=\"_blank\" rel=\"noopener noreferrer\">roots\/acorn-mail<\/a><\/li><li><a href=\"https:\/\/nvd.nist.gov\/vuln\/detail\/CVE-2023-6875\" target=\"_blank\" rel=\"noopener noreferrer\">CVE-2023-6875 Detail<\/a><\/li><\/ul>\n            <\/div>","protected":false},"excerpt":{"rendered":"<p>Configurare SMTP su WordPress tra dev, staging e produzione spesso \u00e8 pi\u00f9 complicato del previsto, soprattutto quando ti affidi a plugin opachi. Acorn Mail propone un approccio pi\u00f9 pulito: configurazione via env e un comando CLI per testare l\u2019invio con errori leggibili.<\/p>\n","protected":false},"author":19,"featured_media":121,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[16],"tags":[4,64,3,5,10],"class_list":["post-122","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ecosistema-wordpress","tag-acorn","tag-cli","tag-roots","tag-smtp","tag-wordpress"],"_links":{"self":[{"href":"https:\/\/helloblog.io\/it\/wp-json\/wp\/v2\/posts\/122","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/helloblog.io\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/helloblog.io\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/helloblog.io\/it\/wp-json\/wp\/v2\/users\/19"}],"replies":[{"embeddable":true,"href":"https:\/\/helloblog.io\/it\/wp-json\/wp\/v2\/comments?post=122"}],"version-history":[{"count":1,"href":"https:\/\/helloblog.io\/it\/wp-json\/wp\/v2\/posts\/122\/revisions"}],"predecessor-version":[{"id":148,"href":"https:\/\/helloblog.io\/it\/wp-json\/wp\/v2\/posts\/122\/revisions\/148"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/helloblog.io\/it\/wp-json\/wp\/v2\/media\/121"}],"wp:attachment":[{"href":"https:\/\/helloblog.io\/it\/wp-json\/wp\/v2\/media?parent=122"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/helloblog.io\/it\/wp-json\/wp\/v2\/categories?post=122"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/helloblog.io\/it\/wp-json\/wp\/v2\/tags?post=122"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}