Condividi tramite


Risolvere i problemi di Posta elettronica database

Questo articolo fornisce metodi per la risoluzione dei problemi di Posta elettronica database. Se la risoluzione iniziale del problema non ha risolto il problema, usare la risoluzione dei problemi avanzata.

Risoluzione dei problemi iniziale Posta elettronica database

Ecco i passaggi di base per la risoluzione dei problemi:

  1. Esaminare le viste Posta elettronica database log e sysmail (sysmail_event_log) per i messaggi che sono già stati inviati o tentati di inviare tramite DatabaseMail.exe.
  2. Inviare un messaggio di prova. Se il messaggio di test viene inviato correttamente, concentrarsi sui dettagli dei messaggi che non vengono inviati. Se il messaggio di test non viene inviato, concentrarsi sulla risoluzione dei problemi del messaggio di test e ignorare i messaggi inviati in precedenza senza successo.
  3. Se si sospetta che le impostazioni del server SMTP non siano corrette o si sia verificato un problema con l'account usato per inviare la posta elettronica, usare PowerShell per inviare un messaggio di test.
  4. Se non si riesce a inviare il messaggio tramite PowerShell, è probabile che si tratti di un problema di configurazione SMTP e che sia necessario un amministratore SMTP.

Per la risoluzione dei problemi di Posta elettronica database iniziale, è possibile seguire questa procedura.

Viste di sistema sysmail msdb

Prima di esaminare i passaggi dettagliati, ecco un breve riepilogo delle visualizzazioni di sistema Posta elettronica database pertinenti.

  1. La registrazione più rilevante si verifica nella visualizzazione di sistema msdb sysmail. È possibile eseguire query su queste viste direttamente nell'ambiente.

    Nome Tipo Descrizione
    sysmail_allitems Visualizzare Elenchi tutti i messaggi inviati a Posta elettronica database.
    sysmail_event_log Visualizzare Elenchi messaggi sul comportamento del programma esterno Posta elettronica database.
    sysmail_faileditems Visualizzare Informazioni sui messaggi che Posta elettronica database non è stato possibile inviare.
    sysmail_mailattachments Visualizzare Informazioni sugli allegati ai messaggi Posta elettronica database.
    sysmail_sentitems Visualizzare Informazioni sui messaggi inviati tramite Posta elettronica database.
    sysmail_unsentitems Visualizzare Informazioni sui messaggi che Posta elettronica database sta tentando di inviare.
  2. Alcuni errori vengono registrati nel registro eventi dell'applicazione Windows.

Passaggio 1: Controllare sysmail_event_log visualizzazione

Questa visualizzazione di sistema è il punto di partenza per la risoluzione di tutti i problemi di Posta elettronica database.

