Hoppa till innehållet
Problemlösning

WordPress skickar inte e-post: SMTP, SPF och DKIM

Närbild på en laptopskärm med inkorgen öppen i ett e-postprogram
Foto: Stephen Phillips – Hostreviews.co.uk / Unsplash

Nästan alltid är orsaken densamma: WordPress skickar e-post genom PHP:s mail() direkt från webbservern, utan autentisering och ofta från en adress som webbservern inte får använda. Mottagarens server kan inte se att mejlet är äkta och sorterar bort det, antingen i skräpposten eller helt tyst. Det du gör är att skicka via ett SMTP-konto eller en transaktionsmejltjänst, från en adress på sajtens egen domän, och att publicera SPF, DKIM och DMARC i DNS för den domänen.

Jag går igenom hur du ser vilken orsak som gäller dig, i den ordning jag själv felsöker, och sedan vad du gör åt det. Längst ner finns hur SPF och DKIM sätts hos Loopia och Oderland.

Symtomen avslöjar en del

Inga mejl alls, inte ens lösenordsåterställning till admin, betyder att sändningen är trasig. Antingen når wp_mail() ingen fungerande mailer, eller så stoppar ett plugin den. Det här går att hitta på några minuter.

Mejlen skickas men hamnar i skräpposten hos Gmail eller Outlook betyder att sändningen fungerar men att domänen saknar autentisering. Det är det vanligaste läget för en butik på delat webbhotell.

Mejl till vissa mottagare kommer fram, andra inte, pekar nästan alltid på SPF eller DMARC. Stora mottagare som Gmail och Microsoft är hårdare än ett litet företags egen server.

Orsaker i sannolikhetsordning

PHP mail() utan autentisering

Ur kartongen anropar wp_mail() PHPMailer med isMail(), alltså PHP:s inbyggda mail(). Webbservern lämnar mejlet till det lokala sendmail-programmet, som i sin tur försöker leverera direkt till mottagaren. Ingen inloggning, ingen signatur, och mejlet kommer från en IP-adress som delas med hundratals andra kunder på samma server. Det är inte fel i sig, men det kräver att webbhotellet har gjort rätt med SPF och DKIM för just den servern, och det är sällan fallet för domäner som inte har sin e-post där.

SPF, DKIM och DMARC saknas för domänen

Sedan februari 2024 kräver Google att alla som skickar till Gmail har SPF eller DKIM, och att den som skickar mer än 5 000 mejl per dag har båda plus DMARC. Saknas posterna är det inte en fråga om mejlet hamnar i skräpposten, utan när.

Avsändaradressen ligger på fel domän

Standardavsändaren i WordPress är wordpress@ följt av sajtens domän, med namnet ”WordPress”. Det ser skräpigt ut men är tekniskt rätt domän. Problemet uppstår när någon sätter avsändaradressen till en Gmail-adress eller till en adress på en annan domän än sajten. Då påstår webbservern att den skickar för gmail.com, och det får den inte.

Webbhotellet blockerar utgående SMTP

Vissa webbhotell blockerar utgående trafik på port 25 från webbservern, och ibland även 465 och 587. Det märks först när du har satt upp ett SMTP-plugin och testmejlet aldrig lämnar servern. Felet i pluginets logg är då en timeout mot SMTP-servern, inte ett autentiseringsfel.

Ett plugin kapar sändningen

wp_mail() är en pluggbar funktion, och vilket plugin som helst kan ersätta den eller kortsluta den via pre_wp_mail. Två SMTP-plugin samtidigt, ett gammalt kontaktformulär med egen SMTP-inställning eller ett säkerhetsplugin som stänger av e-post i staging är de fall jag sett.

Så kontrollerar du

Börja med ett testmejl till en Gmail-adress du kontrollerar, till exempel genom att begära ett nytt lösenord på inloggningssidan. Kommer det fram, öppna det, välj Visa original och läs raden Authentication-Results. Där står spf, dkim och dmarc med pass eller fail för var och en.

Nästa steg är mail-tester.com. Sajten ger dig en engångsadress att skicka till, och svaret är ett betyg på tio-gradig skala med en lista över vad som saknas. Skicka ett riktigt mejl från sajten, inte ett tomt, eftersom innehållet också bedöms.

Kommer inget mejl fram alls behöver du loggning. Både FluentSMTP och Post SMTP loggar varje anrop till wp_mail() med fel från PHPMailer, så att du ser om mejlet ens lämnade WordPress. Står det ingenting i loggen är det ett plugin som stoppar sändningen före PHPMailer. Avaktivera plugin ett i taget tills loggen får rader.

