Compartir a través de


Solución de problemas de Correo electrónico de base de datos

En este artículo se proporcionan métodos para solucionar problemas de Correo electrónico de base de datos. Si la solución de problemas inicial no ha resuelto el problema, use la solución de problemas avanzada.

Solución de problemas de Correo electrónico de base de datos inicial

Estos son los pasos básicos para solucionar problemas:

  1. Revise las vistas de registro de Correo electrónico de base de datos y sysmail (sysmail_event_log) para los correos que ya se han enviado o intentado enviar mediante DatabaseMail.exe.
  2. Enviar un correo de prueba. Si el correo de prueba se envía correctamente, céntrese en los detalles de los mensajes que no se envían. Si no se envía el correo de prueba, céntrese en la solución de problemas del correo de prueba e ignore los correos que se envían sin éxito antes.
  3. Si sospecha que la configuración del servidor SMTP es incorrecta o hay un problema con la cuenta que se usa para enviar el correo, use PowerShell para enviar un correo de prueba.
  4. Si no envía el correo mediante PowerShell, es probable que sea un problema de configuración SMTP y que se necesite un administrador SMTP.

Puede usar los pasos siguientes para la solución de problemas de Correo electrónico de base de datos inicial.

Vistas del sistema de sysmail de Msdb

Antes de examinar los pasos detallados, este es un resumen rápido de las vistas de Correo electrónico de base de datos sistema pertinentes.

  1. El registro más relevante se produce en la vista del sistema msdb sysmail. Puede consultar estas vistas directamente en su entorno.

    Nombre Tipo Descripción
    sysmail_allitems View Listas todos los mensajes que se envían a Correo electrónico de base de datos.
    sysmail_event_log View Listas mensajes sobre el comportamiento del programa externo de Correo electrónico de base de datos.
    sysmail_faileditems View Información sobre los mensajes que Correo electrónico de base de datos no se pudieron enviar.
    sysmail_mailattachments View Información sobre los datos adjuntos de Correo electrónico de base de datos mensajes.
    sysmail_sentitems View Información sobre los mensajes que se han enviado mediante Correo electrónico de base de datos.
    sysmail_unsentitems View Información sobre los mensajes que Correo electrónico de base de datos está intentando enviar actualmente.
  2. Algunos errores se registran en el registro de eventos de la aplicación Windows.

Paso 1: Comprobar sysmail_event_log vista

Esta vista del sistema es el punto de partida para solucionar todos los problemas de Correo electrónico de base de datos.

Al solucionar problemas Correo electrónico de base de datos, busque en la sysmail_event_log vista eventos relacionados con errores de correo electrónico. Algunos mensajes (como el error del Correo electrónico de base de datos programa externo) no están asociados a correos electrónicos específicos.

Sysmail_event_logcontiene una fila para cada mensaje de Windows o SQL Server devuelto por el sistema Correo electrónico de base de datos. En SQL Server Management Studio (SSMS), seleccione Administración, haga clic con el botón derecho en Correo electrónico de base de datos y seleccione Ver Correo electrónico de base de datos registro para comprobar la Correo electrónico de base de datos registro de la siguiente manera:

Captura de pantalla del elemento Ver Correo electrónico de base de datos registro en Correo electrónico de base de datos menú.

Ejecute la consulta siguiente en sysmail_event_log:

SELECT er.log_id AS [LogID],
  er.event_type AS [EventType],
  er.log_date AS [LogDate],
  er.description AS [Description],
  er.process_id AS [ProcessID],
  er.mailitem_id AS [MailItemID],
  er.account_id AS [AccountID],
  er.last_mod_date AS [LastModifiedDate],
  er.last_mod_user AS [LastModifiedUser]
FROM msdb.dbo.sysmail_event_log er
ORDER BY [LogDate] DESC

La event_type columna puede tener los siguientes valores:

  • Errores
  • Advertencias
  • Information
  • Correcto

Para mostrar solo los tipos de eventos necesarios, use la WHERE cláusula para filtrar.

Comprobación del elemento de correo con error específico

Para buscar errores relacionados con correos electrónicos específicos, busque el mailitem_id del correo electrónico con error en la sysmail_faileditems vista y, a continuación, busque los mensajes relacionados con mailitem_id en sysmail_event_log.

SELECT er.log_id AS [LogID], 
    er.event_type AS [EventType], 
    er.log_date AS [LogDate], 
    er.description AS [Description], 
    er.process_id AS [ProcessID], 
    er.mailitem_id AS [MailItemID], 
    er.account_id AS [AccountID], 
    er.last_mod_date AS [LastModifiedDate], 
    er.last_mod_user AS [LastModifiedUser],
    fi.send_request_user,
    fi.send_request_date,
    fi.recipients, fi.subject, fi.body
