Although its inherently a bad idea to use a database server for application processes, and the built in function “sp_send_dbmail” can be a bit temperamental.
Never-the-less, the brief was to send emails this way, and individually (IE: no long strings of addresses).
The environment was mature, with a working Email Profile, a database and tables already in-place and holding HTML style emails ready to go.
-- SendEmailProcess.sql USE [SomeDatabase] GO CREATE PROCEDURE [dbo].[SendEmailProcess] @Test varchar(100) = null AS /* clear out the sysmail tables */ DELETE FROM [msdb].[dbo].[sysmail_allitems] /* parameters */ DECLARE @ID uniqueidentifier, @To varchar(100), @Subject varchar(255), @Html varchar(max), @Return int /* start of loop */ WHILE (SELECT COUNT(*) FROM [SomeDatabase].[dbo].[EmailMessage] EM JOIN [SomeDatabase].[dbo].[Recipient] R ON EM.Id = R.EmailMessage_Id2 WHERE EM.[Status] = 'Submitted') > 0 BEGIN /* get any one email message */ SELECT TOP 1 @ID = EM.ID, @To = isnull(@Test, R.EmailAddress), @Subject = EM.[Subject], @Html = EM.HtmlContent FROM [SomeDatabase].[dbo].[EmailMessage] EM JOIN [SomeDatabase].[dbo].[Recipient] R ON EM.Id = R.EmailMessage_Id2 WHERE EM.[Status] = 'Submitted'; /* send it */ EXEC [msdb].[dbo].[sp_send_dbmail] @profile_name = 'BulkMail', @recipients = @To, @subject = @Subject, @body = @Html, @body_format = 'HTML'; /* check it worked */ SET @Return = @@error /* if it worked - mark it as Sent */ IF @Return = 0 BEGIN UPDATE [SomeDatabase].[dbo].[EmailMessage] SET [Status] = 'Sent' WHERE Id = @ID END /* if it failed - flag it and move on */ IF @Return != 0 /* less-than greater-than does not work in WordPress */ BEGIN UPDATE [SomeDatabase].[dbo].[EmailMessage] SET [Status] = 'Failed' WHERE Id = @ID END /* end of loop */ END GO