Since I am using approval for comments on my site, I had no way of knowing when someone posted a comment pending approval. And since you can’t simply look for comments to posts without going into the database directly, I needed a way to know when someone has posted a comment and to which post it belongs.
To do this, add this subroutine to the end of functions.asp, which is the CDO code to send a message. I didn’t use variables that are assigned in config.asp, so you will have to set them in the subroutine directly for SMTP server, from address, to address, and domain name in the body.
<% 'Send comment notification Sub SendEmail (strBDate, strBID) Dim objMail Set objMail = CreateObject("CDO.Message") objMail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 objMail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "SMTP hostname" objMail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25 objMail.Configuration.Fields.Update objMail.From = "email@example.com" objMail.To = "firstname.lastname@example.org" objMail.Subject = "Comment has been submitted for approval" objMail.HTMLBody = "A comment has been submitted for approval. Go to http://www.yourdomain.com/admin?cmd=bloglist&view=calendar&blogDate=" & strBDate & "&comments=" & strBID & " to approve." objMail.Send Set objMail = Nothing End Sub %>
Then you need to add code to functions.asp to call this subroutine from the subroutine that inserts the comment. Find the subroutine labeled InsertComment(), which should be around line 475 depending on other mods of mine or your own that you may have inserted. Right before the existing line:
Response.Redirect("default.asp?view=plink&id=" & bID & "&comments=1")
insert this code:
' convert blog ID to blog Date strSQL = "SELECT * FROM T_WEBLOG WHERE id = " & bID & " ORDER BY id DESC" Set Rs = Server.CreateObject("ADODB.Recordset") Rs.ActiveConnection = strConn Rs.Source = strSQL Rs.CursorType = 0 Rs.CursorLocation = 2 Rs.LockType = 1 Rs.Open() If Not rs.EOF Then rs.MoveFirst While Not rs.EOF strBDate = rs("b_date") rs.MoveNext Wend End If SendEmail strBDate, bID
This is necessary because the comments are not accessed by using the blog entry ID, but the blog entry’s date. So it is necessary to cross-reference the entry ID to the entry date, and then link to the comments for a given entry ID on that date. The last line calls the email function which will include a hyperlink to the comments for the blog entry that has a new comment.
Now, that is all fine and dandy. You will receive the email with the link, but when you follow it to your site, you probably won’t have an active session so you will have to log in. The way the admin default and login pages work, you will lose the link to the entry you need to approve so you have to click the link in the email again. I work around this by implementing the use of query strings so the site remembers where you were trying to go before you had to log in.
To add this feature, edit admindefault.asp. At line 8, replace the Response.Redirect line with the following code:
Dim sProtocol, sDomain, sPath, sQuerystring, sResult sProtocol = "http://" If UCase(Request.ServerVariables("HTTPS")) = "ON" Then sProtocol = "https://" sDomain = LCase(Request.ServerVariables("SERVER_NAME")) sPath = LCase(Request.ServerVariables("SCRIPT_NAME")) sQuerystring = LCase(Request.Querystring) sResult = sProtocol & sDomain & sPath If Len(sQuerystring) > 0 Then sResult = sResult & "?" & sQuerystring sResult = Server.URLEncode(sResult) Response.Redirect("login.asp") & "?sURL=" & sResult
This builds a query string of the URL you were going to go to before you are redirected to the login page. Now edit adminlogin.asp. At line 34, before the If statement to check for a postback, insert the following line:
strSourceURL = Request.QueryString("sURL")
This retrieves the query string and puts it into a variable. At line 39, before the SQL statement to select the users from the database, insert the following code:
If Not Trim(Request.Form("sourceURL")) = "" Then strSourceURL = Request.Form("sourceURL") Else strSourceURL = "./?" End If
This extra code is added to accommodate you entering a bad password or if you are logging in without following a comment link. At line 74, comment out Johann’s Response.Redirect line after a successful login and then insert and replace the Response.Redirect for no user found with this:
Response.Redirect(strSourceURL) Else Response.Redirect("login.asp?error=nouser") & "&sURL=" & Server.URLEncode(strSourceURL)
This sends you to the page you were intending to go to in the first place. If you entered a bad password, this also preserves the original URL after the login page reloads.
Last, but not least, you need to a hidden form field that will store the original URL when you submit the form to log in. Near the end of the file, insert a line before the close form tag and paste this:
<input name="sourceURL" type="hidden" value="<%= strSourceURL %>" />
I hope that’s not too complicated to follow. It’s a little more convoluted for this modification because it is necessary to add code in multiple places in multiple files, rather than just a chunk of code in one file. But, now you will receive an email when a comment is posted and be easily able to approve or deny the comment just by following the link in the email.