FROM msdb.dbo.sysmail_event_log er 
    LEFT JOIN msdb.dbo.sysmail_faileditems fi
ON er.mailitem_id = fi.mailitem_id
ORDER BY [LogDate] DESC

Cuando se devuelve un error desde sp_send_dbmail, el correo electrónico no se envía al sistema Correo electrónico de base de datos y el error no se muestra en la sysmail_event_log vista. Debe recopilar el seguimiento del generador de perfiles de nivel de instrucción y solucionar el error que encuentre.

Cuando se produce un error en la entrega de cuentas individuales, Correo electrónico de base de datos mantendrá los mensajes de error durante los reintentos hasta que la entrega del elemento de correo se realice correctamente o se produzca un error. Si la entrega se realiza correctamente al final, todos los errores acumulados se registran como advertencias independientes, incluido account_id. Puede provocar una advertencia incluso si se envió el correo electrónico. Si se produce un error en la entrega al final, todas las advertencias anteriores se registran como un mensaje de error sin porque account_id se han producido errores en todas las cuentas.

Problemas que se pueden registrar en sysmail_event_log

Es posible que se hayan registrado sysmail_event_loglos siguientes problemas:

  • Error de DatabaseMail.exe para conectarse a SQL Server.

    Si el programa externo no puede iniciar sesión en las tablas msdb , el programa registrará errores en el registro de eventos de la aplicación Windows.

  • Errores asociados al servidor SMTP.

    • Error al ponerse en contacto con el servidor SMTP.
    • Error al autenticarse con el servidor SMTP.
    • El servidor SMTP rechaza el mensaje de correo electrónico.
  • Excepciones en DatabaseMail.exe.

Si no hay problemas con Correo electrónico de base de datos ejecutable externo, vaya a las vistas del sistema sysmail. Para buscar errores relacionados con correos electrónicos específicos, busque el mailitem_id del correo electrónico con error en la sysmail_faileditems vista y, a continuación, busque los mensajes relacionados con mailitem_id en sysmail_event_log. Cuando se devuelve un error desde sp_send_dbmail, el correo electrónico no se envía al sistema Correo electrónico de base de datos y el error no se muestra en la sysmail_event_log vista.

Paso 2: Comprobar las vistas de sysmail_unsentitems, sysmail_sentitems y sysmail_faileditems

Puede comprobar si estas vistas tienen problemas con correos electrónicos específicos para ver si los correos electrónicos de base de datos se envían, se bloquean en la cola o no se envían.

Las tablas internas de la base de datos msdb contienen los mensajes de correo electrónico y los datos adjuntos que se envían desde Correo electrónico de base de datos, junto con su estado actual. Correo electrónico de base de datos actualiza estas tablas cuando se procesan los mensajes.

Sysmail_mailitems table es la tabla base para las otras vistas sysmail. La sysmail_allitems vista se basa en la tabla y es un superconjunto de estas vistas.

Nota:

Si realiza una copia de seguridad de la base de datos msdb de producción y la restauración en otro sistema de prueba como base de datos de usuario, puede volver a crear las vistas del sistema sysmail en la copia de seguridad restaurada. Las definiciones de vista de la copia de seguridad restaurada harán referencia a la base de datos msdb en el sistema donde restauró la copia de seguridad. Consulte el script para volver a crear vistas de sysmail en msdb del cliente en la sección copia de seguridad de Msdb .

Sysmail_unsentitems

Esta vista contiene una fila para cada mensaje de Correo electrónico de base de datos cuyo estado no es correcto o reintento.

Use esta vista cuando desee ver cuántos mensajes están esperando para enviarse y cuánto tiempo han estado en la cola de correo. Por lo general, el número de mensajes no enviados es pequeño. Puede realizar pruebas comparativas durante las operaciones normales para determinar un número razonable de mensajes en la cola de mensajes para las operaciones normales.

También puede comprobar los sysmail_unsentitems correos en si hay problemas con los objetos de Service Broker en msdb. Si la ExternalMailQueue cola o InternalMailQueue está deshabilitada o hay problemas con la ruta, el correo puede permanecer en sysmail_unsentitmes.

Los mensajes no enviados o reintentos siguen en la cola de correo y se pueden enviar en cualquier momento. Los mensajes pueden tener el estado no enviado por los siguientes motivos:

  • El mensaje es nuevo. Aunque el mensaje se ha colocado en la cola de correo, Correo electrónico de base de datos está trabajando en otros mensajes y aún no ha alcanzado este mensaje.
  • El Correo electrónico de base de datos programa externo no se está ejecutando y no se envía ningún correo.

