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 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 y sysmail (sysmail_event_log) de Correo electrónico de base de datos para los correos que ya se han enviado o intentado enviar mediante DatabaseMail.exe.
  2. Envíe 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 y omita 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 puede enviar el correo mediante PowerShell, es probable que sea un problema de configuración smtp y 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 sysmail de Msdb

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

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

    Nombre Escribir Descripción
    sysmail_allitems Ver Enumera todos los mensajes que se envían a Correo electrónico de base de datos.
    sysmail_event_log Ver Muestra mensajes sobre el comportamiento del programa externo de Correo electrónico de base de datos.
    sysmail_faileditems Ver Información sobre los mensajes que Correo electrónico de base de datos no se pudieron enviar.
    sysmail_mailattachments Ver Información acerca de los datos adjuntos a mensajes del Correo electrónico de base de datos.
    sysmail_sentitems Ver Información sobre los mensajes que se han enviado mediante Correo electrónico de base de datos.
    sysmail_unsentitems Ver 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 los eventos relacionados con errores de correo electrónico. Algunos mensajes (como el error del programa externo Correo electrónico de base de datos) 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 el registro de Correo electrónico de base de datos de la siguiente manera:

Captura de pantalla del elemento de registro Ver Correo electrónico de base de datos 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:

  • Errors
  • Advertencias
  • Información
  • Correcto

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

Comprobar el 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 errores en la sysmail_faileditems vista y, a continuación, busque 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 de 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 los intentos de entrega de cuentas individuales, Correo electrónico de base de datos contendrá 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 un account_id porque se han producido errores en todas las cuentas.

Problemas que se pueden registrar en sysmail_event_log

Es posible que se registren los siguientes problemas:sysmail_event_log

  • 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 de Windows.

  • Errores asociados con el 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 errores en la sysmail_faileditems vista y, a continuación, busque 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 de 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 estas vistas si hay problemas con correos electrónicos específicos para ver si se envían correos electrónicos de base de datos, están bloqueados en la cola o no se pueden enviar.

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 restaura 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 el cliente msdb en la sección Copia de seguridad de Msdb.

Sysmail_unsentitems

Esta vista contiene una fila para cada Correo electrónico de base de datos mensaje cuyo estado no se envía o vuelve a intentarlo.

Utilice esta vista cuando desee ver cuántos mensajes hay en espera para ser enviados y cuánto tiempo llevan en la cola de correo. Por lo general, el número de mensajes sin enviar 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 correos en sysmail_unsentitems 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 sin enviar o reintentar siguen en la cola de correo y se pueden enviar en cualquier momento. Los mensajes pueden tener el estado sin enviar 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 llegado a 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 tiempo configurado para el Account Retry Delay parámetro y, a continuación, intentará enviar el mensaje de nuevo. 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 complementario se puede usar para solucionar más problemas.

Sysmail_faileditems

