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

PCB SQL SERVER 發送郵件(異步改同步)

下一步 滿足 body HERE sent from html copy 郵箱

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

PCB SQL SERVER 發送郵件(異步改同步)