Los mensajes pueden tener el estado de reintento por los siguientes motivos:

  • Correo electrónico de base de datos intentó enviar el correo, pero no pudo ponerse en contacto con el servidor de correo SMTP. Correo electrónico de base de datos sigue intentando enviar el mensaje mediante otras cuentas de Correo electrónico de base de datos asignadas al perfil que envió el mensaje. Si ninguna cuenta puede enviar el correo, Correo electrónico de base de datos esperará el período de tiempo configurado para el Account Retry Delay parámetro y, a continuación, intentará volver a enviar el mensaje. Correo electrónico de base de datos usa el parámetro para determinar cuántas veces se intenta enviar el mensaje. Cuando Correo electrónico de base de datos intenta enviar el mensaje, el mensaje sigue siendo el estado de reintento.
  • Correo electrónico de base de datos se conecta al servidor SMTP, pero se produce un error. El código de error SMTP devuelto por el servidor SMTP y cualquier mensaje de error que lo acompaña se puede usar para solucionar problemas adicionales.

Sysmail_faileditems

Si sabe que no se pudo enviar el correo electrónico, puede consultarlo sysmail_faileditems directamente. Para obtener más información sobre cómo consultar sysmail_faileditems y filtrar mensajes específicos por destinatario, vea Comprobar el estado de los mensajes de correo electrónico enviados con Correo electrónico de base de datos.

Para comprobar el estado de los mensajes de correo electrónico que se envían mediante Correo electrónico de base de datos, ejecute los siguientes scripts:

-- Show the subject, the time that the mail item row was last  
-- modified, and the log information.  
-- Join sysmail_faileditems to sysmail_event_log   
-- on the mailitem_id column.  
-- In the WHERE clause list items where danw was in the recipients,  
-- copy_recipients, or blind_copy_recipients.  
-- These are the items that would have been sent to Jane@contoso.com
 
SELECT items.subject, items.last_mod_date, l.description 
FROM dbo.sysmail_faileditems AS items  
INNER JOIN dbo.sysmail_event_log AS l ON items.mailitem_id = l.mailitem_id  
WHERE items.recipients LIKE '%Jane%'    
    OR items.copy_recipients LIKE '%Jane%'   
    OR items.blind_copy_recipients LIKE '%Jane%'  
GO  

Sysmail_sentitems

Si desea encontrar la hora en que se envió correctamente el último correo electrónico, puede consultar sysmail_sentitems y ordenar de sent_date la siguiente manera:

SELECT ssi.sent_date, * 
FROM msdb.dbo.sysmail_sentitems ssi
ORDER BY ssi.sent_date DESC

Si ciertos tipos de correo se envían correctamente, pero otros no, esta vista puede ayudarle a averiguar las diferencias.

Paso 3: Comprobar sysmail_mailattachments vista

Esta vista contiene una fila por cada dato adjunto que se envía a Correo electrónico de base de datos. Use esta vista cuando necesite información sobre Correo electrónico de base de datos datos adjuntos.

Si tiene problemas para enviar correos electrónicos con datos adjuntos, pero algunos correos con datos adjuntos se envían correctamente, esta vista puede ayudarle a averiguar las diferencias.

Paso 4: Comprobación de la configuración de Correo electrónico de base de datos para el servidor SMTP

Otro paso para ayudar a resolver problemas de Correo electrónico de base de datos es comprobar la configuración de Correo electrónico de base de datos para el servidor SMTP y la cuenta que se usa para enviar Correo electrónico de base de datos.

Para obtener más información sobre cómo configurar Correo electrónico de base de datos, vea Configurar Correo electrónico de base de datos.

Configuración de Correo electrónico de base de datos

Para configurar Correo electrónico de base de datos, siga estos pasos:

  1. Abra SSMS, seleccione Administración, haga clic con el botón derecho en Correo electrónico de base de datos y seleccione Configurar Correo electrónico de base de datos.

    Captura de pantalla del elemento configurar Correo electrónico de base de datos registro en Correo electrónico de base de datos menú.

  2. Seleccione Administrar cuentas y perfiles> de Correo electrónico de base de datosSiguiente.

  3. Si tiene una cuenta, seleccione Ver, cambiar o eliminar una cuenta existente y seleccione Siguiente; de lo contrario, seleccione Crear nueva cuenta. En la captura de pantalla siguiente se muestra la configuración de la cuenta que se usa para conectarse al servidor SMTP y enviar Correo electrónico de base de datos.

    Captura de pantalla de la administración de la cuenta existente en el Asistente para configuración de correo electrónico de base de datos.

