1. 程式人生 > >PCB SQL SERVER 傳送郵件(非同步改同步)

PCB SQL SERVER 傳送郵件(非同步改同步)

採用SQL SERVER傳送郵件是佇列方式(非同步)傳送郵件,所以在我們執行傳送郵件後,無法立即獲取到郵件是否傳送成功了,而在PCB行業實際應用中是需要立即獲取傳送郵件是否成功的狀態來決定下一步邏輯該如何處理的,為了滿足此要求我們需重新封裝一下發送郵件的儲存過程,讓傳送郵件實現同步傳送郵件,方法如下:

一.同步傳送郵件方法

-- =============================================
--傳送郵件
-- =============================================
CREATE   PROCEDURE [dbo].[P_SendEmail
] @MailConfigName VARCHAR(100), --傳送人配置 @ToMail VARCHAR(500)=NULL, --傳送人郵箱名 @CCMail VARCHAR(500)=NULL, --抄送人郵箱名 @Subject VARCHAR(500)=NULL, --主題 @Body VARCHAR(max)=NULL, --郵件內容 @Body_format VARCHAR(10) = 'TEXT', --內容格式 HTML或TEXT @FilePath VARCHAR(500) = NULL
, --附件路徑 @MailState INT OUTPUT --1成功 0失敗 AS BEGIN DECLARE @Mailitem_Id INT SET @MailState = 0 exec msdb.dbo.sp_send_dbmail @profile_name = @MailConfigName, --配置名稱 @recipients = @ToMail, --收件名稱 @copy_recipients = @CCMail,--抄送人 @body_format = @Body_format
, --內容格式 @subject = @Subject, --主題 @body = @Body, --內容 @file_attachments = @FilePath, --附件 @mailitem_id = @Mailitem_Id OUT --EmailID號 WHILE (EXISTS(SELECT TOP 1 1 FROM msdb.dbo.sysmail_unsentitems WHERE mailitem_id = @Mailitem_Id)) --看未傳送的訊息 BEGIN waitfor delay '00:00:01' --延時1S END IF (EXISTS(SELECT TOP 1 1 FROM msdb.dbo.sysmail_sentitems WHERE mailitem_id = @Mailitem_Id) --檢視已傳送的訊息 AND NOT EXISTS(SELECT TOP 1 1 FROM msdb.dbo.sysmail_faileditems WHERE mailitem_id = @Mailitem_Id)) -- 失敗狀態的訊息 BEGIN SET @MailState = 1 END END

二.呼叫傳送郵件

DECLARE @MailState INT 
EXEC [dbo].[P_SendEmail] 
    @MailConfigName = 'pcbren郵箱',   --配置名稱
    @ToMail = '[email protected]', --收件名稱
    @Subject = 'pcbren主題',         --主題
    @Body = 'pcbren內容',            --內容
    @MailState = @MailState OUT     --狀態
    
SELECT @MailState