please dont rip this site


2007.05.11 08:38:27 Update: I no longer recommend or use SpamCOP. Thier MailHosts configuration has become more and more conviluted and confusing, the "user to user" help forum is sometimes quite rude and thier developers are uninterested in improving the user experience. For example, when registering a mailhost, there is an ID number in the header that must match the ID in the body of the email they send. Some MTA (including ASSP) pad header lines with spaces (which, as far as I can see, does not violate any RFQ), but this causes the match to fail because they do not trim the spaces before compairing the values. Despite the fact that there is a well visited, sticky post on thier forum explaining the issue, the developers appear totally unwilling to take the few seconds it would require to add an RTRIM to the header parsing script. Even after manually trimming the values, the resulting MailHosts listing apparently shows every domain ever registered to your IP address rather than your current domain or RIP. This is confusing at best and is not mentioned in any documentation I could find. combined with the fact that SpamCOP keeps blocking innocent gmail users leads me to believe that since IronPort took over, SpamCOP has gone to heck. Use This pages remains for historical purposes.

A VBS SPAM reporting script for MS Outlook automatically do all the reporting for emails that I see ARE SPAM and that I place in a "spam" folder in Outlook.

It will report the spam to, retrieve the result, extract the form elements, approve the default options and actually trigger the sending of the spam reports. It will then log the result, move the message to an "oldspam" folder and go on to the next spam.

The idea is that as spam comes in, I just move it to the spam folder. At night, a scheduled job runs this script via the command line
cscript ol-spam-rpt.vbs //Nologo >> spamlog.html
and logs the results. I don't think spam reporting can get any easier... With the recent security "upgrades" my MS, I can't do it at night anymore.. I have to answer this stupid little box:

This is now a SourceForge Logo project... as is was spamcop

Keep in mind that you must have the Collaborative Data Objects option installed with Outlook. If you run the installer for Outlook or Office, go into the advanced options, you will find this item.

2004.12.21 Now incorporates past (unreported) spams and works with any sort of SpamCop account.

function urlenc(astr)
dim i, c, e
	for i = 1 to len(astr)
		c = mid(astr,i,1)
		if C = " " then
			urlenc = urlenc & "+"
		elseif (c >= "0" and C <= "9") or (c >= "a" and C <= "z") or (c >= "A" and C <= "Z") then
			urlenc = urlenc & c
			urlenc = urlenc & "%" & right( "00" & hex( asc(c) ) , 2)
			end if
	end function
 'wscript.stdout.write urlenc(")(ABC* & * ^ $^%$*&)(*")

