【问题标题】:VB.net sending emailsVB.net 发送电子邮件
【发布时间】:2020-06-13 06:22:11
【问题描述】:

我创建了一个记录到数据库中并通过电子邮件发送的表单。该表格允许自己每天填写一次,并且只在数据库中记录一次。

我注意到有时表单会在电子邮件收件箱中两次到达。

为了尝试阻止这种情况,我创建了一个变量并将其初始化为 0。然后,只有当变量为 0 时,我才允许代码执行发送命令。发送命令执行后,我将变量设置为 1。

Session("sent") = 0
If Session("sent") = 0 Then
   smtp.Send(mail)
   Session("sent") = 1
End If

这并不能有效地阻止电子邮件两次到达。奇怪的是,随机人正在发生双重发送。我想知道发送电子邮件所需的一秒或两秒是否足以让人们再次单击发送按钮,从而导致表单再次通过电子邮件发送。也许我可以在单击表单后禁用提交按钮。这听起来像是一个好的解决方案吗?我还能尝试什么?

【问题讨论】:

    标签: vb.net email


    【解决方案1】:

    你说数据只在数据库中到达一次;有一个进程从数据库中获取数据,发送电子邮件,并使用一些新值更新数据库,以跟踪已为该数据发送电子邮件

    大多数数据库允许您以原子方式执行此类操作;您可以让您的数据库将 email_status 从未发送更新为处理并将数据返回给您发送 - 因此不能运行两次。可能是这样的:

    UPDATE data 
    SET email_status = 'sending'
    OUTPUT inserted.subject, inserted.body
    WHERE datecol = @date and email_status = 'notsent'
    

    每天只会运行一次。

    您可能会发现人们双击提交按钮,在几乎同时完成的并行线程上启动两个请求,并且没有足够快地看到彼此的数据以知道电子邮件已经发送

    【讨论】:

    • 好主意。我会在记录表单之前查询数据库以查看它是否存在。如果表单已经存在,我可以设置变量 Session("sent") = 1。这样,如果表单已经存在,则不会发送表单数据。当表单打开时,我会将变量初始化为 0。这将防止第二次双击请求执行任何操作。
    • 刚刚完成了三击表格,只收到一封电子邮件并进入数据库。 :-)
    猜你喜欢
    • 1970-01-01
    • 2010-12-24
    • 2014-01-06
    • 1970-01-01
    • 2015-06-11
    • 2012-01-16
    • 2012-09-20
    • 2016-06-26
    • 1970-01-01
    相关资源
    最近更新 更多