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