Durante la risoluzione dei problemi Posta elettronica database, cercare nella sysmail_event_log visualizzazione gli eventi correlati agli errori di posta elettronica. Alcuni messaggi (ad esempio l'errore del programma esterno Posta elettronica database) non sono associati a messaggi di posta elettronica specifici.

Sysmail_event_logcontiene una riga per ogni messaggio di Windows o SQL Server restituito dal sistema Posta elettronica database. In SQL Server Management Studio (SSMS) selezionare Gestione, fare clic con il pulsante destro del mouse su Posta elettronica database e scegliere Visualizza Posta elettronica database log per controllare il log Posta elettronica database come indicato di seguito:

Screenshot della voce Visualizza Posta elettronica database log nel menu Posta elettronica database.

Eseguire la query seguente su 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 colonna può avere i valori seguenti:

  • Errori
  • Avvisi
  • Informazioni
  • Esito positivo

Per visualizzare solo i tipi di evento necessari, usare la WHERE clausola per filtrare.

Controllare l'elemento di posta non riuscito specifico

Per cercare gli errori correlati a messaggi di posta elettronica specifici, cercare il mailitem_id messaggio di posta elettronica non riuscito nella sysmail_faileditems visualizzazione e quindi cercare i messaggi correlati a mailitem_id in 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

Quando viene restituito un errore da sp_send_dbmail, il messaggio di posta elettronica non viene inviato al sistema Posta elettronica database e l'errore non viene visualizzato nella sysmail_event_log visualizzazione. È consigliabile raccogliere la traccia del profiler a livello di istruzione e risolvere l'errore riscontrato.

Quando i singoli tentativi di recapito dell'account hanno esito negativo, Posta elettronica database manterrà i messaggi di errore durante i tentativi fino a quando il recapito dell'elemento di posta non riesce o non riesce. Se il recapito ha esito positivo alla fine, tutti gli errori accumulati vengono registrati come avvisi separati, tra cui account_id. Può causare un avviso anche se il messaggio di posta elettronica è stato inviato. Se il recapito non riesce alla fine, tutti gli avvisi precedenti vengono registrati come un unico messaggio di errore senza un account_id perché tutti gli account non sono riusciti.

Problemi che possono essere registrati sysmail_event_log

È possibile che siano stati registrati sysmail_event_logi problemi seguenti:

  • Errore di DatabaseMail.exe di connessione a SQL Server.

    Se il programma esterno non è in grado di accedere alle tabelle msdb , il programma registrerà gli errori nel registro eventi dell'applicazione Windows.

  • Errori associati al server SMTP.

    • Non è stato possibile contattare il server SMTP.
    • Errore di autenticazione con il server SMTP.
    • Il server SMTP rifiuta il messaggio di posta elettronica.
  • Eccezioni in DatabaseMail.exe.

Se non si verificano problemi con Posta elettronica database eseguibile esterno, passare alle visualizzazioni di sistema sysmail. Per cercare gli errori correlati a messaggi di posta elettronica specifici, cercare il mailitem_id messaggio di posta elettronica non riuscito nella sysmail_faileditems visualizzazione e quindi cercare i messaggi correlati a mailitem_id in sysmail_event_log. Quando viene restituito un errore da sp_send_dbmail, il messaggio di posta elettronica non viene inviato al sistema Posta elettronica database e l'errore non viene visualizzato nella sysmail_event_log visualizzazione.

Passaggio 2: Controllare le visualizzazioni sysmail_unsentitems, sysmail_sentitems e sysmail_faileditems

È possibile controllare la presenza di problemi con messaggi di posta elettronica specifici in queste visualizzazioni per verificare se i messaggi di posta elettronica del database vengono inviati, sono bloccati nella coda o non vengono inviati.

Le tabelle interne nel database msdb contengono i messaggi di posta elettronica e gli allegati inviati da Posta elettronica database, insieme al relativo stato corrente. Posta elettronica database aggiorna queste tabelle quando vengono elaborati i messaggi.

Sysmail_mailitems table è la tabella di base per le altre viste sysmail. La sysmail_allitems vista è basata sulla tabella ed è un superset di queste viste.

Nota

Se si esegue il backup del database msdb di produzione e si esegue il ripristino in un altro sistema di test come database utente, è possibile ricreare le viste di sistema sysmail nel backup ripristinato. Le definizioni di visualizzazione nel backup ripristinato faranno riferimento al database msdb nel sistema in cui è stato ripristinato il backup. Vedere lo script per ricreare le visualizzazioni sysmail in customer msdb nella sezione Backup di Msdb .

Sysmail_unsentitems

Questa visualizzazione contiene una riga per ogni Posta elettronica database messaggio il cui stato non è stato inviato o viene eseguito di nuovo.

Usare questa visualizzazione quando si vuole vedere quanti messaggi sono in attesa di essere inviati e per quanto tempo sono stati nella coda di posta elettronica. In genere, il numero di messaggi non inviati è ridotto. È possibile eseguire il benchmark durante le normali operazioni per determinare un numero ragionevole di messaggi nella coda dei messaggi per le normali operazioni.

È anche possibile controllare la posta in sysmail_unsentitems se si verificano problemi con gli oggetti service broker in msdb. Se la ExternalMailQueue coda o InternalMailQueue è disabilitata o si verificano problemi con la route, la posta potrebbe rimanere in sysmail_unsentitmes.

I messaggi non inviati o che riprovano sono ancora nella coda di posta elettronica e possono essere inviati in qualsiasi momento. I messaggi possono avere lo stato non impostato per i motivi seguenti:

  • Il messaggio è nuovo. Anche se il messaggio è stato inserito nella coda di posta, Posta elettronica database sta lavorando su altri messaggi e non ha ancora raggiunto questo messaggio.
  • Il programma esterno Posta elettronica database non è in esecuzione e non viene inviato alcun messaggio di posta elettronica.

I messaggi possono avere lo stato di ripetizione dei tentativi per i motivi seguenti:

  • Posta elettronica database provato a inviare la posta elettronica, ma non è stato possibile contattare il server di posta SMTP. Posta elettronica database continua a provare a inviare il messaggio usando altri account Posta elettronica database assegnati al profilo che ha inviato il messaggio. Se nessun account può inviare il messaggio di posta elettronica, Posta elettronica database attenderà il periodo di tempo configurato per il Account Retry Delay parametro e quindi tenterà di inviare nuovamente il messaggio. Posta elettronica database usa il parametro per determinare il numero di tentativi di invio del messaggio. Quando Posta elettronica database tenta di inviare il messaggio, il messaggio rimane lo stato di ripetizione dei tentativi.
  • Posta elettronica database si connette al server SMTP, ma si verifica un errore. Il codice di errore SMTP restituito dal server SMTP e qualsiasi messaggio di errore associato può essere usato per un'ulteriore risoluzione dei problemi.

Sysmail_faileditems

Se si sa che non è stato possibile inviare il messaggio di posta elettronica, è possibile eseguire una query sysmail_faileditems direttamente. Per altre informazioni sull'esecuzione di sysmail_faileditems query e sui filtri per messaggi specifici per destinatario, vedere Controllare lo stato dei messaggi EMail inviati con Posta elettronica database.

Per controllare lo stato dei messaggi di posta elettronica inviati tramite Posta elettronica database, eseguire gli script seguenti:

-- 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

Se si vuole trovare l'ora in cui l'ultimo messaggio di posta elettronica è stato inviato correttamente, è possibile eseguire query sysmail_sentitems e ordinare come sent_date segue:

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

Se alcuni tipi di messaggi vengono inviati correttamente ma altri non lo sono, questa visualizzazione può aiutare a individuare le differenze.

Passaggio 3: Controllare sysmail_mailattachments visualizzazione

Questa vista contiene una riga per ogni allegato inviato a Posta elettronica database. Usare questa visualizzazione quando sono necessarie informazioni sugli allegati Posta elettronica database.

Se si verificano problemi durante l'invio di messaggi di posta elettronica con allegati, ma alcuni messaggi con allegati vengono inviati correttamente, questa visualizzazione può essere utile per individuare le differenze.

Passaggio 4: Controllare la configurazione Posta elettronica database per il server SMTP

Un altro passaggio per risolvere Posta elettronica database problemi consiste nel controllare la configurazione Posta elettronica database per il server SMTP e l'account usato per inviare Posta elettronica database.

Per altre informazioni su come configurare Posta elettronica database, vedere Configurare Posta elettronica database.

Configurare Posta elettronica database

Per configurare Posta elettronica database, seguire questa procedura:

  1. Aprire SSMS, selezionare Gestione, fare clic con il pulsante destro del mouse su Posta elettronica database e scegliere Configura Posta elettronica database.

    Screenshot della voce configura Posta elettronica database log nel menu Posta elettronica database.

  2. Selezionare Gestisci account e profili> Posta elettronica databaseAvanti.

  3. Se si dispone di un account, selezionare Visualizza, modificare o eliminare un account esistente e selezionare Avanti, in caso contrario selezionare Crea nuovo account. Lo screenshot seguente mostra le impostazioni dell'account usate per connettersi al server SMTP e inviare Posta elettronica database.

    Screenshot della gestione dell'account esistente nella Configurazione guidata posta elettronica database.

Prestare particolare attenzione a:

  • Nome del server e numero di porta. Il nome del server deve essere un nome di dominio completo e il numero di porta deve essere accurato. In genere, la porta SMTP predefinita è 25, ma è necessario controllare la configurazione SMTP corrente.

  • SSL. Verificare se il server SMTP richiede Secure Sockets Layer (SSL) o Transport Layer Security (TLS).

  • Autenticazione SMTP. Si usa il autenticazione di Windows del servizio Motore di database, l'autenticazione di base con un account di dominio specificato o l'autenticazione anonima? È necessario verificare ciò che il server SMTP consente nel proprio ambiente. Se viene specificato un account di dominio (account del servizio o autenticazione di base), deve disporre delle autorizzazioni per il server SMTP.

È possibile usare la configurazione per inviare un messaggio di test con PowerShell. Vedere Inviare un messaggio di posta elettronica di test con PowerShell.

Controllare Posta elettronica database parametri di sistema

Per controllare i parametri di sistema, seguire questa procedura:

  1. Aprire SSMS, selezionare Gestione, fare clic con il pulsante destro del mouse su Posta elettronica database e scegliere Configura Posta elettronica database.

  2. Selezionare Visualizza o modifica parametri di sistema.

Lo screenshot seguente mostra i valori predefiniti per i parametri di sistema. Notare eventuali parametri di sistema univoci e determinare se sono correlati al problema che si sta risolvendo.

Screenshot della configurazione dei parametri di sistema nella Configurazione guidata posta elettronica database.

Passaggio 5: Inviare un messaggio di test

Questa sezione consente di inviare un Posta elettronica database di test usando SSMS e PowerShell.

Inviare un messaggio di posta elettronica di test con Posta elettronica database

L'invio di un messaggio di posta elettronica di test consente di provare a riprodurre il problema riscontrato e di verificare se è possibile inviare Posta elettronica database.

Per inviare un Posta elettronica database di test, selezionare Gestione, fare clic con il pulsante destro del mouse su Posta elettronica database e scegliere Invia messaggio di posta elettronica di test.

Screenshot dell'opzione invia messaggio di posta elettronica di test visualizzata dopo aver fatto clic con il pulsante destro del mouse su Posta elettronica database.

Dopo aver inviato il messaggio di posta elettronica di test, controllare le visualizzazioni Posta elettronica database log e sysmail.

  • Se il messaggio di test non viene inviato correttamente, usare questo documento per risolvere i problemi relativi al motivo per cui non viene inviato.
  • Se il messaggio di test viene inviato correttamente, ma esistono ancora problemi con altri messaggi che non vengono inviati, concentrarsi sui dettagli dei messaggi di posta elettronica che non vengono inviati. Esaminare il comando effettivo sp_send_dbmail in esecuzione. Se non si dispone del comando Transact-SQL, raccogliere una traccia XEvent usando sql_batch_completed i comandi e sql_batch_started e esaminare la batch_text colonna.

Inviare un messaggio di posta elettronica di test con PowerShell

L'uso di un processo esterno consente di escludere Posta elettronica database dalla risoluzione dei problemi e di testare la configurazione dell'account. Ad esempio, usare PowerShell per inviare un messaggio di test. Se non si riesce a inviare un messaggio di test usando PowerShell, significa che non si tratta di un problema di Posta elettronica database.

Se il messaggio inviato da PowerShell ha esito negativo con le stesse impostazioni e credenziali del server SMTP, potrebbe indicare che il problema si trova nel server SMTP.

  • Modificare i parametri seguenti in base all'ambiente e quindi eseguire lo script seguente:

    $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) 
    
  • Se il server SMTP consente l'autenticazione anonima, usare la porta standard 25 e non richiede SSL. Eseguire lo script seguente:

    $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) 
    