Preste especial atención a:

  • Nombre del servidor y número de puerto. El nombre del servidor debe ser un nombre de dominio completo y el número de puerto debe ser preciso. Por lo general, el puerto SMTP predeterminado es 25, pero debe comprobar la configuración smtp actual.

  • SSL. Compruebe si el servidor SMTP requiere Capa de sockets seguros (SSL) o Seguridad de la capa de transporte (TLS).

  • Autenticación SMTP. ¿Usa la autenticación de Windows del servicio Motor de base de datos, la autenticación básica con una cuenta de dominio especificada o la autenticación anónima? Debe comprobar lo que permite el servidor SMTP en su propio entorno. Si se especifica una cuenta de dominio (ya sea una cuenta de servicio o una autenticación básica), debe tener los permisos en el servidor SMTP.

Puede usar la configuración para enviar un correo de prueba con PowerShell. Consulte Envío de un correo electrónico de prueba con PowerShell.

Comprobación de Correo electrónico de base de datos parámetros del sistema

Para comprobar los parámetros del sistema, siga estos pasos:

  1. Abra SSMS, seleccione Administración, haga clic con el botón derecho en Correo electrónico de base de datos y seleccione Configurar Correo electrónico de base de datos.

  2. Seleccione Ver o cambiar los parámetros del sistema.

En la captura de pantalla siguiente se muestran los valores predeterminados de los parámetros del sistema. Observe los parámetros únicos del sistema y determine si están relacionados con el problema que está solucionando.

Captura de pantalla de la configuración de parámetros del sistema en el Asistente para configuración de correo electrónico de base de datos.

Paso 5: Enviar un correo de prueba

Esta sección le ayuda a enviar una Correo electrónico de base de datos de prueba mediante SSMS y PowerShell.

Enviar un correo electrónico de prueba con Correo electrónico de base de datos

El envío de un correo electrónico de prueba le ayuda a intentar reproducir el problema que está experimentando y a comprobar si se puede enviar algún Correo electrónico de base de datos.

Para enviar una Correo electrónico de base de datos de prueba, seleccione Administración, haga clic con el botón derecho en Correo electrónico de base de datos y seleccione Enviar correo electrónico de prueba....

Captura de pantalla de la opción enviar correo electrónico de prueba que se muestra después de hacer clic con el botón derecho en Correo electrónico de base de datos.

Después de enviar el correo de prueba, compruebe las vistas Correo electrónico de base de datos log y sysmail.

  • Si el correo de prueba no se envía correctamente, use este documento para solucionar los problemas por los que no se envía.
  • Si el correo de prueba se envía correctamente, pero todavía hay problemas con otros correos que no se envían, céntrese en los detalles de los mensajes de correo electrónico que no se envían. Revise el comando real sp_send_dbmail que se está ejecutando. Si no tiene el comando Transact-SQL, recopile un seguimiento XEvent mediante sql_batch_completed comandos y sql_batch_started y examine la batch_text columna.

Envío de un correo electrónico de prueba con PowerShell

El uso de un proceso externo le ayuda a excluir Correo electrónico de base de datos de la solución de problemas y probar la configuración de la cuenta. Por ejemplo, use PowerShell para enviar un correo de prueba. Si no envía un correo de prueba mediante PowerShell, indica que no es un problema de Correo electrónico de base de datos.

Si el correo que se envía desde PowerShell produce un error con la misma configuración y credenciales del servidor SMTP, puede indicar que el problema está en el servidor SMTP.

  • Cambie los parámetros siguientes según el entorno y, a continuación, ejecute el siguiente script:

    $EmailFrom = "dbmail@contoso.com"
    $EmailPass = "Y0reP@ssw0rd"
    $EmailTo = "email_alias@contoso.com"
    $Port = 587
    $Subject = "Test From PowerShell"
    $Body = "Did this work?"
    $SMTPServer = "smtp.contoso.com"
    
    $SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, $Port)
    $SMTPClient.EnableSsl = $true
    $SMTPClient.Credentials = New-Object System.Net.NetworkCredential($EmailFrom, $EmailPass);
    $SMTPClient.Send($EmailFrom, $EmailTo, $Subject, $Body) 
    
  • Si el servidor SMTP permite la autenticación anónima, use el puerto estándar 25 y no requiere SSL. Ejecute el siguiente script:

    $EmailFrom = "dbmail@contoso.com"
    $EmailTo = "email_alias@contoso.com"
    $Port = 25
    $Subject = "Test From PowerShell (Anonymous Auth, no SSL)"
    $Body = "Did this work?"
    $SMTPServer = "smtp.contoso.com"
    
    $SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, $Port)
    $SMTPClient.EnableSsl = $true
    $SMTPClient.Credentials = New-Object System.Net.NetworkCredential($EmailFrom, $EmailPass);
    $SMTPClient.Send($EmailFrom, $EmailTo, $Subject, $Body) 
    