Åtgärd: skicka via SMTP eller en transaktionstjänst

Ett SMTP-plugin får WordPress att logga in på en riktig e-postserver i stället för att lämna mejlet till webbserverns sendmail. Jag använder tre beroende på kund.

FluentSMTP är gratis utan låsta funktioner enligt pluginsidan, loggar alla mejl och kan ha flera anslutningar med reserv om en faller. Det är mitt förstaval för små och mellanstora butiker.

WP Mail SMTP har en gratisversion med de flesta mailers, bland annat vanlig SMTP, Gmail, Brevo, Mailgun, SendGrid och Postmark. Loggning, Microsoft 365 och Amazon SES kräver Pro, som kostar 49 USD första året för en sajt enligt prissidan den 12 oktober 2026.

Post SMTP har en gratisversion med grundläggande loggning och betalversioner för fler mailers och återsändning. Det fungerar, men jag ser ingen anledning att välja det före FluentSMTP i en ny installation.

Vilken server du loggar in mot är viktigare än pluginet. Webbhotellets eget SMTP-konto räcker för en sajt som skickar några hundra mejl i månaden. En butik med många ordrar, eller en sajt vars e-post ligger hos Microsoft 365, mår bättre av en transaktionstjänst som Postmark, Brevo eller Amazon SES, där du får egen DKIM-signering och leveransrapporter.

Ett litet SMTP-plugin utan extra funktioner

Behöver du bara vanlig SMTP finns ett alternativ till de stora pluginen. WPU SMTP är det här pluginet wordpressutveckling.se själv använder, med Loopias SMTP-server. Det gör en sak: kopplar wp_mail() till en SMTP-server via PHPMailer, så att all e-post från WordPress skickas inloggad i stället för via webbserverns mail().

Inställningarna ligger under Inställningar, SMTP: server, port, kryptering, användare, lösenord och avsändare. Där finns en knapp för testmejl, och misslyckas sändningen visas det senaste felmeddelandet på samma sida, så att du ser om det var inloggningen eller en blockerad port. Pluginet gör ingenting förrän server, användare och lösenord är ifyllda.

Lösenordet sparas krypterat med libsodium, som följer med PHP, och nyckeln tas från saltnycklarna i sajtens wp-config.php. Skälet är att databasen sprids mer än man tror: exporter, backuper, staging-kopior. Ett SMTP-lösenord i klartext i wp_options följer med överallt, och med det kan vem som helst skicka mejl i ditt namn. Krypterat är det oanvändbart utan wp-config.php. Vill du låsa värden, till exempel på en kundsajt, kan du i stället sätta dem som konstanter i wp-config.php; då går konstanten före inställningssidan.

Sätt rätt avsändare med ett filter

Standardavsändaren wordpress@din-domän.se får SPF och DKIM att stämma, men ser illa ut. Vill du ha en riktig adress och ett riktigt namn utan att gå via ett plugin lägger du de här två filtren i child-temats functions.php eller i ett eget litet plugin. Adressen måste ligga på samma domän som dina SPF- och DKIM-poster.

<?php
// Keep the sender on the site's own domain so SPF, DKIM and the From header align.
add_filter( 'wp_mail_from', 'wpu_mail_from_address' );
function wpu_mail_from_address( $from_email ) {
	return 'noreply@example.se';
}

add_filter( 'wp_mail_from_name', 'wpu_mail_from_name' );
function wpu_mail_from_name( $from_name ) {
	return 'Exempelbutiken';
}

WooCommerce har egna fält för avsändarnamn och avsändaradress under WooCommerce, Inställningar, E-post, och de gäller ordermejlen. Filtren ovan täcker allt annat: lösenordsmejl, kommentarer, formulärplugin som skickar via wp_mail(). Har du ett SMTP-plugin installerat sätter det oftast avsändaren själv, och då behöver du inte filtret.

SPF, DKIM och DMARC i DNS

Alla tre är TXT-poster i domänens DNS. Exemplen nedan är generiska. De faktiska värdena kommer från den som skickar mejlet, alltså webbhotellet eller transaktionstjänsten.

example.se.                    TXT  "v=spf1 include:spf.leverantoren.se -all"
valjare._domainkey.example.se. TXT  "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A..."
_dmarc.example.se.             TXT  "v=DMARC1; p=none; rua=mailto:dmarc@example.se"

