Dokumentacja MevvMail

Dostarczyć wiadomość i móc to udowodnić.

MevvMail przejmuje wp_mail(), wysyła przez skonfigurowane połączenia, ponawia to, co zawiodło, i zapisuje każdą próbę w tabeli we własnej bazie danych. Ten przewodnik obejmuje instalację, ekran połączeń pole po polu, kolejność, w jakiej przechodzony jest łańcuch, dziennik, ramkę zamówienia WooCommerce, ekrany Pro oraz to, co sprawdzić, gdy wiadomość nie dociera.

Co robi

WordPress przekazuje każdą wiadomość własnej funkcji mail() serwera, która nie uwierzytelnia nadawcy. Skrzynki pocztowe traktują taką pocztę podejrzliwie, a gdy zostanie odrzucona, nikt się o tym nie dowiaduje: wp_mail() zwraca false, strona działa dalej, a resetowanie hasła albo potwierdzenie zamówienia po prostu znika.

MevvMail zastępuje tę ścieżkę. Wysyła przez uwierzytelnione połączenie skonfigurowane przez użytkownika, przechodzi listę połączeń w kolejności priorytetów, aż któreś przyjmie wiadomość, ponawia te, które zawiodły, i pokazuje status dostarczenia wiadomości zamówienia WooCommerce wprost na ekranie zamówienia.

Kiedy jej używać
Sklep wysyła wiadomości o zamówieniach, koncie albo faktury, a na pytanie „czy poszła?” trzeba móc odpowiedzieć zapisem, a nie domysłem.
Dopóki nie zostanie skonfigurowany, nic nie zmienia
Gdy nie zdefiniowano żadnego połączenia, filtr oddaje wysyłkę z powrotem do WordPressa. Włączenie wtyczki nigdy nie przejmuje po cichu działającej ścieżki pocztowej.
To nie jest usługa wysyłkowa
MevvMail nie odsprzedaje dostarczania i nie ma własnego limitu. Własny serwer SMTP albo własne konto u dostawcy zapewnia użytkownik, a wtyczka z niego korzysta.

Wymagania: WordPress 6.0 lub nowszy oraz PHP 8.1 lub nowszy. WooCommerce jest opcjonalny — bez niego wszystko działa tak samo, brakuje tylko ramki zamówienia.

Instalacja

  1. Należy zainstalować darmową wtyczkę MevvMail: wgrać archiwum zip w Wtyczki → Dodaj nową albo skopiować katalog mevvmail do /wp-content/plugins/.
  2. Następnie ją włączyć. Nic nie zostaje jeszcze przejęte.
  3. Otworzyć MevvMail → Połączenia i dodać pierwsze połączenie.
  4. Nacisnąć Wyślij e-mail testowy i potwierdzić, że wiadomość dociera.
  5. Opcjonalnie, ale zalecane: dodać drugie połączenie o niższym priorytecie jako zapasowe.
  6. Tylko jeśli potrzebne są ekrany Pro: zainstalować MevvMail Pro jako drugą wtyczkę i aktywować licencję MEVM w MevvMail → Licencja.

Gdy Pro jest zainstalowane, darmowa wtyczka ma pozostać włączona. Wysyłka, przełączanie awaryjne i dziennik mieszkają w darmowej wtyczce, więc wygasła licencja nigdy nie zatrzymuje wysyłania poczty przez sklep.

Połączenia

Połączenie to jedna droga wyjścia z witryny. Dostępnych jest dziesięć typów i każdy z nich jest w darmowej wtyczce — żadna funkcja nie jest wstrzymana i nie narzucamy limitu wysyłki.

SMTPPHP mail()BrevoSendGridMailgunPostmarkSparkPostElastic EmailSMTP2GOResend

Pola na ekranie

Nazwa
Własna etykieta połączenia. To ona pojawia się w dzienniku w kolumnie Połączenie, więc warto nadać nazwę, którą rozpozna się o trzeciej nad ranem.
Dostawca
Wybór typu. Reszta formularza zmienia się razem z nim: SMTP pyta o host, port, szyfrowanie i dane logowania, a dostawca API o klucz, w przypadku Mailgun i SparkPost także o region.
Priorytet
Liczba. Łańcuch przechodzony jest od najniższego priorytetu w górę, więc główne połączenie dostaje najmniejszą liczbę, a zapasowe większą.
Nazwa nadawcy i adres nadawcy
Nadawca, w którego imieniu wychodzi wiadomość. Należy użyć adresu w domenie, której rekordy SPF, DKIM i DMARC wskazują dostawcę, przez którego odbywa się wysyłka — inaczej skrzynka pozostanie podejrzliwa nawet wobec bezbłędnie dostarczonej poczty.
Wymuszaj tego nadawcę w każdej wiadomości
Domyślnie wyłączone. Gdy jest włączone, to połączenie nadpisuje nadawcę, którego niosła wiadomość. Przydaje się, gdy jakaś wtyczka wysyła z adresu, którego dostawca nie autoryzuje; szkodzi, gdy nadawcy ustawiani osobno dla każdej wtyczki są naprawdę potrzebni.
Aktywne
Nieaktywne połączenie jest pomijane przez łańcuch i zostaje na ekranie. W ten sposób wyłącza się jednego dostawcę z ruchu bez utraty jego ustawień.

