Konfiguracja modułu poczty
Ready4Docs obsługuje konta pocztowe poprzez protokół IMAP z dwoma trybami synchronizacji:
Typy kont pocztowych
Dział zatytułowany „Typy kont pocztowych”| Typ konta | Opis | Synchronizacja |
|---|---|---|
imap | Standardowy IMAP | Polling (co 10-60 sek) |
imap-idle | IMAP z IDLE | Push (natychmiastowa) |
m365 | Microsoft 365 | Graph API + Webhooks |
google | Google Workspace | Gmail API + Push |
Workery synchronizacji
Dział zatytułowany „Workery synchronizacji”System używa dwóch workerów do synchronizacji poczty:
1. Mail Sync Daemon (polling)
Dział zatytułowany „1. Mail Sync Daemon (polling)”Obsługuje konta bez wsparcia IDLE. Sprawdza nowe wiadomości w interwałach 10-60 sekund.
# Statussudo supervisorctl status ready4docs-mail-sync-daemon
# Logitail -f /home/ready4docs/public_html/backend/storage/logs/mail-sync-daemon.log
# Restartsudo supervisorctl restart ready4docs-mail-sync-daemonKonfiguracja supervisor: /etc/supervisor/conf.d/ready4docs-mail.conf
[program:ready4docs-mail-sync-daemon]command=php /home/ready4docs/public_html/backend/artisan mail:sync-daemon --min-interval=10 --max-interval=60autostart=trueautorestart=trueuser=www-datanumprocs=1stdout_logfile=/home/ready4docs/public_html/backend/storage/logs/mail-sync-daemon.log2. Mail IDLE Worker (push)
Dział zatytułowany „2. Mail IDLE Worker (push)”Obsługuje konta z IDLE. Utrzymuje stałe połączenie z serwerem IMAP i otrzymuje powiadomienia o nowych wiadomościach natychmiast.
Kiedy jest potrzebny: Tylko gdy istnieje przynajmniej jedno konto z account_type = 'imap-idle'.
# Sprawdź czy są konta IDLEphp artisan tinker --execute="echo \App\Models\MailAccount::where('account_type', 'imap-idle')->count();"
# Jeśli są konta IDLE - zainstaluj workersudo cp /home/ready4docs/public_html/backend/supervisor/mail-idle.conf /etc/supervisor/conf.d/ready4docs-mail-idle.confsudo supervisorctl rereadsudo supervisorctl update
# Statussudo supervisorctl status ready4docs-mail-idle:*
# Logitail -f /home/ready4docs/public_html/backend/storage/logs/mail-idle.logKonfiguracja supervisor: /etc/supervisor/conf.d/ready4docs-mail-idle.conf
[program:ready4docs-mail-idle]command=php /home/ready4docs/public_html/backend/artisan queue:work redis --queue=mail-idle --sleep=3 --tries=1 --timeout=0 --max-jobs=1autostart=trueautorestart=trueuser=www-datanumprocs=4stdout_logfile=/home/ready4docs/public_html/backend/storage/logs/mail-idle.logstopwaitsecs=3600Sprawdzanie wsparcia IDLE
Dział zatytułowany „Sprawdzanie wsparcia IDLE”Przed dodaniem konta możesz sprawdzić czy serwer IMAP obsługuje IDLE:
# Test dla konkretnego kontaphp artisan mail:test-idle <account_id>
# Test dla wszystkich kont IMAPphp artisan mail:test-idleSerwery obsługujące IDLE:
- Gmail / Google Workspace ✅
- Microsoft 365 / Outlook.com ✅
- Większość nowoczesnych serwerów IMAP ✅
- Starsze serwery (np. niektóre hostingi współdzielone) ❌
Dodawanie konta pocztowego
Dział zatytułowany „Dodawanie konta pocztowego”1. Przez API (automatyczne wykrywanie IDLE)
Dział zatytułowany „1. Przez API (automatyczne wykrywanie IDLE)”POST /api/mail/accounts{ "email": "user@example.com", "imap_host": "imap.example.com", "imap_port": 993, "imap_encryption": "ssl", "smtp_host": "smtp.example.com", "smtp_port": 587, "smtp_encryption": "tls", "settings": { "username": "user@example.com", "password": "secret" }}System automatycznie:
- Testuje połączenie IMAP
- Sprawdza capabilities serwera
- Ustawia
account_typenaimap-idlelubimap
2. Ręczna zmiana typu konta
Dział zatytułowany „2. Ręczna zmiana typu konta”php artisan tinker>>> $account = \App\Models\MailAccount::where('email', 'user@example.com')->first();>>> $account->update(['account_type' => 'imap-idle']);Po zmianie na imap-idle uruchom IDLE worker (jeśli jeszcze nie działa).
Konfiguracja Google OAuth (Gmail / Google Workspace)
Dział zatytułowany „Konfiguracja Google OAuth (Gmail / Google Workspace)”Ready4Docs obsługuje integrację z Gmail i Google Workspace poprzez OAuth 2.0. Umożliwia to bezpieczne połączenie bez konieczności włączania “Dostęp do mniej bezpiecznych aplikacji” lub generowania haseł aplikacji.
Wymagane kroki
Dział zatytułowany „Wymagane kroki”1. Utwórz projekt w Google Cloud Console
Dział zatytułowany „1. Utwórz projekt w Google Cloud Console”- Przejdź do Google Cloud Console
- Utwórz nowy projekt lub wybierz istniejący
- W menu nawigacji wybierz APIs & Services → Library
- Wyszukaj i włącz Gmail API
2. Skonfiguruj OAuth consent screen
Dział zatytułowany „2. Skonfiguruj OAuth consent screen”- W menu wybierz APIs & Services → OAuth consent screen
- Wybierz typ użytkownika:
- Internal - tylko dla użytkowników z Twojej organizacji Google Workspace
- External - dla wszystkich użytkowników Gmail
- Wypełnij formularz:
- App name: Ready4Docs
- User support email: Twój email
- Developer contact email: Twój email
- W sekcji Scopes dodaj:
https://www.googleapis.com/auth/gmail.readonlyhttps://www.googleapis.com/auth/gmail.sendhttps://www.googleapis.com/auth/gmail.modifyhttps://mail.google.com/
- Zapisz i kontynuuj
3. Utwórz OAuth 2.0 credentials
Dział zatytułowany „3. Utwórz OAuth 2.0 credentials”- W menu wybierz APIs & Services → Credentials
- Kliknij Create Credentials → OAuth 2.0 Client ID
- Wybierz Application type: Web application
- Wypełnij formularz:
- Name: Ready4Docs Mail Integration
- Authorized redirect URIs:
https://your-domain.com/api/auth/google/callbackhttp://localhost:8000/api/auth/google/callback # dla dev
- Kliknij Create
- Zapisz Client ID i Client Secret - będą potrzebne w konfiguracji
4. Skonfiguruj backend (Laravel)
Dział zatytułowany „4. Skonfiguruj backend (Laravel)”Dodaj credentials do pliku .env:
GOOGLE_CLIENT_ID=your-client-id.apps.googleusercontent.comGOOGLE_CLIENT_SECRET=your-client-secretGOOGLE_REDIRECT_URI=https://your-domain.com/api/auth/google/callbackUwaga: GOOGLE_REDIRECT_URI jest opcjonalne - domyślnie używa APP_URL/api/auth/google/callback
5. Dodaj konto Google w Ready4Docs
Dział zatytułowany „5. Dodaj konto Google w Ready4Docs”- Zaloguj się do Ready4Docs
- Przejdź do Poczta → Konta
- Kliknij Dodaj konto
- Wybierz Gmail / Google Workspace
- Podaj adres email (np.
user@gmail.comlubuser@twoja-firma.com) - Kliknij Połącz z Google
- Autoryzuj aplikację w oknie Google OAuth
- Po autoryzacji zostaniesz przekierowany z powrotem do Ready4Docs
System automatycznie:
- Pobierze i zapisze
access_tokenirefresh_token - Ustawi
account_typenagoogle - Skonfiguruje IMAP/SMTP dla Gmail (
imap.gmail.com:993,smtp.gmail.com:465)
API Endpoints
Dział zatytułowany „API Endpoints”| Endpoint | Metoda | Opis |
|---|---|---|
/api/auth/google | GET | Redirect do Google OAuth |
/api/auth/google/callback | GET | Callback handler (public) |
/api/auth/google/revoke/{accountId} | POST | Odwołaj dostęp OAuth |
/api/auth/google/refresh/{accountId} | POST | Ręczne odświeżenie tokenu |
Automatyczne odświeżanie tokenów
Dział zatytułowany „Automatyczne odświeżanie tokenów”GoogleMailService automatycznie odświeża access_token gdy:
- Token wygasł (lub wygaśnie za mniej niż 5 minut)
- Jest dostępny
refresh_token
Tokeny są odświeżane w tle podczas:
- Synchronizacji wiadomości IMAP
- Wysyłania wiadomości SMTP
- Manualnego wywołania
/api/auth/google/refresh/{accountId}
Rozwiązywanie problemów
Dział zatytułowany „Rozwiązywanie problemów”Błąd: “Missing refresh_token”
Dział zatytułowany „Błąd: “Missing refresh_token””Google nie zwraca refresh_token jeśli użytkownik już wcześniej autoryzował aplikację. Rozwiązanie:
- Odwołaj dostęp: https://myaccount.google.com/permissions
- Autoryzuj konto ponownie w Ready4Docs
- Upewnij się, że w OAuth flow jest parametr
prompt=consent
Błąd: “Invalid refresh token”
Dział zatytułowany „Błąd: “Invalid refresh token””Refresh token może wygasnąć jeśli:
- Nie był używany przez 6 miesięcy
- Użytkownik zmienił hasło
- Użytkownik odwołał dostęp
Rozwiązanie: Re-autoryzuj konto w Ready4Docs.
Błąd: “Access denied” podczas autoryzacji
Dział zatytułowany „Błąd: “Access denied” podczas autoryzacji”Sprawdź:
- Czy Gmail API jest włączone w Google Cloud Console
- Czy OAuth consent screen jest opublikowany (jeśli External)
- Czy redirect URI w Google Cloud Console dokładnie pasuje do URI w aplikacji
Bezpieczeństwo
Dział zatytułowany „Bezpieczeństwo”- Access tokens wygasają co ~1 godzinę
- Refresh tokens są ważne bezterminowo (dopóki nie zostaną odwołane)
- Wszystkie tokeny są szyfrowane w bazie danych (Laravel Crypt)
- Komunikacja z Google API odbywa się przez HTTPS
- Zalecane: Użyj Internal OAuth consent screen dla Google Workspace
Monitorowanie
Dział zatytułowany „Monitorowanie”Sprawdzenie statusu workerów
Dział zatytułowany „Sprawdzenie statusu workerów”sudo supervisorctl status | grep ready4docs-mailOczekiwany output:
ready4docs-mail-sync-daemon RUNNING pid 12345, uptime 1:23:45ready4docs-mail-idle:00 RUNNING pid 12346, uptime 1:23:45 # tylko jeśli są konta IDLEready4docs-mail-idle:01 RUNNING pid 12347, uptime 1:23:45ready4docs-mail-idle:02 RUNNING pid 12348, uptime 1:23:45ready4docs-mail-idle:03 RUNNING pid 12349, uptime 1:23:45Sprawdzenie ostatniej synchronizacji
Dział zatytułowany „Sprawdzenie ostatniej synchronizacji”php artisan tinker --execute="\App\Models\MailAccount::select('email', 'account_type', 'status', 'last_sync_at', 'error_count') ->get() ->each(fn(\$a) => print(\"{$a->email} | {$a->account_type} | {$a->status} | {$a->last_sync_at} | errors: {$a->error_count}\n\"));"Logi błędów
Dział zatytułowany „Logi błędów”# Ogólne logi Laraveltail -f /home/ready4docs/public_html/backend/storage/logs/laravel.log | grep -i mail
# Logi sync daemontail -f /home/ready4docs/public_html/backend/storage/logs/mail-sync-daemon.log
# Logi IDLE workertail -f /home/ready4docs/public_html/backend/storage/logs/mail-idle.logRozwiązywanie problemów
Dział zatytułowany „Rozwiązywanie problemów”Konto ma status “disabled”
Dział zatytułowany „Konto ma status “disabled””Konto jest automatycznie wyłączane po 5 kolejnych błędach synchronizacji.
# Sprawdź błądphp artisan tinker --execute="\$a = \App\Models\MailAccount::where('email', 'user@example.com')->first();echo \"Status: {\$a->status}\nError: {\$a->last_error}\nCount: {\$a->error_count}\";"
# Włącz ponowniephp artisan tinker --execute="\App\Models\MailAccount::where('email', 'user@example.com')->first()->enable();"IDLE worker nie startuje
Dział zatytułowany „IDLE worker nie startuje”-
Sprawdź czy są konta
imap-idle:Okno terminala php artisan tinker --execute="echo \App\Models\MailAccount::where('account_type', 'imap-idle')->count();" -
Jeśli są, sprawdź konfigurację supervisor:
Okno terminala ls -la /etc/supervisor/conf.d/ | grep idle -
Zainstaluj konfigurację jeśli brakuje:
Okno terminala sudo cp /home/ready4docs/public_html/backend/supervisor/mail-idle.conf /etc/supervisor/conf.d/ready4docs-mail-idle.confsudo supervisorctl reread && sudo supervisorctl update
Wiadomości nie synchronizują się
Dział zatytułowany „Wiadomości nie synchronizują się”-
Sprawdź status konta:
Okno terminala php artisan tinker --execute="\App\Models\MailAccount::first()->only(['status', 'last_sync_at', 'last_error']);" -
Wymuś synchronizację:
Okno terminala php artisan mail:sync-daemon --once -
Sprawdź logi:
Okno terminala tail -100 /home/ready4docs/public_html/backend/storage/logs/mail-sync-daemon.log
Komendy artisan
Dział zatytułowany „Komendy artisan”| Komenda | Opis |
|---|---|
mail:sync-daemon | Uruchom daemon synchronizacji (polling) |
mail:idle:start | Uruchom IDLE listenery dla kont |
mail:test-idle | Sprawdź czy serwer obsługuje IDLE |
mail:resync | Wymuś ponowną synchronizację wiadomości |
mail:resync-attachments | Ponownie pobierz załączniki |