サーバーの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
これは、メール送信のテストに主に使用しているコードです。 クエリの結果を電子メールで送信する方法を示します。 。
-===========================================================================
-- 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)
'
結論なしで同様の質問があります:
何が欠けている?
その後、.NET 3.5をインストールすると、すべてが正常に動作し始めました。
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';