【问题标题】:Stored procedure using SP_SEND_DBMAIL sending duplicate emails to all recipients使用 SP_SEND_DBMAIL 向所有收件人发送重复电子邮件的存储过程
【发布时间】:2013-03-09 10:26:42
【问题描述】:

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

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

对此的任何帮助将不胜感激。

【问题讨论】:

  • 这个电话看起来不错,但你怎么称呼它?你确定你没有调用它两次吗?
  • 我通过 SQL Server 代理中的作业管理器调用它,据我所知,它只在作业调度程序中调用一次。
  • 你检查过日志吗?
  • 我刚刚检查了日志,作业每天只运行一次,在每个作业中我可以看到程序只运行一次。
  • Run SELECT * FROM msdb.dbo.sysmail_sentitems 是否显示有问题的电子邮件的两行?如果不是,那么这是一个邮件服务器问题。如果是,则存储过程被调用两次。

标签: sql sql-server email duplicates sp-send-dbmail


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 感谢您的回答,但我已经检查了作业列表,并且确定该程序只运行一次。
    【解决方案3】:

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

    【讨论】:

    • 感谢您的输入,但我已经检查过了,我没有使用任何 Outlook 邮件过滤器。
    【解决方案4】:

    我建议您将另一个表添加到您的数据库中,该表将保存有关上次向每个收件人发送电子邮件的时间的信息。

    如果没有这样的表,您将无法真正知道发生了什么。如果您不小心多次运行 SP 怎么办?没有什么可以阻止它发送电子邮件。

    关于这个问题——您的邮件服务器是否在已发送的邮件中保留一份副本?如果是这样,您可能需要检查那里所有消息的发送日期。这可能会为您提供有关正在发生的事情的良好信息。

    【讨论】:

    • 感谢您的意见。我禁用了该作业以查看该过程是否正在其他地方运行,但是我发现情况并非如此,并最终重新创建该作业以查看它是否解决了问题。它似乎成功了。
    • 很高兴知道我提供了帮助 :)
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

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

      这个问题有几个解决方案。

      1. 将每个收件人拆分为单独的电子邮件。
      2. 从列表中删除无效收件人
      3. 将 DBMail 中的重试设置设为 0

      【讨论】:

        【解决方案7】:

        我在@query 中使用 SELECT 语句在每封电子邮件的正文中发送常量文本时遇到了同样的重复问题,此外还使用 @body 和 @subject 根据某些条件发送自定义文本。

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

        我运行了 SELECT * FROM msdb.dbo.sysmail_sentitems 并且确定发送了两次足够的电子邮件。查看 sysmail_configuration 发现 AccountRetryAttempts paramValue = 1。

        在我从存储过程中完全删除@query(执行更改)并运行 sp.query 后,问题就消失了。然后我将@query 放回 sp,执行更改。在那之后,电子邮件只开始发送一次。去图吧。

        【讨论】:

          【解决方案8】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-12-11
            • 2023-03-13
            • 2015-06-07
            • 2021-07-19
            • 2012-05-18
            • 2017-01-10
            相关资源
            最近更新 更多