web-dev-qa-db-ja.com

DatabaseMailの包括的なトラブルシューティング

サーバーの1つからメールを送信する際に問題が発生しました。

DatabaseMail または msdb.dbo.sp_send_dbmail を使用したい

同じdatabaseMail設定と同じSMTPサーバーを使用する他の運用サーバーがあり、それらはすべて正常に機能しています。この1つの特定のサーバーだけがSQL Server経由でメールを送信していないので、その理由を調べる必要があります。

最初にテストするのは、SMTPサーバーへの接続です。テストでは、Powershellを使用して電子メールを送信しますが、問題なく動作します!!!!

これは、Powershellを使用して電子メールを送信する方法のスクリプトです。

$smtpServer = "200.1.1.223"
$smtpPort = 25
$emailFrom = "[email protected]"
$emailTo = "[email protected]"
$smtp = new-object Net.Mail.SmtpClient($smtpServer)
$smtp.Port = $smtpPort
$subject = "ccatsql" 
$body = "test email from ccatsql " 
$smtp.Send($emailFrom, $emailTo, $subject, $body)

そしてそれはうまくいきます。

そのサーバーで私が持っている問題は 電子メールがキューに入れられたときにDatabaseMailが起動しなかった

sysmail_event_log をクエリすると、送信した(試行した)電子メールに関連するイベントが表示されません。

SELECT * FROM msdb.dbo.sysmail_event_log order by log_date desc 

sysmail_unsentitems をクエリすると、すべてのメールがunsert状態で表​​示されます。

SELECT * FROM msdb.dbo.sysmail_unsentitems 
ORDER BY send_request_date DESC

enter image description here

これは、メール送信のテストに主に使用しているコードです。 クエリの結果を電子メールで送信する方法を示します。 。

-===========================================================================
-- Failed to initialize sqlcmd library with error number -2147467259
-- that was caused because I had left a piece of rubish code from a previous query
-- and internally it was saying: Invalid column name 'sintMarketID'.
-- but I could only see this using the profile.
--==========================================================================


set deadlock_priority high
set transaction isolation level repeatable read

declare @sub varchar(150)
declare @radhe int
select @sub = '-- Number of rows affected by Hare Krishna job run at ' 
               + CAST(convert(datetime, getdate(), 100)AS VARCHAR)
--print @sub


    EXEC msdb.dbo.sp_send_dbmail 
        @profile_name = 'DBA', -- Change profile name accordingly
        @recipients='[email protected]', -- change mail address accordingly
        @subject = @sub,
        @body_format = 'TEXT',
        @importance='High',
        @sensitivity='Private',
        @file_attachments=NULL,
        @execute_query_database='MSDB',
        @query_no_truncate=0,
        @query_result_header = 1,
        @mailitem_id= @Radhe OUTPUT,
        @query= '


SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SET NOCOUNT ON

DECLARE @SQL VARCHAR(MAX)

SELECT @SQL = ''

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
select getdate()
''

EXEC(@SQL)

'

結論なしで同様の質問があります:

DatabaseMailプロセスをシャットダウンしています

何が欠けている?

2

インストールした.Netバージョンを確認

その後、.NET 3.5をインストールすると、すべてが正常に動作し始めました。

enter image description here

DatabaseMailには.NET 3.5が必要であるという事実は、十分に文書化されていません(少なくとも私にとっては)。

SQL Server 2016-.NET 3.5がないとデータベースメールは機能しません

現在のデータベースメール構成を確認するにはどうすればよいですか?

EXEC msdb.dbo.sysmail_help_configure_sp;
EXEC msdb.dbo.sysmail_help_account_sp;
EXEC msdb.dbo.sysmail_help_profile_sp;
EXEC msdb.dbo.sysmail_help_profileaccount_sp;
EXEC msdb.dbo.sysmail_help_principalprofile_sp;

EXEC msdb.dbo.sysmail_help_account_sp

