ASP 经典,循环查询和发送电子邮件
ASP Classic, Looping through query and sending emails
我正在尝试遍历数据库查询并将电子邮件发送到我从查询中获得的电子邮件地址。
这是我的一段代码。
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 以启用详细的错误消息。
好吧,正如其他人在评论中观察到的那样,如果没有实际的错误消息,很难说清楚。有许多可能的来源:
- 由于某种原因此时记录集已关闭
- 记录集中没有"Email"字段
- 电子邮件地址无效
- ...
好处是,您可以使用经典的 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 or see this solution) 中也是如此。这只是为了在您无权访问 IIS 设置时帮助您查找错误。
我曾经遇到过类似的问题,发现它是由错误的电子邮件地址引起的,他们的服务器响应错误。该错误打破了循环。将未使用的电子邮件地址排除在数据库之外是不可能的,因此为了解决这个问题,我简单地添加了 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
那么例行程序是否在任何更多失败的电子邮件上运行都无关紧要,因为它会忽略它们并转到下一封电子邮件。
我正在尝试遍历数据库查询并将电子邮件发送到我从查询中获得的电子邮件地址。 这是我的一段代码。
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 以启用详细的错误消息。
好吧,正如其他人在评论中观察到的那样,如果没有实际的错误消息,很难说清楚。有许多可能的来源:
- 由于某种原因此时记录集已关闭
- 记录集中没有"Email"字段
- 电子邮件地址无效
- ...
好处是,您可以使用经典的 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 or see this solution) 中也是如此。这只是为了在您无权访问 IIS 设置时帮助您查找错误。
我曾经遇到过类似的问题,发现它是由错误的电子邮件地址引起的,他们的服务器响应错误。该错误打破了循环。将未使用的电子邮件地址排除在数据库之外是不可能的,因此为了解决这个问题,我简单地添加了 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
那么例行程序是否在任何更多失败的电子邮件上运行都无关紧要,因为它会忽略它们并转到下一封电子邮件。