2013-03-20 17 views
7

Mam procedura składowana uruchamiana co noc, która ma wysłać wyniki zapytania do kilku odbiorców. Jednak w większości dni kończy się wysłanie zduplikowanej wiadomości e-mail minutę później. Kod, którego używam, jest następujący (wszystkie e-maile i odwołania do bazy danych zostały zmienione):Procedura zapisana przy użyciu SP_SEND_DBMAIL wysyłanie zduplikowanych wiadomości e-mail do wszystkich odbiorców

EXEC msdb.dbo.sp_send_dbmail 
@recipients = '[email protected]', 
@copy_recipients = '[email protected];[email protected];[email protected]', 
@subject = 'Example Email', 
@profile_name = 'ExampleProfile', 
@query = 'SELECT name 
    FROM table 
    WHERE date BETWEEN (getdate() - 1) AND getdate()', 
@attach_query_result_as_file = 1 

Każda pomoc w tym zakresie byłaby bardzo doceniana.

+0

Połączenie wydaje się dobre, ale jak się nazywasz? Jesteś pewien, że nie dzwonisz do niego dwa razy? –

+0

Wywołuję go za pomocą Menedżera zadań w SQL Server Agent i o ile widzę, jest on wywoływany tylko raz w ramach Harmonogramu zadań. – andewM

+0

Czy sprawdziłeś log? –

Odpowiedz

5

Rozwiązanie okazało się zmniejszeniem liczby Kont Powrotu Konta na serwerze do 0 (w Kreatorze konfiguracji poczty bazy danych).

0

Jeśli wysyła duplikaty wiadomości e-mail do adresatów, oznacza to, że numer SP jest wywoływany wiele razy dziennie. Sprawdź czas dzwonienia ustawiony w zadaniu SQL, które wywołuje to SP. Powinno to być raz dziennie, aby uniknąć duplikowania wiadomości e-mail.

+0

Dzięki za odpowiedź, ale sprawdziłem listę zadań i jestem pewien, że procedura jest uruchamiana tylko raz. – andewM

0

Jeśli nie jest on wysyłany dwa razy z programu SQL Server, a także nie stanowi problemu z serwerem pocztowym, sprawdź, czy nie sprawdzasz poczty w programie Outlook za pomocą filtrów poczty, a następnie możesz otrzymać wiadomość e-mail dwukrotnie.

+0

Dzięki za dane wejściowe, ale sprawdziłem i nie używam żadnych filtrów Poczty programu Outlook. – andewM

0

Proponuję dodać kolejną tabelę do bazy danych, która będzie zawierać informacje o ostatnim wysłaniu e-maila do każdego odbiorcy.

Bez takiego stołu nie można naprawdę wiedzieć, co się dzieje. Co zrobić, jeśli wielokrotnie uruchamiasz SP przez przypadek? Nic nie powstrzyma go przed wysłaniem e-maila.

Odnośnie tego problemu - czy serwer pocztowy zachowuje kopię wysłanych elementów? Jeśli tak, możesz sprawdzić datę wysłania wszystkich wiadomości. To może dać ci dobrą informację o tym, co się dzieje.

+0

Dziękuję za twój wkład. Zablokowałem zadanie, aby zobaczyć, czy procedura została uruchomiona w innym miejscu, ale odkryłem, że tak nie było i w końcu ponownie utworzyłem zadanie, aby sprawdzić, czy to rozwiązało problem. Wygląda na to, że udało się. – andewM

+0

Cieszę się, że pomogłem :) –

0

Dzieje się tak, ponieważ adres otrzymujący wiadomość e-mail (w grupie lub w osobnej grupie) ma adres e-mail, który nie jest już ważny. Chociaż można wyeliminować ponowne próby, jak w zaakceptowanej odpowiedzi, najlepszym sposobem jest oczyszczenie dystrybucji.

0

Miałem podobny problem, gdy mieliśmy wielu odbiorców w jednym e-mailu, i wygenerowałoby 2 wysłane e-maile. Problem polegał na tym, że jeden z adresatów nie był już prawidłowy, a ponowna próba wysłałaby wiadomość e-mail do wszystkich odbiorców, a nie tylko do osoby, której nie udało się. Istnieje kilka widoków w msdb, które mogą pomóc w znalezieniu nieważnego odbiorcy. Zaczynają dbo.sysmail_ < coś >

Istnieje kilka rozwiązań tego problemu.

  1. Podziel każdego odbiorcę jako oddzielny adres e-mail.
  2. usunąć nieprawidłowy odbiorcę z listy
  3. Ustaw celu ponownego ustawienia w DBMail do 0
0

miałem ten sam problem duplikacji podczas korzystania SELECT w @query wysłać stały tekst w ciele każdego e-mail, oprócz używania @body i @subject do wysyłania niestandardowego tekstu w zależności od pewnych warunków.

Jeden e-mail zawierał tekst niestandardowy i tekst zapytania zgodnie z oczekiwaniami. Powielony e-mail zawierał tylko tekst @query (brak tekstu niestandardowego) z wierszem tematu "Wiadomość SQL Server".

Uruchomiłem SELECT * FROM msdb.dbo.sysmail_sentitems i pewna liczba wiadomości e-mail była wysyłana dwa razy.Spojrzenie na sysmail_configuration ujawniło, że AccountRetryAttempts paramValue = 1.

Problem zniknął po tym, jak usunąłem @query całkowicie z procedury składowanej (wykonałem zmianę), uruchomiłem sp. Następnie umieszczam @query z powrotem w sp, wykonuję zmianę. Następnie e-maile zaczęły wysyłać tylko raz. Domyśl.

0

Upewnij się, że nie masz żadnych innych instrukcji aktualizacji w jakichkolwiek innych wyzwalaczach w wyzwalaczach pobocznych podczas aktualizacji.

Nawet w obliczu podobnego problemu, gdy sprawdzałem z moimi wyzwalaczami, widziałem, że użyłem kolejnej instrukcji Update w innym wyzwalaczu. Powodowało wielokrotne wyzwalanie wyzwalaczy. W związku z tym uruchomiono dwa maile.

Powiązane problemy