Passaggio 6: Controllare gli oggetti sysmail Service Broker

I problemi con gli oggetti service broker in msdb possono causare un'operazione non riuscita di Posta elettronica database. Un problema comune è che una delle code di Service Broker (ExternalMailQueue e InternalMailQueue) è disabilitata. Questo problema può essere causato da un messaggio non elaborabile che non può essere inviato correttamente in Service Broker. Ad esempio, XML non valido. Se un messaggio non può essere inviato dopo cinque tentativi, viene considerato "non elaborabile" e la coda verrà disabilitata fino a quando il messaggio non elaborabile non viene rimosso. La riabilitare la coda non risolverà il problema perché il messaggio non elaborabili è ancora nella coda e la sequenza di errore si ripeterà. Per altre informazioni sui messaggi non elaborabili, vedere Gestione dei messaggi non elaborabili.

Anche uno degli altri oggetti service broker , ad Message Typeesempio , Contract, Servicee Route, può essere disabilitato o mancante. Le code di Service Broker hanno una procedura di attivazione associata alla coda, quindi si tratta di un possibile punto di errore. È possibile controllare la activation_procedure colonna in msdb.sys.service_queuese quindi usare sp_helptext per verificare se sono presenti problemi.

Eseguire la query seguente e quindi controllare il contenuto della seconda colonna dei risultati della query.

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