SPF listar vilka servrar som får skicka för domänen. En domän får bara ha en SPF-post. Skickar du både från webbhotellet och från en transaktionstjänst lägger du båda som include: i samma post. DKIM är en publik nyckel som mottagaren använder för att kontrollera signaturen; väljaren före _domainkey bestämmer avsändaren och du kan ha flera. DMARC talar om vad mottagaren ska göra när båda misslyckas. Börja med p=none och läs rapporterna innan du skärper till p=quarantine.

Så gör du hos svenska webbhotell

Loopia lägger till SPF automatiskt när domänens DNS ligger på deras namnservrar, och skapar DKIM-nycklar för domänen när du skapar den första e-postadressen i Kundzonen. Ligger DNS någon annanstans lägger du själv in v=spf1 include:spf.loopia.se -all som TXT på @. DKIM för en annan avsändare lägger du till under DNS-editorn med Lägg till subdomän, där värdnamnet och värdet kommer från den tjänst som signerar. Loopia skriver uttryckligen att de inte hjälper till med DMARC, så den posten får du sätta själv.

Oderland samlar allt under Levererbarhet för e-post i cPanel. Klicka Hantera på domänen så ser du SPF-posten med en editor och DKIM-posten med kopieringsknappar. Använder du Oderlands DNS och skickar bara via deras servrar behöver du normalt inte göra något. Ligger DNS hos någon annan lägger du till +include:_vsp.oderland.com och webbserverns IP-adress i din SPF-post, och kopierar DKIM-posten till din DNS-leverantör. Är posten för lång för leverantören finns valet Delad som delar upp den.

Inleed har en guide för att testa levererbarhet med mail-tester via webbmailen, men ingen egen sida om SPF och DKIM för vanlig e-post. Posterna finns under DNS Management i DirectAdmin, där SPF-posten innehåller spf.inleed.se.

Fallgropar

Två SPF-poster på samma domän gör att båda ogiltigförklaras. Det händer när någon klistrar in transaktionstjänstens post bredvid webbhotellets i stället för att slå ihop dem.

Avsändaradressen i ett formulärplugin satt till besökarens adress får varje mejl att se ut som förfalskning. Sätt avsändaren till din egen domän och lägg besökarens adress i Reply-To.

Sidcache och e-post hänger inte ihop, men en övergiven staging-kopia gör det. Jag har sett butiker där staging-sajten skickade ordermejl till riktiga kunder eftersom SMTP-inställningarna följde med i kopian. Stäng av sändningen i staging med ett filter på pre_wp_mail.

DNS-ändringar slår igenom med fördröjning, hos Loopia upp till 24 timmar enligt deras egen sida. Testa inte om efter fem minuter och dra slutsatser.

Pihlfelt & Vänner

Kommer mejlen fortfarande inte fram?

Vi går igenom avsändare, SMTP och DNS-posterna för domänen och skickar testmejl tills orderbekräftelserna landar i inkorgen.

Beskriv problemet

Vanliga frågor

Varför kommer ordermejlen från WooCommerce inte fram?

WooCommerce skickar via samma wp_mail() som allt annat i WordPress. Kommer inga lösenordsmejl fram heller är det sändningen som är trasig, inte WooCommerce. Kommer bara ordermejlen bort är det oftast avsändaradressen under WooCommerce, Inställningar, E-post som ligger på fel domän.

Räcker det med SPF?

Nej. Google kräver SPF eller DKIM för alla avsändare, och båda plus DMARC för den som skickar mer än 5 000 mejl per dag till Gmail. Sätt båda från början, så slipper du göra om jobbet när volymen växer.

Måste jag ha ett SMTP-plugin om webbhotellet redan har SPF och DKIM?

Inte alltid. Ligger både sajt och e-post hos samma webbhotell med deras DNS kan PHP mail() fungera. Så fort e-posten ligger hos Microsoft 365 eller Google Workspace skickar webbservern från en adress den inte får använda, och då behöver du SMTP eller en transaktionstjänst.

Vad ska DMARC-policyn vara?

Börja med p=none och en rua-adress så att du får rapporter. Höj till p=quarantine när rapporterna visar att alla dina avsändare, även nyhetsbrev och ekonomisystem, klarar SPF eller DKIM.

Hur ser jag om ett mejl klarade SPF och DKIM?

Öppna mejlet i Gmail, välj Visa original och läs raden Authentication-Results. Där står spf=pass, dkim=pass och dmarc=pass om allt är rätt.

Källor

Testad med

  • WordPress 7.1.3
  • WooCommerce 11.2.1
  • PHP 8.4

Senast testad 14 oktober 2026

Fungerar inte koden hos dig, eller hittade du ett fel? Berätta

Hjälpte det här inlägget?

Läs vidare

Alla inlägg