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 = 'yadnfku@foxmail.com', --收件名称
    @Subject = 'pcbren主题',         --主题
    @Body = 'pcbren内容',            --内容
    @MailState = @MailState OUT     --状态
    
SELECT @MailState

 

posted @ 2018-12-21 22:58  pcbren  阅读(373)  评论(0编辑  收藏  举报