Zapisane wartości tajne nigdy nie są wypisywane z powrotem do formularza. W polach hasła i klucza API widnieje „Zapisane — pozostaw puste, aby zachować”: wartość wpisuje się tylko wtedy, gdy się ją zmienia.

Warto sprawdzić, zanim się zaufa

Wyślij e-mail testowy wysyła prawdziwą wiadomość przez to jedno połączenie i zapisuje wynik w dzienniku jak każdą inną wysyłkę. Jeśli się nie uda, dziennik niesie własną odpowiedź dostawcy — a to niemal zawsze zdanie, które mówi, co jest nie tak.

Łańcuch i to, co dzieje się przy niepowodzeniu

Gdy WordPress tworzy wiadomość, MevvMail przechodzi połączenia w kolejności priorytetów i zatrzymuje się na pierwszym, które ją przyjmie. Dostawca ograniczający liczbę żądań, z wyczerpanym limitem albo niedziałający kosztuje jedną próbę, a nie wiadomość. Całe przejście zapisywane jest jako jeden wpis dziennika, a nie jeden na połączenie: pojedyncza wiadomość nie powinna czytać się jak trzy osobne niepowodzenia.

Gdy wszystkie połączenia odmówiły, wpis zapisywany jest jako nieudany i trafia do kolejki ponowień. Jest próbowany jeszcze trzy razy — po minucie, po pięciu minutach i po trzydziestu minutach — i na tym się kończy. Adres, który nie istnieje, nie zacznie istnieć przy czterdziestej próbie.

Ponowienia planowane są przez WP-Cron, który uruchamia się tylko wtedy, gdy ktoś odwiedzi witrynę. Na spokojnej witrynie ponowienie może nastąpić później niż w zaplanowanej minucie. Jeżeli to ma znaczenie, można przejść na prawdziwego crona serwerowego zwykłą drogą — DISABLE_WP_CRON w wp-config.php plus wywołanie wp-cron.php z crontaba. Po stronie MevvMail nie trzeba niczego zmieniać.

Łańcuch, który ma sens

  • Dwa połączenia u dwóch różnych dostawców chronią przed złym dniem jednego dostawcy. Dwa połączenia u tego samego dostawcy nie chronią.
  • W łańcuchu należy trzymać jedno połączenie SMTP, inaczej wiadomości z załącznikami nie mają dokąd pójść (patrz niżej).
  • PHP mail() to rozsądna ostateczność, ale kiepski pierwszy wybór: to właśnie ta nieuwierzytelniona ścieżka, dla której zastąpienia wtyczka istnieje.

Dziennik wiadomości

Każda próba zapisywana jest w tabeli we własnej bazie danych. Nic z poczty nie jest wysyłane do nas — w żadnym miejscu wtyczki nie ma telemetrii, analityki ani skanowania treści.

Co jest zapisywane
Czas, odbiorcy, temat, status, połączenie, które obsłużyło wiadomość, część witryny, która ją wytworzyła, własna odpowiedź dostawcy i liczba prób.
Filtry
Według statusu (wysłane, nieudane, oczekujące), według źródła i według daty. Te trzy razem to zwykle całe dochodzenie w zgłoszeniu wsparcia.
Źródło
Wiadomość może nieść etykietę mówiącą, która wtyczka ją wytworzyła — formularz, wiadomość odzyskująca, powiadomienie WooCommerce. Etykieta zapisywana jest we własnej kolumnie i zdejmowana z wiadomości przed wysyłką, więc nigdy nie dociera do osoby, która ją odbiera.
Wyślij ponownie
Każdy wpis można wysłać ponownie z listy. Wraca do łańcucha od góry, więc użyte zostanie połączenie, które w międzyczasie naprawiono.
Przechowuj treść wiadomości
Domyślnie włączone. Po wyłączeniu dziennik zachowuje tylko nagłówki. Taki wpis można wtedy obejrzeć, ale nie wysłać ponownie — a nieudana wysyłka nie trafia też do kolejki drabiny ponawiania, bo w obu przypadkach nie zachowano niczego do wysłania.
Przechowuj wpisy dziennika przez
7, 30, 90 dni albo bezterminowo. Starsze wpisy usuwane są zgodnie z harmonogramem.

