【问题标题】:ASP Classic, Looping through query and sending emailsASP Classic,循环查询和发送电子邮件
【发布时间】:2016-05-22 19:48:57
【问题描述】:

我正在尝试遍历数据库查询并将电子邮件发送到我从查询中获得的电子邮件地址。 这是我的一段代码。

do until rs.EOF
    Set myMail = CreateObject("CDO.Message")
    myMail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 
    myMail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") ="relay-hosting.secureserver.net"
    myMail.Configuration.Fields.Update
    myMail.Subject= subject
    myMail.From="something@Something.Something"
    myMail.To = rs("Email")
    myMail.HTMLBody = strMessage & "Some Message"
    myMail.Send
    Set myMail = Nothing
    rs.MoveNext
loop

我已经搜索并尝试了不同的解决方案,但没有任何运气。 以下代码行似乎有问题,但我找不到什么

myMail.To = rs("Email")

在给出任何答案或建议之前,请记住,

  • 当我在 CDO 消息对象的“TO”属性中使用任何静态电子邮件地址时,此代码工作正常
  • 查询给出了准确的结果
  • 当我在 CDO 消息对象的“TO”属性中使用动态电子邮件(来自查询的电子邮件)时,我收到 500 内部服务器错误。我无权访问 IIS 以启用详细的错误消息。

【问题讨论】:

  • 如果没有实际的错误消息,几乎不可能分辨出来。当您说“准确的结果”时,这是什么意思?查询的返回值是多少,您使用的硬编码值是多少?
  • 非常仔细地检查您的查询结果。至少有一个rs("Email") 值不是有效的电子邮件地址。没有其他解释。
  • @SeanLange 从“准确结果”我的意思是查询结果给了我想要的电子邮件地址。我硬编码了我的电子邮件地址以接收电子邮件,并且我收到了它们。但是当我使用动态值时,它会出错。如果您仍然不清楚我的意思,请告诉我
  • 正如@Keith 所说,您的值中至少有一个不是有效的电子邮件地址。由于您坚持使用经典的 asp 并且无法让 IIS 为您提供任何有用的东西,您可能不得不求助于严肃的老式日志记录。让您的代码记录每个电子邮件地址,最后一个记录将是错误的。您还可以添加一些错误处理,这样您的代码就不会引发 500 错误。 “错误...”
  • 在您自己的机器上启用 IIS 和 ASP 并尝试重现错误...启用详细的错误消息。没有错误消息几乎不可能告诉发生了什么

标签: while-loop asp-classic recordset cdo.message


【解决方案1】:

嗯,正如其他人在 cmets 中观察到的那样,如果没有实际的错误消息,很难分辨。有很多可能的来源:

  • 由于某种原因,此时记录集已关闭
  • 记录集中没有“电子邮件”字段
  • 电子邮件地址无效
  • ...

好消息是,您可以使用经典的 ASP 错误处理来查找错误,如下所示:

on error resume next

do until rs.EOF
    Set myMail = CreateObject("CDO.Message")
    myMail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 
    myMail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") ="relay-hosting.secureserver.net"
    myMail.Configuration.Fields.Update
    myMail.Subject= subject
    myMail.From="something@Something.Something"
    myMail.To = rs("Email")
    myMail.HTMLBody = strMessage & "Some Message"
    myMail.Send

    if err then
        Response.write "<code>" & err.Source & " - " & err.Description & "</code>"
    end if

    Set myMail = Nothing
    rs.MoveNext
loop

on error goto 0

当然有更好的方法来处理这些错误,即使在经典 ASP 中也是如此(search SO 或参见this solution)。这只是为了在您无权访问 IIS 设置时帮助您找到错误。

【讨论】:

  • 记录集中有email字段,Email的格式是有效的(我已经把它们都写到页面上看到了),想不出任何可以关闭记录集的原因。尝试错误处理,但错误代码为 0。使用 web.config 文件覆盖错误显示设置,现在我看到请求超时的错误。但是当我在“TO”属性中使用静态电子邮件地址发送电子邮件时,相同的代码会在几秒钟内执行。
  • 也许rs("Email") 在某处为NULL?添加 CStr() 进行转换。
  • 我已经仔细检查过,记录集中的每一行都有一个有效的电子邮件地址。我试过 CStr() 没有任何运气。无论如何感谢每个人在这里的时间。我将不得不继续挖掘以解决这个问题。
  • @gpinkas 或 rs("Email") &amp; "" 就足够了。个人不喜欢将ADODB.Recordset 变量直接设置为对象,通常会先进入局部变量,在将它们传递给对象属性等之前可以对其进行检查操作。
  • @Atif:好吧,祝你调试顺利!也许多封邮件有问题?看这里:stackoverflow.com/questions/10482053/…
【解决方案2】:

我曾经遇到过类似的问题,发现它是由错误的电子邮件地址引起的,他们的服务器响应错误。这个错误打破了循环。将未使用的电子邮件地址保留在数据库之外是不可能的,所以为了解决这个问题,我简单地添加了 On Error Resume Next

ObjSendMail.To = "Me <my@example.com>"
ObjSendMail.Subject = strSubject
ObjSendMail.From = strFromName & " <no-reply@example.com>"
ObjSendMail.ReplyTo = strFromName & " <" & strFromEmail & ">"
ObjSendMail.BodyPart.Charset = "UTF-8"
ObjSendMail.TextBody = strEmailBody  
ObjSendMail.TextBodyPart.Charset = "UTF-8"
On Error Resume Next
ObjSendMail.Send
Set ObjSendMail = Nothing

然后,例程是否在任何失败的电子邮件上跳闸都没关系,因为它会忽略它们并转移到下一封电子邮件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多