Paso 6: Comprobación de los objetos de Sysmail Service Broker

Los problemas con los objetos de Service Broker en msdb pueden provocar un funcionamiento incorrecto de Correo electrónico de base de datos. Un problema común es que una de las colas de Service Broker (ExternalMailQueue y InternalMailQueue) está deshabilitada. Este problema puede deberse a un mensaje dudoso que no se puede enviar correctamente en Service Broker. Por ejemplo, XML con formato incorrecto. Si un mensaje no se puede enviar después de cinco intentos, se considera "dudoso" y la cola se deshabilitará hasta que se quite el mensaje dudoso. Volver a habilitar la cola no resolverá el problema porque el mensaje dudoso sigue en la cola y la secuencia de errores simplemente se repetirá. Para obtener más información sobre el mensaje dudoso, vea Control de mensajes dudosos.

Uno de los demás objetos de Service Broker (como Message Type, Contract, Servicey Route) también puede estar deshabilitado o falta. Las colas de Service Broker tienen un procedimiento de activación asociado a la cola, por lo que es un posible punto de error. Puede comprobar la activation_procedure columna en msdb.sys.service_queuesy, a continuación, usar sp_helptext para comprobar si hay algún problema.

Ejecute la consulta siguiente y compruebe el contenido de la segunda columna de los resultados de la consulta.

