Только некоторая электронная почта успешно отправлена ​​из sp_send_dbmail (Database Mail) на SQL Server 2005 - PullRequest
1 голос
/ 25 февраля 2011

Я хочу найти ответ на то, что происходит, когда я использую 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?Я имею в виду, что во внешний домен поступила ошибка, но почта доставлена.Или, если почта не доставлена, где я должен посмотреть, что вызывает проблему.

1 Ответ

0 голосов
/ 11 августа 2014

Можете ли вы попробовать добавить функцию 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 достаточно времени для эффективного заполнения данных с помощью курсора и доставки электронной почты. Это отлично работало в моем случае.

...