środa, 8 lutego 2012

APEX_MAIL i problem z datą "Wysłano"

Jak wiadomo APEX w wersji 4.1 rozbudował natywną funkcję wysyłki maili o uwierzytelnianie poczty wychodzącej. Wsparcie uwierzytelnaiania otworzyło możliwość korzystanie z zewnetrznych dostawców poczty. Chcąc wreszcie przesiąść się z autorskiego mechanizmu wysyłki poczty opartego o pakiet UTL_SMTP na APEX_MAIL zacząłem jakiś czas temu testy. Generalnie wszystko szło jak po maśle do momentu kiedy przyjrzałem się dokładnie przychodzącej wiadomości.



W wysyłanych wiadomościach brak było daty wysłania. Chmmm.... był to duży problem. Patrząc od strony odbiorcy wiadomości, brak tej daty powodował zupełne zamieszanie w skrzynce odbiorczej, z drugiej zaś strony wiadomość ta mogła być potraktowany przez filtry anty spamowe wiadomo jak. Żeby nie owijać w bawełnę przejdę do kodu żeby przedstawić jak należy postępować aby wiadomość otrzymała Datę wysłania.

Chcąc skonstruować wiadomość mail z APEX API należy w pierwszej kolejność użyć pakietu:
1. APEX_MAIL.SEND_MAIL - Niniejsze API tworzy wiadomość z wszelkimi jej atrybutami tzn. z adresem odbiorcy, tematem, wiadomością, odbioracami CC, BCC itp. Odpalenie tej procedury nie powoduje wysyłki wiadomości a tylko wstawienie jej do kolejki.
2. COMMIT - commit w tym przypadku jest znaczący, tzn brak tego commita własnie był przyczyną pustej daty wysyłki. I teraz ważna informacja: Jeżeli twój mechanizm jest podłączony do APEX-a to możesz ten commit pominnąć a nawet powiem więcej, należy go pominąć, jeżeli jednak uruchamiasz API z tzw. palca w np SQL Developerze lub z własnego JOB-a to jest on niezbędny !
3. APEX_MAIL.PUSH_QUEUE - pakiet który realizuje wysyłkę (zwalnia kolejkę). Nie musisz tego odpalać, APEX ma wbudowany JOB, który co 5 minut sam odpala wysyłkę pod warunkiem że APEX_MAIL.SEND_MAIL było uruchomione z APEX-a. Jeżeli jednak chcesz aby mail wyszedł natychmiast to oczywiście nic nie stoi na przeszkodzie aby dodać do mechanizmu ten punkt.

Podsumowując:
- jeżeli chcesz wysłać maila z narzędzia zewnętrznego takiego jak SQL Developer lub z własnego JOB-a to niezbędny jest commit.
- I ostatni dodatek o którym wcześniej całkowicie zapomniałem. Jeżeli wysyłasz maila z zewnętrznych narzędzi lub JOB-a musisz ustawić tzw. security_group_id, do tego służy pakiet apex_util.set_security_group_id(p_security_group_id => workspace_id);

Jeżeli macie jakieś problemy techniczne to zapraszam na forum

0 komentarze:

Prześlij komentarz