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

时间:2013-03-20 11:00:26

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

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

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

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

8 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

如果没有这样的表,你无法真正知道发生了什么。如果你偶然多次运行SP怎么办?没有任何东西可以阻止它发送电子邮件。

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

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

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

答案 6 :(得分:0)

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

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

我运行了SELECT * FROM msdb.dbo.sysmail_sentitems,确实发送了两次电子邮件。看一下sysmail_configuration,发现AccountRetryAttempts paramValue = 1。

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

答案 7 :(得分:0)

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

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

相关问题