function GetHTMLAttrib(anAttrib, aString)
	GetHTMLAttrib = ""
	on error resume next
	GetHTMLAttrib = split(aString,anAttrib&"=")(1)
	if left(GetHTMLAttrib,1)=chr(34) then GetHTMLAttrib = mid(GetHTMLAttrib,2)
	if instr(GetHTMLAttrib,"""")>0 then GetHTMLAttrib = split(GetHTMLAttrib,"""")(0)
	end function

wscript.stdout.write chr(13)&chr(10)&"<P> <A TITLE="&chr(34)&"Started:"&Now()&chr(34)&">-</A>"

olFolderInbox = 6
'Set objXhttp = Wscript.CreateObject("Msxml2.ServerXMLHTTP.4.0")
'ServerXMLHTTP.4.0 doesn't seem to be able to post data to the site. 
Set objhttp = Wscript.CreateObject("Microsoft.XmlHttp")
wscript.stdout.write "<A TITLE="&chr(34)&"Got XMLHTTP"&chr(34)&">-</A>"

Set objSession = Wscript.CreateObject("MAPI.Session")
objSession.Logon , , False, False
wscript.stdout.write "<A TITLE="&chr(34)&"Got MAPI.Session"&chr(34)&">-</A>"
Set ol = Wscript.CreateObject("Outlook.Application")
wscript.stdout.write "<A TITLE="&chr(34)&"Got Outlook.Application"&chr(34)&">-</A>"
Set olns = ol.GetNameSpace("MAPI")
wscript.stdout.write "<A TITLE="&chr(34)&"Got MAPI Namespace"&chr(34)&">-</A>"
Set MyFolder = olns.GetDefaultFolder(olFolderInbox).Folders("spam")
wscript.stdout.write "<A TITLE="&chr(34)&"Got SPAM folder"&chr(34)&">-</A>"
Set myDestFolder = MyFolder.Folders("oldspam")
wscript.stdout.write "<A TITLE="&chr(34)&"Got oldspam folder"&chr(34)&">-</A>"
Set fs = CreateObject("Scripting.FileSystemObject")

' Get the number of items in the folder.
NumItems = MyFolder.Items.Count
' Set MyItem to the collection of items in the folder.
Set MyItems = MyFolder.Items
DIM myMsgs()
I = 0
for each myItem in MyItems
	I = I + 1
	wscript.stderr.WriteLine I & " " & myItem.Subject
	set myMsgs(I) = myItem
' Loop through all of the items in the folder.
For I = 1 to NumItems
'for each myMsg in myMsgs
  Set MyMsg = MyMsgs(I)
   if datediff( "d", MyMsg.ReceivedTime, now() ) >= 3 then
	wscript.stderr.write chr(13)&chr(10)&" - "&myMsg.ReceivedTime & " " & chr(34)& myMsg.Subject & chr(34) & " TOO OLD!"
	strEntryID = MyMsg.EntryID
	wscript.stdout.write chr(13)&chr(10)&"<P> <A TITLE="&chr(34)&strEntryID&chr(34)&">-</A>"
	strStoreID = MyMsg.Parent.StoreID
	Set objCDOMsg = objSession.GetMessage(strEntryID, strStoreID)
'	Set myStream = objCDOMsg.GetStream 'don't work in OL98
'	myStr = ""
'	j = 1
'	for each myfield in objCDOMsg.Fields
'		if myField.ID = 8192030 then
'		myStr = myStr & chr(13)&chr(10) & j & myField.Name & "(" & myField.ID&")"&"-" &myfield.Value
'		end if
'		MsgBox MyMsg.Subject & myStr
'		myStr = ""
'		j = j + 1
'		next
'	MsgBox MyMsg.Subject & myStr
	on error resume next
	mySubject = split(myMsg.Subject & "**SPAM ", "**SPAM")(0)
	wscript.stderr.write chr(13)&chr(10)&" - "&myMsg.ReceivedTime &" " &datediff( "d", MyMsg.ReceivedTime, now() )& " " & chr(34)& mySubject & chr(34) & " "
	wscript.stdout.write "<B>"&MyMsg.ReceivedTime & " </B><I>"""&mySubject&"""</I>"
	myStr = objCDOMsg.Fields.Item(8192030) 'this is the raw headers
	myStr = replace(myStr, myMsg.Subject, mySubject)
	myStr = replace(myStr, "Post.Office MTA v3.5.3", "MetaMail v1.2" )

	myStr = myStr & chr(13)&chr(10) & objCDOMsg.Fields.Item(269680670) 'this is the raw html (only for HTML encoded messages)
	on error goto 0
	myStr = myStr & objCDOMsg.Text	'this is the raw text
	truncatemsg = chr(13)&"[truncated by SpamCop]"&chr(13)
	if len(myStr)>50000 then myStr = left(myStr, 50000-len(truncatemsg))&truncatemsg
'	myStr = "action=submit&oldverbose=&spam="&myStr&"&submit=x1"
	myStr = "action=submit&oldverbose=1&spam="&urlenc(myStr)&"&submit=x1"
	Set a = fs.CreateTextFile("spam0.txt", True)
	startTime = Now()
	wscript.stdout.write "<A TITLE="&chr(34)&"askspamcop"&chr(34)&">-</A>"
'	wscript.stdout.write urlenc(myStr)
' "POST", "", FALSE, "", "password" "POST", "", FALSE
	objhttp.setRequestHeader "EncodeingType", "multipart/form-data"
	objhttp.setRequestHeader "ContentType", "text/plain"
	myStr = objhttp.responseText
	ID = GetHTMLAttrib("/sc?id",myStr)
	wscript.stderr.write " id='"&ID&"'"
	Set a = fs.CreateTextFile("spam1.txt", True)
	a.WriteLine("ID: "&ID&chr(13)&chr(10) )
'	a.WriteLine(objhttp.statusText)
'	a.WriteLine(objhttp.getOption(-1))	
		'getOption(-1) returns the actual URL *after* the redirection
		'but generates an error with Microsoft.XmlHttp object
'	a.WriteLine(chr(13)+chr(10))
'	a.WriteLine(objhttp.getAllResponseHeaders())
	dResp = datediff("s",startTime,now())
	wscript.stdout.write "<A TITLE="&chr(34)&"id="&ID&" in "&dResp&"s"&chr(34)&">-</A>"
	if dResp > 45 then 
		wscript.stderr.write " Spamcop is loaded. Reply took:"& dResp &" seconds. Try later."
		end if
	while ID = Empty and dResp < 120
		wscript.stderr.write " Waiting for un-reported"
		wscript.stdout.write "<A TITLE="&chr(34)&"backthen="&backthen&chr(34)&">-</A>"
		backthen = now()
		tick = now()
			if DateDiff("s",tick,now()) > 0 then 
				tick = now()
				wscript.stderr.write "."
				end if
			loop while DateDiff("s",backthen,now()) < 10
		wscript.stdout.write "<A TITLE="&chr(34)&"now()="&now()&chr(34)&">-</A>" "GET", "", FALSE
		myStr = objhttp.responseText
		ID = GetHTMLAttrib("/sc?id",myStr)
		wscript.stderr.write " id='"&ID&"'"
		Set a = fs.CreateTextFile("spam2.txt", True)
		a.WriteLine("ID: "&ID&chr(13)&chr(10) )
'		a.WriteLine(objhttp.statusText)
'		a.WriteLine(objhttp.getOption(-1))		'getOption(-1) returns the actual URL *after* the redirection
'		a.WriteLine(objhttp.getAllResponseHeaders())
		dResp = datediff("s",startTime,now())

	if instr(myStr, "spamid")<1 AND ID<>Empty then 'go get the past report
		wscript.stderr.write " Getting saved report" "GET", ""&ID, FALSE, "", "password"
		myStr = objhttp.responseText
		Set a = fs.CreateTextFile("spam3.txt", True)
		end if
	myStr = split(myStr&ID&" ", ID,2)(1)
	wscript.stderr.write ". Reporting to: "
	if instr(myStr, "spamid")>0 then 
	'	myStr = "<input type=""hidden"" name=""action"" value=""flexsend"">"
		sendStr = ""
		urlStr = ""
		for each myStr in split(replace(myStr,"<","><"),">") '>
			if left(myStr,1) = "<" then
				if instr(1, myStr, "action=display", 1) > 0 then
					idLinkStr = replace(urlStr & GetHTMLAttrib("href", myStr),"&action=display","")
					end if
				select case ucase(split(mid(myStr,2))(0))
					case "FORM"
						urlAction = GetHTMLAttrib("action", myStr)
						if left(urlAction,4)="http" then urlStr = urlAction else urlStr = urlStr & urlAction
						methodStr = ucase(GetHTMLAttrib("method", myStr))
					case "INPUT"
						typeStr = GetHTMLAttrib("type", myStr)
						if typeStr = "checkbox" and instr(1,myStr, "checked",1)>0 then 
							sendStr = sendStr &"&"&GetHTMLAttrib("name", myStr) &"="
							sendStr = sendStr &"on"
						elseif typeStr = "submit" then
'							if GetHTMLAttrib("name",myStr) = empty then 
'								sendStr = sendStr &"&submit="
'								sendStr = sendStr &urlenc(GetHTMLAttrib("value", myStr))
'								end if
						elseif instr(myStr,"") then
							wscript.stderr.write "NOT Cybervalince "
							sName = GetHTMLAttrib("name", myStr)
							sendStr = sendStr &"&"&sName&"="
							sValue = GetHTMLAttrib("value", myStr)
							sendStr = sendStr &urlenc(sValue)
							if sName = "source" then wscript.stdout.write chr(13)&chr(10)&"<BR>Source:"&sValue
							if instr(sValue, "@") then wscript.stderr.write sValue&"; "
							end if
					case "TEXTAREA"
						sendStr = sendStr &"&"&GetHTMLAttrib("name", myStr) &"="
					case "SELECT"
					case "OPTION"
					case "/SELECT"
					case "/FORM"
					case else
					end select
				end if
		wscript.stdout.write chr(13)&chr(10)&"<BR><A HREF="""&idLinkStr&""">"&idLinkStr&"</A>" methodStr, urlStr, FALSE, "", "password"
' methodStr, urlStr, FALSE, "", ""
'		objhttp.setRequestHeader "ContentType", "application/x-www-form-urlencoded"
'		objhttp.setRequestHeader "ContentType", "text/html;charset=UTF-8"
		objhttp.setRequestHeader "ContentType", "multipart/form-data"
		myStr = objhttp.responseText
		Set a = fs.CreateTextFile("spamrep.txt", True)
'		a.WriteLine(objhttp.getAllResponseHeaders())
		myStr = split(myStr, "<p>")(1)
		wscript.stdout.write chr(13)&chr(10)&"<BR>"&myStr&"</P>"
		wscript.stdout.write chr(13)&chr(10)&"Rejected: <BR>"
		wscript.stderr.write chr(13)&chr(10)&"Rejected"
		e=instr(1,myStr, "<p>"&chr(10)&"<font color=""red"">",1)
		if e > 0 then wscript.stdout.write split(mid(myStr,e)&"</font> ","</font>")(0)&"</font>"
		e=instr(1,myStr, "error:",1)
		if e > 0 then 
			wscript.stdout.write split(mid(myStr,e)&"<br> ","<br>")(0)&"<br>"
			wscript.stderr.write split(mid(myStr,e)&"<br> ","<br>")(0)
			end if
		end if
	myMsg.Move myDestFolder
'	wscript.quit
	end if

2004.04.13 Confirmed to work in Outlook 2003, although Outlook has this annoying tendancy to ask you if it is ok all the time.

2002.08.13 Updated the script to include debug info in the log file as html anchor text so that you can mouse over the -'s in IE and see the messages. It is also now confirmed to work in Outlook 2000 on Windows XP.

See also:

file: /Techref/language/basic/ol-spam-rpt-vbs.htm, 15KB, , updated: 2016/12/8 19:11, local time: 2017/2/21 00:04, owner: JMN-EFP-786,

 ©2017 These pages are served without commercial sponsorship. (No popup ads, etc...).Bandwidth abuse increases hosting cost forcing sponsorship or shutdown. This server aggressively defends against automated copying for any reason including offline viewing, duplication, etc... Please respect this requirement and DO NOT RIP THIS SITE. Questions?
Please DO link to this page! Digg it! / MAKE! / 

<A HREF=""> An automated SPAM reporting script for MS Outlook </A>

After you find an appropriate page, you are invited to your to this massmind site! (posts will be visible only to you before review) Just type in the box and press the Post button. (HTML welcomed, but not the <A tag: Instead, use the link box to link to another page. A tutorial is available Members can login to post directly, become page editors, and be credited for their posts.

Link? Put it here: 
if you want a response, please enter your email address: 
Attn spammers: All posts are reviewed before being made visible to anyone other than the poster.
Did you find what you needed?

  PICList 2017 contributors:
o List host: MIT, Site host, Top posters @20170221 IVP, RussellMc, Van Horn, David, Neil, James Cameron, Sean Breheny, alan.b.pearce, Denny Esterline, David Duffy (AVD), Bob Blick,
* Page Editors: James Newton, David Cary, and YOU!
* Roman Black of Black Robotics donates from sales of Linistep stepper controller kits.
* Ashley Roll of Digital Nemesis donates from sales of RCL-1 RS232 to TTL converters.
* Monthly Subscribers: Gregg Rew. on-going support is MOST appreciated!
* Contributors: Richard Seriani, Sr.

Welcome to!