Dziennik może zawierać dane osobowe — adresy, tematy oraz, jeżeli ustawienie pozostanie włączone, treści wiadomości. Przed uruchomieniem produkcyjnym warto przejrzeć ustawienie przechowywania i opcję treści pod kątem własnych obowiązków, tak samo jak każdy inny rekord sklepu.

Odinstalowanie

Usunięcie wtyczki nie rusza dziennika ani ustawień. Na ekranie ustawień jest jedna zgoda do zaznaczenia — Przy usuwaniu wtyczki usuń też tabelę dziennika i wszystkie ustawienia — i domyślnie jest wyłączona, bo niszczące odczytanie słowa „odinstalowanie” nigdy nie powinno być tym, które dostaje się przypadkiem.

Załączniki

W wersji 1.0.0 załączniki podróżują wyłącznie przez SMTP. Ośmiu dostawców API ich nie wysyła i jest to celowe ograniczenie, a nie błąd: każde z tych API chce pliku w innym kształcie, a wypuszczenie ośmiu w połowie przetestowanych koderów nie było tego warte.

  • Wiadomość z plikiem trwale pomija połączenia API i szuka w łańcuchu połączenia SMTP.
  • Gdy połączenie SMTP jest skonfigurowane, faktury, bilety i pliki PDF wychodzą normalnie.
  • Gdy nie skonfigurowano żadnego połączenia SMTP, taka wiadomość zapisywana jest w dzienniku jako nieudana, zamiast zostać dostarczona bez pliku — ciche dostarczenie bez faktury byłoby gorsze niż widoczne niepowodzenie.

Praktyczna zasada mieści się w jednej linijce: w łańcuchu trzeba trzymać jedno połączenie SMTP, cokolwiek jeszcze w nim jest.

Zamówienia WooCommerce

Gdy WooCommerce jest aktywny, każdy ekran zamówienia dostaje ramkę z listą wiadomości, które to zamówienie wytworzyło, i statusem dostarczenia każdej z nich. Na pytanie „czy klient dostał potwierdzenie?” odpowiada się przy zamówieniu, a nie przez przeszukiwanie dziennika.

Dziennik zapisuje też, którą wiadomością WooCommerce była dana poczta, więc ponowienie po pół godziny nadal wie, co wysyła — a przy licencji Pro także, która reguła routingu i który temat go dotyczą.

MevvMail działa dokładnie tak samo na witrynie bez WooCommerce. Po prostu nie ma tam ramki zamówienia.

Co dodaje licencja Pro

Wszystko powyżej jest w darmowej wtyczce: dziesięć typów połączeń, łańcuch awaryjny, drabina ponawiania, dziennik, ponowna wysyłka i ramka zamówienia WooCommerce. Pro to osobna wtyczka, która dokłada głębię WooCommerce na wierzchu wysyłki.

Projektant wiadomości WooCommerce
Logo, kolor podstawowy, kolor tła, tekst stopki i temat dla każdego typu wiadomości, wraz z podglądem zapisanego projektu. Projekt stosuje darmowa wtyczka, więc przetrwa wyłączenie licencji.
Śledzenie otwarć
Opcjonalny piksel 1×1 serwowany przez własną witrynę, zapisywany jako pojedynczy znacznik czasu w kolumnie Otwarto w dzienniku. Domyślnie wyłączone. Nie są zbierane żadne adresy IP, klient poczty, odsyłacz, lokalizacja, urządzenie ani liczba otwarć, a współczynnik otwarć nie jest nigdzie pokazywany.
Alerty o awariach
Jedna wiadomość albo jeden webhook na awarię, po wybranej liczbie kolejnych niepowodzeń. Alert wychodzi własną ścieżką pocztową serwera — dzięki temu może dotrzeć nawet wtedy, gdy zepsute są właśnie połączenia — i nie niesie odbiorcy, tematu ani treści z nieudanej wiadomości.
Routing warunkowy
Reguły oparte na etykiecie źródła albo na typie wiadomości WooCommerce przesuwają połączenie na początek łańcucha. Łańcuch nigdy nie jest zawężany, więc przełączanie awaryjne działa dalej, a reguła dopasowuje się także przy opóźnionym ponowieniu.