SELECT CONVERT(VARCHAR(32),name) Name, 'exec sp_helptext ''' + activation_procedure + '''' ActivationProc_Code 
FROM msdb.sys.service_queues

Para determinar si hay algún problema con los objetos de Service Broker, es mejor comparar los objetos con una configuración de Correo electrónico de base de datos que funcione. Estos son los objetos con los que debe comparar:

  • Message Types
    • {//www.microsoft.com/databasemail/messages} Sendmail
    • {//www.microsoft.com/databasemail/messages} SendMailStatus
  • Contracts
    • www.microsoft.com/databasemail/contracts/SendMail/v1.0
  • Queues
    • dbo.ExternalMailQueue
    • dbo.InternalMailQueue
  • Services
    • ExternalMailService
    • InternalMailService
  • Routes

Solución de problemas de Correo electrónico de base de datos avanzadas

La solución de problemas avanzada se aplica a los siguientes escenarios:

  • Al examinar el registro de Correo electrónico de base de datos, Correo electrónico de base de datos se bloquea y la causa no se explica por completo. Verá que el proceso DatabaseMail se inicia inmediatamente seguido de un mensaje de excepción y, a continuación, se muestra el proceso DatabaseMail que se está cerrando .
  • Correo electrónico de base de datos no se inicia correctamente. No se inicia el proceso DatabaseMail en la sysmail_event_log vista.
  • La solución de problemas inicial no ayuda a resolver el problema.

Puede usar los métodos siguientes para la solución de problemas de Correo electrónico de base de datos avanzada.

Colecciones para la solución de problemas avanzada

Para resolver los problemas, es posible que necesite una o varias de estas colecciones.

Método 1: Copia de seguridad de la base de datos msdb

Puede ser útil consultar las vistas sysmail en un entorno independiente de la producción. En algunos casos, puede realizar una copia de seguridad de la base de datos msdb y, a continuación, restaurarla en otra instancia. Las vistas sysmail se definen con referencia a msdb, por lo que incluso al realizar consultas en la copia de seguridad de msdb restaurada, las vistas harán referencia a la base de datos del sistema msdb en su instancia. Para volver a crear vistas sysmail desde msdb de producción, vuelva a crear las vistas sysmail en la base de datos de usuario mediante el siguiente script.

/* sysmail_allitems */

USE [msdb_customer]
GO

PRINT 'Creating view sysmail_allitems in msdb backup from customer...'
GO
IF (EXISTS (SELECT *
            FROM [msdb_customer].dbo.sysobjects
            WHERE (NAME = N'sysmail_allitems')
              AND (TYPE = 'V')))
  DROP VIEW sysmail_allitems
GO

CREATE VIEW sysmail_allitems
AS
SELECT mailitem_id, profile_id, recipients, copy_recipients, blind_copy_recipients, subject, body, body_format, importance, sensitivity, file_attachments,
       attachment_encoding, query, execute_query_database, attach_query_result_as_file, query_result_header, query_result_width, query_result_separator,
       exclude_query_output, append_query_error, send_request_date, send_request_user, sent_account_id,
       CASE sent_status 
          WHEN 0 THEN 'unsent' 
          WHEN 1 THEN 'sent' 
          WHEN 3 THEN 'retrying' 
          ELSE 'failed' 
       END AS sent_status,
       sent_date, last_mod_date, last_mod_user       
FROM [msdb_customer].dbo.sysmail_mailitems 
WHERE (send_request_user = SUSER_SNAME()) OR (ISNULL(IS_SRVROLEMEMBER(N'sysadmin'), 0) = 1) 

GO

/* sysmail_sentitems */

USE [msdb_customer]
GO

PRINT 'Creating view sysmail_sentitems in msdb backup from customer...'
GO
IF (EXISTS (SELECT *
            FROM [msdb_customer].dbo.sysobjects
            WHERE (NAME = N'sysmail_sentitems')
              AND (TYPE = 'V')))
  DROP VIEW sysmail_sentitems
GO

CREATE VIEW sysmail_sentitems
AS
SELECT * FROM [msdb_customer].dbo.sysmail_allitems WHERE sent_status = 'sent'

GO

/* sysmail_unsentitems */

USE [msdb_customer]
GO

PRINT 'Creating view sysmail_unsentitems in msdb backup from customer...'
GO
IF (EXISTS (SELECT *
            FROM [msdb_customer].dbo.sysobjects
            WHERE (NAME = N'sysmail_unsentitems')
              AND (TYPE = 'V')))
  DROP VIEW sysmail_unsentitems
GO

CREATE VIEW sysmail_unsentitems
AS
SELECT * FROM [msdb_customer].dbo.sysmail_allitems WHERE (sent_status = 'unsent' OR sent_status = 'retrying')

GO

/* sysmail_faileditems */

USE [msdb_customer]
GO

PRINT 'Creating view sysmail_faileditems in msdb backup from customer...'
GO
IF (EXISTS (SELECT *
            FROM [msdb_customer].dbo.sysobjects
            WHERE (NAME = N'sysmail_faileditems')
              AND (TYPE = 'V')))
  DROP VIEW sysmail_faileditems
GO

CREATE VIEW sysmail_faileditems
AS
SELECT * FROM [msdb_customer].dbo.sysmail_allitems WHERE sent_status = 'failed'

GO

/* sysmail_event_log */
USE [msdb_customer]
GO
PRINT 'Creating view sysmail_event_log in msdb backup from customer...'
GO
IF (EXISTS (SELECT *
            FROM [msdb_customer].dbo.sysobjects
            WHERE (NAME = N'sysmail_event_log')
              AND (TYPE = 'V')))
  DROP VIEW sysmail_event_log
GO
CREATE VIEW sysmail_event_log
AS
SELECT log_id,
       CASE event_type 
          WHEN 0 THEN 'success' 
          WHEN 1 THEN 'information' 
          WHEN 2 THEN 'warning' 
          ELSE 'error' 
       END as event_type,
       log_date, description, process_id, sl.mailitem_id, account_id, sl.last_mod_date, sl.last_mod_user
FROM [msdb_customer].[dbo].[sysmail_log]  sl
WHERE (ISNULL(IS_SRVROLEMEMBER(N'sysadmin'), 0) = 1) OR 
      (EXISTS ( SELECT mailitem_id FROM [msdb_customer].[dbo].[sysmail_allitems] ai WHERE sl.mailitem_id = ai.mailitem_id ))

GO

Para obtener más información sobre las vistas de sysmail, consulte la sección vistas del sistema sysmail .

Método 2: Comprobar el registro de eventos de la aplicación Windows

Si el programa deDatabaseMail.exe externo no puede iniciar sesión en la tabla msdb , el programa registrará el error en el registro de eventos de la aplicación Windows. Además, si DatabaseMail.exe encuentra una excepción, también se registrará la excepción. Aunque la pila de excepciones suele ser idéntica, compruebe el registro de eventos para ver si existe otra información de pila.

A veces, al solucionar problemas de un bloqueo deDatabaseMail.exe , es posible que el registro indique que se creó un volcado de informe de errores de Windows como se indica a continuación:

<datetime stamp>,Information,0,1001,Windows Error Reporting,Viewpoint.contoso.com,"Fault bucket , type 0
Event Name: APPCRASH
Response: Not available
Cab Id: 0
Problem signature:
P1: DatabaseMail.exe
P2: 11.0.2100.60
P3: 4f35e1a1
P4: KERNELBASE.dll
P5: 6.3.9600.18725
P6: 59380775
P7: c0000142
P8: 00000000000ece60
P9: 
P10: 
Attached files:
These files may be available here:
C:\ProgramData\Microsoft\Windows\WER\ReportQueue\AppCrash_DatabaseMail.exe_deaadc12935831f6bbfe9bdcb0cbf864374426c1_807e7507_337982fd
Analysis symbol: 
Rechecking for solution: 0
Report Id: <Report Id>
Report Status: 4100
Hashed bucket:"

Puede recuperar todos los archivos que muestran AppCrash_DatabaseMail.exe_* en .. \WER\ReportQueue ruta de acceso. Consulte la sección Análisis de ProcDump para obtener sugerencias de análisis de volcado de memoria.

Método 3: Recopilar y analizar XEvent o SQL Server Trace

Puede recopilar un seguimiento de los comandos de Transact-SQL que se ejecutan en el sistema para ver si se produce un error en alguno de ellos.

Configuración de la herramienta PSSDiag

Puede usar PSSDiag para recopilar el seguimiento XEvent o SQL Server en la plantilla Rendimiento general. Como se muestra en la captura de pantalla siguiente, seleccione algunos eventos adicionales, especialmente todos los eventos de agente.

Captura de pantalla de la herramienta Pssdiag en la que están habilitados todos los eventos de agente de la pestaña XEvent.

Análisis del seguimiento de Xevent o SQL

Cuando se envía un Correo electrónico de base de datos, normalmente se ven cinco sesiones diferentes (SPID) en una captura Xevent o Profiler.

  • sp_send_dbmail: después de ejecutar la instrucción Transact-SQL, verá los eventos de Service Broker que se usan para colocar los mensajes en la ExternalMailQueue cola.

  • Activación de Service Broker para enviar mensajes al servidor SMTP a través deDatabaseMail.exe. El nombre de la aplicación es "Microsoft SQL Server Service Broker Activation".

  • Correo electrónico de base de datos programa externo: este es el programa de Correo electrónico de base de datos externo que recibe mensajes de la ExternalMailQueue cola y prepara los mensajes para enviarlos al servidor SMTP. El nombre de la aplicación es "DatabaseMail - DatabaseMail - Id<PID>".

  • Correo electrónico de base de datos programa externo: esta es otra conexión de Correo electrónico de base de datos. Después de que la primera conexión procese los mensajes existentes en la ExternalMailQueue cola, se crea la conexión para escuchar los mensajes adicionales que se colocarán en la cola. Si no hay ningún otro mensaje en la cola, DatabaseMail.exe finalizará y cerrará esta conexión.

  • Activación de Service Broker para recibir mensajes de respuesta del servidor SMTP a través deDatabaseMail.exe. Actualiza las tablas sysmail para registrar los resultados de los correos que se envían.

Solo puede conocer el comportamiento esperado si ve muchos de los seguimientos. La mejor manera de saber las diferencias es comparar el seguimiento con el de los correos electrónicos de base de datos enviados correctamente. Si a veces puede enviar un Correo electrónico de base de datos, compare el seguimiento con un seguimiento correcto, vea la diferencia y compruebe si hay errores notificados por los SPID. Si no puede enviar ningún Correo electrónico de base de datos, compare el seguimiento con el que se envía correctamente en el entorno de prueba.

Método 4: Capturar y analizar eventos de Monitor de procesos

Monitor de procesos (Procmon) forma parte del conjunto Sysinternals de Windows.

Process Monitor genera una captura ruidosa. Para no perder nada, es mejor aplicar filtros a los datos después de capturarlos en lugar de durante el proceso de captura. Normalmente, puede dirigirse a la captura en torno a una reproducción del problema de Correo electrónico de base de datos, por lo que los datos globales capturados no serían demasiado grandes.

Capturar eventos de archivo, registro, red, proceso y subproceso

Cuando se inicia procmon.exe, comienza a capturar datos inmediatamente. La GUI es sencilla. Debe detener la captura de eventos hasta que esté listo para reproducir el problema. Seleccione Eventos>de captura de archivos (Ctrl+E) para desactivar el elemento de menú y detener la colección de eventos. Seleccione el icono de borrador o presione Ctrl+X para borrar los eventos que ya están capturados:

Captura de pantalla de la herramienta procmon que muestra que se borran todos los eventos.

Cuando esté listo para reproducir el problema de Correo electrónico de base de datos, siga estos pasos:

  1. Seleccione Eventos>de captura de archivos (Ctrl+E) para empezar a capturar eventos.
  2. Intente enviar el Correo electrónico de base de datos para reproducir el problema.
  3. Seleccione Eventos>de captura de archivos (Ctrl+E) para detener la captura de eventos.
  4. Guarde el archivo como *. PML.

Análisis del seguimiento del Monitor de procesos

Después de obtener . Archivo PML, ábralo con Monitor de procesos de nuevo. En primer lugar, filtre el archivo a los procesos deDatabaseMail.exe y sqlservr.exe . A continuación, seleccione Filtrar > filtro... o haga clic en el icono de filtro para abrir el menú de filtro.

En Nombre del proceso, seleccione sqlservr.exe y DatabaseMail.exey agregue estas entradas:

Captura de pantalla de la herramienta procmon que muestra database.exe está filtrada.

Al igual que el caso de la captura XEvent o Trace de SQL, no es inmediatamente obvio lo que se debe buscar. Normalmente, la mejor manera de iniciar el análisis es comparar el seguimiento con una captura de Procmon para una Correo electrónico de base de datos enviada correctamente. Lo ideal es comparar el seguimiento con un correo electrónico enviado correctamente desde el mismo entorno donde se produce el problema. Sin embargo, si no se envía correctamente ningún Correo electrónico de base de datos en el entorno específico, compare el seguimiento con un correo electrónico enviado correctamente en otro entorno.

Cuando DatabaseMail.exe no puede cargar un archivo DLL o no encuentra el archivo DatabaseMail.exe.config , el análisis es útil.

Método 5: Recopilar y analizar el volcado de excepciones mediante la herramienta ProcDump

ProcDump también forma parte del conjunto Sysinternals de Windows.

ProcDump es útil cuando se intenta capturar un volcado de memoria del programa externoDatabaseMail.exe . Normalmente, se usa ProcDump para solucionar problemas cuando DatabaseMail.exe encuentra una excepción no controlada.

Configuración de ProcDump

Para configurar ProcDump para capturar un volcado de DatabaseMail.exe al encontrar una excepción no controlada, abra primero un símbolo del sistema con privilegios de administrador. A continuación, habilite ProcDump para capturar el volcado del proceso deDatabaseMail.exe mediante el siguiente comando:

c:\Sysinternals> procdump -ma -t DatabaseMail.exe -w e2

Verá la siguiente salida en la ventana de comandos:

ProcDump v9.0 - Sysinternals process dump utility
Copyright (C) 2009-2017 Mark Russinovich and Andrew Richards
Sysinternals - www.sysinternals.com
 
Waiting for process named DatabaseMail.exe...

A continuación, reproduzca el problema. El volcado se creará en la misma carpeta donde ha ejecutado ProcDump.exe.

Análisis del volcado de excepciones

Busque el registro de excepciones y examine la pila de llamadas que conduce a la excepción.

  1. Abra el archivo de volcado en WinDbg (descargar herramientas de depuración para Windows- WinDbg - controladores de Windows).
  2. Cambie al registro de excepciones mediante el .ecxr comando o !analyze -v .

Cuando tenga la pila, empiece a buscar problemas conocidos para una pila de llamadas coincidente. Si necesita más ayuda, póngase en contacto con el equipo de CSS.

Método 6: Usar la herramienta de depuración de viajes en el tiempo

La captura de depuración de viajes en el tiempo (TTD) suele ser el último recurso para problemas difíciles. Puede usar el depurador de la versión preliminar de WinDbg para obtenerlo. Para obtener instrucciones completas e información sobre TTD, vea Depuración de viajes en el tiempo sobre cómo funciona y cómo realizar análisis. Si llega a este punto, debe ponerse en contacto con el equipo de CSS. Sin embargo, en esta sección se proporcionan instrucciones sobre cómo capturar el TTD cuando sea necesario.

Configuración de TTD

Por varias razones, la captura TTD de DatabaseMail.exe puede ser un poco difícil. En primer lugar, DatabaseMail.exe no se ejecuta como un servicio indefinidamente, pero lo invoca SQL Server proceso (sqlservr.exe). Por lo tanto, no se puede asociar a él, pero debe configurar TTD mediante el -onLaunch parámetro para empezar a capturarlo cuando se iniciaDatabaseMail.exe . En segundo lugar, dado que otro proceso invocaDatabaseMail.exe, debe usar los procesos secundarios de depuración.