0

ASP でのエラー処理に本当に苦労しています。

電子メール アドレスと実際のメール自体を取得する MS SQL データベースから電子メールを送信するスクリプトがあります。

スクリプトはアドレスをループし、キューをブロックしないように一度に 50 個を送信します。

問題は、無効または違法な電子メール アドレスがある場合は常に送信が停止し、ページが 500 エラーを返すことです。

そのため、On Error Resume Next タグを追加したところ、代わりに重複したメールが送信されるようになりました。

これを解決する方法はわかりませんが、各アドレスに 2 通または 3 通のメールが送信されることがあるようです。ページ番号が更新されたときに、すでに送信されたメールに再送信するように見えるか、1 ページで 0-50 を送信する代わりに、1 ページで最初の 50 を送信し、次に 2 ページで最初の 100 を送信し、次に 3 ページで最初の 150 を送信するように見えるため、51 -100 ページ 2、101 - 150 ページ 3 など。

当然のことながら、各アドレスに 1 つのメールを送信するだけで、データベースにメール アドレスを持つメールがあったときに停止しないようにします。

過去 6 時間、If Err.Number をコード内のさまざまな場所に配置しようとして成功しなかったので、いくつかの hlpe を本当に感謝しています。

助けてくれてありがとう。

<% On Error Resume Next
Response.Expires = 0
Response.Buffer=FALSE
Server.ScriptTimeout = 36000 

set cn = createobject("adodb.connection")
cn.open strCon
set rs = cn.execute("select * from mails where mailID = "& request.querystring("mailID") &"") 
    subject = rs("subject")
    mailType = rs("mailType")
    mailBody =  rs("mailBody")

    set rs = cn.execute("Select * from settings")
    strServer = rs("server")
    email = rs("email")

    page = trim(request.querystring("page"))
    If page = "" Then
    page = 1
    else
    page = cint(page)
    End If
    DisplayNum = 0

    Set oCon = Server.CreateObject ("ADODB.Connection")
    Set Rec = Server.CreateObject ("ADODB.Recordset")
    oCon.Open straCon
    Rec.PageSize = 50
    Rec.CursorLocation = adUseClient
    sql = "Select email from dbo.emailTables where emailID Between '1' and '5000'"      
    Rec.Open sql, oCon

    ipage = Rec.PageCount   

    if page = 0 or page > ipage Then
    Rec.AbsolutePage = ipage
    else
    Rec.AbsolutePage = page
    end if

    allEmail = Rec.RecordCount 

    do while not Rec.eof AND DisplayNum < 50

    If Err.Number = 0 Then

    Set ObjSendMail = CreateObject("CDO.Message")
    ObjSendMail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 
    ObjSendMail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "localhost"
    ObjSendMail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25 
    ObjSendMail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 60
    ObjSendMail.Configuration.Fields.Update     
    ObjSendMail.To = Rec("email")
    ObjSendMail.Subject = subject
    ObjSendMail.From = sender
    ObjSendMail.CreateMHTMLBody "http://www.urlpage.com"
    ObjSendMail.Send     
    Set ObjSendMail = Nothing       
    DisplayNum = DisplayNum + 1         
    Rec.movenext

    Err.Clear
    End If          

    loop

    If ipage > 1 And page < ipage Then
    strPage = "post.asp?mailID="& request.querystring("mailID")&"&page="& page+1
    strTimer = 30

    else
    strPage = "overview.asp"
    strTimer = 5
    strMsg = strMsg & "<br><br>All mails sent to list. "

    end if

%>

<head>
<title>Newsletter</title>
<link href="style.css" type="text/css" rel="stylesheet">
<meta http-equiv="REFRESH" content="<%=strTimer%>; URL=<%=strPage%>">
</head>
<body>
</body>
</html>
4

1 に答える 1

0

電子メールの送信時にのみエラーをトラップするように、コードを変更します。現在のところ、このコード内のエラーはバイパスされ、電子メールの送信以外にエラーがあるかどうかはわかりません。コードを次のように変更すると、メールの送信に関するエラーのみがスキップされます。

<% 'On Error Resume Next '---removed
Response.Expires = 0
Response.Buffer=FALSE
Server.ScriptTimeout = 36000 

set cn = createobject("adodb.connection")
cn.open strCon
set rs = cn.execute("select * from mails where mailID = "& request.querystring("mailID") &"") 
    subject = rs("subject")
    mailType = rs("mailType")
    mailBody =  rs("mailBody")

    set rs = cn.execute("Select * from settings")
    strServer = rs("server")
    email = rs("email")

    page = trim(request.querystring("page"))
    If page = "" Then
    page = 1
    else
    page = cint(page)
    End If
    DisplayNum = 0

    Set oCon = Server.CreateObject ("ADODB.Connection")
    Set Rec = Server.CreateObject ("ADODB.Recordset")
    oCon.Open straCon
    Rec.PageSize = 50
    Rec.CursorLocation = adUseClient
    sql = "Select email from dbo.emailTables where emailID Between '1' and '5000'"      
    Rec.Open sql, oCon

    ipage = Rec.PageCount   

    if page = 0 or page > ipage Then
    Rec.AbsolutePage = ipage
    else
    Rec.AbsolutePage = page
    end if

    allEmail = Rec.RecordCount 

    do while not Rec.eof AND DisplayNum < 50

    'If Err.Number = 0 Then '---removed

    Set ObjSendMail = CreateObject("CDO.Message")
    ObjSendMail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 
    ObjSendMail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "localhost"
    ObjSendMail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25 
    ObjSendMail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 60
    ObjSendMail.Configuration.Fields.Update     
    ObjSendMail.To = Rec("email")
    ObjSendMail.Subject = subject
    ObjSendMail.From = sender
    ObjSendMail.CreateMHTMLBody "http://www.urlpage.com"
    On Error Resume Next '---added
    ObjSendMail.Send     
    On Error Goto 0 '---added
    Set ObjSendMail = Nothing       
    DisplayNum = DisplayNum + 1         
    Rec.movenext

    'Err.Clear '---removed
    'End If '---removed         

    loop

    If ipage > 1 And page < ipage Then
    strPage = "post.asp?mailID="& request.querystring("mailID")&"&page="& page+1
    strTimer = 30

    else
    strPage = "overview.asp"
    strTimer = 5
    strMsg = strMsg & "<br><br>All mails sent to list. "

    end if
%>
于 2013-09-23T23:38:01.183 に答える