Si sabe que no se pudo enviar el correo electrónico, puede consultar 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 la que se envió correctamente el último correo electrónico, puede consultar sysmail_sentitems y pedir sent_date de 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 para cada archivo 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 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 Correo electrónico de base de datos problemas 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 los pasos siguientes:

  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 de registro configurar Correo electrónico de base de datos en Correo electrónico de base de datos menú.

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

  3. Si tiene una cuenta, seleccione Ver, cambiar o eliminar una cuenta existente y, 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 qué permite el servidor SMTP en su propio entorno. Si se especifica una cuenta de dominio (ya sea una cuenta de servicio o la 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 los 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 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

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

Para enviar un 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 de registro y sysmail de Correo electrónico de base de datos.

  • Si el correo de prueba no se envía correctamente, use este documento para solucionar por qué 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 puede enviar un correo de prueba mediante PowerShell, indica que no es un problema de Correo electrónico de base de datos.

Si se produce un error en el correo enviado desde PowerShell 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 requiera 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 Service Broker de sysmail

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 no se puede enviar un mensaje 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 todavía está en la cola y la secuencia de errores se repetirá. Para obtener más información sobre el mensaje dudoso, vea Control de mensajes dudosos.

Uno de los otros objetos de Service Broker (como Message Type, Contract, Servicey Route) también puede deshabilitarse o faltar. 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 funcional. 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 avanzadas de Correo electrónico de base de datos

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

  • 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 con un mensaje de excepción y, a continuación , se muestra el proceso DatabaseMail apagado .
  • Correo electrónico de base de datos no se inicia correctamente. No ve que el proceso DatabaseMail se inicia en la sysmail_event_log vista.
  • La solución de problemas inicial no le ayuda a resolver el problema.

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

Recopilaciones 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 resultar útil consultar las vistas de 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. Todas las vistas sysmail se definen con referencia a msdb, por lo que incluso al consultar en la copia de seguridad de msdb restaurada, las vistas harán referencia a la base de datos del sistema msdb en la instancia. Para volver a crear vistas de sysmail desde msdb de producción, vuelva a crear las vistas de 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: Comprobación del registro de eventos de la aplicación Windows

Si el programa DatabaseMail.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 de 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 alguna otra información de pila.

A veces, cuando soluciona un bloqueo de DatabaseMail.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 ProcDump Analysis (Análisis de ProcDump) para obtener sugerencias de análisis de volcado.

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

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 de 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 en la pestaña XEvent.

Análisis del seguimiento de Xevent o SQL

Cuando se envía un Correo electrónico de base de datos, verá normalmente cinco sesiones diferentes (SPID) en una captura de 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 de DatabaseMail.exe. El nombre de la aplicación es "Activación de Microsoft SQL Server Service Broker".

  • 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, la conexión se crea para escuchar 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 de DatabaseMail.exe. Actualiza las tablas de sysmail para registrar los resultados de los mensajes que se envían.

Solo puede conocer el comportamiento esperado viendo muchos de los seguimientos. La mejor manera de conocer las diferencias es comparar el seguimiento con uno de los Correo electrónico de base de datos enviados correctamente. Si a veces puede enviar una 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 ninguna 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 del Monitor de procesos

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

El Monitor de procesos 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 generales 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 recopilación de eventos. Seleccione el icono del borrador o presione Ctrl+X para borrar los eventos que ya están capturados:

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

Cuando esté listo para reproducir el problema de Correo electrónico de base de datos, siga los 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 el . Archivo PML, ábralo mediante el Monitor de procesos de nuevo. En primer lugar, filtre el archivo a los procesos de DatabaseMail.exe y sqlservr.exe . A continuación, seleccione Filtrar > filtro... o haga clic en el icono de filtro para abrir el menú filtro.

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

Captura de pantalla de la herramienta procmon que muestra database.exe se filtra.

Al igual que sucede con la captura de XEvent o Trace de SQL, no es inmediatamente obvio qué buscar. Normalmente, la mejor manera de iniciar el análisis es comparar el seguimiento con una captura de Procmon para un Correo electrónico de base de datos enviado correctamente. Lo ideal es comparar el seguimiento con un correo electrónico enviado correctamente desde el mismo entorno en el que 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: Recopilación y análisis del 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 externo DatabaseMail.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 de DatabaseMail.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 de tiempo

La captura de depuración de viajes de tiempo (TTD) suele ser el último recurso para problemas difíciles. Puede usar el depurador de vista previa de WinDbg para obtenerlo. Para obtener instrucciones completas e información sobre TTD, vea Time Travel Debugging on how it works and how to do analysis. 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 de TTD de DatabaseMail.exe puede ser un poco difícil. En primer lugar, DatabaseMail.exe no se ejecuta como servicio indefinidamente, pero se invoca mediante el proceso de SQL Server (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 inicie DatabaseMail.exe . En segundo lugar, dado que otro proceso invoca DatabaseMail.exe , debe usar los procesos secundarios de depuración.