Per determinare se si verificano problemi con gli oggetti service broker, è preferibile confrontare gli oggetti con una configurazione di Posta elettronica database funzionante. Di seguito sono riportati gli oggetti da confrontare:

  • 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

Risoluzione avanzata dei problemi di Posta elettronica database

La risoluzione dei problemi avanzata si applica agli scenari seguenti:

  • Quando si esamina il log Posta elettronica database, Posta elettronica database si arresta in modo anomalo e la causa non è completamente spiegata. Si noterà che il processo DatabaseMail viene avviato immediatamente da un messaggio di eccezione e quindi viene visualizzato l'arresto del processo DatabaseMail .
  • Posta elettronica database non viene avviato correttamente. Il processo DatabaseMail non viene avviato nella sysmail_event_log visualizzazione.
  • La risoluzione iniziale dei problemi non consente di risolvere il problema.

È possibile usare i metodi seguenti per la risoluzione avanzata dei problemi di Posta elettronica database.

Raccolte per la risoluzione dei problemi avanzata

Per risolvere i problemi, potrebbe essere necessaria una o più di queste raccolte.

Metodo 1: Eseguire il backup del database msdb

Può essere utile eseguire query sulle viste sysmail in un ambiente separato dall'ambiente di produzione. In alcuni casi, è possibile eseguire il backup del database msdb e quindi eseguire il ripristino in un'altra istanza. Le viste sysmail sono tutte definite con riferimento a msdb, quindi anche quando si esegue una query nel backup msdb ripristinato, le viste faranno riferimento al database di sistema msdb nell'istanza. Per ricreare le visualizzazioni sysmail dal database msdb di produzione, ricreare le visualizzazioni sysmail nel database utente usando lo script seguente.

