Sql 使用SP_SEND_DBMAIL向所有收件人发送重复电子邮件的存储过程

Sql 使用SP_SEND_DBMAIL向所有收件人发送重复电子邮件的存储过程,sql,sql-server,email,duplicates,sp-send-dbmail,Sql,Sql Server,Email,Duplicates,Sp Send Dbmail,我有一个每晚运行的存储过程,它应该将查询结果发送给几个收件人。然而,在大多数情况下,它会在一分钟后发送一封重复的电子邮件。我使用的代码如下(所有电子邮件和数据库引用都已更改): 如果有任何帮助,我们将不胜感激。如果它向收件人发送重复的电子邮件,则表示您的SP一天内会被多次呼叫。检查正在调用此SP的SQL作业中设置的调用时间。该时间应为每天一次,以避免重复的电子邮件。如果SQL Server没有发送两次,并且邮件服务器也没有问题,请确保您没有使用邮件过滤器在Outlook中检查邮件,然后您可能会收

我有一个每晚运行的存储过程,它应该将查询结果发送给几个收件人。然而,在大多数情况下,它会在一分钟后发送一封重复的电子邮件。我使用的代码如下(所有电子邮件和数据库引用都已更改):


如果有任何帮助,我们将不胜感激。

如果它向收件人发送重复的电子邮件,则表示您的SP一天内会被多次呼叫。检查正在调用此SP的SQL作业中设置的调用时间。该时间应为每天一次,以避免重复的电子邮件。

如果SQL Server没有发送两次,并且邮件服务器也没有问题,请确保您没有使用邮件过滤器在Outlook中检查邮件,然后您可能会收到两次电子邮件。

我建议您在数据库中添加另一个表,用于保存上次向每个收件人发送电子邮件的时间信息

没有这样的桌子,你就不可能真正知道发生了什么。如果意外地多次运行SP会怎么样?没有什么可以阻止它发送电子邮件


关于此问题–您的邮件服务器是否在已发送邮件中保留副本?如果是的话,您可能想检查所有邮件的发送日期。这可能会为您提供有关正在发生的事情的详细信息。

解决方案是将服务器上的帐户重试帐户数减少到0(在数据库邮件配置向导中)。

这是因为接收电子邮件的地址(在组中或个人中)的电子邮件地址不再有效。虽然您可以消除接受答案中的重试,但最好的方法是清理分发。

我遇到过一个类似的问题,我们在一封电子邮件中有多个收件人,它将生成两封已发送的电子邮件。问题最终导致其中一个收件人不再有效,重试将向所有收件人发送电子邮件,而不仅仅是失败的收件人。msdb中有许多视图可以帮助您查找无效收件人。它们启动dbo.sysmail_

这个问题有两种解决方案

  • 将每个收件人作为单独的电子邮件发送出去
  • 从列表中删除无效的收件人
  • 将DBMail中的重试设置设置为0

  • 除了使用@body和@subject发送自定义文本(取决于某些条件)外,我在@query中使用SELECT语句在每封电子邮件的正文中发送常量文本时也遇到了同样的重复问题

    一封电子邮件按预期包含自定义文本和查询文本。重复的电子邮件仅包含@query文本(无自定义文本),系统插入的主题行为“SQL Server消息”

    我从msdb.dbo.sysmail_sentitems运行SELECT*并确保发送了两次电子邮件。查看sysmail_配置发现AccountRetryParamValue=1


    当我从存储过程中完全删除@query(执行更改)并运行sp后,问题就消失了。然后我将@query放回sp中,执行更改。此后,电子邮件只发送了一次。如图所示。

    确保在更新时的侧触发器中的任何其他触发器中没有任何其他更新语句


    甚至我也面临类似的问题,当我与触发器交叉检查时,我发现我在另一个触发器中使用了另一个Update语句。它导致触发器多次触发。因此触发了两封邮件

    这个电话听起来不错,但你怎么称呼它?您确定没有调用它两次吗?我是通过SQL Server Agent中的作业管理器调用它的,据我所知,它在作业计划程序中只被调用一次。您检查了日志吗?我刚刚检查了日志,作业每天只运行一次,在每个作业中,我可以看到该过程只运行一次。运行从msdb.dbo.sysmail\u sentitems中选择*是否显示有问题的电子邮件的两行?如果不是,则这是邮件服务器问题。如果是,则将调用存储过程两次。感谢您的回答,但我已检查了作业列表,并且我确信该过程只运行一次。感谢您的输入。我禁用了该作业,以查看该过程是否在其他地方运行,但是我发现情况并非如此,并最终重新创建了该作业,以查看它是否修复了问题。我很高兴知道我帮了忙:)谢谢你的输入,但是我已经检查过了,我没有使用任何Outlook邮件过滤器。
    EXEC msdb.dbo.sp_send_dbmail
    @recipients = 'email1@email.com',
    @copy_recipients = 'email2@email.com;email3@email.com;email4@email.com',
    @subject = 'Example Email',
    @profile_name = 'ExampleProfile',
    @query = 'SELECT name
        FROM table
        WHERE date BETWEEN (getdate() - 1) AND getdate()',
    @attach_query_result_as_file = 1