Только некоторые сообщения электронной почты успешно отправляются из sp_send_dbmail (почта базы данных) в SQL Server 2005.

Я хочу найти ответ на то, что происходит, когда я использую sp_send_dbmail на SQL Server 2005. Я гуглил, но безуспешно, и я не знаю, куда теперь обратиться.

Это сценарий:

Я настроил функцию почты на нашем сервере SQL. У меня есть адреса электронной почты в одной таблице и содержимое в другой таблице. Для каждого адреса, который я нахожу в своей таблице, я использую sp_send_dbmail хранимую процедуру для компиляции нового сообщения по этому адресу.

Когда я позже запускаю свой собственный SP, который делает вышеперечисленное (берет электронную почту и компилирует новое сообщение для получателя), DatabaseMail90.exe запускается на сервере, и электронные письма отправляются. Но здесь все становится сложнее, потому что часть почты распространяется напрямую, вероятно, потому, что она находится в том же домене и в той же сети. Сложность заключается в том, что большинство (но не все) внешней почты получают ошибку в таблице msdb.dbo.sysmail_mailitems. Но на этом путаница не заканчивается. Некоторые сообщения электронной почты доставляются, хотя в таблице msdb.dbo.sysmail_mailitems сообщается об ошибке.

Это запрос, который я использую для просмотра статуса отправленных сообщений:

SELECT
    mailitem_id,
    recipients,
    subject,
    send_request_date,
    sent_status, --0 new, not sent, 1 sent, 2 failure or 3 retry.
    sent_date
FROM 
    msdb.dbo.sysmail_mailitems
WHERE
    sent_status != 1

Я настроил базу данных Mail, системные параметры следующим образом:

  • Попытки повторной попытки учетной записи: 3
  • Задержка повторной попытки учетной записи (секунды): 30
  • Максимальный размер файла (байт): 50000000 (НИКОГДА не будет таким большим, просто на всякий случай)
  • Запрещенные расширения вложенных файлов: exe, dll, vbs, js
  • Минимальное время жизни исполняемого файла Database Mail (секунд): 300
  • Уровень ведения журнала: расширенный

Мой почтовый профиль базы данных является общедоступным и установлен в качестве профиля по умолчанию. Я также создал существующий профиль.

Это SP, который выполняет все и начинает отправлять почту:

DECLARE @fldEmail AS VARCHAR(max)
DECLARE @fldSubject AS VARCHAR(max)
DECLARE @fldMessage AS VARCHAR(max)
DECLARE port_cursor CURSOR FOR
SELECT d.[E-Mail],s.Subject,s.HTMLMessage
FROM tbl_NAV_Sendout s,tbl_NAV_DistributionList d
OPEN port_cursor
FETCH NEXT FROM port_cursor
INTO @fldEmail, @fldSubject, @fldMessage
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC msdb.dbo.sp_send_dbmail @recipients = @fldEmail, @subject = @fldSubject, @body = @fldMessage, @body_format = 'HTML', @file_attachments = 'C:\NAVDW\ECNAV.csv', @profile_name = 'DBMail'
FETCH NEXT FROM port_cursor
INTO @fldEmail, @fldSubject, @fldMessage
END
CLOSE port_cursor
DEALLOCATE port_cursor

Так что вопрос остается. Есть ли способ настроить параметры для более быстрой доставки электронной почты? И еще, реальный вопрос, почему иногда возникает ошибка при отправке электронной почты? Нет ничего плохого в адресе электронной почты, на который он отправляет. Где я должен искать возможные ошибки в моем коде или моей конфигурации Database Mail? Испытывали ли вы что-то подобное?

Каково описание ошибки в таблице msdb.dbo.sysmail_mailitems? Я имею в виду, что на внешний домен сообщается об ошибке, но почта доставляется. Или, если почта не доставляется, где мне искать причину проблемы.


person user542051    schedule 25.02.2011    source источник
comment
какое-нибудь окончательное решение по этому поводу?   -  person Kiquenet    schedule 26.12.2012


Ответы (1)


Можете ли вы попробовать добавить функцию WAITFOR DELAY в свой запрос sql, как показано ниже:

DECLARE @fldEmail AS VARCHAR(max)  
DECLARE @fldSubject AS VARCHAR(max)  
DECLARE @fldMessage AS VARCHAR(max)  
DECLARE port_cursor CURSOR FOR  
SELECT d.[E-Mail],s.Subject,s.HTMLMessage  
FROM tbl_NAV_Sendout s,tbl_NAV_DistributionList d  
OPEN port_cursor  
FETCH NEXT FROM port_cursor  
INTO @fldEmail, @fldSubject, @fldMessage  
WHILE @@FETCH_STATUS = 0  
BEGIN  
WAITFOR DELAY '000:00:10'  
EXEC msdb.dbo.sp_send_dbmail @recipients = @fldEmail, @subject = @fldSubject, @body =   @fldMessage, @body_format = 'HTML', @file_attachments = 'C:\NAVDW\ECNAV.csv',   @profile_name = 'DBMail'  
FETCH NEXT FROM port_cursor  
INTO @fldEmail, @fldSubject, @fldMessage  
END  
CLOSE port_cursor  
DEALLOCATE port_cursor  

Хотя это замедлит выполнение, но добавление этой функции даст SQL Server достаточно времени для эффективного заполнения данных с помощью курсора и доставки электронной почты. В моем случае это сработало отлично.

person whywake    schedule 11.08.2014