Licencję aktywuje się w MevvMail → Licencja kluczem zaczynającym się od MEVM. Gdy wygaśnie, projektant, śledzenie, alerty i routing przestają działać; wysyłka, przełączanie awaryjne i dziennik idą dalej, bo nigdy nie należały do Pro.

Śledzenie otwarć to wskazówka, a nie pomiar. Skrzynka blokująca obrazy albo serwer pośredniczący, który je buforuje, sprawia, że piksel milczy lub odzywa się za wcześnie. Dlatego zachowywane jest tylko pierwsze otwarcie i dlatego produkt nie pokazuje współczynnika otwarć.

Co opuszcza serwer

Dwie rzeczy i obie są tu wymienione.

  1. Poczta, do skonfigurowanego dostawcy. Nadawca, odbiorcy, temat, treść, ewentualne Reply-To i nagłówki własne oraz własny klucz API, żeby dostawca mógł uwierzytelnić użytkownika. MevvMail nie dodaje niczego — żadnego adresu witryny, żadnych danych użytkownika, żadnego naszego identyfikatora — i do żadnego dostawcy nic nie jest wysyłane, dopóki nie utworzy się połączenia tego typu.
  2. Sprawdzenie aktualizacji. Dwie wartości — slug wtyczki i numer zainstalowanej wersji — wysyłane pod adres https://mevvsoft.com/api/v1/license/free-update, gdy WordPress uruchamia własne sprawdzenie aktualizacji, a odpowiedź w pamięci podręcznej jest starsza niż dwanaście godzin. Żadnego adresu witryny, żadnego adresu e-mail, żadnego klucza licencji, żadnej listy wtyczek, żadnych statystyk użycia. Odpowiedź jest podpisana, a niepodpisana zostaje odrzucona. Kopia rozprowadzana przez katalog wtyczek WordPress w ogóle nie zawiera pliku aktualizatora.

Wydawca nie otrzymuje z tej wtyczki żadnej treści wiadomości, żadnych adresów odbiorców, żadnych wpisów dziennika ani żadnej analityki. Dziennik to tabela we własnej bazie danych, a o tym, jak długo jest przechowywany i czy treści wiadomości są w ogóle zachowywane, decyduje użytkownik.

Rozwiązywanie problemów

Dziennik mówi „wysłane”, ale wiadomość nie dotarła
„Wysłane” znaczy, że połączenie przyjęło wiadomość, a nie że skrzynka umieściła ją w skrzynce odbiorczej. Najpierw warto sprawdzić spam, potem to, czy adres nadawcy jest w domenie, której rekordy SPF, DKIM i DMARC autoryzują dostawcę, przez którego odbywa się wysyłka. Większość poczty, która znika na tym etapie, to sprawa uwierzytelnienia, a nie dostarczania.
Wszystko zawodzi na pierwszym połączeniu
Należy otworzyć wpis i przeczytać własną odpowiedź dostawcy: jest zapisana razem z próbą. Zły port i złe szyfrowanie, wygasły klucz oraz nadawca, którego dostawca nie autoryzuje, odpowiadają za większość przypadków.
Wiadomość z załącznikiem zawiodła
Warto sprawdzić, czy w łańcuchu jest połączenie SMTP. Bez niego wiadomość z plikiem celowo zapisywana jest w dzienniku jako nieudana.
Ponowienia nigdy się nie odbywają
Dwie przyczyny. WP-Cron uruchamia się tylko wtedy, gdy ktoś odwiedzi witrynę, więc na spokojnej witrynie ponowienie czeka na ruch — albo trzeba przejść na prawdziwego crona serwerowego. Druga to ustawienie „Przechowuj treść wiadomości”: gdy jest wyłączone, nie ma czym ponowić, a nieudany wpis celowo zostaje nietknięty.
Przycisk „Wyślij ponownie” nic nie zrobił
Ten wpis zapisano bez treści, więc nie ma czego wysłać. Dla wpisów, które mogą być potrzebne do ponownej wysyłki, należy z powrotem włączyć ustawienie „Przechowuj treść wiadomości”.
Brakuje ekranów Pro
Należy sprawdzić, czy darmowa wtyczka jest włączona, czy wtyczka Pro jest włączona i czy licencja jest aktywowana. Wymagane są wszystkie trzy warunki, a ekran licencji mówi, który z nich nie jest spełniony.

Pisząc do nas, warto podać wersje wtyczek, wersje WordPressa i PHP, typ połączenia oraz dokładny tekst odpowiedzi dostawcy z wpisu dziennika. Najpierw trzeba usunąć adresy klientów i treść wiadomości; sama odpowiedź niemal zawsze wystarcza.