以下のこのリンクは、データベースメール設定をあるサーバーから別のサーバーにコピーする必要がある場合に特に役立ちます。

一時テーブルに保存されたデータベースメール構成

データベースメールの基本のトラブルシューティングに役立つ次のスクリプト を取得しました。

コメントに注意を払い、一度に1ステップずつ実行します。

USE msdb
 GO

-- Check that the service broker is enabled on MSDB. 
-- Is_broker_enabled must be 1 to use database mail.
SELECT is_broker_enabled FROM sys.databases WHERE name = 'msdb';
-- Check that Database mail is turned on. 
-- Run_value must be 1 to use database mail.
-- If you need to change it this option does not require
-- a server restart to take effect.
EXEC sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
EXEC sp_configure 'Database Mail XPs';

-- Check the Mail queues
-- This system stored procedure lists the two Database Mail queues.  
-- The optional @queue_type parameter tells it to only list that queue.
-- The list contains the length of the queue (number of emails waiting),
-- the state of the queue (INACTIVE, NOTIFIED, RECEIVES_OCCURRING, the 
-- last time the queue was empty and the last time the queue was active.
EXEC msdb.dbo.sysmail_help_queue_sp -- @queue_type = 'Mail' ;

-- Check the status (STARTED or STOPPED) of the sysmail database queues
-- EXEC msdb.dbo.sysmail_start_sp -- Start the queue
-- EXEC msdb.dbo.sysmail_stop_sp -- Stop the queue
EXEC msdb.dbo.sysmail_help_status_sp;

-- Check the different database mail settings.  
-- These are system stored procedures that list the general 
-- settings, accounts, profiles, links between the accounts
-- and profiles and the link between database principles and 
-- database mail profiles.
-- These are generally controlled by the database mail wizard.

EXEC msdb.dbo.sysmail_help_configure_sp;
EXEC msdb.dbo.sysmail_help_account_sp;
--  Check that your server name and server type are correct in the
--      account you are using.
--  Check that your email_address is correct in the account you are
--      using.
EXEC msdb.dbo.sysmail_help_profile_sp;
--  Check that you are using a valid profile in your dbmail command.
EXEC msdb.dbo.sysmail_help_profileaccount_sp;
--  Check that your account and profile are joined together
--      correctly in sysmail_help_profileaccount_sp.
EXEC msdb.dbo.sysmail_help_principalprofile_sp;

-- I’m doing a TOP 100 on these next several queries as they tend
-- to contain a great deal of data.  Obviously if you need to get
-- more than 100 rows this can be changed.
-- Check the database mail event log.
-- Particularly for the event_type of "error".  These are where you
-- will find the actual sending error.
SELECT TOP 100 * 
FROM msdb.dbo.sysmail_event_log 
ORDER BY last_mod_date DESC;

-- Check the actual emails queued
-- Look at sent_status to see 'failed' or 'unsent' emails.
SELECT TOP 100 * 
FROM msdb.dbo.sysmail_allitems 
ORDER BY last_mod_date DESC;

-- Check the emails that actually got sent. 
-- This is a view on sysmail_allitems WHERE sent_status = 'sent'
SELECT TOP 100 * 
FROM msdb.dbo.sysmail_sentitems 
ORDER BY last_mod_date DESC;

-- Check the emails that failed to be sent.
-- This is a view on sysmail_allitems WHERE sent_status = 'failed'
SELECT TOP 100 * 
FROM msdb.dbo.sysmail_faileditems 
ORDER BY last_mod_date DESC



-- Clean out unsent emails
-- Usually I do this before releasing the queue again after fixing the problem.
-- Assuming of course that I don't want to send out potentially thousands of 
-- emails that are who knows how old.
-- Obviously can be used to clean out emails of any status.
EXEC msdb.dbo.sysmail_delete_mailitems_sp  
  @sent_before =  '2017-09-28',
  @sent_status = 'failed';
2