/* 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

Per altre informazioni sulle viste sysmail, vedere la sezione viste di sistema sysmail .

Metodo 2: Controllare il registro eventi dell'applicazione Windows

Se il programma DatabaseMail.exe esterno non è in grado di accedere alla tabella msdb , l'errore verrà registrato nel registro eventi dell'applicazione Windows. Inoltre, se DatabaseMail.exe rileva un'eccezione, verrà registrata anche l'eccezione. Anche se lo stack di eccezioni è in genere identico, controllare il registro eventi per verificare se sono presenti altre informazioni sullo stack.

In alcuni casi, quando si risolve un arresto anomalo delDatabaseMail.exe , è possibile che la registrazione indichi che è stato creato un dump di Segnalazione errori Windows come indicato di seguito:

<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:"

È possibile recuperare tutti i file che mostrano AppCrash_DatabaseMail.exe_* in . Percorso \WER\ReportQueue . Vedere la sezione Analisi ProcDump per i suggerimenti di analisi dei dump.

Metodo 3: Raccogliere e analizzare XEvent o SQL Server Trace

È possibile raccogliere una traccia dei comandi Transact-SQL eseguiti nel sistema per verificare se uno di essi ha esito negativo.

Configurare lo strumento PSSDiag

È possibile usare PSSDiag per raccogliere la traccia XEvent o SQL Server nel modello Prestazioni generali. Come illustrato nello screenshot seguente, selezionare alcuni eventi aggiuntivi, in particolare tutti gli eventi broker.

Screenshot dello strumento Pssdiag in cui sono abilitati tutti gli eventi broker nella scheda XEvent.

Analizzare la traccia Xevent o SQL

Quando viene inviato un Posta elettronica database, in genere vengono visualizzate cinque sessioni diverse (SPID) in un'acquisizione Xevent o Profiler.

  • sp_send_dbmail: dopo aver eseguito l'istruzione Transact-SQL, vengono visualizzati gli eventi di Service Broker usati per inserire i messaggi nella ExternalMailQueue coda.

  • Attivazione di Service Broker per l'invio di messaggi al server SMTP tramite DatabaseMail.exe. Il nome dell'applicazione è "attivazione Microsoft SQL Server Service Broker".

  • Posta elettronica database Programma esterno: si tratta del programma di Posta elettronica database esterno che riceve i messaggi dalla ExternalMailQueue coda e prepara i messaggi da inviare al server SMTP. Il nome dell'applicazione è "DatabaseMail - DatabaseMail - Id<PID>".

  • Posta elettronica database Programma esterno: si tratta di un'altra connessione da Posta elettronica database. Dopo che la prima connessione elabora i messaggi esistenti nella ExternalMailQueue coda, la connessione viene creata per restare in ascolto dei messaggi aggiuntivi da inserire nella coda. Se non sono presenti altri messaggi nella coda, DatabaseMail.exe terminerà e chiuderà la connessione.

  • Attivazione di Service Broker per la ricezione di messaggi di risposta dal server SMTP tramite DatabaseMail.exe. Aggiorna le tabelle sysmail per registrare i risultati dei messaggi inviati.

È possibile conoscere il comportamento previsto solo visualizzando molte delle tracce. Il modo migliore per conoscere le differenze consiste nel confrontare la traccia con quella dei messaggi di posta elettronica del database inviati correttamente. Se a volte è possibile inviare un Posta elettronica database, confrontare la traccia con una traccia corretta, vedere la differenza e verificare la presenza di eventuali errori segnalati dagli SPID. Se non è possibile inviare Posta elettronica database, confrontare la traccia con quella inviata correttamente nell'ambiente di test.

Metodo 4: Acquisire e analizzare gli eventi di Monitoraggio processi

Process Monitor (Procmon) fa parte della famiglia di prodotti Windows Sysinternals.

Monitoraggio processo produce un'acquisizione rumorosa. Per non perdere nulla, è preferibile applicare filtri ai dati dopo l'acquisizione anziché durante il processo di acquisizione. In genere, è possibile impostare come destinazione l'acquisizione intorno a una riproduzione del problema di Posta elettronica database, in modo che i dati complessivi acquisiti non siano troppo grandi.

Acquisire eventi di file, registro, rete, processi e thread

Quando si avvia procmon.exe, inizia immediatamente l'acquisizione dei dati. L'interfaccia utente grafica è semplice. È necessario arrestare l'acquisizione di eventi fino a quando non si è pronti per riprodurre il problema. Selezionare Eventidi acquisizione file > (CTRL+E) per deselezionare la voce di menu e arrestare la raccolta di eventi. Selezionare l'icona della gomma o premere CTRL+X per cancellare gli eventi già acquisiti:

Screenshot dello strumento procmon che mostra che tutti gli eventi vengono cancellati.

Quando si è pronti per riprodurre il problema di Posta elettronica database, seguire questa procedura:

  1. Selezionare Eventidi acquisizione file > (CTRL+E) per avviare l'acquisizione di eventi.
  2. Provare a inviare il Posta elettronica database per riprodurre il problema.
  3. Selezionare Eventidi acquisizione file > (CTRL+E) per arrestare l'acquisizione di eventi.
  4. Salvare il file con il nome *. PML.

Analizzare la traccia di Monitoraggio processi

Dopo aver ottenuto l'oggetto . file PML, aprirlo usando di nuovo Monitoraggio processo. Prima di tutto, filtrare il file in base ai processiDatabaseMail.exe e sqlservr.exe . Selezionare quindi Filtro > filtro... oppure fare clic sull'icona del filtro per aprire il menu filtro.

In Nome processo selezionare sqlservr.exe e DatabaseMail.exee quindi aggiungere queste voci:

Screenshot dello strumento procmon che mostra database.exe è filtrato.

Proprio come nel caso di SQL XEvent o Trace capture, non è immediatamente ovvio cosa cercare. In genere, il modo migliore per avviare l'analisi consiste nel confrontare la traccia con un'acquisizione di Procmon per un Posta elettronica database inviato correttamente. Idealmente, confrontare la traccia con un messaggio di posta elettronica inviato correttamente dallo stesso ambiente in cui si verifica il problema. Tuttavia, se nessun Posta elettronica database viene inviato correttamente nell'ambiente specifico, confrontare la traccia con un messaggio di posta elettronica inviato correttamente in un altro ambiente.

Quando DatabaseMail.exe non riesce a caricare una DLL o non riesce a trovare il file DatabaseMail.exe.config , l'analisi è utile.

Metodo 5: Raccogliere e analizzare il dump delle eccezioni usando lo strumento ProcDump

ProcDump fa anche parte della famiglia di prodotti Sysinternals di Windows.

ProcDump è utile quando si tenta di acquisire un dump di memoria del programma esterno DatabaseMail.exe . In genere, si usa ProcDump per la risoluzione dei problemi quando DatabaseMail.exe rileva un'eccezione non gestita.

Configurare ProcDump

Per configurare ProcDump per acquisire un dump di DatabaseMail.exe quando si verifica un'eccezione non gestita, aprire prima un prompt dei comandi con privilegi di amministratore. Abilitare quindi ProcDump per acquisire il dump del processo diDatabaseMail.exe usando il comando seguente:

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

Nella finestra di comando verrà visualizzato l'output seguente:

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...

Riprodurre quindi il problema. Il dump verrà creato nella stessa cartella in cui è stato eseguito ProcDump.exe.

Analizzare il dump delle eccezioni

Trovare il record di eccezione ed esaminare lo stack di chiamate che causa l'eccezione.

  1. Aprire il file di dump in WinDbg (Scaricare strumenti di debug per Windows - WinDbg - Driver di Windows).
  2. Passare al record di eccezione usando il .ecxr comando o !analyze -v .

Quando si ha lo stack, iniziare a cercare i problemi noti per uno stack di chiamate corrispondente. Se è necessaria ulteriore assistenza, contattare il team CSS.

Metodo 6: Usare lo strumento di debug time travel

L'acquisizione TTD (Time Travel Debugging) è in genere l'ultima risorsa per problemi difficili. È possibile usare il debugger di anteprima WinDbg per ottenerlo. Per istruzioni complete e informazioni su TTD, vedere Debug di Time Travel su come funziona e come eseguire l'analisi. Se si arriva a questo punto, è necessario contattare il team CSS. Tuttavia, questa sezione fornisce istruzioni su come acquisire il TTD quando necessario.

Configurare TTD

Per diversi motivi, l'acquisizione TTD di DatabaseMail.exe può essere un po' complessa. In primo luogo, DatabaseMail.exe non viene eseguito come servizio a tempo indeterminato, ma viene richiamato dal processo SQL Server (sqlservr.exe). Di conseguenza, non è possibile collegarsi ad esso, ma è necessario configurare TTD usando il -onLaunch parametro per iniziare a acquisirlo all'avvio diDatabaseMail.exe . In secondo luogo, poiché DatabaseMail.exe viene richiamato da un altro processo, è necessario usare i processi figlio debug.