From richie at entrian.com Wed Oct 1 03:33:49 2003 From: richie at entrian.com (Richie Hindle) Date: Wed Oct 1 03:34:09 2003 Subject: [Spambayes-checkins] spambayes/spambayes/resources help.gif, NONE, 1.1 help_gif.py, NONE, 1.1 .cvsignore, 1.1, 1.2 In-Reply-To: References: Message-ID: <1ovknvcqdbed0i53r59btnd7h9gmc5gfsn@4ax.com> [Tony] > A not-quite-matching help image for the web interface. > If whoever made all the others is reading this, it would be > great if you could replace this with a matching one :) Will do (sorry for not replying sooner, but I've been away for a few days). -- Richie Hindle richie@entrian.com From montanaro at users.sourceforge.net Wed Oct 1 10:07:41 2003 From: montanaro at users.sourceforge.net (Skip Montanaro) Date: Wed Oct 1 10:07:45 2003 Subject: [Spambayes-checkins] website faq.txt,1.45,1.46 Message-ID: Update of /cvsroot/spambayes/website In directory sc8-pr-cvs1:/tmp/cvs-serv20957 Modified Files: faq.txt Log Message: add a note about using SB with non-English languages Index: faq.txt =================================================================== RCS file: /cvsroot/spambayes/website/faq.txt,v retrieving revision 1.45 retrieving revision 1.46 diff -C2 -d -r1.45 -r1.46 *** faq.txt 25 Sep 2003 13:13:08 -0000 1.45 --- faq.txt 1 Oct 2003 14:07:37 -0000 1.46 *************** *** 588,591 **** --- 588,618 ---- + Does SpamBayes work with non-English languages? + ----------------------------------------------- + + SpamBayes was developed by English-speaking people and has therefore had + very little testing with other languages. There are some anecdotal reports + that it doesn't work as well with Western European language. It might work + very well with them if these default values are changed in the user's ini + file: + + [Tokenizer] + replace_nonascii_chars: True + skip_max_word_size: 12 + + The first setting causes all non-ASCII characters to be replaced by a + question mark. For non-English languages the setting should probably be + False. The second setting causes all words longer than 12 characters to + yield a "skip: X NNN" token instead of the word itself, where X is the first + letter of the word and NNN is the word length. For languages like German, + this can be especially troublesome, because an inordinate number of words + will yield tokens like "skip: ? 17" because they are long and start with an + accented character. + + Asian languages will be particularly troublesome. The SpamBayes tokenizer + splits the message into whitespace-separated tokens. (Many?/Most?/All?) + Asian languages don't separate "words" with whitespace, so the entire body + of a message will generate little other than "skip: ? NNN" tokens. + How do I train SpamBayes (web method)? -------------------------------------- From anadelonbrin at users.sourceforge.net Wed Oct 1 20:02:21 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Wed Oct 1 20:02:24 2003 Subject: [Spambayes-checkins] website faq.txt,1.46,1.47 quotes.ht,1.6,1.7 Message-ID: Update of /cvsroot/spambayes/website In directory sc8-pr-cvs1:/tmp/cvs-serv13433 Modified Files: faq.txt quotes.ht Log Message: Add a quote from the EDN article. Fix the link to the email package (thanks Rob). Index: faq.txt =================================================================== RCS file: /cvsroot/spambayes/website/faq.txt,v retrieving revision 1.46 retrieving revision 1.47 diff -C2 -d -r1.46 -r1.47 *** faq.txt 1 Oct 2003 14:07:37 -0000 1.46 --- faq.txt 2 Oct 2003 00:02:18 -0000 1.47 *************** *** 129,133 **** also need version 2.4.3 or above of the Python "email" package. If you're running Python 2.2.2 or above, then you already have this. If not, you can ! download it from the `Mimelib project`_ and install it. Unpack the archive, cd to the email-2.4.3 directory and type "python setup.py install" (YMMV on different platforms). This will install it into your Python site-packages --- 129,133 ---- also need version 2.4.3 or above of the Python "email" package. If you're running Python 2.2.2 or above, then you already have this. If not, you can ! download it from the `email-SIG`_ and install it. Unpack the archive, cd to the email-2.4.3 directory and type "python setup.py install" (YMMV on different platforms). This will install it into your Python site-packages *************** *** 136,140 **** .. _Python download page: http://www.python.org/download/ ! .. _Mimelib project: http://mimelib.sf.net/ --- 136,140 ---- .. _Python download page: http://www.python.org/download/ ! .. _email-SIG: http://www.python.org/sigs/email-sig/ Index: quotes.ht =================================================================== RCS file: /cvsroot/spambayes/website/quotes.ht,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** quotes.ht 8 Sep 2003 12:01:44 -0000 1.6 --- quotes.ht 2 Oct 2003 00:02:18 -0000 1.7 *************** *** 58,61 **** --- 58,69 ----

+

+ Words can't fully describe the elation I feel when I boot up my computer in the morning, + launch Outlook and watch 75 or so e-mails download, only to see two-thirds of them immediately + and automatically leave my inbox and enter the spam folder! + Brian Dipert in an article + in EDN Magazine. +

+

What we are saying about us

From anadelonbrin at users.sourceforge.net Thu Oct 2 01:20:24 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Thu Oct 2 01:20:27 2003 Subject: [Spambayes-checkins] spambayes/spambayes UserInterface.py, 1.28, 1.29 Message-ID: Update of /cvsroot/spambayes/spambayes/spambayes In directory sc8-pr-cvs1:/tmp/cvs-serv24098/spambayes Modified Files: UserInterface.py Log Message: If the user needs to send a message to spambayes@python.org asking for help, then help them do this so that they will include at least some of the information that is needed to helpt hem fix the problem. Index: UserInterface.py =================================================================== RCS file: /cvsroot/spambayes/spambayes/spambayes/UserInterface.py,v retrieving revision 1.28 retrieving revision 1.29 diff -C2 -d -r1.28 -r1.29 *** UserInterface.py 30 Sep 2003 04:18:05 -0000 1.28 --- UserInterface.py 2 Oct 2003 05:20:22 -0000 1.29 *************** *** 67,72 **** --- 67,75 ---- import re + import os + import sys import time import email + import smtplib import binascii import cgi *************** *** 83,86 **** --- 86,90 ---- import tokenizer from spambayes import Stats + from spambayes import Version from Options import options, optionsPathname, defaults, OptionsClass *************** *** 252,255 **** --- 256,260 ---- self.parm_ini_map = config_parms self.advanced_options_map = adv_parms + self.app_for_version = None # subclasses must fill this in def onClassify(self, file, text, which): *************** *** 926,927 **** --- 931,1079 ---- self.write(stats) self._writePostamble() + + def onBugreport(self): + """Create a message to post to spambayes@python.org that hopefully + has enough information for us to help this person with their + problem.""" + self._writePreamble("Send Help Message", ("help", "Help")) + report = self.html.bugreport.clone() + # Prefill the report + sb_ver = Version.get_version_string(self.app_for_version) + if hasattr(sys, "frozen"): + sb_type = "binary" + else: + sb_type = "source" + py_ver = sys.version + try: + # Use "Windows" instead of "nt" or people might be confused. + os_name = "Windows %d.%d.%d.%d (%s)" % sys.getwindowsversion() + except AttributeError: + # Not available in non-Windows, or pre 2.3 + os_name = os.name + report.message_body = "I am using %s (%s), with version %s of " \ + "Python; my operating system is %s. I have " \ + "trained %d ham and %d spam.\n\nThe problem " \ + "I am having is [DESCRIBE YOUR PROBLEM HERE] " \ + % (sb_ver, sb_type, py_ver, os_name, + self.classifier.nham, self.classifier.nspam) + domain_guess = options["pop3proxy", "remote_servers"][0] + for pre in ["pop.", "pop3.", "mail.",]: + if domain_guess.startswith(pre): + domain_guess = domain_guess[len(pre):] + report.from_addr.value = "[YOUR EMAIL ADDRESS]@%s" % (domain_guess,) + report.cc_addr.value = report.from_addr.value + report.subject.value = "Problem with %s" % (self.app_for_version,) + # If the user has a log file, attach it. + try: + import win32api + except ImportError: + pass + else: + if hasattr(sys, "frozen"): + temp_dir = win32api.GetTempPath() + for name in ["SpamBayesService", "SpamBayesServer",]: + for i in xrange(3): + pn = os.path.join(temp_dir, "%s%d.log" % (name, + (i+1))) + if os.path.exists(pn): + # I can't seem to set a default value for a + # "File" input type, so have to change it to + # "Text" if one is found. + report.file.type = "text" + report.file.value = pn + # For the moment, just attach the first one + # we find. + break + if report.file.value: + break + + self.write(report) + self._writePostamble() + + def onSubmitreport(self, from_addr, to_addr, cc_addr, message, + subject, attach): + """Send the help message/bug report to the specified address.""" + # For guessing MIME type based on file name extension + import mimetypes + + from email import Encoders + from email.Message import Message + from email.MIMEBase import MIMEBase + from email.MIMEAudio import MIMEAudio + from email.MIMEMultipart import MIMEMultipart + from email.MIMEImage import MIMEImage + from email.MIMEText import MIMEText + + if not self._verifyEnteredDetails(from_addr, cc_addr, message): + self._writePreamble("Error", ("help", "Help")) + self.write(self._buildBox("Error", "status.gif", + "You must fill in the details that " \ + "describe your specific problem " \ + "before you can send the message.")) + else: + self._writePreamble("Sent", ("help", "Help")) + mailer = smtplib.SMTP(options["smtpproxy", "remote_servers"][0]) + + # Create the enclosing (outer) message + outer = MIMEMultipart() + outer['Subject'] = subject + outer['To'] = to_addr + if cc_addr: + outer['CC'] = cc_addr + outer['From'] = from_addr + outer.preamble = message + # To guarantee the message ends with a newline + outer.epilogue = '' + + # Guess the content type based on the file's extension. + ctype, encoding = mimetypes.guess_type(attach) + if ctype is None or encoding is not None: + # No guess could be made, or the file is encoded (compressed), + # so use a generic bag-of-bits type. + ctype = 'application/octet-stream' + maintype, subtype = ctype.split('/', 1) + if maintype == 'text': + fp = open(attach) + # Note: we should handle calculating the charset + msg = MIMEText(fp.read(), _subtype=subtype) + fp.close() + elif maintype == 'image': + fp = open(attach, 'rb') + msg = MIMEImage(fp.read(), _subtype=subtype) + fp.close() + elif maintype == 'audio': + fp = open(attach, 'rb') + msg = MIMEAudio(fp.read(), _subtype=subtype) + fp.close() + else: + fp = open(attach, 'rb') + msg = MIMEBase(maintype, subtype) + msg.set_payload(fp.read()) + fp.close() + # Encode the payload using Base64 + Encoders.encode_base64(msg) + # Set the filename parameter + msg.add_header('Content-Disposition', 'attachment', + filename=os.path.basename(attach)) + outer.attach(msg) + msg = MIMEText(message) + outer.attach(msg) + + recips = [] + for r in [to_addr, cc_addr]: + if r: + recips.append(r) + mailer.sendmail(from_addr, recips, outer.as_string()) + self.write("Sent message. Please do not send again, or " \ + "refresh this page!") + self._writePostamble() + + def _verifyEnteredDetails(self, from_addr, cc_addr, message): + """Ensure that the user didn't just send the form message, and + at least changed the fields.""" + if from_addr.startswith("[YOUR EMAIL ADDRESS]") or \ + cc_addr.startswith("[YOUR EMAIL ADDRESS]"): + return False + if message.endswith("[DESCRIBE YOUR PROBLEM HERE]"): + return False + return True From anadelonbrin at users.sourceforge.net Thu Oct 2 01:20:25 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Thu Oct 2 01:20:30 2003 Subject: [Spambayes-checkins] spambayes/spambayes/resources ui.html, 1.24, 1.25 ui_html.py, 1.24, 1.25 Message-ID: Update of /cvsroot/spambayes/spambayes/spambayes/resources In directory sc8-pr-cvs1:/tmp/cvs-serv24098/spambayes/resources Modified Files: ui.html ui_html.py Log Message: If the user needs to send a message to spambayes@python.org asking for help, then help them do this so that they will include at least some of the information that is needed to helpt hem fix the problem. Index: ui.html =================================================================== RCS file: /cvsroot/spambayes/spambayes/spambayes/resources/ui.html,v retrieving revision 1.24 retrieving revision 1.25 diff -C2 -d -r1.24 -r1.25 *** ui.html 30 Sep 2003 04:18:06 -0000 1.24 --- ui.html 2 Oct 2003 05:20:22 -0000 1.25 *************** *** 121,128 **** ! If you have fully exhausted all your ideas, then you can ! contact ! the SpamBayes team. --- 121,187 ---- ! Sorry, there isn't any specific help available for that section. ! ! !   ! ! If you believe you may have found a bug in SpamBayes, or are ! at a loss as to how you can proceed, you can ask the SpamBayes ! mailing list for assistance. Note that the members of this list ! are volunteers that answer questions in their free time, so an ! answer to your question might take a little while to appear. If ! you are quite certain that you have found a bug, then you're ! probably better off submitting this via the ! SourceForge tracking system, as sometimes things get lost on ! the list, particularly in busy times or when the latest virus is ! flooding the net with bogus messages.
 
! There is certain information which people need to know in order to ! suggest how you might fix any problems. To help make sure that you ! have all this information, SpamBayes can create ! a help message for you. If you choose to email the list without ! using this, please ensure that you have all the pertinent information. ! (Otherwise your response is likely to be "please tell us ..."). + + +


+

A pre-filled-in 'help' message

+ +
+
+ + + + + + + + + + +
Send Help Message
From: + +
To: + +
CC: + +
Subject: + +
Message: + +
Attach Log file: + +
+ +
+
Index: ui_html.py =================================================================== RCS file: /cvsroot/spambayes/spambayes/spambayes/resources/ui_html.py,v retrieving revision 1.24 retrieving revision 1.25 diff -C2 -d -r1.24 -r1.25 *** ui_html.py 30 Sep 2003 04:18:06 -0000 1.24 --- ui_html.py 2 Oct 2003 05:20:22 -0000 1.25 *************** *** 6,104 **** import zlib ! data = zlib.decompress("x\\{s8;`8Ю%ʏl.q%Ԕ\013\"!\033aٗ~\015\004\037\ ! z1sU$>FCw\003w/^N~}wŮ'o^wx9zq2Fl\ ! $H&<\036\016~vo9_\024˘\005\017񻈊X(poSG_rWI!\031\017\012`(\ ! 8[\024Ez(YF\027%\017\026aIq$0P\036(\023Uc(\017\030\037`*\ ! \003\020(%Q2f\036׷\024|\012ۡ\036\026l\011e\033\004(\000\003\031l̾/||\037\ ! pۅ\001=N\014\015(\030\035D4_\000S\031T>\022+jS$\001>y\033LyP#S\036|g\ ! LBh)\004tR\036Q28.\017c1\003\032ӳoaTf\016\013«\022ƃMcWn*B.;Eo\ ! [bxΣ\026PI۵Gb)υ\032\002\005W<]Ȕ\034\031E6dZh3\017\036;c\ ! (,\026\007O1mp6q0bKddL}G^U^7\017$A\017:\030\014htz5#\035\ ! WX]V\015\024Ba?,JŝLԀ6+\002\0135u\034yO*?\020~\017\015V\0175v\ ! %\011\021\023/\034z?\017{\026͗Q\ ! \030\035Oi\001\037@AM7F4l,dX\006|@bj\003́%yqhN\015\010LI\024%$P,\024\001x\005HG&TЯ\015GIZ\026d\016u\021\025\000w\ ! \015\001KQv\030څ36z\030\014r\036ei\011V!\030yƗK^(%\0337zVI\007x֝y\ ! \024`\012x\007tf>Uu_\027\016!w>7sYaulzhT${\006\0039YD\ ! ý\035)2\000B5\003\003\004*+!]ɤ\031\012\022\033ԣk\006\032\027g_\015&E\030\"\017#.Y\\\014\032\ ! ѹ\\d.BKvgC$֦6E8QF0W*߂vr]䉫\027\021\006+8|*\ ! \005\027z\037\034\007J\003&3\000%5*jL.Y\036d\000<\024[ϓ;\007!\004*\00704\001\ ! ?}4\012j\005('l\034\013!\003V`\034\010֎Ro5p2/《d\000Xp\022!\ ! \005sQq9\015fG&x\006\027\"\006\"\012;\023k-,(!\017N,\030eHW-+Q4\032G\034\ ! \034\005œ׎&kv]\0268\001F=nYE柃\027j[U_?vz\013\010|(j\ ! \021\027!X\021Pt#PKhE \020\002)E\037\035PWE @ڳ@e~e\032b7\027eM]sa\032C\ ! ixȧu;\015=h9k\015\032$,\025ysƓ\002\034H\017,\011Mv:\ ! `Җ\001\012;\025\021\002.,\030GE\006\006\000\007ڧٰn[\006\004)!\ ! A7˵vV\015.4kg \032SޯWQV$fͪjF҂\0136+\026\017\013^\ ! \003KP\020\000u*ҁ\030\014Zɗf>2A\004=\0353j?[ul춛Ut\ ! h\011M\022\0133\0252#}9&X\012r!$\024*WyTw!?\002/\011ѾtK\ ! \005=Us\033\"1ۘ*8u,,Nkڪc\027\024DYB\030zPx\012„H\034;Ӳ(@\0263\010N\005шAq\004\011Rv\0244 \ ! \0243\014t^H`TUT\003z0\"ǔ\022BDk\\Uz\031\001B6dD\035\001\027\0235\004\031PO8\ ! SV=ɕ\003Q\037i3\\\\r@J0TbJ߇i4c[ZKL@\034\ ! \017ן&\026z|\0368E\024\0200̓_0\\2#?\\ȹ@\002ꫫN\035k8q\ ! \033(X~].p0\026/hܾU)ܽCy2g!h r\017H历3p\027.\001I\0268\ ! ž=n\031J~jU\010\033bf.[6\032,JM0\"\032s~||7\ ! *\023er2Q`5i\010\026\023\037k~\031\013eP.!\036 \0379{5\014b̋\005/~]cSde\ ! \027~?\024c{\021\024XΩn\000\036/\037CCOd@\004k\026>\036Ћ=wbG\ ! G\027\027\030[\000~!J\015iSg`/*\016\012ZDv\011~\004\011U\001\024=}Wu\ ! /pu.eG4|v5I\012\025K\002T\024Q-ޖS3\033Qiá\002'c&\000+9\ ! 5\015P]6ἓШ,5s\005\036溳\011\006T]ǪNs_\025\025\010Y\005Q\001]\037D\\\020\ ! EunK+\006@@\032-\032շPspn\036\025oj\023xx={\006\ ! q\015u.{\000b\000\006\034__8VgQ\002p\ ! &\020)R[I\007\032ʉX\006\033\023f+Im\0359WQ\031*\011wD\ ! \"\022:JB\000I\\8ɿ\007}\011)\\\0161\014.n\020Ŵ\011kN\034\037(}DYT5h\004L\ ! #Vje2\035c?\034\0254}\010Ԙ\027\007l4b\"eGwF?hԓ\033\000\027\0122\ ! M8\031\017#i@=\ ! .ހn\"\">7TZ Ik4fAPNeq\0070+\011Ⓐ\014\031|Bc{\023'\010\011[)\017\ ! @c&\027.\034%֭OJ\003)j\001\023dS)ЛMKo7R-z;K]&g4\ ! J\011aT\017<\0347p8w*q\004rF6\0042uhN\011+,\023KyO\015Mo;':W\ ! 2\013\024٣4em\015H\013ĩ\0364;\026†^a8=}\\\0009Fp]+pN#k\ ! \002Fk\017z&@\011&7\00355ԋz=O\002fAh/\021H<\012LoHDwȍۜtD\017`.\\\ ! ֝4D\005+\014)&R`\0372\003\022:1e\\\003U]̧\"v\027xô^kF1\ ! C\033ub4uS\037Mg4\023s񰡛#5i:x#e3v{gpE\ ! \012\023>K\001υq7)6LjzZWalgn+z\0147!ZK\037ӬkQ0ݵ\ ! \036U\035y\015dD\022Ti\032\005ƽ\026̟A@f.UY\007Le^1_/[\034y\ ! f\031z\015Hgǧ[1^kcv8EV./d70޵e7HHsq*d\ ! \013\001J}BvNq38gZk&*Ċ\037Vٍ\006ֱ\016#Z&um'F?\021\ ! ڂ\022\014N9PM7 TGW;jj\0333eV8kI?\ ! )nrF;\005N |\027\0225lI-SZTNN!.S>PuDIu0Q\ ! S\027\0314!dq*\015Ïk\0329F\021oCZ\026Dz9il9\007zs+\021\003\021\003L\026L{\ ! y}ӓ'd!=S/$r4ԓcz91~Cuk*U*ݥ\ ! rrlfP\\_i.v{JDŽ7\0062UڹCWztzͱͣv\002')Cz\013\ ! \020ǽrwIT\004O\031K.ץȭ\015Gi\005el'Tͥ\002P\0000EN\000!\ ! ^F^BY]w=h<\000u!O5j\\Ö\032I\007\012Ab\0134O ۨkk[\ ! +`J7h8\033p6Hkyov7\015ޅv}ڮ8VIeZ\013j\0154h\021E%\ ! f̧\032g<\015e~SS2Jߙ4N\0313?\013\013Xvӿ\00158Uw=\031\016\022\0232EOc\ ! \016f\035;hy\011kGM;OiRڱDՎB9'ed{g\000Ն]ڗh\ ! vxf\025)N;;;]GDob&޶?LoEl!s*2yUdDIɍ]\ ! \013YȓL\ ! OuEYr8SE\022j~F\036IpXn>-\013\0052K\0279(Ow\003}\015\ ! zޓՌޟj͖\"`Ƞ4ch_\014VF7}\024:\010g\001^3\ ! 4L@\017\003v;\031\037\037ֹ#Ƞ{FǛWՠyb\004ۓ:b1g\010ƀ?NߑHD*:\ ! ݷGsΏ~&\011\026\015d\0164Vwl\035\001\001ٖΦϔ\025\032\0247S\012Cx\ ! Lẹ\021}XB\0220\024\031>_6S\016Ŋ\020n") ### end --- 6,121 ---- import zlib ! data = zlib.decompress("xb\032_H/}\ ! \014ǣ\015o\027\036&zbx6]_\005\032ފ\0058\025ID-c[MR3H\024vi44\010\ ! (\010F\012\034F:gY\020Eq:|n/{\011\001_~T\021{U`\004`v\020VS\ ! \033\020\"e\017\016NOȮ|^,*\015|CEB\000Ϩ!ꐙkܟ\035\ ! l\025G\0023#b\014`\0035O/`\ ! *q\024%\037N2;\007<\000B\015\036H͂\031>X\014\037e§'#0\025KSEg0\020\ ! kb\020t\017\007X_ϋsV}\\voa9\004\014J)z+>_,o#a \ ! 0-g\004d\"l\026'`/B\021łXgq\012L(\026%B48O\024\01017%.yZ\ ! `M=QJ\005 A\006%%Y\015\027sX&8\017E\036(00\0304Β2\011A@eZKXE\ ! k`($Ifj69aBEPR\025rLdezJؠ?؀\027\0057Xf\"\005vK Nq\ ! =Ow,V[\002>hX\021\015@>\014\006\006E=1;\0364\036&g,;\017hSeB\030m\ ! _x\003ke&J9$f\0254\026HT\005#p\021̏S\016\004úX\021\001\\ s\005\ ! %BY\013YB,J\022\0350j\025TA\003\032Ey\037dPh4\0009k\037ZWo\004IVm)\023e\014\025iEK\002\\ha\ ! ,\000:\012@=\013d\013t\007J#&r5\000%\005UfX2\031A\001,Vhm}F5\010H\002\ ! \004p\000E`kcU5V5\020#0?8b\005Ɓ\016\025z}C\010\022\011\007H\010\0061\ ! 6#+VA-6\011\\`Y3\036ux\011XKl|ka\005-\004\023\033y%v\004t\005r\ ! 2(\0367&(zqkHr[>\013y@\020\036YE>\000/Ԁ^~\ ! \011P44#_DE\000\005яA\020`\\\0375B\010\006|t@}\025\000\006*\003/\000)(7u\ ! dz\017\030ztmNC<[M4Ppjx9=-E9\007-x/dsIITp@%\014\007\003MBU\ ! 02]\017hs#*zjN;}E4\001.*\004G$\"}c\004?(+fOA)\ ! H\006\004\031Y&#A7R[P\013\032+Y\025\001\025fވ<_\037_\ ! r\024k&3\036Ƴ8Ts\023\007qB\011jp-S1l2A`'aBMyCE\0319S=\ ! \032{\005\\6Q\000JaV\036\006dJaP\002\004b\004\025u\0052\025>\010\015S^Ua\012A\ ! PT\020\035@V\002p\031!jU)\033H`\037\007#\\D\002NK\\+*H3\"\000\035I9)>\0139\022\ ! vW\037\035ISL*\016&\027\030\031.\005%\006\036f'|h\032Wr1\037Jl%|D(\ ! SQ.ʹ\012\030ɀ\015\035*e!\0253[8puR8E\032\005\003ڇ\013!$,GճD,\0053\ ! RA+\021/\004;xZ#\036V^`mKFw\023ZU,R,X4-I|~==Z\001\027`\ ! >Dj['}a}@\017fp{0\025\032+i\033\006K̟\000aAcsA!\026\002:fj\ ! W\036{\030\006\012\022b\022e\014!\020``\003UQ\011Vw&\004R\013&\005Vt\000d+\ ! \011N6*ޒyxQtɋ\031f\031iF{t54\014;F$'\ ! Qp!\024y\\q;}!2Y=ڳ?@ݯ\004\011şwC?\010-qW[~\037y=\032\ ! pX\032b}Ԣ=D#iCuq5%\030B\023:x\015\"X2'\023T\025\ ! ,X\023%M~\031\0268\"\016U\012\034€ \003CXK̺\032-\013R\016\023\00500\ ! XI3wAߙ\021@ˢD;1'\023l(\015\010\027ƘPo\034I}T\"Z4K\ ! Q\011ۆZ-6h\010\001(͗qVTR\015\000ཧɊˎ7p_\ ! ;\024don5\007\007:M~})\006\010t\001%yCITo|||.f&MPZ\0034\027\005\006s,!ޕ\0204vV\005\ ! p3m_\007qmq3H0\000n\026ϷeL\001NW@ʜD\035\026\00488N\003\031@\ ! :\000\015\003R%$l\033¥E\017KΫ\006s\\񷖺3Fqɗ^#\025gS\037\004X\012\ ! lT\035_㑉c\010s\010\001c\023Rn+\027&\004ZsYQ;\023X;5n`<\025=(Nt\ ! &\001bLrj&\024\032Z#)P\035\002\001δ@vRyTkS\003gf\007\032҄\"Ӻ7\ ! T\003]5K]ġɄ ʫXu=Ղ*\025\032dLtq3\036\002x?GW\037B\012\ ! 􉡛?A>fn\012>\005u=fss*L\"1F\020j\013Euz\0350#6`\004\035~\ ! .¿(\004\024|\001̐(6\005UoENV)qW3\027\035\035I\035@f\003tmT\034隆sa\ ! 7\"č\021&x3q88V\022\023)b.C\017]˹\005@\012N\0359\ ! q3`\032\006w5\030̅+-\0204v\037_,\012b\001c6L*s\017\026`I\026\ ! 0=y<~D\010-\037K𦵪k,AU&)̐a}_^U\ ! \027\033R9*cw=2\010\027\023Tg \022a>!_~9DKvrXuEҲ\ ! F_;o5c\00714\034]P7=\000<\017hO̒\032\001\01053ݧ\027\007?(EBm\ ! OC%;Ez\013\027\037\"y1u̥n\020ĊW\035\034\036{\035 YU00~^\016\032Y\ ! K3\030[L²5\0377#N5UxUkl^]xSNja\024(eE0dx\024b\ ! \0372Ҽv\003d;?c\007\002ge\035MXcMx\006G&\014&r\011VZU\ ! \\w_1mX#ME AqĎ\015pxʎ\033\015OG\035.:]~A\024\013\ ! \007Ed=?\015D\"e5L\005l@\002͍WytE\001S`c\014^\004(m `\ ! K7)0p^t<덵\030D\002\025\0272:9S;v\011=oXF*\017 C\ ! 7\012\015= d\035-!UISw\033f3\012ɝ2KD\0203\000\021γ/q\ ! &~5Oqe\0241V2\021V((\0022Zf(\026v\025#X\024M\0374Ij[vC\ ! \015?յf'pҙrNSY-Db@\020faRR^\017)-4r\013S\032<蟪ͳK\037\ ! y8n_I.JP7t\033ஷB4z7+ݶ\002g$Ҧ\004\0170C'dlm\ ! JLob;\025X͎Q}\032@6zN:Nݔ`Ur\024t8̞P:;ѹ\022y_%תG]\025J\033\ ! H3ij\017ƭ@\013͆axY}7N\001\002\014\022h']atX7\030.c$\001\013ǖ\\\ ! 0G\"g\026+SmEXt\0325\026t PC,Elz#z0gNM\000}bʐo\ ! (v\0166\022,W)s{*C\036\001M)O+aZ.\\эf1N\"\033iפ&uf)\ ! IW)v\032=\035\033׷M3E\025apnT\002P\ ! X2~|r\000\002\014ia\001=\001\007:\023'qǘl@\027\023\017҃\007(\020A\023B6\021#)x\ ! 6\014q\021=xkrJ\020V s\016溕W\"\004\017\"\004\017,rǿ\010L뛎d]G9\006ğ\ ! ʄ?\021a83\005#ACcH01c[3uCJx鳰]N_?\014?V^\ ! 1aGc2ȩܡ򕬚wg# [<&pR\022\023mwK\0056\ ! yٸuɥs\016\016KaZA)\033\023jBW>R\000!L{0{p:bGS:]\017ھ\016\ ! G<(E;626Vp5]lP't\0208@e\004Zgm(\003o1\0036\026\022Ь\ ! \033qov;\0156\005Tx5zf\006Ӡ#/ʼ:\005\026\025S QF/U\033\ ! OLO'\035vj\037cE\003\015vʾ>ZH\"C\034,lf\036\035O\034>EX\ ! 'V?T@U]fЃ|n\004ϳG!8\036\\]K4*&\032:\013K~羮SU@NLƇĬ1Wem\ ! 4\003\006\020͗)bZh\"_\017\016\034Yh;\023\011wU)w1\ ! \026\013[W1\005F\025곚l{f2(Be?ڦ\022jŀֶ\023E\005⤏\ ! s\013z͑{U:v9K9W~\007\005*Kv`j\007#H\035l3*\ ! Tb3\033\034\016;ϦYȓLf݅c}](HҮ\035\007uB\011g\037\ ! ˛zH,\\W\027B]u!Ax\005:5&v8|U\\voc$?\005Ê\"c\032\ ! Q@\027\025\026l o\036u\016bY׌'\015SÐ\016hx6:=ҹ\023H}Fן\004ZV}\ ! @\030\014\034DYb9\013ODwj\024?c_\"O$us\015Y Ǖ\ ! Q\012\034zٔҽ\022C#VB/|\015SxLg,Q$(\"ZPO/\ ! dF\026") ### end From anadelonbrin at users.sourceforge.net Thu Oct 2 01:33:25 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Thu Oct 2 01:33:28 2003 Subject: [Spambayes-checkins] spambayes/spambayes UserInterface.py, 1.29, 1.30 Message-ID: Update of /cvsroot/spambayes/spambayes/spambayes In directory sc8-pr-cvs1:/tmp/cvs-serv25558/spambayes Modified Files: UserInterface.py Log Message: Handle those people for whom spambayes doesn't have their smtp server details, and who want to send a bug report. Index: UserInterface.py =================================================================== RCS file: /cvsroot/spambayes/spambayes/spambayes/UserInterface.py,v retrieving revision 1.29 retrieving revision 1.30 diff -C2 -d -r1.29 -r1.30 *** UserInterface.py 2 Oct 2003 05:20:22 -0000 1.29 --- UserInterface.py 2 Oct 2003 05:33:23 -0000 1.30 *************** *** 988,991 **** --- 988,1005 ---- break + try: + smtp_server = options["smtpproxy", "remote_servers"][0] + except IndexError: + smtp_server = None + if not smtp_server: + self.write(self._buildBox("Warning", "status.gif", + "You will be unable to send this message from " \ + "this page, as you do not have your SMTP " \ + "server's details entered in your configuration. " \ + "Please either enter those " \ + "details, or copy the text below into your " \ + "regular mail application.")) + del report.submitrow + self.write(report) self._writePostamble() From anadelonbrin at users.sourceforge.net Thu Oct 2 01:33:25 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Thu Oct 2 01:33:30 2003 Subject: [Spambayes-checkins] spambayes/spambayes/resources ui.html, 1.25, 1.26 ui_html.py, 1.25, 1.26 Message-ID: Update of /cvsroot/spambayes/spambayes/spambayes/resources In directory sc8-pr-cvs1:/tmp/cvs-serv25558/spambayes/resources Modified Files: ui.html ui_html.py Log Message: Handle those people for whom spambayes doesn't have their smtp server details, and who want to send a bug report. Index: ui.html =================================================================== RCS file: /cvsroot/spambayes/spambayes/spambayes/resources/ui.html,v retrieving revision 1.25 retrieving revision 1.26 diff -C2 -d -r1.25 -r1.26 *** ui.html 2 Oct 2003 05:20:22 -0000 1.25 --- ui.html 2 Oct 2003 05:33:23 -0000 1.26 *************** *** 179,183 **** ! --- 179,183 ---- ! Index: ui_html.py =================================================================== RCS file: /cvsroot/spambayes/spambayes/spambayes/resources/ui_html.py,v retrieving revision 1.25 retrieving revision 1.26 diff -C2 -d -r1.25 -r1.26 *** ui_html.py 2 Oct 2003 05:20:22 -0000 1.25 --- ui_html.py 2 Oct 2003 05:33:23 -0000 1.26 *************** *** 6,121 **** import zlib ! data = zlib.decompress("xb\032_H/}\ ! \014ǣ\015o\027\036&zbx6]_\005\032ފ\0058\025ID-c[MR3H\024vi44\010\ ! (\010F\012\034F:gY\020Eq:|n/{\011\001_~T\021{U`\004`v\020VS\ ! \033\020\"e\017\016NOȮ|^,*\015|CEB\000Ϩ!ꐙkܟ\035\ ! l\025G\0023#b\014`\0035O/`\ ! *q\024%\037N2;\007<\000B\015\036H͂\031>X\014\037e§'#0\025KSEg0\020\ ! kb\020t\017\007X_ϋsV}\\voa9\004\014J)z+>_,o#a \ ! 0-g\004d\"l\026'`/B\021łXgq\012L(\026%B48O\024\01017%.yZ\ ! `M=QJ\005 A\006%%Y\015\027sX&8\017E\036(00\0304Β2\011A@eZKXE\ ! k`($Ifj69aBEPR\025rLdezJؠ?؀\027\0057Xf\"\005vK Nq\ ! =Ow,V[\002>hX\021\015@>\014\006\006E=1;\0364\036&g,;\017hSeB\030m\ ! _x\003ke&J9$f\0254\026HT\005#p\021̏S\016\004úX\021\001\\ s\005\ ! %BY\013YB,J\022\0350j\025TA\003\032Ey\037dPh4\0009k\037ZWo\004IVm)\023e\014\025iEK\002\\ha\ ! ,\000:\012@=\013d\013t\007J#&r5\000%\005UfX2\031A\001,Vhm}F5\010H\002\ ! \004p\000E`kcU5V5\020#0?8b\005Ɓ\016\025z}C\010\022\011\007H\010\0061\ ! 6#+VA-6\011\\`Y3\036ux\011XKl|ka\005-\004\023\033y%v\004t\005r\ ! 2(\0367&(zqkHr[>\013y@\020\036YE>\000/Ԁ^~\ ! \011P44#_DE\000\005яA\020`\\\0375B\010\006|t@}\025\000\006*\003/\000)(7u\ ! dz\017\030ztmNC<[M4Ppjx9=-E9\007-x/dsIITp@%\014\007\003MBU\ ! 02]\017hs#*zjN;}E4\001.*\004G$\"}c\004?(+fOA)\ ! H\006\004\031Y&#A7R[P\013\032+Y\025\001\025fވ<_\037_\ ! r\024k&3\036Ƴ8Ts\023\007qB\011jp-S1l2A`'aBMyCE\0319S=\ ! \032{\005\\6Q\000JaV\036\006dJaP\002\004b\004\025u\0052\025>\010\015S^Ua\012A\ ! PT\020\035@V\002p\031!jU)\033H`\037\007#\\D\002NK\\+*H3\"\000\035I9)>\0139\022\ ! vW\037\035ISL*\016&\027\030\031.\005%\006\036f'|h\032Wr1\037Jl%|D(\ ! SQ.ʹ\012\030ɀ\015\035*e!\0253[8puR8E\032\005\003ڇ\013!$,GճD,\0053\ ! RA+\021/\004;xZ#\036V^`mKFw\023ZU,R,X4-I|~==Z\001\027`\ ! >Dj['}a}@\017fp{0\025\032+i\033\006K̟\000aAcsA!\026\002:fj\ ! W\036{\030\006\012\022b\022e\014!\020``\003UQ\011Vw&\004R\013&\005Vt\000d+\ ! \011N6*ޒyxQtɋ\031f\031iF{t54\014;F$'\ ! Qp!\024y\\q;}!2Y=ڳ?@ݯ\004\011şwC?\010-qW[~\037y=\032\ ! pX\032b}Ԣ=D#iCuq5%\030B\023:x\015\"X2'\023T\025\ ! ,X\023%M~\031\0268\"\016U\012\034€ \003CXK̺\032-\013R\016\023\00500\ ! XI3wAߙ\021@ˢD;1'\023l(\015\010\027ƘPo\034I}T\"Z4K\ ! Q\011ۆZ-6h\010\001(͗qVTR\015\000ཧɊˎ7p_\ ! ;\024don5\007\007:M~})\006\010t\001%yCITo|||.f&MPZ\0034\027\005\006s,!ޕ\0204vV\005\ ! p3m_\007qmq3H0\000n\026ϷeL\001NW@ʜD\035\026\00488N\003\031@\ ! :\000\015\003R%$l\033¥E\017KΫ\006s\\񷖺3Fqɗ^#\025gS\037\004X\012\ ! lT\035_㑉c\010s\010\001c\023Rn+\027&\004ZsYQ;\023X;5n`<\025=(Nt\ ! &\001bLrj&\024\032Z#)P\035\002\001δ@vRyTkS\003gf\007\032҄\"Ӻ7\ ! T\003]5K]ġɄ ʫXu=Ղ*\025\032dLtq3\036\002x?GW\037B\012\ ! 􉡛?A>fn\012>\005u=fss*L\"1F\020j\013Euz\0350#6`\004\035~\ ! .¿(\004\024|\001̐(6\005UoENV)qW3\027\035\035I\035@f\003tmT\034隆sa\ ! 7\"č\021&x3q88V\022\023)b.C\017]˹\005@\012N\0359\ ! q3`\032\006w5\030̅+-\0204v\037_,\012b\001c6L*s\017\026`I\026\ ! 0=y<~D\010-\037K𦵪k,AU&)̐a}_^U\ ! \027\033R9*cw=2\010\027\023Tg \022a>!_~9DKvrXuEҲ\ ! F_;o5c\00714\034]P7=\000<\017hO̒\032\001\01053ݧ\027\007?(EBm\ ! OC%;Ez\013\027\037\"y1u̥n\020ĊW\035\034\036{\035 YU00~^\016\032Y\ ! K3\030[L²5\0377#N5UxUkl^]xSNja\024(eE0dx\024b\ ! \0372Ҽv\003d;?c\007\002ge\035MXcMx\006G&\014&r\011VZU\ ! \\w_1mX#ME AqĎ\015pxʎ\033\015OG\035.:]~A\024\013\ ! \007Ed=?\015D\"e5L\005l@\002͍WytE\001S`c\014^\004(m `\ ! K7)0p^t<덵\030D\002\025\0272:9S;v\011=oXF*\017 C\ ! 7\012\015= d\035-!UISw\033f3\012ɝ2KD\0203\000\021γ/q\ ! &~5Oqe\0241V2\021V((\0022Zf(\026v\025#X\024M\0374Ij[vC\ ! \015?յf'pҙrNSY-Db@\020faRR^\017)-4r\013S\032<蟪ͳK\037\ ! y8n_I.JP7t\033ஷB4z7+ݶ\002g$Ҧ\004\0170C'dlm\ ! JLob;\025X͎Q}\032@6zN:Nݔ`Ur\024t8̞P:;ѹ\022y_%תG]\025J\033\ ! H3ij\017ƭ@\013͆axY}7N\001\002\014\022h']atX7\030.c$\001\013ǖ\\\ ! 0G\"g\026+SmEXt\0325\026t PC,Elz#z0gNM\000}bʐo\ ! (v\0166\022,W)s{*C\036\001M)O+aZ.\\эf1N\"\033iפ&uf)\ ! IW)v\032=\035\033׷M3E\025apnT\002P\ ! X2~|r\000\002\014ia\001=\001\007:\023'qǘl@\027\023\017҃\007(\020A\023B6\021#)x\ ! 6\014q\021=xkrJ\020V s\016溕W\"\004\017\"\004\017,rǿ\010L뛎d]G9\006ğ\ ! ʄ?\021a83\005#ACcH01c[3uCJx鳰]N_?\014?V^\ ! 1aGc2ȩܡ򕬚wg# [<&pR\022\023mwK\0056\ ! yٸuɥs\016\016KaZA)\033\023jBW>R\000!L{0{p:bGS:]\017ھ\016\ ! G<(E;626Vp5]lP't\0208@e\004Zgm(\003o1\0036\026\022Ь\ ! \033qov;\0156\005Tx5zf\006Ӡ#/ʼ:\005\026\025S QF/U\033\ ! OLO'\035vj\037cE\003\015vʾ>ZH\"C\034,lf\036\035O\034>EX\ ! 'V?T@U]fЃ|n\004ϳG!8\036\\]K4*&\032:\013K~羮SU@NLƇĬ1Wem\ ! 4\003\006\020͗)bZh\"_\017\016\034Yh;\023\011wU)w1\ ! \026\013[W1\005F\025곚l{f2(Be?ڦ\022jŀֶ\023E\005⤏\ ! s\013z͑{U:v9K9W~\007\005*Kv`j\007#H\035l3*\ ! Tb3\033\034\016;ϦYȓLf݅c}](HҮ\035\007uB\011g\037\ ! ˛zH,\\W\027B]u!Ax\005:5&v8|U\\voc$?\005Ê\"c\032\ ! Q@\027\025\026l o\036u\016bY׌'\015SÐ\016hx6:=ҹ\023H}Fן\004ZV}\ ! @\030\014\034DYb9\013ODwj\024?c_\"O$us\015Y Ǖ\ ! Q\012\034zٔҽ\022C#VB/|\015SxLg,Q$(\"ZPO/\ ! dF\026") ### end --- 6,121 ---- import zlib ! data = zlib.decompress("xaA\036\0071X\ ! c=/08g _\015?\010f\003aWж\006/q\022w<\024OC\013e0\ ! axR\004U\017φ9kV@#[x\004\034g\"}4rI\012x\006®?\013Ҕ\006\005\"\ ! \027e\032HH,\013(N\027e/s1zv\027D\036W\014^e\017L\012\0176K\000fW(\012j5%\ ! Qn\011!YIˣgbť\014\026\\W\014m\037*\022r\007xF}%\017Q\\+\034]\020;\ ! g8* \007Ϟ\035\021c\000|>\017\003\021#{9c\006=\032--zx\0009\036€t(NK)C\ ! VnՍ+\001i\013\030QqoE&\\\036a\031_ѻ\022s\013[~Ͷ\025\027\003m\ ! ;ᒘ\023/s\015\ ! ޟ\\ÿ\027{8еzQ2SG~\003\014S\034E!U\020WJ=M[by6y\037\011\003y\ ! i9& Ld8\001\021O,\026tw\">S`B,\021\027Qoy@9)q\021\015ӊ7<\007\ ! +gl\012R*\000Y\0142(\007-j\010ք2\031( D\001`qI@\017\012\005\"/\"^\022,\ ! \000Ca%I\015S\011\023],ꯐc\022$+3փV-\014\006\006$(AU\015*\023)[\002q\ ! 7x\022\005Ldb\012AÊh\000rqd00(\000Y0\001h:{\ ! \026ɀ #dd:\006_|\027T;R~K6\026aE@j-7\"7(.\ ! \034\005Ɍ<\016\004A\020B{\032\\K0*qz\014L\020I\030PrsfN\014b;~ϵ\ ! c\001\036i\001\015t\024RU\001&\022p1\000=A\030A`]\014a\005=\017\002ygÔU\020%\ ! \024\025`\007:\\\006i\032(x\025j\006Ry%\010!\023ϱ\021\005p\0156Kdf aQ\ ! \000\031cXdmؠb{nxst\026\ ! \025bq\022\024_u'f h\005`\003s&\0120P>p>\016C\020Sat<\030H \005識\030\ ! `y_9nAx\031x5.c\027FȂ0?\020B!\001\027Ba\000K0\033\ ! c0d9\027\020y@\006`V\015S\000`H55\004`ykE\005i\016>Rd\\\034C9\0113v:\007~,g6[B\ ! c43\011qiYea\0221\002;ݥ и`Ì\\,\020M#J.\003Y\0110x\012e\ ! *0ʅ^9S_\001#\031\001q,Bvf+=\020\024N\024GpH`Up)$zv`F\ ! *h4\005\023s\031Okd\013ѓsW\026u\035K\024\013f$MK\022ߡbzOV\005X\ ! ~\017\"^X_?\003\031\\\036---~ůJpچA\012'@إt\\PN?\ ! tU)F\001yF\004t\031C\031\004\030kX@Uj\025%\011A\024I\025&.=%\012a\ ! \002ӡ\015\0335^~(?<\035{:}}YY`\026\021{5\035j\0157\013Î>\012\011&a\ ! \024\\\010&E\036\027\033oNn_tV\017,ɏ{1Po+aBg\017<6ByՖz^&7\ ! \034\006t;#ub;<\017XuҢsz`\\M\011\020(8/>A҆ux,S\021D*\012\ ! I}&׌R\013}X\036R54>0>>TUO>r\037MT\015\031'*2cM{\ ! *@n)7;\035\016ĝ~\032qZ%\037E\034\0248\001[A\006nu5Z\027\"E\035&2\013`:a\"s\ ! *gVY3\017#~\002/\002\023oł2N\037mO4 fb\033cB-*\012q$2X{\ ! p\005Ȧ\036c\020\005\0225E\016ʹ\027Zv\0001J2Yj!\024=eLF]\ ! ̽ٻz޹ {6\027\03768ӉlOO\0315m\024=IX}/fF<\033ʩzh4i\ ! lr\\\007I%\025u@J-\024`g\0007J̘\027 \"\022H\021$rN\007\006\025[{\ ! \023~@\021/\025}\025\010FmҖ\032RIX<1>rmԴ\\a@\030xuro\ ! )ht+a)CE3\022#VmmP\033c u>.f&MZ\0034\023#\006s,!\0204\ ! 6{V\005p4mܟ\007\003rmq\023J0\000n\036/v%L\001\002VNW@ʜD-\00788\ ! \012\031@:\036{\015\036\002R'l\033¥E\017KN\006s\\3FW^#3gS\ ! \037\004X\016lT\035_\011cs\010c\023R+\0276\004ZwYQŘ\021RsL:)(5F(g3:\005\002|kYP=V\020'\037׶\007ΦM\026\034\ ! S\011Eu\025\006Ujb\011C[\037\030AJKf\004\012Ku%\017Uf4Ȁ\020,\012\005f\002\ ! 8z^\004U`O\014)B1+\000<1Mp[4cTW\024cbf\022YI7…V;*ӫX\ ! A\036\001#\013v\021E!`\013`DIGz+Jtֵʐ\030WmP\032\000\022l=E_r\015O\ ! \006\021mh8\027F}_\030a2\031\034Sz\003ɉ)OA{$R9е;\000Y\ ! <\023g;S\015Ưa|WB8*\012Oc\036%Jɢ\000|(\037\0309j5gR\ ! C\000\006K܇\007C\037F\004o[8C\033\035T_e<\014Y\030\014\036\007?\031\014.\ ! Ջ_uA*\0232vO'\025*\027r*t\037\025>=DXbxH׬t\001䒝\ ! \034U]sofi\014\015,f\027M\017\000\017z?S%$\032G\000LS\ ! \037u\"\"\005\017k[L̘zr_b+Xߞ\036\035{\033 YU00~\ ! ^\016\032YK3\030[\017Mr5|ԟ4#Nߤ9UxY\037jl]xSje\024(\ ! tE0dx2b\0372v\003d;]c\007zge\035MXcNQx\006G&\0146\ ! r\011tZ\025\\w_1mX#ME AqF#v3v2\034wx4(\012[\ ! @-\007<\017X\030?P/\"1\037on \027)ar.`\005\022hn+/\012\002s\035c\"@\ ! i;\007\001\007_ʼyM\031'\035]_o j\024Oо\021ABTLy26\ ! \022MT\004\007\034{nې(?\000\001J֑\021r\\4ue:\023Y)ܛ)D\004Q;\003\034\ ! Q<\022jW\031x[I\021ca\023aՋ\"0+j\025h\026\002jqoWX\000?9fEPA\ ! vj'AԈS]kv\002')buN9R$6\017\004aV\032&%UR\025BcNnRhS\ ! <ԇv*\004*\022\012*\013\005z7J-\037\011z'Jm+pF\"mJ)fH\ ! ē-MMsg\002\0213*O#\023VI]ǩ\022YWΊ\003KG\007':\"F\ ! }Yi\003>\035\037ixA\025h;\014Ϟ=F)@`4\\W\0027|I\016\006ez\ ! $`\035ي\034Vbe{M\036kPFV⑑\016d\034\032jE__tD\017T]i\011\017Z\ ! L\031RXM\036A\025<\\%*1e|]ge#I07y7LE+,I|6\024\ ! ӤΌ6叧u\027fTC/)? {i!\015\037\002kl\007<;\037M*,/45\033\ ! R\\{&Eߎˠ\0361L\035{\027<īrn\025\016\004CȒ;\032,SG&\ ! Lՙ&8MR\003\026\030wאs\010HK\\vim\003fB\026~\033T8\031folX3\ ! \015\017r:\030G㳽6^KcNđ\024Ȯͫv\003\021]Kvv\003e\023}\030\ ! IzA\014H\024ٽf(TTu*a\010\014\031\035\037P\034і-Y˾\035#VQb>P\ ! uyPg\034:w\007F##4|\035ΙN_l;j}}ؤ\037Kd\003P\035@瀐\036Sf4/.t)L+(e\003{B-Bt|J\031\000w_^h\ ! ;\"B\017eJE\016\003]?omW\007¨˷6'#:NBL?\005\034ռ+-\036\ ! i'lOh7-Y0}U\037g<},\016i}^\026[\016oWA8\034L\027$\031vX\ ! mla\012%y`46&O#\022Thw\013\037:gjV+9&$G.:pHS\014\ ! &ˠoBUgoVHWE\001Bhl\002S*.`.NW\002:iʖ3\032\037\022D_y\ ! '\016\014\030#Gφ\015 /S@uS#k1Mۿ\021>84sd\\$`\033U\ ! \011Ɯ;,l]\024[U^ln%n9\\S\010tjJՊ\001m'H};\013\ ! I\037)5''(\025\023\030#=t۽Zsr\016>\017T1Tߏ\007\020\017F:\ ! ݋fTtg6\"o9=wM}ڑ'\005Ժ\017rY\026X];\016TQ\023\ ! c?\010\0216Շ8iY/\023vB\013ukLp2)jsI~\013\025\ ! Eƚ5Bʁ|/\006+~-|}=\012\034\004\000\031O\032 !;\035xx6>=ҹ\023H}F\ ! _\010Z}@\032\014\034DYb9\013ODgj\024?_\"/&us\015Y\ ! ǕQ\012\034zٔҽ\022C#B\017|\015SxLg,QЍ$(\"ڨR\ ! //=SKp") ### end From anadelonbrin at users.sourceforge.net Thu Oct 2 01:50:46 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Thu Oct 2 01:50:48 2003 Subject: [Spambayes-checkins] spambayes/spambayes message.py,1.38,1.39 Message-ID: Update of /cvsroot/spambayes/spambayes/spambayes In directory sc8-pr-cvs1:/tmp/cvs-serv27689/spambayes Modified Files: message.py Log Message: Yikes. I introduced a bug that meant that training wasn't done on messages from the review page, even though an error wasn't produced. Fix that. Index: message.py =================================================================== RCS file: /cvsroot/spambayes/spambayes/spambayes/message.py,v retrieving revision 1.38 retrieving revision 1.39 diff -C2 -d -r1.38 -r1.39 *** message.py 19 Sep 2003 23:38:10 -0000 1.38 --- message.py 2 Oct 2003 05:50:43 -0000 1.39 *************** *** 106,110 **** from cStringIO import StringIO - CRLF_RE = re.compile(r'\r\n|\r|\n') --- 106,109 ---- *************** *** 200,203 **** --- 199,205 ---- def asTokens(self): return tokenize(self.as_string()) + + def tokenize(self): + return self.asTokens() def _force_CRLF(self, data): From anadelonbrin at users.sourceforge.net Thu Oct 2 02:01:15 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Thu Oct 2 02:01:18 2003 Subject: [Spambayes-checkins] spambayes/spambayes Corpus.py,1.8,1.9 Message-ID: Update of /cvsroot/spambayes/spambayes/spambayes In directory sc8-pr-cvs1:/tmp/cvs-serv29418/spambayes Modified Files: Corpus.py Log Message: This is how I missed that bug - if an AttributeError was raised during training, it was simply ignored. Switch to a safer option, and use hasattr() instead. Index: Corpus.py =================================================================== RCS file: /cvsroot/spambayes/spambayes/spambayes/Corpus.py,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** Corpus.py 19 Sep 2003 23:38:10 -0000 1.8 --- Corpus.py 2 Oct 2003 06:01:12 -0000 1.9 *************** *** 132,143 **** # even though right now the only observable events are # training related ! try: obs.onAddMessage(message) - except AttributeError: # ignore if not implemented - pass def removeMessage(self, message): '''Remove a Message from this corpus''' - key = message.key() if options["globals", "verbose"]: --- 132,140 ---- # even though right now the only observable events are # training related ! if hasattr(obs, "onAddMessage"): obs.onAddMessage(message) def removeMessage(self, message): '''Remove a Message from this corpus''' key = message.key() if options["globals", "verbose"]: *************** *** 148,160 **** for obs in self.observers: # see comments in event loop in addMessage ! try: obs.onRemoveMessage(message) - except AttributeError: - pass def cacheMessage(self, message): '''Add a message to the in-memory cache''' # This method should probably not be overridden - key = message.key() --- 145,154 ---- for obs in self.observers: # see comments in event loop in addMessage ! if hasattr(obs, "onRemoveMessage"): obs.onRemoveMessage(message) def cacheMessage(self, message): '''Add a message to the in-memory cache''' # This method should probably not be overridden key = message.key() *************** *** 190,194 **** def takeMessage(self, key, fromcorpus): '''Move a Message from another corpus to this corpus''' - msg = fromcorpus[key] msg.load() # ensure that the substance has been loaded --- 184,187 ---- From sjoerd at users.sourceforge.net Thu Oct 2 04:06:25 2003 From: sjoerd at users.sourceforge.net (Sjoerd Mullender) Date: Thu Oct 2 04:06:31 2003 Subject: [Spambayes-checkins] spambayes/scripts sb_imapfilter.py,1.8,1.9 Message-ID: Update of /cvsroot/spambayes/spambayes/scripts In directory sc8-pr-cvs1:/tmp/cvs-serv13772 Modified Files: sb_imapfilter.py Log Message: Fixed two problems: If a message has an unparseable date, this function would return None instead of the current time; time.mktime can cause OverflowError when given out-of-bounds time stamps which would cause the program to crash. In both cases we now just return the current time. Index: sb_imapfilter.py =================================================================== RCS file: /cvsroot/spambayes/spambayes/scripts/sb_imapfilter.py,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** sb_imapfilter.py 28 Sep 2003 23:55:26 -0000 1.8 --- sb_imapfilter.py 2 Oct 2003 08:06:22 -0000 1.9 *************** *** 329,335 **** parsed_date = parsedate(message_date) if parsed_date is not None: ! return Time2Internaldate(time.mktime(parsed_date)) ! else: ! return Time2Internaldate(time.time()) def get_substance(self): --- 329,337 ---- parsed_date = parsedate(message_date) if parsed_date is not None: ! try: ! return Time2Internaldate(time.mktime(parsed_date)) ! except OverflowError: ! pass ! return Time2Internaldate(time.time()) def get_substance(self): From sjoerd at users.sourceforge.net Thu Oct 2 04:08:22 2003 From: sjoerd at users.sourceforge.net (Sjoerd Mullender) Date: Thu Oct 2 04:08:29 2003 Subject: [Spambayes-checkins] spambayes/scripts sb_imapfilter.py,1.9,1.10 Message-ID: Update of /cvsroot/spambayes/spambayes/scripts In directory sc8-pr-cvs1:/tmp/cvs-serv13996 Modified Files: sb_imapfilter.py Log Message: Typo in comment. Index: sb_imapfilter.py =================================================================== RCS file: /cvsroot/spambayes/spambayes/scripts/sb_imapfilter.py,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** sb_imapfilter.py 2 Oct 2003 08:06:22 -0000 1.9 --- sb_imapfilter.py 2 Oct 2003 08:08:19 -0000 1.10 *************** *** 344,348 **** return imap.SelectFolder(self.folder.name) ! # We really want to use RFC822.PEEK here, as that doesn't effect # the status of the message. Unfortunately, it appears that not # all IMAP servers support this, even though it is in RFC1730 --- 344,348 ---- return imap.SelectFolder(self.folder.name) ! # We really want to use RFC822.PEEK here, as that doesn't affect # the status of the message. Unfortunately, it appears that not # all IMAP servers support this, even though it is in RFC1730 From skip at pobox.com Thu Oct 2 09:49:49 2003 From: skip at pobox.com (Skip Montanaro) Date: Thu Oct 2 10:31:33 2003 Subject: [Spambayes-checkins] spambayes/spambayes UserInterface.py, 1.28, 1.29 In-Reply-To: References: Message-ID: <16252.11517.731290.513569@montanaro.dyndns.org> Tony> Modified Files: Tony> UserInterface.py Tony> Log Message: Tony> If the user needs to send a message to spambayes@python.org asking Tony> for help, then help them do this so that they will include at Tony> least some of the information that is needed to helpt hem fix the Tony> problem. Damn, Tony! You're quick! Thanks for that enhancement. Skip From tim_one at users.sourceforge.net Thu Oct 2 13:47:41 2003 From: tim_one at users.sourceforge.net (Tim Peters) Date: Thu Oct 2 13:47:46 2003 Subject: [Spambayes-checkins] spambayes/Outlook2000 filter.py,1.34,1.35 Message-ID: Update of /cvsroot/spambayes/spambayes/Outlook2000 In directory sc8-pr-cvs1:/tmp/cvs-serv19162/Outlook2000 Modified Files: filter.py Log Message: filter_message(): spam and unsures were double-counted in the stats. Index: filter.py =================================================================== RCS file: /cvsroot/spambayes/spambayes/Outlook2000/filter.py,v retrieving revision 1.34 retrieving revision 1.35 diff -C2 -d -r1.34 -r1.35 *** filter.py 29 Sep 2003 02:14:25 -0000 1.34 --- filter.py 2 Oct 2003 17:47:39 -0000 1.35 *************** *** 13,25 **** config = mgr.config.filter prob = mgr.score(msg) prob_perc = prob * 100 if prob_perc >= config.spam_threshold: disposition = "Yes" attr_prefix = "spam" - mgr.stats.num_spam += 1 elif prob_perc >= config.unsure_threshold: disposition = "Unsure" attr_prefix = "unsure" - mgr.stats.num_unsure += 1 else: disposition = "No" --- 13,24 ---- config = mgr.config.filter prob = mgr.score(msg) + mgr.stats.RecordClassification(prob) prob_perc = prob * 100 if prob_perc >= config.spam_threshold: disposition = "Yes" attr_prefix = "spam" elif prob_perc >= config.unsure_threshold: disposition = "Unsure" attr_prefix = "unsure" else: disposition = "No" *************** *** 80,84 **** raise RuntimeError, "Eeek - bad action '%r'" % (action,) - mgr.stats.RecordClassification(prob) return disposition except: --- 79,82 ---- From mhammond at users.sourceforge.net Thu Oct 2 20:06:59 2003 From: mhammond at users.sourceforge.net (Mark Hammond) Date: Thu Oct 2 20:07:01 2003 Subject: [Spambayes-checkins] spambayes/windows/py2exe README.txt,1.1,1.2 Message-ID: Update of /cvsroot/spambayes/spambayes/windows/py2exe In directory sc8-pr-cvs1:/tmp/cvs-serv32278 Modified Files: README.txt Log Message: Typo and remove old notes. Index: README.txt =================================================================== RCS file: /cvsroot/spambayes/spambayes/windows/py2exe/README.txt,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** README.txt 29 Aug 2003 14:46:18 -0000 1.1 --- README.txt 3 Oct 2003 00:06:56 -0000 1.2 *************** *** 6,10 **** Run "setup_all.py" ! You should find a dist directly. pop3proxy*.exe should all work. ! addin.exe/addin.dll are the Outlook addin and do not work ! (and will be renamed) \ No newline at end of file --- 6,8 ---- Run "setup_all.py" ! You should find a dist directory. \ No newline at end of file From anadelonbrin at users.sourceforge.net Thu Oct 2 22:34:39 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Thu Oct 2 22:34:43 2003 Subject: [Spambayes-checkins] spambayes/spambayes UserInterface.py, 1.30, 1.31 Message-ID: Update of /cvsroot/spambayes/spambayes/spambayes In directory sc8-pr-cvs1:/tmp/cvs-serv27232/spambayes Modified Files: UserInterface.py Log Message: Wrap the help message at 70 characters, and handle problems attaching a file. Index: UserInterface.py =================================================================== RCS file: /cvsroot/spambayes/spambayes/spambayes/UserInterface.py,v retrieving revision 1.30 retrieving revision 1.31 diff -C2 -d -r1.30 -r1.31 *** UserInterface.py 2 Oct 2003 05:33:23 -0000 1.30 --- UserInterface.py 3 Oct 2003 02:34:37 -0000 1.31 *************** *** 1036,1075 **** outer['CC'] = cc_addr outer['From'] = from_addr ! outer.preamble = message # To guarantee the message ends with a newline outer.epilogue = '' # Guess the content type based on the file's extension. ! ctype, encoding = mimetypes.guess_type(attach) ! if ctype is None or encoding is not None: ! # No guess could be made, or the file is encoded (compressed), ! # so use a generic bag-of-bits type. ! ctype = 'application/octet-stream' ! maintype, subtype = ctype.split('/', 1) ! if maintype == 'text': ! fp = open(attach) ! # Note: we should handle calculating the charset ! msg = MIMEText(fp.read(), _subtype=subtype) ! fp.close() ! elif maintype == 'image': ! fp = open(attach, 'rb') ! msg = MIMEImage(fp.read(), _subtype=subtype) ! fp.close() ! elif maintype == 'audio': ! fp = open(attach, 'rb') ! msg = MIMEAudio(fp.read(), _subtype=subtype) ! fp.close() else: ! fp = open(attach, 'rb') ! msg = MIMEBase(maintype, subtype) ! msg.set_payload(fp.read()) ! fp.close() ! # Encode the payload using Base64 ! Encoders.encode_base64(msg) ! # Set the filename parameter ! msg.add_header('Content-Disposition', 'attachment', ! filename=os.path.basename(attach)) ! outer.attach(msg) ! msg = MIMEText(message) outer.attach(msg) --- 1036,1080 ---- outer['CC'] = cc_addr outer['From'] = from_addr ! outer.preamble = self._wrap(message) # To guarantee the message ends with a newline outer.epilogue = '' # Guess the content type based on the file's extension. ! try: ! ctype, encoding = mimetypes.guess_type(attach) ! if ctype is None or encoding is not None: ! # No guess could be made, or the file is encoded (compressed), ! # so use a generic bag-of-bits type. ! ctype = 'application/octet-stream' ! maintype, subtype = ctype.split('/', 1) ! if maintype == 'text': ! fp = open(attach) ! # Note: we should handle calculating the charset ! msg = MIMEText(fp.read(), _subtype=subtype) ! fp.close() ! elif maintype == 'image': ! fp = open(attach, 'rb') ! msg = MIMEImage(fp.read(), _subtype=subtype) ! fp.close() ! elif maintype == 'audio': ! fp = open(attach, 'rb') ! msg = MIMEAudio(fp.read(), _subtype=subtype) ! fp.close() ! else: ! fp = open(attach, 'rb') ! msg = MIMEBase(maintype, subtype) ! msg.set_payload(fp.read()) ! fp.close() ! # Encode the payload using Base64 ! Encoders.encode_base64(msg) ! except IOError: ! # Couldn't access the file, so don't attach it. ! pass else: ! # Set the filename parameter ! msg.add_header('Content-Disposition', 'attachment', ! filename=os.path.basename(attach)) ! outer.attach(msg) ! msg = MIMEText(self._wrap(message)) outer.attach(msg) *************** *** 1092,1093 **** --- 1097,1142 ---- return False return True + + def _wrap(self, text, width=70): + """Wrap the text into lines no bigger than the specified width.""" + try: + from textwrap import wrap + except ImportError: + pass + else: + return '\n'.join(wrap(text, width)) + # No textwrap module, so do the same stuff (more-or-less) ourselves. + wordsep_re = re.compile(r'(\s+|' # any whitespace + r'-*\w{2,}-(?=\w{2,})|' # hyphenated words + r'(?<=\S)-{2,}(?=\w))') # em-dash + if len(text) <= width: + return [text] + chunks = wordsep_re.split(text) + chunks = filter(None, chunks) + return self._wrap_chunks(chunks, width) + + def _wrap_chunks(self, chunks, width): + """Stolen from textwrap; see that module in Python > 2.3 for + details.""" + lines = [] + while chunks: + cur_line = [] + cur_len = 0 + if chunks[0].strip() == '' and lines: + del chunks[0] + while chunks: + l = len(chunks[0]) + if cur_len + l <= width: + cur_line.append(chunks.pop(0)) + cur_len += l + else: + break + if chunks and len(chunks[0]) > width: + space_left = width - cur_len + cur_line.append(chunks[0][0:space_left]) + chunks[0] = chunks[0][space_left:] + if cur_line and cur_line[-1].strip() == '': + del cur_line[-1] + if cur_line: + lines.append(indent + ''.join(cur_line)) + return lines From anadelonbrin at users.sourceforge.net Thu Oct 2 22:37:12 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Thu Oct 2 22:37:15 2003 Subject: [Spambayes-checkins] spambayes/spambayes UserInterface.py, 1.31, 1.32 Message-ID: Update of /cvsroot/spambayes/spambayes/spambayes In directory sc8-pr-cvs1:/tmp/cvs-serv27562/spambayes Modified Files: UserInterface.py Log Message: Opps - forgot to test pre Python 2.3. Two wee bugs that would arise in that case. Index: UserInterface.py =================================================================== RCS file: /cvsroot/spambayes/spambayes/spambayes/UserInterface.py,v retrieving revision 1.31 retrieving revision 1.32 diff -C2 -d -r1.31 -r1.32 *** UserInterface.py 3 Oct 2003 02:34:37 -0000 1.31 --- UserInterface.py 3 Oct 2003 02:37:10 -0000 1.32 *************** *** 1114,1118 **** chunks = wordsep_re.split(text) chunks = filter(None, chunks) ! return self._wrap_chunks(chunks, width) def _wrap_chunks(self, chunks, width): --- 1114,1118 ---- chunks = wordsep_re.split(text) chunks = filter(None, chunks) ! return '\n'.join(self._wrap_chunks(chunks, width)) def _wrap_chunks(self, chunks, width): *************** *** 1139,1142 **** del cur_line[-1] if cur_line: ! lines.append(indent + ''.join(cur_line)) return lines --- 1139,1142 ---- del cur_line[-1] if cur_line: ! lines.append(''.join(cur_line)) return lines From anadelonbrin at users.sourceforge.net Thu Oct 2 22:58:38 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Thu Oct 2 22:58:42 2003 Subject: [Spambayes-checkins] spambayes/scripts sb_imapfilter.py, 1.7.2.1, 1.7.2.2 Message-ID: Update of /cvsroot/spambayes/spambayes/scripts In directory sc8-pr-cvs1:/tmp/cvs-serv31161/scripts Modified Files: Tag: release_1_0 sb_imapfilter.py Log Message: Copy Sjoerd's fix into the 1.0 branch. Hopefully fix [ spambayes-Bugs-816400 ] Crash because of bad date. If appending fails, we now try without the flags, without the date, and without both (which means that information is lost). In theory, we're only copying this information, so it should be all ok, but in practice imap is a PITA. Index: sb_imapfilter.py =================================================================== RCS file: /cvsroot/spambayes/spambayes/scripts/sb_imapfilter.py,v retrieving revision 1.7.2.1 retrieving revision 1.7.2.2 diff -C2 -d -r1.7.2.1 -r1.7.2.2 *** sb_imapfilter.py 28 Sep 2003 23:57:12 -0000 1.7.2.1 --- sb_imapfilter.py 3 Oct 2003 02:58:36 -0000 1.7.2.2 *************** *** 329,333 **** parsed_date = parsedate(message_date) if parsed_date is not None: ! return Time2Internaldate(time.mktime(parsed_date)) else: return Time2Internaldate(time.time()) --- 329,336 ---- parsed_date = parsedate(message_date) if parsed_date is not None: ! try: ! return Time2Internaldate(time.mktime(parsed_date)) ! except OverflowError: ! pass else: return Time2Internaldate(time.time()) *************** *** 406,419 **** flags = None ! response = imap.append(self.folder.name, flags, ! msg_time, self.as_string()) ! if response[0] == "NO": ! # This may be because we have tried to set an invalid flag. ! # Try again, losing all the flag information, but warn the ! # user that this has happened. ! response = imap.append(self.folder.name, None, msg_time, self.as_string()) if response[0] == "OK": ! print "WARNING: Could not append flags: %s" % (flags,) self._check(response, 'append') --- 409,420 ---- flags = None ! for flgs, tme in [(flags, msg_time), ! (None, msg_time), ! (flags, Time2Internaldate(time.time())), ! (None, Time2Internaldate(time.time()))]: ! response = imap.append(self.folder.name, flgs, tme, self.as_string()) if response[0] == "OK": ! break self._check(response, 'append') From anadelonbrin at users.sourceforge.net Thu Oct 2 22:59:42 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Thu Oct 2 22:59:45 2003 Subject: [Spambayes-checkins] spambayes/scripts sb_imapfilter.py,1.10,1.11 Message-ID: Update of /cvsroot/spambayes/spambayes/scripts In directory sc8-pr-cvs1:/tmp/cvs-serv31325/scripts Modified Files: sb_imapfilter.py Log Message: Hopefully fix [ spambayes-Bugs-816400 ] Crash because of bad date. If appending fails, we now try without the flags, without the date, and without both (which means that information is lost). In theory, we're only copying this information, so it should be all ok, but in practice imap is a PITA. Index: sb_imapfilter.py =================================================================== RCS file: /cvsroot/spambayes/spambayes/scripts/sb_imapfilter.py,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** sb_imapfilter.py 2 Oct 2003 08:08:19 -0000 1.10 --- sb_imapfilter.py 3 Oct 2003 02:59:40 -0000 1.11 *************** *** 408,421 **** flags = None ! response = imap.append(self.folder.name, flags, ! msg_time, self.as_string()) ! if response[0] == "NO": ! # This may be because we have tried to set an invalid flag. ! # Try again, losing all the flag information, but warn the ! # user that this has happened. ! response = imap.append(self.folder.name, None, msg_time, self.as_string()) if response[0] == "OK": ! print "WARNING: Could not append flags: %s" % (flags,) self._check(response, 'append') --- 408,419 ---- flags = None ! for flgs, tme in [(flags, msg_time), ! (None, msg_time), ! (flags, Time2Internaldate(time.time())), ! (None, Time2Internaldate(time.time()))]: ! response = imap.append(self.folder.name, flgs, tme, self.as_string()) if response[0] == "OK": ! break self._check(response, 'append') From anadelonbrin at users.sourceforge.net Fri Oct 3 01:17:13 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Fri Oct 3 01:17:17 2003 Subject: [Spambayes-checkins] spambayes/scripts sb_smtpproxy.py, 1.3.2.2, 1.3.2.3 Message-ID: Update of /cvsroot/spambayes/spambayes/scripts In directory sc8-pr-cvs1:/tmp/cvs-serv19704/scripts Modified Files: Tag: release_1_0 sb_smtpproxy.py Log Message: Fix [ 810342 ] sb_smtpproxy does not work with smtplib.SMTP.sendmail() (We were sending the wrong response to a DATA command). Index: sb_smtpproxy.py =================================================================== RCS file: /cvsroot/spambayes/spambayes/scripts/Attic/sb_smtpproxy.py,v retrieving revision 1.3.2.2 retrieving revision 1.3.2.3 diff -C2 -d -r1.3.2.2 -r1.3.2.3 *** sb_smtpproxy.py 29 Sep 2003 05:09:23 -0000 1.3.2.2 --- sb_smtpproxy.py 3 Oct 2003 05:17:11 -0000 1.3.2.3 *************** *** 346,355 **** self.inData = True if self.train_as_ham == True or self.train_as_spam == True: ! self.push("250 OK\r\n") return None ! rv = command ! for arg in args: ! rv += ' ' + arg ! return rv def onMailFrom(self, command, args): --- 346,352 ---- self.inData = True if self.train_as_ham == True or self.train_as_spam == True: ! self.push("354 Enter data ending with a . on a line by itself\r\n") return None ! return command + ' ' + ' '.join(args) def onMailFrom(self, command, args): From anadelonbrin at users.sourceforge.net Fri Oct 3 01:17:45 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Fri Oct 3 01:17:50 2003 Subject: [Spambayes-checkins] spambayes/spambayes smtpproxy.py,1.3,1.4 Message-ID: Update of /cvsroot/spambayes/spambayes/spambayes In directory sc8-pr-cvs1:/tmp/cvs-serv19746/spambayes Modified Files: smtpproxy.py Log Message: Fix [ 810342 ] sb_smtpproxy does not work with smtplib.SMTP.sendmail() (We were sending the wrong response to a DATA command). Index: smtpproxy.py =================================================================== RCS file: /cvsroot/spambayes/spambayes/spambayes/smtpproxy.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** smtpproxy.py 29 Sep 2003 05:09:00 -0000 1.3 --- smtpproxy.py 3 Oct 2003 05:17:43 -0000 1.4 *************** *** 338,347 **** self.inData = True if self.train_as_ham == True or self.train_as_spam == True: ! self.push("250 OK\r\n") return None ! rv = command ! for arg in args: ! rv += ' ' + arg ! return rv def onMailFrom(self, command, args): --- 338,344 ---- self.inData = True if self.train_as_ham == True or self.train_as_spam == True: ! self.push("354 Enter data ending with a . on a line by itself\r\n") return None ! return command + ' ' + ' '.join(args) def onMailFrom(self, command, args): From anadelonbrin at users.sourceforge.net Fri Oct 3 01:23:04 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Fri Oct 3 01:23:07 2003 Subject: [Spambayes-checkins] spambayes/Outlook2000 README.txt, 1.11, 1.11.2.1 Message-ID: Update of /cvsroot/spambayes/spambayes/Outlook2000 In directory sc8-pr-cvs1:/tmp/cvs-serv20489/Outlook2000 Modified Files: Tag: release_1_0 README.txt Log Message: Fix [ 812020 ] Outlook plugin doesn't get 'installed' Presumably if Mark thought that the plug-in code should be installed, then this would already be the case. So do the user's second recommendation, and update the readme's to point out to the user that they need to keep the Outlook2000 directory around. Index: README.txt =================================================================== RCS file: /cvsroot/spambayes/spambayes/Outlook2000/README.txt,v retrieving revision 1.11 retrieving revision 1.11.2.1 diff -C2 -d -r1.11 -r1.11.2.1 *** README.txt 27 Aug 2003 09:06:16 -0000 1.11 --- README.txt 3 Oct 2003 05:23:02 -0000 1.11.2.1 *************** *** 4,7 **** --- 4,13 ---- you *must* have win32all-149 or later. + Note that running "setup.py install" will *not* install the contents of this + directory into the Python site-packages directory. You will need to either + copy this directory there yourself, or run it from some other appropriate + location. The plug-in will probably not be happy if you change the location + of the source files after it is installed (do an uninstall, then a reinstall). + See below for a list of known problems. *************** *** 81,85 **** Please send all comments, queries, support questions etc to the SpamBayes ! mailing list - see http://mail.python.org/mailman-21/listinfo/spambayes -- Sean --- 87,91 ---- Please send all comments, queries, support questions etc to the SpamBayes ! mailing list - see http://mail.python.org/mailman/listinfo/spambayes -- Sean From anadelonbrin at users.sourceforge.net Fri Oct 3 01:23:04 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Fri Oct 3 01:23:08 2003 Subject: [Spambayes-checkins] spambayes README.txt,1.53.2.2,1.53.2.3 Message-ID: Update of /cvsroot/spambayes/spambayes In directory sc8-pr-cvs1:/tmp/cvs-serv20489 Modified Files: Tag: release_1_0 README.txt Log Message: Fix [ 812020 ] Outlook plugin doesn't get 'installed' Presumably if Mark thought that the plug-in code should be installed, then this would already be the case. So do the user's second recommendation, and update the readme's to point out to the user that they need to keep the Outlook2000 directory around. Index: README.txt =================================================================== RCS file: /cvsroot/spambayes/spambayes/README.txt,v retrieving revision 1.53.2.2 retrieving revision 1.53.2.3 diff -C2 -d -r1.53.2.2 -r1.53.2.3 *** README.txt 26 Sep 2003 03:51:57 -0000 1.53.2.2 --- README.txt 3 Oct 2003 05:23:02 -0000 1.53.2.3 *************** *** 99,104 **** For information about how to use the Outlook plug-in, please read the ! "about.html" file in the Outlook2000 directory. ! POP3 Proxy --- 99,105 ---- For information about how to use the Outlook plug-in, please read the ! "about.html" file in the Outlook2000 directory. If you want to run the ! Outlook plug-in from source, you should also read the "README.txt" file ! in that directory. POP3 Proxy From anadelonbrin at users.sourceforge.net Fri Oct 3 01:23:17 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Fri Oct 3 01:23:19 2003 Subject: [Spambayes-checkins] spambayes/Outlook2000 README.txt,1.11,1.12 Message-ID: Update of /cvsroot/spambayes/spambayes/Outlook2000 In directory sc8-pr-cvs1:/tmp/cvs-serv20570/Outlook2000 Modified Files: README.txt Log Message: Fix [ 812020 ] Outlook plugin doesn't get 'installed' Presumably if Mark thought that the plug-in code should be installed, then this would already be the case. So do the user's second recommendation, and update the readme's to point out to the user that they need to keep the Outlook2000 directory around. Index: README.txt =================================================================== RCS file: /cvsroot/spambayes/spambayes/Outlook2000/README.txt,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** README.txt 27 Aug 2003 09:06:16 -0000 1.11 --- README.txt 3 Oct 2003 05:23:15 -0000 1.12 *************** *** 4,7 **** --- 4,13 ---- you *must* have win32all-149 or later. + Note that running "setup.py install" will *not* install the contents of this + directory into the Python site-packages directory. You will need to either + copy this directory there yourself, or run it from some other appropriate + location. The plug-in will probably not be happy if you change the location + of the source files after it is installed (do an uninstall, then a reinstall). + See below for a list of known problems. *************** *** 81,85 **** Please send all comments, queries, support questions etc to the SpamBayes ! mailing list - see http://mail.python.org/mailman-21/listinfo/spambayes -- Sean --- 87,91 ---- Please send all comments, queries, support questions etc to the SpamBayes ! mailing list - see http://mail.python.org/mailman/listinfo/spambayes -- Sean From anadelonbrin at users.sourceforge.net Fri Oct 3 01:23:17 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Fri Oct 3 01:23:20 2003 Subject: [Spambayes-checkins] spambayes README.txt,1.56,1.57 Message-ID: Update of /cvsroot/spambayes/spambayes In directory sc8-pr-cvs1:/tmp/cvs-serv20570 Modified Files: README.txt Log Message: Fix [ 812020 ] Outlook plugin doesn't get 'installed' Presumably if Mark thought that the plug-in code should be installed, then this would already be the case. So do the user's second recommendation, and update the readme's to point out to the user that they need to keep the Outlook2000 directory around. Index: README.txt =================================================================== RCS file: /cvsroot/spambayes/spambayes/README.txt,v retrieving revision 1.56 retrieving revision 1.57 diff -C2 -d -r1.56 -r1.57 *** README.txt 26 Sep 2003 03:54:38 -0000 1.56 --- README.txt 3 Oct 2003 05:23:15 -0000 1.57 *************** *** 99,103 **** For information about how to use the Outlook plug-in, please read the ! "about.html" file in the Outlook2000 directory. --- 99,105 ---- For information about how to use the Outlook plug-in, please read the ! "about.html" file in the Outlook2000 directory. If you want to run the ! Outlook plug-in from source, you should also read the "README.txt" file ! in that directory. From anadelonbrin at users.sourceforge.net Fri Oct 3 02:02:50 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Fri Oct 3 02:02:55 2003 Subject: [Spambayes-checkins] spambayes/scripts sb_imapfilter.py,1.11,1.12 Message-ID: Update of /cvsroot/spambayes/spambayes/scripts In directory sc8-pr-cvs1:/tmp/cvs-serv27442/scripts Modified Files: sb_imapfilter.py Log Message: Some browsers don't return after webbrowser.open, so just hang if we try to launch the UI. For those people, if imapfilter is run without the -c -t or -b switches, then just serve the interface (they can manually open the browser to the right place). Index: sb_imapfilter.py =================================================================== RCS file: /cvsroot/spambayes/spambayes/scripts/sb_imapfilter.py,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** sb_imapfilter.py 3 Oct 2003 02:59:40 -0000 1.11 --- sb_imapfilter.py 3 Oct 2003 06:02:47 -0000 1.12 *************** *** 738,751 **** print "and engine %s.\n" % (get_version_string(),) - if not (doClassify or doTrain or launchUI): - print "-b, -c, or -t operands must be specified." - print "Please use the -h operand for help." - sys.exit() - if (launchUI and (doClassify or doTrain)): ! print """ ! -b option is exclusive with -c and -t options. The user interface will be launched, but no classification ! or training will be performed.""" bdbname = os.path.expanduser(bdbname) --- 738,746 ---- print "and engine %s.\n" % (get_version_string(),) if (launchUI and (doClassify or doTrain)): ! print """-b option is exclusive with -c and -t options. The user interface will be launched, but no classification ! or training will be performed. ! """ bdbname = os.path.expanduser(bdbname) *************** *** 794,798 **** # Web interface ! if launchUI: if server != "": imap = IMAPSession(server, port, imapDebug, doExpunge) --- 789,793 ---- # Web interface ! if not (doClassify or doTrain) or launchUI: if server != "": imap = IMAPSession(server, port, imapDebug, doExpunge) From sjoerd at acm.org Fri Oct 3 04:30:03 2003 From: sjoerd at acm.org (Sjoerd Mullender) Date: Fri Oct 3 04:30:12 2003 Subject: [Spambayes-checkins] spambayes/scripts sb_imapfilter.py, 1.7.2.1, 1.7.2.2 In-Reply-To: References: Message-ID: <3F7D338B.5060707@acm.org> Tony Meyer wrote: > Update of /cvsroot/spambayes/spambayes/scripts > In directory sc8-pr-cvs1:/tmp/cvs-serv31161/scripts > > Modified Files: > Tag: release_1_0 > sb_imapfilter.py > Log Message: > Copy Sjoerd's fix into the 1.0 branch. > > Hopefully fix [ spambayes-Bugs-816400 ] Crash because of bad date. If appending fails, we now try without the flags, without the date, and without both (which means that information is lost). > > In theory, we're only copying this information, so it should be all ok, but in > practice imap is a PITA. > > Index: sb_imapfilter.py > =================================================================== > RCS file: /cvsroot/spambayes/spambayes/scripts/sb_imapfilter.py,v > retrieving revision 1.7.2.1 > retrieving revision 1.7.2.2 > diff -C2 -d -r1.7.2.1 -r1.7.2.2 > *** sb_imapfilter.py 28 Sep 2003 23:57:12 -0000 1.7.2.1 > --- sb_imapfilter.py 3 Oct 2003 02:58:36 -0000 1.7.2.2 > *************** > *** 329,333 **** > parsed_date = parsedate(message_date) > if parsed_date is not None: > ! return Time2Internaldate(time.mktime(parsed_date)) > else: > return Time2Internaldate(time.time()) > --- 329,336 ---- > parsed_date = parsedate(message_date) > if parsed_date is not None: > ! try: > ! return Time2Internaldate(time.mktime(parsed_date)) > ! except OverflowError: > ! pass > else: > return Time2Internaldate(time.time()) > *************** This was not the complete fix. You also need to remove the else at the end of the function and dedent the final return. -- Sjoerd Mullender From ta-meyer at ihug.co.nz Thu Oct 2 22:14:40 2003 From: ta-meyer at ihug.co.nz (Tony Meyer) Date: Fri Oct 3 11:00:59 2003 Subject: [Spambayes-checkins] spambayes/spambayes UserInterface.py, 1.28, 1.29 In-Reply-To: <1ED4ECF91CDED24C8D012BCF2B034F130374555F@its-xchg4.massey.ac.nz> Message-ID: <1ED4ECF91CDED24C8D012BCF2B034F130212AFC2@its-xchg4.massey.ac.nz> > Damn, Tony! You're quick! Thanks for that enhancement. I was encouraged by the thought of fewer "It doesn't work, I'm not going to tell you anything else" messages . =Tony Meyer From richiehindle at users.sourceforge.net Fri Oct 3 14:52:10 2003 From: richiehindle at users.sourceforge.net (Richie Hindle) Date: Fri Oct 3 14:52:19 2003 Subject: [Spambayes-checkins] spambayes/spambayes/resources ui_psp.py, 1.3, 1.4 ui_html.py, 1.26, 1.27 ui.psp, 1.1, 1.2 ui.html, 1.26, 1.27 help_gif.py, 1.1, 1.2 help.gif, 1.1, 1.2 Message-ID: Update of /cvsroot/spambayes/spambayes/spambayes/resources In directory sc8-pr-cvs1:/tmp/cvs-serv15643 Modified Files: ui_psp.py ui_html.py ui.psp ui.html help_gif.py help.gif Log Message: New Help icon, in the style of the other icons. Index: ui_psp.py =================================================================== RCS file: /cvsroot/spambayes/spambayes/spambayes/resources/ui_psp.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** ui_psp.py 13 Jul 2003 16:12:28 -0000 1.3 --- ui_psp.py 3 Oct 2003 18:52:08 -0000 1.4 *************** *** 4,151 **** source = 'ui.psp' package = 'spambayes.resources' ! data = "Paint Shop Pro Image File\012\032\000\000\000\000\000\005\000\000\000~BK\000\000\000.\000\000\000.\000\000\000\001\000\000F\000\000\000j\ ! tX<@\002\002\000\030\000\001\000\000\000\000\001\000@\002\000\000\000\000\000\002\000\003\000\000\005~BK\000\012\000\030\000\000\000~FL\000\001\000\016\000\000\000\000\012\000\000\000\ ! \012\000\000\000\000\000~BK\000\001\0008\000\000\000~FL\000\001\000\004\000\000\000'>~FL\000\002\000\004\000\000\000u'>~FL\000\006\000\004\000\000\000\001\000\000\000~F\ ! L\000\007\000\004\000\000\000\004\004\000\007~BK\000\020\000\032\000\000\010\000\000\000\002\000\000\000~BK\000\021\000\030\000\000\000\030\000\000\000\000\000\000#\000\000\000\030\000\003\000\001\000\000\000\ ! \000\001\001\000~BK\000\021\000\030\000\000\000\030\000\000\000\001\000\000F\000\000\000\030\000\003\000\001\000\000\000\000\001\000\000~BK\000\022\000\012\000\000\016\000\000\000\012\000\0000R\000\000\ \005\000\000\020JFIF\000\001\001\000\001,\001,\000\000\000C\000\002\001\001\001\001\001\002\001\001\001\002\002\002\002\002\004\003\002\002\002\002\005\004\004\003\004\006\005\006\006\006\005\006\ \006\006\007\011\010\006\007\011\007\006\006\010\013\010\011\012\012\012\012\012\006\010\013\014\013\012\014\011\012\012\012\000C\001\002\002\002\002\002\002\005\003\003\005\012\007\006\007\012\012\012\012\012\012\012\012\012\012\ ! \012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\000\021\010\000#\000\003\001\"\000\002\021\001\003\021\001\ ! \000\034\000\001\000\002\002\003\001\000\000\000\000\000\000\000\000\000\000\000\007\010\005\006\002\004\011\003\0003\020\000\001\003\003\003\003\003\002\005\002\007\000\000\000\000\000\001\002\003\004\000\005\006\007\021\022\ ! \010\023!\024\"1\025A\026#23B\011\027QRWr\000\032\001\001\000\003\001\001\001\000\000\000\000\000\000\000\000\000\000\000\002\004\005\001\006\003\000*\021\000\002\001\004\002\ ! \001\003\003\004\003\000\000\000\000\000\000\001\002\021\000\003\004!\005\0221\006AQ\"Ba\0232q\024\025b\000\014\003\001\000\002\021\003\021\000?\000::í>\ ! .3|7Sb\030jf\014D\0024e-$|8\012\025z_Kzc3ռ\\E\020=C\ ! \012\024\024ם/}-HlV*'!b>\013\000\012nׯv\011Ymv+\ ! Fm<\035d\017'{e3z\000t3/s\0322YrJmi{\000\002?Ki\ ! \\ڏ08^+\030|m\000\026\007=\007\0113Rw/+%ؔOm\036\ ! \032)Us\034uZғdzEs\006!Zݦs&kW7\032#y\034F{\013\036@qjipS\031\ ! \006'ı\020\"NBb`U[N'\027dLy4L\003P4eP$գyE\036CO3\0218LH\ ! Syi+yt\\\012[\036RK)}\034Kgr?\032/Ml2uj\004\030C#\034+\ ! V\000r?z\017[ٽ\012dmC8`'!68Rqk\004w*\ ! I\000~3v\010BJ`>I?aQ\0364s1\031]䩋m\031%a=Q\ ! !\034\037~\036޲\033\034,;\033s\010nƑV\012\025\035TDt(ˠGMVKY:\ ! \010^\027K\030amu#.)q.\004INz|\017\027\030\027/`1\003MqT|\035\ ! Y96-Q\027\011\000wT?\001m#A})QV79fkzܟ\026\007ό\034^TEn\003\ ! (XXx͙o\035L\027`&+o/!q1n_\"B)h\004C I\027٬r\034=P^ʊ%$\ ! x\000I\004)KI\004\020\010ڷ]<Ԭ'Uq\000%3c!ǐ^6̺énۉJq\ ! U[\025,S.\015q.0\0230l#]\037ݭ\034HK$\007@_\036|yıuxR\ ! \035:+*m\001OD\015{\003\023\025\0066\000Y/\025F8qn8,W[b\0101HBCq\ ! p~K\0272kjBh\016VZV:NN8PGMڤ􋣱N\ ! wI\022'\036R\020D\006\001Bp)\007>F\037\0040pp\027+\031Ab\031T\000@2A[y\033!-\ ! \0001$\023J\000 \021緟Jlk\036Iy\021j6(%|T\023\000\0055UC[A=RE۬Wo\032a\ ! S\036\003xCqmv/\005)Cw\0076\016ݍ\034\033b=Ż\007\004~P?p\033ЪW\ ! !z\012\027B\017V,\003\021Ӫ\033Rӹ66܇:J6r(DF\001R%\\I.\020x/,\ ! gJ%@7\004\037}TjIzoym\031A\013HגtI\000\035JRj)JWVc_=?֬fz9H\023GK\ ! ѿ\027Q\036+\033<ƻT2S\006ʬ \024)\\ҸH\036[\013):Ӊ)q\022\024\003\010?\"Ҁ\ ! i汶\0143\017\024|Rm/~\005{\006\000Y*R\033?\"[^ ~)Qۧv.\035W\ ! .GAN\ ! &>bՃ\017\"\031L\037\007TPPݷ\\b6y\015)y\001Hq\012\033)*\007\004\022\010?5V\004\"\020\010\ ! US\004\027<1W[\026˧\0237BՒc\\jy%ML\011\011C\002y\024\004ǥC\013M\ ! _Y\034#-2+@zHl(4\020RXl)|\032@\000sZ%kVJ\017/J,몃\ ! \000\023-\031&[2wY8\017\025\026mØ\016\001$\010_@\020H֩QV\007\031\0372>olPm\ ! \\;^(T┬'\025*Ҩcdd@\004t\016\020\016\"\003\037\037;\030X7\003\022@#\032\ ! 0H\023=G̿@r̟N镻'Ĭۋ;)6l\035\011R\035md&CiO\"\017vڥ:R\0319H\ ! \022\011>\000@'@L\036~)$\001\011 l)JUJJlzkw\025>\037z\ ! JGy\034\026T\007\000;ȝYTܹi\014\030#_\004A\037$\032K\034Hd\037\024)PҔ)JR\ ! )JR)JR)JR)JR)JR)JR)JR)JR)JR~BK\000\022\000\017\000\000\016\ ! \000\000\000\017\000\000HH\001\000\010\000\000\020JFIF\000\001\001\000\001,\001,\000\000\000C\000\005\003\004\004\004\003\005\004\004\004\005\005\005\006\007\014\010\007\007\007\007\017\ ! \013\013\011\014\021\017\022\022\021\017\021\021\023\026\034\027\023\024\032\025\021\021\030!\030\032\035\035\037\037\037\023\027\"$\"\036$\034\036\037\036\000C\001\005\005\005\007\006\007\016\010\010\016\036\024\021\ ! \024\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\000\021\010\000F\001\ ! \003\001\"\000\002\021\001\003\021\001\000\034\000\001\000\003\000\003\001\001\000\000\000\000\000\000\000\000\000\000\005\006\007\001\003\010\002\004\000F\020\000\001\004\002\001\002\003\005\003\006\010\017\001\000\000\ ! \000\001\000\002\003\004\005\021\006\022!\007\0231\024\025\"AQ\0262a#Bq\0103CV\027$&78FRbfuv\000\033\001\001\000\003\ ! \001\001\001\001\000\000\000\000\000\000\000\000\000\000\004\005\006\003\002\001\007\0001\021\000\002\001\002\004\004\004\006\002\002\003\000\000\000\000\000\000\001\002\003\021\004!1Q\005\022Aa\023\"q2\ ! R\024B\006\000\014\003\001\000\002\021\003\021\000?\000Z\" \010\"|\025ðo;l\0204s?U\ ! \000\003y>Oqܦc(ȣo݊1\024D0~\003gJ\034\005iaW\"K\035F8eܿ\"\ ! K\010\"\"\000\002\" \010yc\011'8^84\001J%p>R(\0346.t\020^lg\ ! `t5F~\007\035\007mw[qR^fBZo1k7}--p\000ҧˇU\ ! w֫;-r\022mZz>^\021\021@&D@\021Rsgfq\0344\007V\\\004u=\ ! \037B=FT\\ćd_N98\005q\035\015}z\011\034.&i;on+ĨV$\ ! +Z*\024d汖0Yַ894z'\037V\022\036\011rTVtJ^\ ! xSw_5}DE\021@\017_O7ہG1\037#3|P?mxo\ ! \003#\027en],؎nOi^\031\034q߉{\000\007l{i\036\022X/%5D\"(p\024%~\ ! \0333W\004yvWH^O\023*\001M'^PVy=Z]HM]duM/\ ! k44\016\013\034\021\021\000EXs\\n2ث\0255x5\034de_t\ ! \034ֵ\015\004h<\015-\0025\0377[\035Dž\005P\ ! ۴\"I\034gIpX\016\036\007l._7o\027pr\014ۣtukWILen=Ovo\ ! Z#-G\024QS\007KsMF~_3|6tJ^GTZne^>.Ӹs\0370u\030|\ ! \033i-p\020{)5\005\036!ƫh\022;Y\\4e\037\000\037 \000SJIQwݯ\033;\ ! E^kgmŒ唦q\\:\004gzeINn\022RZ\027\027|\034A.W\0266JV:\ ! zIx8]\021ߣZ>\003\012񑳗bp\031ak`>vq\037A\000ގ_\ ! \0273[jI,؄\031cqӀ:wrox6d\035nc(W\002A\024aa,%\017\036\ ! ZexJ\024fyz)Yzݲ\031%\011ƳTӦ˂\",\012f\037H1\ ! _:\024ݽt)\000H\035D~ +jx\035\007\035zK_\001-?\012w\014g\031+ey\020\ ! \014-IE-v\021ez\027\030\000ț$#C$\026)<5GJ7al]+k\ ! l:a.,{>G{o\014R2X,Ok5;\004\037B\027x\037PX\000d:1\025!g\ ! ;O)Ч<,\034.Ym66\000\023y\007\032ɇ+@\033X,op\001\035hߐ_^h\ ! ڮ\035 \036x\037P+Pawr\\\033\015H\037+o_W<\02467\025i[!h# \ ! \005Qw>\037I}SrGܵ;jߗ\\Q\021V\005\013>\000\034'\000D\003`ׂx\ ! b<\015a{5fC=oN{\000=\000«~\033W|^yjՕ\030\034G\033GE\ ! ~\035r|Z\0346Kq\033yֶ+\035\035E,'b[y\025|Yּ\ ! ig}\\\000\036.n_Nz]?=ogWG\000ڟ\ ! ˂$2m\010X\034+\031y[iR.i\010^]MmjVu-q\ ! -\014\037.r8r2Wkc7]82 \034\034(H\035\0246\034\025b\ ! \002\013D!\002\010 =$\020A\035=QTl\024\037}HU\000>]jy::| Cj\ ! ᡊ\037ӾnRq\014DՔޚ٫iƛi>!%j.`k~[O\017ֆ8=\ ! \033-\005~@bdf&;\017bDkzτ\032{%4\027\026\002OmܫqI%<\ ! K_g{\030fo}7Zn\012+׸\025\033GbYf)X\034ǴC+\034\017b<+\032\0324\ ! U\037O#Nt3$cv6\010=4*xu\024}Wu;WAWy\033wIЮ깓J\ ! 6\026C'Ceq\020d\022{\006nI\022ch\017Id\024GQ91ӗloJY\ ! \027\021\024mXpk\006BCۨ\017͉ݷwG\022:1d\013MvF1\007O\\C`s\ ! \011\016\007}¸b<*O\015n)e}\036k^\021CĨ0\000V\000Uf(\ ! c+ۚ6u\015l\022\035\033q\037\025\"\034sX)a\034rrR[B\014WG\024\\mw\010\023ӭ=\033\ ! j#trG4\020}M\037\032MY>#{:FTgf>Qh8z\017\006_\ ! q1ݛ\017n\005[&֥\022\006\033_^zq\025\037ƚO5i4{iLG\007\ ! GOPwj{nfSr\017|cl`\022\011M;\035\034\016$h\007b%kZ\032\0324\000\ ! \035\\kE.X\022o\000VE\037\014MIIt_\"\"I2\003yG\032x[Xc\ ! l{w\014\000\000\003\000~BK\000\005\000H\000\000\000\020\000\000\0008\000\000\000\ ! HH\001\000\000\000\002\000x1\001\000\000\000 g\015\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000>\014\000\000\003\000\ ! ~BK\000\005\000H\000\000\000\020\000\000\0008\000\000\000HH\001\000\000\000\003\000x1\001\000\000\000 g\015\017\000\000\000\000\000\000\000\000\000\000\000\000\000\ ! \000\000\000\000\000\000\000\000\000\000\000\000\000\000>\014\000\000\003\000~BK\000\004\000\004\000\000}\000\000\000\004\000Text\003\000\000\000\000\000\000\000\000\000\000\000\000\000\ ! \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\ ! \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000~BK\000\015\000,\004\000\000\010\000\000\000\001\000\000\000~\ ! BK\000\016\000\032\004\000\000\024\000\000\000\000\000\001\000\007\000\000\000\001\000\000\000\000\000\000\000U\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000?\000\000\000\000\000\000\000\000\000\000\ ! \000\000\000\000\034@\000\000\000\000\000\000\000\000\000\000\000\000\000\000?\000\000\000\000\000\000B@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000?\010\000\000\000\014\000\ ! \000\000\006\000\000\000\003\000\010\000\000\000\000\000\000\000\006\000\000\000\002\000Y\000\000\000\010\000Webdings\000\000\000\000\001\000\000\002\000\000\0005\000\000\000\000UUUUUU5\ ! @\000\001\000\001\000\000\001ףp=\012\034@ףp=\012\034@\000\000\000\000\000\000\000\000?\000\000\000\000\000\000?\000\000\000\000\000\000\000$@~BK\000\017\000\022\000\000\ ! \000\006\000\000\000\001\000\014\000\000\000\000\000\000\000~BK\000\017\000\022\000\000\000\006\000\000\000\001\000\014\000\000\000\000\000~BK\000\023\000-\000\000\000-\000\000\ ! \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\000\000\001\000\010\000\000\000a\000\000\000\006\000\000\000\ ! \002\000Y\000\000\000\010\000Webdings\000\000\000\000\001\000\000\002\000\000\000%\000\000\000\000-@\000\001\000\001\000\000\001ףp=\012\034@ףp=\ ! \012\034@\000\000\000\000\000\000\000\000?\000\000\000\000\000\000?\000\000\000\000\000\000\000$@~BK\000\017\000\022\000\000\000\006\000\000\000\001\000\014\000\000\000\000\000\000\000~\ ! BK\000\017\000\022\000\000\000\006\000\000\000\001\000\014\000\000\000\000\000~BK\000\023\000-\000\000\000-\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ ! \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\000\000\001\000\010\000\000\000N\000\000\000\006\000\000\000\001\000\010\000\000\000L\000\000\000\006\000\000\000\001\000\010\000\000\000\ ! i\000\000\000\006\000\000\000\002\000Y\000\000\000\010\000Webdings\000\000\000\000\002\000\000\002\000\000\000%\000\000\000\000-@\000\001\000\001\000\000\001ףp=\ ! \012\034@ףp=\012\034@\000\000\000\000\000\000\000\000?\000\000\000\000\000\000?\000\000\000\000\000\000\000$@~BK\000\017\000\022\000\000\000\006\000\000\000\001\000\014\000\000\000\000\ ! \000\000\000~BK\000\017\000\022\000\000\000\006\000\000\000\001\000\014\000\000\000\000\000~BK\000\023\000-\000\000\000-\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ ! \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\000\000\001\000\010\000\000\000\000\000\000\006\000\000\000\002\000Z\000\000\000\011\000Wing\ ! dings\000\000\000\000\001\000\000\002\000\000\000%\000\000\000\000-@\000\001\000\001\000\000\001ףp=\012\034@ףp=\012\034@\000\000\000\000\000\000\000\ ! \000?\000\000\000\000\000\000?\000\000\000\000\000\000\000$@~BK\000\017\000\022\000\000\000\006\000\000\000\001\000\014\000\000\000\000\000\000\000~BK\000\017\000\022\000\000\000\006\000\ ! \000\000\001\000\014\000\000\000\000\000~BK\000\023\000-\000\000\000-\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ ! \000\000\000\000\000\000\000\000\000\000\000\006\000\000\000\001\000\010\000\000\000C\000\000\000\006\000\000\000\001\000\010\000\000\000D\000\000\000\010\000\000\000\000\000\000\000" ### end --- 4,169 ---- source = 'ui.psp' package = 'spambayes.resources' ! data = "Paint Shop Pro Image File\012\032\000\000\000\000\000\005\000\000\000~BK\000\000\000.\000\000\000.\000\000\000\001\000\000F\000\000\000j\ ! tX<@\002\002\000\030\000\001\000\000\000\000\001\000`\002\000\000\000\000\000\002\000\003\000\000%~BK\000\012\000\030\000\000\000~FL\000\001\000\016\000\000\000\000\012\000\000\000\ ! \012\000\000\000\000\000~BK\000\001\0008\000\000\000~FL\000\001\000\004\000\000\000'>~FL\000\002\000\004\000\000\000?}?~FL\000\006\000\004\000\000\000\001\000\000\000~F\ ! L\000\007\000\004\000\000\000\004\004\000\007~BK\000\020\000\035\000\000\010\000\000\000\002\000\000\000~BK\000\021\000\030\000\000\000\030\000\000\000\000\000\000\037\000\000\000\030\000\003\000\001\000\000\000\ ! \000\001\001\000~BK\000\021\000\030\000\000\000\030\000\000\000\001\000\000F\000\000\000\030\000\003\000\001\000\000\000\000\001\000\000~BK\000\022\000#\013\000\000\016\000\000\000\025\013\000\000H\000\000\ \005\000\000\020JFIF\000\001\001\000\001,\001,\000\000\000C\000\002\001\001\001\001\001\002\001\001\001\002\002\002\002\002\004\003\002\002\002\002\005\004\004\003\004\006\005\006\006\006\005\006\ \006\006\007\011\010\006\007\011\007\006\006\010\013\010\011\012\012\012\012\012\006\010\013\014\013\012\014\011\012\012\012\000C\001\002\002\002\002\002\002\005\003\003\005\012\007\006\007\012\012\012\012\012\012\012\012\012\012\ ! \012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\000\021\010\000\037\000\003\001\"\000\002\021\001\003\021\001\ ! \000\033\000\001\000\002\003\001\001\000\000\000\000\000\000\000\000\000\000\000\006\007\004\005\010\003\011\0005\020\000\002\002\001\004\002\001\003\002\003\005\011\000\000\000\000\001\002\003\004\005\000\006\007\021\010\022\ ! !\023\0241\"Q\011\025A\026\027#28BUaqv\000\031\001\000\003\001\001\001\000\000\000\000\000\000\000\000\000\000\000\000\003\005\002\006\001\000)\021\001\000\001\003\004\ ! \001\004\001\005\001\001\000\000\000\000\000\001\002\003\004\021\000\005\022!1\006\"AQa\023Bq#\000\014\003\001\000\002\021\003\021\000?\000}]ٵbmg\ ! :2ѣ5Khbݒuw1:$z _8|\034ne\\[ܱf\016%>vu\ ! X<,\027aܓ'J&\013\030\031+z_dڷۊocm$3\024G\030{rqyZ\ ! \024Y \024.k.v\027aߖx)'m,83..JF\032،\036\ ! {t\001\0325\005N*siO\021m奏N{\0033^F|\000\001T\005\000\011֥SgTv4\ ! 2\020H\001|fH\016-\0336f(ʿl\021U\027\031{tk'\016tmϑ{:\030\ ! \024\024%_\036\020ݟ\010=u|g3\\y7a/!A\025#Uڴ2\010fU1Hcep\ ! 7)[ם68kuڻRVz\033s\010v\017+?w\022HB\030\026h\00418[ޗv}3\ ! iL\0078\027){p`,Muڥ\030[\0363;%)nj{˖Y\000NnBW\ ! Zx'dh\\2Hv\031H \010#MV^+\026\033,W9c'Gkcfi(% \012ߩH\ ! .z\036G\021'՛b\013kңSG\004\000>îʵkXT\016\022N?`C\ ! ;+\035Yc1(3ζ?G\001\027a0F>#\020; [%_\031yqkWmf\ ! :ȇ\026ܕdC*FH\031\000UGiӍI\016W1q|H:t'Z\ ! rNQ\024aR<{z\017#~3CܳrPY~+2\004H\013HQU\ ! \0310/{Cunɶr}\026јźl>\011u?{\015i\031U(\027H7(\004m̹\036\ ! 䍗\033ܬ\033~ҳu\006.ݕAfgDc\017(k*\011\036ڡe.\003_'d܆\006\027\003c\ ! 䩷׳mKB^\025\024EET\0001\006˲l\0272Ԕa\031\011$r׍.0\001\031bd/:\ ! x([ƹN2\0271\023\005\031U%Db}&sz+n,Rx+\035\010 -G\ ! 8cdrZxSa;\034216\012\035N\007gX\037m\026\033k?Q|}k;\002\ ! b:ѣ#C\002?Pk'x'.ğ\034$\035\014yd>Ԉ8~\010\\\012\"%3\ ! #\017!\014\036,kӥBDp{1Jx\0148ԧ{y!¼i%\010y\037|ŷ+cb7Nz\037\ ! %Eg\017R\016s\025t&\006٣\035V\020\020%E\016;\007E\017\025&vy?\033K\ ! 3\016_\021,6\024(\035[\017\000En\026;uZLV(O(ɏ\024\ ! \007{Ƒc{^*)\013\014\011?o\022\\O/X|y׶\000;;vmL\021W\030\025LI\030!X\026\ ! 'ݺV>PX2kܭ\035sJ6\014v\010#?~t\\,$\0339\0325SU\ ! A\003\026OW.'tYx\033DYB2\031\024/bq~Y9o(bO)bqMMxc)D\036y\033z\ ! .!Q\012T\023s(&3ӌ!Ykwu;\011\000c2\035E\033|\ ! \032ێL`J RX\001e\005J=dw\021s-Ӓ6(2ZGS\007c#\030m댷/p;675S`F:+{=.?!WZ\032\024\0171$\ ! :\022u;~Gy3<9w\032\035fYgr-+yB(\0177\016E}ߢ\011]5=\ ! pFL\032c9X\036\021Y\004WƢ{\015Ua1\"\001\037t)H\030O)\004VA]5\ ! lj/h,Cxoֆz\022ȠaO`=v\011\004\035Iᶶ\016ۘicc\ ! Fd\013\034\020ơR5\003@\000~YzneBw3\010E\031_<^6+#09!q\037\002ii\032\ ! vi\032i4ihѦiFlͩ.U91c}!Ȓ>ߟBuzi\ ! s9+\007?\032a\010g_y]O%N\\~FSמ6x&2H:*~\010 A\027h>?\ ! \020\030j7\024lGW\0167b#|~59MwwoNTTc/ \000!Ҫש\031\ ! )G‚{7Ż3=e6^F\032Vn3Vy^(J\032ywѕHtV\ ! AZrbtQX\012\0203M⻛\0005yb\032JԨU:я\024HQ\ ! \007?YZkU.n+GIWYooI \017\0154M'NM4ѣMDw\004q\036䝹cս6\ ! ==O:~0WǸoS^'R4\027\027\026gFlTL8(\021G*\013\020\002@\020LG\ ! \004~\023&i馚hѯ~BK\000\022\000\021\000\000\016\000\000\000\021\000\000q\001\000\010\000\000\020JFIF\000\001\001\000\001,\001\ ! ,\000\000\000C\000\005\003\004\004\004\003\005\004\004\004\005\005\005\006\007\014\010\007\007\007\007\017\013\013\011\014\021\017\022\022\021\017\021\021\023\026\034\027\023\024\032\025\021\021\030!\030\032\035\035\037\037\ ! \037\023\027\"$\"\036$\034\036\037\036\000C\001\005\005\005\007\006\007\016\010\010\016\036\024\021\024\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\ ! \036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\000\021\010\000F\001\003\001\"\000\002\021\001\003\021\001\000\034\000\001\000\003\000\003\001\001\000\000\000\000\000\000\000\000\ ! \000\000\005\006\007\001\003\010\004\002\000F\020\000\001\004\002\001\002\003\005\003\006\011\014\003\000\000\000\001\000\002\003\004\005\021\006\022!\007\0231\024\025\"AQ\0262a#Bq\0103\ ! CRV\027$&78Fbfuv\000\033\001\001\000\003\001\001\001\001\000\000\000\000\000\000\000\000\000\000\004\005\006\003\002\001\007\0001\021\000\001\003\002\ ! \004\003\007\003\005\001\001\000\000\000\000\000\001\000\002\003\004\021\005!1Q\022Aa\023\"2qR\006\024B\000\014\003\001\000\002\021\003\021\000?\000Z\"\"\ ! \"\"\"\"(\016w1\\;\006NM\003O3\000~Jo';e\0361Y\031\024mF\"\017l\ ! IS[A3Uk0\020/:\026\012kȽ\035U\021\024%-\021\021\021\021\021\021\021\021\021\021\021\021\021\027yc\011'8^8\ ! 4\001J\001t9/*E\034Cޓ\023\026\034-L\022\0164\010\033\000qKn\024(\0377[K.lGZ'M4\0148=\ ! \000\003I=qa(*9\007p\021G]\021P(J7!f\011dX*'U\003#N\011\ ! q9H\016|i@?dEG_ O%E\\499l\020v\010\\B\"\"\"\"g97\031lU\ ! G''+آkH'h.$.31\031mwy7j$Ť㶻v66\006\ ! ”h\021(®\022;5aDE\025IDEKe\033qY\007\026\027\015\036\007g~v\037\ ! L!g@7*\025}|409|\021`N\037~kɛϲQ\\\007ע'#m\016\015\004AGqux\ ! 9bz\0366-E\005\031!ֻ]\011޷Vo<\034v~ /q3UX$c'\ ! M}K~DEWȈ#\000exse1rjlи\0233;k)~\ ! }a\036wzk\036qԛP}PIծ;龑⼱|\ ! \026=>zin|3\017hck͟\035\\\\g%ű\0322BvIn\036eק5-3\ ! ʛ<ͩU\010%{1\000+~\015q\013\034/\014m-\023v79o@?=\006\000]\006\ ! 4i\014ANH;\006gwz\007\034n::Ahm}\013\007\007\032y\035}\021\026\ ! Mi\021\021\024\0075\0377[\035Dž\005P۴\"I\034gIpX\016\036\007l._7o\027p\ ! r\014ۣtukWILen=OvoZ#-F)\0348{x\015\017,\032̒8w\017\015\ ! Dyr+N$b+Xn9еA\027\003x\032K6epіC`\ ! \000|\001N*DBg\010MsknK{Ne14;ۢ唦q\\:\004gzI\033\034\034\ ! 5\013\036a\016d+ulf\035Vxf=$A\034.ڭ]\037_\001݅Zr˱8\\s\014ΰ\ ! 5\037v;r8c|Obe\000oGQ_/\031ĭz5[W$c\026lBK\014\035;or7[\033n2O\016\ ! 71+l\001 00\022\007v\017sܭMdt\003\020'uט/eIk̋\ ! -\005W\004DY5ERg3w\017ä\030td\035\012n޺d\016?\020\025Po\016s=%u/\000\ ! \026;\014c_W\033\\/}B^Re۟@;P~#\036\031\023w$|SH~~d=\ ! \0028^f-Rmx]%ŏg=]m^FK\023%{\036湧`BO\003\000\ ! j\013\037lgWx$\0222K\036\002N@]>1\034\021\034@\014ȶ-8Aƥ}ra\006:;>)\ ! \000~Z?\027hv/4@kW\016\017@\017è\025Pawr\\\033\015H\037+o_W<\0246\ ! 7\025i[!h# \005Qr?\\\000\004~B->\025\021\025jT/p\ ! \037\025g~\006-\005Av\031\035x\032j̇{\\]\000O\000W5ݵt獣\ ! MQCQQ@8\0117A~AvxՎ>-Z\016\033%\015k[\025tH\016\\ݎ}\026_C\0231~\ ! m-2A\004\007\010#Dz*8I\031~j\031\031 \007\ ! T5'GO\021{_a̪#ߑ\006麤*\035M0y^\021m4i\030\022VR\006\ ! .jhcѲ\\\017\012*ZKbnc*FLK(^\003Iq`\ ! $ʶ\020֗\037kuuaLG\021\014=ܭMȫ{Q\004v(X5b{D2\ ! #l~#FJi׹Y.xvA\007u\011;9\003\030댹ªY}\023A%V=\004\0358w\033\004֡aA\036\0071X\ ! c=/08g _\015?\010f\003aWж\006/q\022w<\024OC\013e0\ ! axR\004U\017φ9kV@#[x\004\034g\"}4rI\012x\006®?\013Ҕ\006\005\"\ ! \027e\032HH,\013(N\027e/s1zv\027D\036W\014^e\017L\012\0176K\000fW(\012j5%\ ! Qn\011!YIˣgbť\014\026\\W\014m\037*\022r\007xF}%\017Q\\+\034]\020;\ ! g8* \007Ϟ\035\021c\000|>\017\003\021#{9c\006=\032--zx\0009\036€t(NK)C\ ! VnՍ+\001i\013\030QqoE&\\\036a\031_ѻ\022s\013[~Ͷ\025\027\003m\ ! ;ᒘ\023/s\015\ ! ޟ\\ÿ\027{8еzQ2SG~\003\014S\034E!U\020WJ=M[by6y\037\011\003y\ ! i9& Ld8\001\021O,\026tw\">S`B,\021\027Qoy@9)q\021\015ӊ7<\007\ ! +gl\012R*\000Y\0142(\007-j\010ք2\031( D\001`qI@\017\012\005\"/\"^\022,\ ! \000Ca%I\015S\011\023],ꯐc\022$+3փV-\014\006\006$(AU\015*\023)[\002q\ ! 7x\022\005Ldb\012AÊh\000rqd00(\000Y0\001h:{\ ! \026ɀ #dd:\006_|\027T;R~K6\026aE@j-7\"7(.\ ! \034\005Ɍ<\016\004A\020B{\032\\K0*qz\014L\020I\030PrsfN\014b;~ϵ\ ! c\001\036i\001\015t\024RU\001&\022p1\000=A\030A`]\014a\005=\017\002ygÔU\020%\ ! \024\025`\007:\\\006i\032(x\025j\006Ry%\010!\023ϱ\021\005p\0156Kdf aQ\ ! \000\031cXdmؠb{nxst\026\ ! \025bq\022\024_u'f h\005`\003s&\0120P>p>\016C\020Sat<\030H \005識\030\ ! `y_9nAx\031x5.c\027FȂ0?\020B!\001\027Ba\000K0\033\ ! c0d9\027\020y@\006`V\015S\000`H55\004`ykE\005i\016>Rd\\\034C9\0113v:\007~,g6[B\ ! c43\011qiYea\0221\002;ݥ и`Ì\\,\020M#J.\003Y\0110x\012e\ ! *0ʅ^9S_\001#\031\001q,Bvf+=\020\024N\024GpH`Up)$zv`F\ ! *h4\005\023s\031Okd\013ѓsW\026u\035K\024\013f$MK\022ߡbzOV\005X\ ! ~\017\"^X_?\003\031\\\036---~ůJpچA\012'@إt\\PN?\ ! tU)F\001yF\004t\031C\031\004\030kX@Uj\025%\011A\024I\025&.=%\012a\ ! \002ӡ\015\0335^~(?<\035{:}}YY`\026\021{5\035j\0157\013Î>\012\011&a\ ! \024\\\010&E\036\027\033oNn_tV\017,ɏ{1Po+aBg\017<6ByՖz^&7\ ! \034\006t;#ub;<\017XuҢsz`\\M\011\020(8/>A҆ux,S\021D*\012\ ! I}&׌R\013}X\036R54>0>>TUO>r\037MT\015\031'*2cM{\ ! *@n)7;\035\016ĝ~\032qZ%\037E\034\0248\001[A\006nu5Z\027\"E\035&2\013`:a\"s\ ! *gVY3\017#~\002/\002\023oł2N\037mO4 fb\033cB-*\012q$2X{\ ! p\005Ȧ\036c\020\005\0225E\016ʹ\027Zv\0001J2Yj!\024=eLF]\ ! ̽ٻz޹ {6\027\03768ӉlOO\0315m\024=IX}/fF<\033ʩzh4i\ ! lr\\\007I%\025u@J-\024`g\0007J̘\027 \"\022H\021$rN\007\006\025[{\ ! \023~@\021/\025}\025\010FmҖ\032RIX<1>rmԴ\\a@\030xuro\ ! )ht+a)CE3\022#VmmP\033c u>.f&MZ\0034\023#\006s,!\0204\ ! 6{V\005p4mܟ\007\003rmq\023J0\000n\036/v%L\001\002VNW@ʜD-\00788\ ! \012\031@:\036{\015\036\002R'l\033¥E\017KN\006s\\3FW^#3gS\ ! \037\004X\016lT\035_\011cs\010c\023R+\0276\004ZwYQŘ\021RsL:)(5F(g3:\005\002|kYP=V\020'\037׶\007ΦM\026\034\ ! S\011Eu\025\006Ujb\011C[\037\030AJKf\004\012Ku%\017Uf4Ȁ\020,\012\005f\002\ ! 8z^\004U`O\014)B1+\000<1Mp[4cTW\024cbf\022YI7…V;*ӫX\ ! A\036\001#\013v\021E!`\013`DIGz+Jtֵʐ\030WmP\032\000\022l=E_r\015O\ ! \006\021mh8\027F}_\030a2\031\034Sz\003ɉ)OA{$R9е;\000Y\ ! <\023g;S\015Ưa|WB8*\012Oc\036%Jɢ\000|(\037\0309j5gR\ ! C\000\006K܇\007C\037F\004o[8C\033\035T_e<\014Y\030\014\036\007?\031\014.\ ! Ջ_uA*\0232vO'\025*\027r*t\037\025>=DXbxH׬t\001䒝\ ! \034U]sofi\014\015,f\027M\017\000\017z?S%$\032G\000LS\ ! \037u\"\"\005\017k[L̘zr_b+Xߞ\036\035{\033 YU00~\ ! ^\016\032YK3\030[\017Mr5|ԟ4#Nߤ9UxY\037jl]xSje\024(\ ! tE0dx2b\0372v\003d;]c\007zge\035MXcNQx\006G&\0146\ ! r\011tZ\025\\w_1mX#ME AqF#v3v2\034wx4(\012[\ ! @-\007<\017X\030?P/\"1\037on \027)ar.`\005\022hn+/\012\002s\035c\"@\ ! i;\007\001\007_ʼyM\031'\035]_o j\024Oо\021ABTLy26\ ! \022MT\004\007\034{nې(?\000\001J֑\021r\\4ue:\023Y)ܛ)D\004Q;\003\034\ ! Q<\022jW\031x[I\021ca\023aՋ\"0+j\025h\026\002jqoWX\000?9fEPA\ ! vj'AԈS]kv\002')buN9R$6\017\004aV\032&%UR\025BcNnRhS\ ! <ԇv*\004*\022\012*\013\005z7J-\037\011z'Jm+pF\"mJ)fH\ ! ē-MMsg\002\0213*O#\023VI]ǩ\022YWΊ\003KG\007':\"F\ ! }Yi\003>\035\037ixA\025h;\014Ϟ=F)@`4\\W\0027|I\016\006ez\ ! $`\035ي\034Vbe{M\036kPFV⑑\016d\034\032jE__tD\017T]i\011\017Z\ ! L\031RXM\036A\025<\\%*1e|]ge#I07y7LE+,I|6\024\ ! ӤΌ6叧u\027fTC/)? {i!\015\037\002kl\007<;\037M*,/45\033\ ! R\\{&Eߎˠ\0361L\035{\027<īrn\025\016\004CȒ;\032,SG&\ ! Lՙ&8MR\003\026\030wאs\010HK\\vim\003fB\026~\033T8\031folX3\ ! \015\017r:\030G㳽6^KcNđ\024Ȯͫv\003\021]Kvv\003e\023}\030\ ! IzA\014H\024ٽf(TTu*a\010\014\031\035\037P\034і-Y˾\035#VQb>P\ ! uyPg\034:w\007F##4|\035ΙN_l;j}}ؤ\037Kd\003P\035@瀐\036Sf4/.t)L+(e\003{B-Bt|J\031\000w_^h\ ! ;\"B\017eJE\016\003]?omW\007¨˷6'#:NBL?\005\034ռ+-\036\ ! i'lOh7-Y0}U\037g<},\016i}^\026[\016oWA8\034L\027$\031vX\ ! mla\012%y`46&O#\022Thw\013\037:gjV+9&$G.:pHS\014\ ! &ˠoBUgoVHWE\001Bhl\002S*.`.NW\002:iʖ3\032\037\022D_y\ ! '\016\014\030#Gφ\015 /S@uS#k1Mۿ\021>84sd\\$`\033U\ ! \011Ɯ;,l]\024[U^ln%n9\\S\010tjJՊ\001m'H};\013\ ! I\037)5''(\025\023\030#=t۽Zsr\016>\017T1Tߏ\007\020\017F:\ ! ݋fTtg6\"o9=wM}ڑ'\005Ժ\017rY\026X];\016TQ\023\ ! c?\010\0216Շ8iY/\023vB\013ukLp2)jsI~\013\025\ ! Eƚ5Bʁ|/\006+~-|}=\012\034\004\000\031O\032 !;\035xx6>=ҹ\023H}F\ ! _\010Z}@\032\014\034DYb9\013ODgj\024?_\"/&us\015Y\ ! ǕQ\012\034zٔҽ\022C#B\017|\015SxLg,QЍ$(\"ڨR\ ! //=SKp") ### end --- 6,121 ---- import zlib ! data = zlib.decompress("x\ ! !;WuJG7\032@\003h\000\027~kv=}7W\015\006?^\015\006ԋpĦy\ ! ʸE\032$\037],UB<𷈋8ʛdj\026ld?I7iy\020\0015>+^\ ! \004lY\024YVU\020.B\001KE/T\006_?dqΥc,\031 eo\032pL\ ! Ma{W\000#\027IlUʢ \007J\026\"7bC$Da9@\030oOXAr:\ ! -yrϋ8\014*\027q:fC?+\0310~x.\025\001`\035<\017E\"1\020Bz\031c\ ! ?\036my\0240Aջó|\025,<^,\001ǙH\"jq\0375j\002Aς4AfAx\ ! EF0R809˂(3{K\034`\0313G<\025\"W\003\002\022n&BZM\011\ ! o[Bp?9;=}R#\031Xq)\005WU C\033򇊄\\\001Q_C!3\012G\027?}=\ ! :%'nG\0306y8\003><@^Θ:uϼFK\036\036@\016\007=0 \035ӒuJd\ ! ղ[`uJv@t\032\002t\024y[\0111nX`\004dBwb`l@\ ! N$&\013!/I 奯4ȟ72\003\013=6A&\027jd\036^I\021}\006\006k^L\ ! (J?|dv\016x\000\0324=\0053P},\027Q\031\026?\004\\\003ON@a*V\034c˜a \ ! ' \036\016t-\\\024笌Q\000\024Gs\010b\025RgOSiV|XMޠG@a\ ! ZΪ\011&e,\ ! ˀ\015q׊g=sw*|ſ\032z\023\030\0339˼p\010;\037*?d\"SO\033\003yy\ ! \035B\026DO\016\024\020\000U\010PS\004z(,\007욉|\024ox \014^\014$9\ ! X\011\032]-t#$B\001Ykкz#HjN(cX̭7L;.Z\022p2E\013\035\ ! \001L\000Y \013^}\0134?V\0373\001-,6Ŋ0\017\012gB\013l4jAhGB\025$\ ! \003(\032\007?\030\012\001\032y'\034\034%1+0\016\004mw@\033b\015F8]H8XERE0)_\ ! W\036Yi\012JnAN\006͆@n%OZb\023e[\013k,h!\000\01740;-#+S4\ ! \031G\0119FK\016N#_{F*Yȓ\004z\030*\005x\006\034\032c\037\007\ ! O\031\031\"\002-\0028-~\014p\005\021\026B 7\003\010\004@\017]7P\037x\006MY\004E);\ ! \015}Xkt:>\036jVAn\031.a\"a\027\033\023d&\020AY4k}\017^\ ! E2 &2\031ٵ\0162\027.\005\016ԨkxMxXqkzrR\011Š\012[To\ ! DoQ\\ȯC9\012\015\031\017y\034\0118!υf5`T̩\0306 0Zf\"!#͜\ ! \031vkp\003=\002.\033(\000CM\\M\017\003L2%c(\001zN1\012O\031\012zl\037\004Ά)\ ! /0\005 K(*\016 +\001u\014\0205\007Q*Y\014\015`K\021C\"\001'c#\005\013\032lo%\ ! \012@â\0012ǰڰAy\007h\002l\022\007\035G\002%h&\007\030\016W|\ ! \022,*U$r)\026O@\013`-\007L\025`V}}\034\020 rXtx0@A\ ! ȁ\013Oy1烿s݂<\037}5\011!z)\\)lF}R\010I\"\ ! Q$\021KTJi\013&0\0013p\027X\033'ѯ=\021-:\\)\026,I$C?W\ ! \036\013`~\037\"˭Eڽ@\007n3=[ZZ_\015\025OKO頱\020\ ! K\001=u^SVq\003n~o\0111\0112\0203\0100ְ\004S++J;\023\\)\005\002+L\ ! ]zK\025\004VC\033L\025Ao7<6^~(?=\035{:}}YY`\026\021{5\035j\0157\013Î\ ! >\012\011&a\024\\\010&E\036\027\033oNn_tV\017,\017{1Po+aB'\017<6ByՖ\ ! z^&7\034\006t;#ub;<\007XuҢsz`\\M\011\020(8/>A҆ux,\ ! S\021D*\012I}&mF>,{\032}\032UWW\037MU\030vRe\037\037'FMIՏ&C\ ! \025\031&ZrS gΛĝ\016uN?8\"\016U\012\034€ \003CH̺\032-\013R\016\ ! \023\00500XK3wAߙ\021?\027EbA\031'P\032\020L3ύ1\026\025\005_9z\ ! T\031UYm8\002\\CdS±qE\032\"fۋ_-;y|\030E%mj,\020r\ ! 2&B}=lSm\017W\034D6\032J$\027I{p\015\ ! Th4\0324`69䒊: \026N0ҳr\033Y%f\013\020\021pg\011P\010\\X9p'\ ! \003x\003KCc\010\012¾\012Q\004a6[iK\015}~$,\030l\0376jZ0 i\014pa<\ ! kO\024i4I\024\031\021+6(AǍ1\020:zveG&FC\001\011\021\ ! 9\020Jc\032\033phF6\0016\011%w\030[i\000B7\0272\000\001RA+ eN\ ! \026\003fm\034]g\014 \035\017=\006W\017\001\0236d\015\007%AY\003D9[u\ ! +̩\017B[\007yJ6؄1D9D걉O)Ul\033vٻB),\033B\ ! zi0j }:i\000&\037b̈rj&\024\032Z#\031P\035\002\001@vRyT\017kS\ ! \003g&\013\016)҄\"ӺT\003]5ԄK]ӡI JXuyՒ*3\032dL\010|qo\ ! ~V\026\005\0023\001\034=/\002~l*'n\024!\025k\000s&-1+ϱNh3,Ǥ\033B\ ! @\035\025U, ؀\021t\005\010\0200S\0050C#T\025%:ZeBt6(\015v\000{V\ ! osj64\013/q0\014c=]_Qā=\022s\034BZ\035\000\ ! R,_]uvW^v]͉3\0060P`!\034_l]\025{\022dQ\000t\024K\017@\ ! R3!Xn%Yn!\017#\007hXUMޡ\0162Ia\036g,\014[\006\010\ ! \003ԟ\014\006\027_r/LʉT\031ؓ\012p9\025f\012xΞF\",1G<$KVO\ ! x`{rN׹HZvV34s\026\013\007\007QY\022S#\000޿\ ! q?:dPPtyN^\002Ň5x-&fL]=si/[\025oOڽ\ ! \015*i\030?/y\007\015?rn\031\014~ڇ&a9\032fO\021oҜ*vˬ\0175P6ͮF)gf\ ! 5޲_\012NI\"@2<\0311\017AUWY@\001Z2\036U|\012\006T_NsW\027\025\ ! \0109\015Q\000m\032\035(2Vںa_\0321Մ\034\"vY^'\015D}7zV^2;\025\ ! -\003{={2(\0271xFʋ\0013M5F~\026«O\004\024O\030.yM\ ! FTY\020?F\022\010\024\015^\035$\003Eܴ\002A\006s\014C,貥`9t\026\ ! \003\027m!\0161gq\032Ģǜ|\013k\0378)&K\0331Q.Xϣk\007i\023֘S\024^A\021\ ! mI#ô\034>vB=,V,\027\027};C\"\0208f\021\031;\031\016Ot<\032u\ ! tJJ\003\007Q,\037\027͘֏zn7\020ы09__[\027\003\01147^\026\005L\ ! 1g\021\000/e޼\014ᓎ.zԯ7c\0205\012d'Wh_ȈO M!x*\ ! }a\031\033&*DHpc=mH\024\037\000\000%Hl\010tBO2kVXSM\ ! Y\"\001@wC5yŒCK\ ! à\023%i)\035\02360&K\033\035*_ɪ\031}7y:B\014ţn\002'^*E\021.!X\ ! O:viR\000)m3MX\\:\024\025=\026l!c:>\014\000$´\007ƭ\023+v\ ! 6+u~u\030\001VG)lұElv\037\006uJ\020cKTGuލ2\026)\031\ ! =i ,͚\025hmSO͎}Td?\006\037xQաƧ0j\ ! t\005)\025UM5zx*}g|:g;V\030+*7\016mS}IC\007\027\031|!f=7\ ! xױ<=,,w_^h;\"B\017eJE\016\003]?omW\007¨˷6'#:NBL?\005\034\ ! ռ+-\036i'lOh7-Y0}U\037g<},\016i}^\026[\016oWA8\034\ ! L\027$\031vXmla\012%y`46&O#\022Thw\013\037:gjV+GLI|\ ! 0]t\030JMbAu߄ҭ>t\002\016\0216\004T\\\\;uz\005uҔ-gj5\ ! >$f*\034Or\023/\035\03106G揞\015\033@4_*ӧꊕ4Gb'G\027I&ܝ}phJG\ ! ۹H7J9\0239wXغ)h/\030V_fK65sF\021*.\030\015?V+\006\ ! .,\020'}֜TL\\bkT\006ܫ\021\026nkYʹ;\037eYDbv8S\ ! E\026NP?#o}/D4T\037Ceڿ\020\002Oڭ\013\011.`ֱ1ᓮnF|\033%\ ! %S\027\014+5k|F\003\012_\014VZ{\0249\010g\001^34LA\016Cv:dl|zs\ ! '\032~\020^65\0308}<\026s\026N\035\006u\035DKpu(~̷\032\037'ME_\ ! LF\032\026\001A+\0248){3%fF;&\037\022X̣\021\033k\ ! I@QDQ_V__cKr") ### end Index: ui.psp =================================================================== RCS file: /cvsroot/spambayes/spambayes/spambayes/resources/ui.psp,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 Binary files /tmp/cvs3OrIHa and /tmp/cvsE42ebb differ Index: ui.html =================================================================== RCS file: /cvsroot/spambayes/spambayes/spambayes/resources/ui.html,v retrieving revision 1.26 retrieving revision 1.27 diff -C2 -d -r1.26 -r1.27 *** ui.html 2 Oct 2003 05:33:23 -0000 1.26 --- ui.html 3 Oct 2003 18:52:08 -0000 1.27 *************** *** 118,122 **** SpamBayes Help !   --- 118,122 ---- SpamBayes Help !   *************** *** 601,605 **** ! Help --- 601,605 ---- ! Help Index: help_gif.py =================================================================== RCS file: /cvsroot/spambayes/spambayes/spambayes/resources/help_gif.py,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** help_gif.py 29 Sep 2003 07:28:12 -0000 1.1 --- help_gif.py 3 Oct 2003 18:52:08 -0000 1.2 *************** *** 4,19 **** source = 'help.gif' package = 'spambayes.resources' ! data = "GIF89aq\000q\000\000\0003f@p9k!\025Created with The GIMP\000!\004\001\012\000\003\000,\000\ ! \000\000\000q\000q\000\000\002m\000ًδ{h}9z\0132\013o0XP5\013\"x(K \014\026\ ! \023fz.Rߧڈb[׭CUt%\020@5\0367Z;ȭ#\037UDr\007($8H\027T(\ ! H\002\007Q7#\011\010BA\011嘙cc\031I\030\030\012::W\001\021j\033[\0120\"\031+\ ! q\034<%Q\004Sd\015=Hː,\016\011NNuXp.t+.bB=/~\ ! A4^=f\\\013\010=c`%x\030o\014\027}o2\003CrȎ\000OK\030\0060\024\017\ ! Ke\023\020JTXFgI8Er(M(d\032nFM\024\026̅\0073a~\"[ꙉ\006\016*\ ! Mhj侥[Wm[w+\036\004\027^\0157v\034ϵ#G4WVjN=4+h~\ ! t&gd\001H]:/ӱ\012͏u۷۸\013\015qq\012l\015\036w*uvG\023}Ss\ ! v\003+\\e=m^w7vy\007α0\016,gz\036\036e%Q\037z-܀\000*\ ! i`J3\005H'\022>E\035t\010\035\033N˃\027á\007\"\037'ڒKV\"R\032j\025c fy\ ! A\010ފwWBx\011 Update of /cvsroot/spambayes/spambayes/spambayes/resources In directory sc8-pr-cvs1:/tmp/cvs-serv14946 Modified Files: ui_psp.py ui.psp Log Message: Source image (Paint Shop Pro 7) for the new Help icon. Index: ui_psp.py =================================================================== RCS file: /cvsroot/spambayes/spambayes/spambayes/resources/ui_psp.py,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** ui_psp.py 3 Oct 2003 18:52:08 -0000 1.4 --- ui_psp.py 3 Oct 2003 22:00:48 -0000 1.5 *************** *** 5,169 **** package = 'spambayes.resources' data = "Paint Shop Pro Image File\012\032\000\000\000\000\000\005\000\000\000~BK\000\000\000.\000\000\000.\000\000\000\001\000\000F\000\000\000j\ ! tX<@\002\002\000\030\000\001\000\000\000\000\001\000`\002\000\000\000\000\000\002\000\003\000\000%~BK\000\012\000\030\000\000\000~FL\000\001\000\016\000\000\000\000\012\000\000\000\ ! \012\000\000\000\000\000~BK\000\001\0008\000\000\000~FL\000\001\000\004\000\000\000'>~FL\000\002\000\004\000\000\000?}?~FL\000\006\000\004\000\000\000\001\000\000\000~F\ ! L\000\007\000\004\000\000\000\004\004\000\007~BK\000\020\000\035\000\000\010\000\000\000\002\000\000\000~BK\000\021\000\030\000\000\000\030\000\000\000\000\000\000\037\000\000\000\030\000\003\000\001\000\000\000\ ! \000\001\001\000~BK\000\021\000\030\000\000\000\030\000\000\000\001\000\000F\000\000\000\030\000\003\000\001\000\000\000\000\001\000\000~BK\000\022\000#\013\000\000\016\000\000\000\025\013\000\000H\000\000\ \005\000\000\020JFIF\000\001\001\000\001,\001,\000\000\000C\000\002\001\001\001\001\001\002\001\001\001\002\002\002\002\002\004\003\002\002\002\002\005\004\004\003\004\006\005\006\006\006\005\006\ \006\006\007\011\010\006\007\011\007\006\006\010\013\010\011\012\012\012\012\012\006\010\013\014\013\012\014\011\012\012\012\000C\001\002\002\002\002\002\002\005\003\003\005\012\007\006\007\012\012\012\012\012\012\012\012\012\012\ \012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\000\021\010\000\037\000\003\001\"\000\002\021\001\003\021\001\ ! \000\033\000\001\000\002\003\001\001\000\000\000\000\000\000\000\000\000\000\000\006\007\004\005\010\003\011\0005\020\000\002\002\001\004\002\001\003\002\003\005\011\000\000\000\000\001\002\003\004\005\000\006\007\021\010\022\ ! !\023\0241\"Q\011\025A\026\027#28BUaqv\000\031\001\000\003\001\001\001\000\000\000\000\000\000\000\000\000\000\000\000\003\005\002\006\001\000)\021\001\000\001\003\004\ ! \001\004\001\005\001\001\000\000\000\000\000\001\002\003\004\021\000\005\022!1\006\"AQa\023Bq#\000\014\003\001\000\002\021\003\021\000?\000}]ٵbmg\ ! :2ѣ5Khbݒuw1:$z _8|\034ne\\[ܱf\016%>vu\ ! X<,\027aܓ'J&\013\030\031+z_dڷۊocm$3\024G\030{rqyZ\ ! \024Y \024.k.v\027aߖx)'m,83..JF\032،\036\ ! {t\001\0325\005N*siO\021m奏N{\0033^F|\000\001T\005\000\011֥SgTv4\ ! 2\020H\001|fH\016-\0336f(ʿl\021U\027\031{tk'\016tmϑ{:\030\ ! \024\024%_\036\020ݟ\010=u|g3\\y7a/!A\025#Uڴ2\010fU1Hcep\ ! 7)[ם68kuڻRVz\033s\010v\017+?w\022HB\030\026h\00418[ޗv}3\ ! iL\0078\027){p`,Muڥ\030[\0363;%)nj{˖Y\000NnBW\ ! Zx'dh\\2Hv\031H \010#MV^+\026\033,W9c'Gkcfi(% \012ߩH\ ! .z\036G\021'՛b\013kңSG\004\000>îʵkXT\016\022N?`C\ ! ;+\035Yc1(3ζ?G\001\027a0F>#\020; [%_\031yqkWmf\ ! :ȇ\026ܕdC*FH\031\000UGiӍI\016W1q|H:t'Z\ ! rNQ\024aR<{z\017#~3CܳrPY~+2\004H\013HQU\ ! \0310/{Cunɶr}\026јźl>\011u?{\015i\031U(\027H7(\004m̹\036\ ! 䍗\033ܬ\033~ҳu\006.ݕAfgDc\017(k*\011\036ڡe.\003_'d܆\006\027\003c\ ! 䩷׳mKB^\025\024EET\0001\006˲l\0272Ԕa\031\011$r׍.0\001\031bd/:\ ! x([ƹN2\0271\023\005\031U%Db}&sz+n,Rx+\035\010 -G\ ! 8cdrZxSa;\034216\012\035N\007gX\037m\026\033k?Q|}k;\002\ ! b:ѣ#C\002?Pk'x'.ğ\034$\035\014yd>Ԉ8~\010\\\012\"%3\ ! #\017!\014\036,kӥBDp{1Jx\0148ԧ{y!¼i%\010y\037|ŷ+cb7Nz\037\ ! %Eg\017R\016s\025t&\006٣\035V\020\020%E\016;\007E\017\025&vy?\033K\ ! 3\016_\021,6\024(\035[\017\000En\026;uZLV(O(ɏ\024\ ! \007{Ƒc{^*)\013\014\011?o\022\\O/X|y׶\000;;vmL\021W\030\025LI\030!X\026\ ! 'ݺV>PX2kܭ\035sJ6\014v\010#?~t\\,$\0339\0325SU\ ! A\003\026OW.'tYx\033DYB2\031\024/bq~Y9o(bO)bqMMxc)D\036y\033z\ ! .!Q\012T\023s(&3ӌ!Ykwu;\011\000c2\035E\033|\ ! \032ێL`J RX\001e\005J=dw\021s-Ӓ6(2ZGS\007c#\030m댷/p;675S`F:+{=.?!WZ\032\024\0171$\ ! :\022u;~Gy3<9w\032\035fYgr-+yB(\0177\016E}ߢ\011]5=\ ! pFL\032c9X\036\021Y\004WƢ{\015Ua1\"\001\037t)H\030O)\004VA]5\ ! lj/h,Cxoֆz\022ȠaO`=v\011\004\035Iᶶ\016ۘicc\ ! Fd\013\034\020ơR5\003@\000~YzneBw3\010E\031_<^6+#09!q\037\002ii\032\ ! vi\032i4ihѦiFlͩ.U91c}!Ȓ>ߟBuzi\ ! s9+\007?\032a\010g_y]O%N\\~FSמ6x&2H:*~\010 A\027h>?\ ! \020\030j7\024lGW\0167b#|~59MwwoNTTc/ \000!Ҫש\031\ ! )G‚{7Ż3=e6^F\032Vn3Vy^(J\032ywѕHtV\ ! AZrbtQX\012\0203M⻛\0005yb\032JԨU:я\024HQ\ ! \007?YZkU.n+GIWYooI \017\0154M'NM4ѣMDw\004q\036䝹cս6\ ! ==O:~0WǸoS^'R4\027\027\026gFlTL8(\021G*\013\020\002@\020LG\ ! \004~\023&i馚hѯ~BK\000\022\000\021\000\000\016\000\000\000\021\000\000q\001\000\010\000\000\020JFIF\000\001\001\000\001,\001\ ! ,\000\000\000C\000\005\003\004\004\004\003\005\004\004\004\005\005\005\006\007\014\010\007\007\007\007\017\013\013\011\014\021\017\022\022\021\017\021\021\023\026\034\027\023\024\032\025\021\021\030!\030\032\035\035\037\037\ ! \037\023\027\"$\"\036$\034\036\037\036\000C\001\005\005\005\007\006\007\016\010\010\016\036\024\021\024\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\ ! \036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\000\021\010\000F\001\003\001\"\000\002\021\001\003\021\001\000\034\000\001\000\003\000\003\001\001\000\000\000\000\000\000\000\000\ ! \000\000\005\006\007\001\003\010\004\002\000F\020\000\001\004\002\001\002\003\005\003\006\011\014\003\000\000\000\001\000\002\003\004\005\021\006\022!\007\0231\024\025\"AQ\0262a#Bq\0103\ ! CRV\027$&78Fbfuv\000\033\001\001\000\003\001\001\001\001\000\000\000\000\000\000\000\000\000\000\004\005\006\003\002\001\007\0001\021\000\001\003\002\ ! \004\003\007\003\005\001\001\000\000\000\000\000\001\000\002\003\004\021\005!1Q\022Aa\023\"2qR\006\024B\000\014\003\001\000\002\021\003\021\000?\000Z\"\"\ ! \"\"\"\"(\016w1\\;\006NM\003O3\000~Jo';e\0361Y\031\024mF\"\017l\ ! IS[A3Uk0\020/:\026\012kȽ\035U\021\024%-\021\021\021\021\021\021\021\021\021\021\021\021\021\027yc\011'8^8\ ! 4\001J\001t9/*E\034Cޓ\023\026\034-L\022\0164\010\033\000qKn\024(\0377[K.lGZ'M4\0148=\ ! \000\003I=qa(*9\007p\021G]\021P(J7!f\011dX*'U\003#N\011\ ! q9H\016|i@?dEG_ O%E\\499l\020v\010\\B\"\"\"\"g97\031lU\ ! G''+آkH'h.$.31\031mwy7j$Ť㶻v66\006\ ! ”h\021(®\022;5aDE\025IDEKe\033qY\007\026\027\015\036\007g~v\037\ ! L!g@7*\025}|409|\021`N\037~kɛϲQ\\\007ע'#m\016\015\004AGqux\ ! 9bz\0366-E\005\031!ֻ]\011޷Vo<\034v~ /q3UX$c'\ ! M}K~DEWȈ#\000exse1rjlи\0233;k)~\ ! }a\036wzk\036qԛP}PIծ;龑⼱|\ ! \026=>zin|3\017hck͟\035\\\\g%ű\0322BvIn\036eק5-3\ ! ʛ<ͩU\010%{1\000+~\015q\013\034/\014m-\023v79o@?=\006\000]\006\ ! 4i\014ANH;\006gwz\007\034n::Ahm}\013\007\007\032y\035}\021\026\ ! Mi\021\021\024\0075\0377[\035Dž\005P۴\"I\034gIpX\016\036\007l._7o\027p\ ! r\014ۣtukWILen=OvoZ#-F)\0348{x\015\017,\032̒8w\017\015\ ! Dyr+N$b+Xn9еA\027\003x\032K6epіC`\ ! \000|\001N*DBg\010MsknK{Ne14;ۢ唦q\\:\004gzI\033\034\034\ ! 5\013\036a\016d+ulf\035Vxf=$A\034.ڭ]\037_\001݅Zr˱8\\s\014ΰ\ ! 5\037v;r8c|Obe\000oGQ_/\031ĭz5[W$c\026lBK\014\035;or7[\033n2O\016\ ! 71+l\001 00\022\007v\017sܭMdt\003\020'uט/eIk̋\ ! -\005W\004DY5ERg3w\017ä\030td\035\012n޺d\016?\020\025Po\016s=%u/\000\ ! \026;\014c_W\033\\/}B^Re۟@;P~#\036\031\023w$|SH~~d=\ ! \0028^f-Rmx]%ŏg=]m^FK\023%{\036湧`BO\003\000\ ! j\013\037lgWx$\0222K\036\002N@]>1\034\021\034@\014ȶ-8Aƥ}ra\006:;>)\ ! \000~Z?\027hv/4@kW\016\017@\017è\025Pawr\\\033\015H\037+o_W<\0246\ ! 7\025i[!h# \005Qr?\\\000\004~B->\025\021\025jT/p\ ! \037\025g~\006-\005Av\031\035x\032j̇{\\]\000O\000W5ݵt獣\ ! MQCQQ@8\0117A~AvxՎ>-Z\016\033%\015k[\025tH\016\\ݎ}\026_C\0231~\ ! m-2A\004\007\010#Dz*8I\031~j\031\031 \007\ ! T5'GO\021{_a̪#ߑ\006麤*\035M0y^\021m4i\030\022VR\006\ ! .jhcѲ\\\017\012*ZKbnc*FLK(^\003Iq`\ ! $ʶ\020֗\037kuuaLG\021\014=ܭMȫ{Q\004v(X5b{D2\ ! #l~#FJi׹Y.xvA\007u\011;9\003\030댹ªY}\023A%V=\004\0358w\033\004֡CHJ!\010`Y\020O,ox_a\ ! uvZq\005\016\026V9)ɼ (\004\006'7je[Kr!\0134#\025̙- \001GzTS!R\ ! +-G<\023ƲC4.\031$B;\014{\020A\004\021MV^upĿ\026+[9c'Gkcfi(% \012S\ ! \"]<#DO\0217\\\012\026oJNj\014\0060H$AGeZŪT\030}25P?W\ ! [gwp㰱\013=lf;%\025y&E\030:\016\026wx\027^-z]J\ ! Y\020RےeHI\0260C1 \020\030Qj6;kf\017\026P2\001F5+\ ! [ݻ\034\000A\\4GjNTs\017 >\000zJ\020QI^\037/xѺ[=4&\004\017>5DI\"r~O]O%N\\~FSמ6x&\ ! 2H:*} A\0274p\037\037\010wN5\033C\0126#AD@\033\\\021a}ڜѻ\ ! TeV\002@?;\000t+@̽\022\001#O_暏ffg,k(Jfj7/+\ ! \033\011S#O1_.2_s\016]*ը\022iRq\037n\032U\025\024\020=3&⻛k\000ӭ\023\015\ ! ۘj{\007I+RV:F>E\012?(\003kզR䏒NNޑ@\017\003M4IӴM4\ ! hQ\037G\021Ǩozc\017Wo>Wþ|~/\037mKӨ\\[NW*`*{\ ! \006;\007\034\035&\013?U\003q!`=4M'NM4ѣ_~BK\000\022\000\014\022\000\000\016\000\000\000\021\000\000q\001\ ! \000\010\000\000\020JFIF\000\001\001\000\001,\001,\000\000\000C\000\005\003\004\004\004\003\005\004\004\004\005\005\005\006\007\014\010\007\007\007\007\017\013\013\011\014\021\017\022\022\021\017\ ! \021\021\023\026\034\027\023\024\032\025\021\021\030!\030\032\035\035\037\037\037\023\027\"$\"\036$\034\036\037\036\000C\001\005\005\005\007\006\007\016\010\010\016\036\024\021\024\036\036\036\036\036\036\036\036\036\ ! \036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\000\021\010\000F\001\003\001\"\000\002\021\001\003\021\001\ ! \000\034\000\001\000\003\000\003\001\001\000\000\000\000\000\000\000\000\000\000\005\006\007\003\004\010\001\002\000F\020\000\001\003\003\002\003\005\003\010\006\006\013\000\000\000\000\001\000\002\003\004\005\021\006\022\ ! \007!1\023\024\"AQ\0252a\010\026#Bq3Vb\027$&CR78Ffuv\000\033\001\001\000\003\001\001\001\001\000\000\000\000\000\000\ ! \000\000\000\000\004\005\006\003\002\001\007\0002\021\000\001\003\002\004\004\004\006\002\002\003\000\000\000\000\000\001\000\002\021\003\004\005!1Q\022\023Aa\"q2R\024B\006\025\ ! \000\014\003\001\000\002\021\003\021\000?\000Z\"\"\"\"\"\"(\015w-Z:L\003Og\000U\006{ӷK\ ! \035uFv(Q\020\031?i$g]D0\020'sDu\026\013i1舡)h\ ! \023\034\020ICW\017PǨSȠ~z\017\030rSj)S\ ! Q\03556M4\0148sp\000\001$XCi\\fX}\012\013' \024\"(\"*\005\004j\033K'gUQO\ ! t'R\001N:\022\"8:\016cO2\007U\036~Q\0222>ߺ\002z+/s\\摐A\ ! !}QԄDDDEXk[mRGqۊw(R\011\\4\027`\022ZH0\0276\026ƪNƶ\007\ ! >\011'-$\034\0232\024e\\S\026\013%Յ\021\024U%\021\026W2[k5W\010|39\ ! \024N\000\016G7\021\0061뜅.*d,+:\002\021a\016':l^u+MAnǴ=\ ! \031\031?д>\032q\002Ѯhe}\033$xZ\017G4y\036_\0209)wX-յ.q\000dKH \036[b\ ! \025y `\011oDER\021\021\021\021\021\021\021\021\021\021\021\026GUu\027)t˂;f3>-p~\ ! c|\036/\035özoZBEmN=浻\001h\033\032R\ ! !p6:I\0076\031(\0378;;A\024\033v\026\017Rњ\021\026Mi\ ! \021\021\024\006v!buʵGߞCѣ>_U\003f]q\037Pۢyl6)\020D6:B^n\ ! !q$\006\0175cff*\015\035ֆNT?c<\034\0160\017\025\003R6îZoTqG)\ ! kc|R\006\001\014.G\010$\022|\014\037E|t\021\025\006#T\000\004\016\037]\007#ܪ>\ ! ZgLXu&U\006I_%`q8\016kZ׆0\\\036N\006pz-\002\035)cRXoF\007wMNҢ\ ! Ų\006Ip\037,nݧl\002T6)\011dry\016ŀe\000[-\036-\016\031\ ! +*t^\033|tˆ\\w=`j1Ju\005:L>0>\"Cc|\007\0137Q\ ! i\004dGOZv[%knFy9k\007PZ\017K\0155Oe%|`!\ ! \000\000\000\005:<\024g\012&[&'X跶橤Tx8\024fncf3xJEΛ\034\ ! \0345\013\036a\034A-ꚶQTұԳ1K\021z;\024\000@9M\0335uoa\ ! \016\003\031\001>\033\006\002y\023(\00388E{c4^m-ɒ*j!%Xv\034;o23[6d\ ! ;[()\033<\000H\"4%9\007V\035@b\024\011\035\004fc/E6\025\"@D\ ! M\004\010kPśmGH-r:\0127g\033d?h\0334\033=p\006\ ! |\015qi\0008S5t9}NJ\026\"2֣c-v\002=A=\031\023s$xq$\ ! CX=\017\025)nԚJJxëds\011qcy\035,^FK\023%{\036湧 Ѕ\ ! \007\025\037kgWx%Kx\0073\030BXY#\001\021ovnRn\000[Y\ ! L`\003q\005wz:z 5T\001\005c]{\015\025ʑw\032:zg\031\02219\031i\004\036|\032\0259u\003|q]0꫺\ ! M-V\012vJO\015\024l,Mc,f2\017?\017,s\035U\"\013N{d,̨\035\003\014\ ! Q\035!#;N0Ei\032FشCa\022\036[;qɮĎ\013m˝=pm5l\ ! u\0011\007dNn4\035 s+kU#fu'e}\016c^SqCPpx]\0152g]F\ ! GN\025nDEBf\027\010iKSpzʉ*$lsD\032\034\027\0203\0318+OQ:\015\037z6o\ ! &<ٻhh\0340\002awqoR(?\004w.)fq\006汮=2q\013(5n|mMH\037Fݎ\016\ ! 恞霮ɛFݭsk\022RGSM顐a4/#x@\036>X#2%Y{T1\ ! I\036\031\031\033\\XIsq\006>x^Zj\027j0LÄ=\0367[Į]dZaDD\ ! XDDDDDDDDDDDDE\037KOi]yីH\"׹bW1!0\ ! HiઅT\024;d\016iA\\A\020\016EB7Hi6KڷK\033&sPD\017L\033\"\ ! Ʊ\030kZ0\000\005EjTO^YI@\010Y{$qI\015#c\0322\\x\003\ ! 媷jn\030E\024{E=\\ѳpA!\036.#\005i'Z\026\\\035;e\032(.\007h9DDP\ ! \024\\\027\032:k\0045jj\034F\010\\辂Zd/\002 Sp=[n:Fv4\ ! F}f'\016\003/U[w\030S\003\005\024\024&\022\003[\0333W\021_[m*q|3Ƿ3FZNFA\007S\012\024\\k\037YpUu2c|J\000\001\036g\000\001++*\ ! \\>Z\022rv~U_F2-!\014۰R(V2W*cɠnA\007\016\034A#PN\ ! 6\013F_-7TнUW\006\032IH\031\"Re:k\033\000)Ri\002\000;7\021\025\ ! jDDDDDDDDD_cd:)XZd8\036]v\0329KL3IݠD\016\0040o\\OW?p\ ! \".1Ɔ':\\?(ꋥbWӚ8GY\034֒\033E\007\002D\ ! .\004\001p_ڻQZ.EWGT\036C k;֗\002\013FH\015g淕ҠZm\023TP[(&i \ ! t\031?z\014V2!M\004\015PpZx+2s?dDEZ\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\ ! \021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\ ! \021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\ ! \021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\027~BK\000\003\0008\007\000\000~\ ! BK\000\004\000\001\000\000\000\000\000\012\000Background\001\000\000\000\000\000\000\000\000\001\000\000F\000\000\000\000\000\000\000\000\000\000\000\001\000\000F\000\000\000\000\ ! \001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ ! \000\000\000\000\000\000\000\000\000\000\010\000\000\000\001\000\003\000~BK\000\005\000L\000\000\000\020\000\000\000<\000\000\000q\001\000\000\000\001\000x\000\ ! \000\000\000 ]\010U\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0007\000\000\000\003\000%\033~BK\000\005\000\ ! L\000\000\000\020\000\000\000<\000\000\000q\001\000\000\000\002\000x\000\000\000\000 ]\010U\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ ! \000\000\000\000\000\000\0007\000\000\000\003\000%\033~BK\000\005\000L\000\000\000\020\000\000\000<\000\000\000q\001\000\000\000\003\000x\000\000\000\000 ]\ ! \010U\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0007\000\000\000\003\000%\033~BK\000\004\000\005\000\000}\000\000\000\ ! \004\000Text\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ ! \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ ! ~BK\000\015\000\010\005\000\000\010\000\000\000\001\000\000\000~BK\000\016\000\004\000\000\024\000\000\000\000\000\001\000\007\000\000\000\001\000\000\000\000\000\000\000U\000\000\000\000\000\000\000\000\000\000\ ! \000\000\000\000\000\000\000\000?\000\000\000\000\000\000\000\000\000\000\000\000\000\000\034@\000\000\000\000\000\000\000\000\000\000\000\000\000\000?\000\000\000\000\000\000B@\000\000\000\000\000\000\000\000\000\000\ ! \000\000\000\000\000\000\000\000\000\000\000\000?\010\000\000\000\016\000\000\000\006\000\000\000\003\000\010\000\000\000\000\000\000\000\006\000\000\000\002\000Y\000\000\000\010\000Webdings\000\000\000\000\ ! \001\000\000\002\000\000\0005\000\000\000\000UUUUUU5@\000\001\000\001\000\000\001ףp=\012\034@ףp=\012\034@\000\000\000\000\000\000\000\000?\000\000\000\000\000\000\ ! ?\000\000\000\000\000\000\000$@~BK\000\017\000\022\000\000\000\006\000\000\000\001\000\014\000\000\000\000\000\000\000~BK\000\017\000\022\000\000\000\006\000\000\000\001\000\014\000\000\000\000\ ! \000~BK\000\023\000-\000\000\000-\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ ! \000\000\006\000\000\000\001\000\010\000\000\000a\000\000\000\006\000\000\000\002\000Y\000\000\000\010\000Webdings\000\000\000\000\001\000\000\002\000\000\000%\000\000\000\000-\ ! @\000\001\000\001\000\000\001ףp=\012\034@ףp=\012\034@\000\000\000\000\000\000\000\000?\000\000\000\000\000\000?\000\000\000\000\000\000\000$@~BK\000\017\000\022\000\000\ ! \000\006\000\000\000\001\000\014\000\000\000\000\000\000\000~BK\000\017\000\022\000\000\000\006\000\000\000\001\000\014\000\000\000\000\000~BK\000\023\000-\000\000\000-\000\000\ ! \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\000\000\001\000\010\000\000\000N\000\000\000\006\000\000\000\ ! \001\000\010\000\000\000L\000\000\000\006\000\000\000\001\000\010\000\000\000i\000\000\000\006\000\000\000\002\000Y\000\000\000\010\000Webdings\000\000\000\000\002\000\000\002\000\000\000%\000\000\000\ ! \000-@\000\001\000\001\000\000\001ףp=\012\034@ףp=\012\034@\000\000\000\000\000\000\000\000?\000\000\000\000\000\000?\000\000\000\000\000\000\000$@~\ ! BK\000\017\000\022\000\000\000\006\000\000\000\001\000\014\000\000\000\000\000\000\000~BK\000\017\000\022\000\000\000\006\000\000\000\001\000\014\000\000\000\000\000~BK\000\023\ ! \000-\000\000\000-\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\000\000\001\000\010\000\000\000\ ! \000\000\000\006\000\000\000\002\000Z\000\000\000\011\000Wingdings\000\000\000\000\001\000\000\002\000\000\000%\000\000\000\000-@\000\001\000\001\000\000\001ףp\ ! =\012\034@ףp=\012\034@\000\000\000\000\000\000\000\000?\000\000\000\000\000\000?\000\000\000\000\000\000\000$@~BK\000\017\000\022\000\000\000\006\000\000\000\001\000\014\000\000\000\ ! \000\000\000\000~BK\000\017\000\022\000\000\000\006\000\000\000\001\000\014\000\000\000\000\000~BK\000\023\000-\000\000\000-\000\000\000\000\000\000\000\000\000\000\000\000\000\ ! \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\000\000\001\000\010\000\000\000C\000\000\000\006\000\000\000\001\000\010\000\000\000D\000\000\000\006\ ! \000\000\000\002\000Y\000\000\000\010\000Webdings\000\000\000\000\001\000\000\002\000\000\000#\000\000\000\000+@\000\001\000\001\000\000\001ףp=\012\034@\ ! p=\012\034@\000\000\000\000\000\000\000\000?\000\000\000\000\000\000?\000\000\000\000\000\000\000$@~BK\000\017\000\022\000\000\000\006\000\000\000\001\000\014\000\000\000\000\000\000\000\ ! ~BK\000\017\000\022\000\000\000\006\000\000\000\001\000\014\000\000\000\000\000~BK\000\023\000-\000\000\000-\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ ! \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\000\000\001\000\010\000\000\000s\000\000\000\010\000\000\000\000\000\000\000~BK\000\006\000r\000\000\000$\000\000\ ! \000o\001\000\000\005\000\000\000\001\000\000.\000\000\000\000\000\000\000\000\000\000\000)\000\000\000)\000\000\000\010\000\000\000\001\000\001\000~BK\000\005\000<\000\000\000\020\000\000\000,\000\000\0004\ ! \013\000\000\003\000\000\000xJG\034H80oTQ\012G\025*D(I$\016\000\000\000\000\003\0003C" ### end Index: ui.psp =================================================================== RCS file: /cvsroot/spambayes/spambayes/spambayes/resources/ui.psp,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 Binary files /tmp/cvsvKUtac and /tmp/cvsOJy75d differ From anadelonbrin at users.sourceforge.net Sun Oct 5 21:24:14 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Sun Oct 5 21:24:17 2003 Subject: [Spambayes-checkins] spambayes/spambayes ImapUI.py,1.22,1.23 Message-ID: Update of /cvsroot/spambayes/spambayes/spambayes In directory sc8-pr-cvs1:/tmp/cvs-serv417/spambayes Modified Files: ImapUI.py Log Message: Trivial fix for imap over ssl being offered when it is available. Thanks to Paul Wagland for pointing out the problem & fix. Index: ImapUI.py =================================================================== RCS file: /cvsroot/spambayes/spambayes/spambayes/ImapUI.py,v retrieving revision 1.22 retrieving revision 1.23 diff -C2 -d -r1.22 -r1.23 *** ImapUI.py 29 Sep 2003 04:43:09 -0000 1.22 --- ImapUI.py 6 Oct 2003 01:24:12 -0000 1.23 *************** *** 111,115 **** # Only offer SSL if it is available try: ! from imaplib import IMAP_SSL except ImportError: parm_list = list(parm_map) --- 111,115 ---- # Only offer SSL if it is available try: ! from imaplib import IMAP4_SSL except ImportError: parm_list = list(parm_map) From anadelonbrin at users.sourceforge.net Sun Oct 5 21:24:39 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Sun Oct 5 21:24:42 2003 Subject: [Spambayes-checkins] spambayes/spambayes ImapUI.py, 1.18.2.2, 1.18.2.3 Message-ID: Update of /cvsroot/spambayes/spambayes/spambayes In directory sc8-pr-cvs1:/tmp/cvs-serv484/spambayes Modified Files: Tag: release_1_0 ImapUI.py Log Message: Trivial fix for imap over ssl being offered when it is available. Thanks to Paul Wagland for pointing out the problem & fix. Index: ImapUI.py =================================================================== RCS file: /cvsroot/spambayes/spambayes/spambayes/ImapUI.py,v retrieving revision 1.18.2.2 retrieving revision 1.18.2.3 diff -C2 -d -r1.18.2.2 -r1.18.2.3 *** ImapUI.py 28 Sep 2003 23:57:12 -0000 1.18.2.2 --- ImapUI.py 6 Oct 2003 01:24:37 -0000 1.18.2.3 *************** *** 109,113 **** # Only offer SSL if it is available try: ! from imaplib import IMAP_SSL except ImportError: parm_list = list(parm_map) --- 109,113 ---- # Only offer SSL if it is available try: ! from imaplib import IMAP4_SSL except ImportError: parm_list = list(parm_map) From anadelonbrin at users.sourceforge.net Sun Oct 5 21:45:18 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Sun Oct 5 21:45:22 2003 Subject: [Spambayes-checkins] spambayes/spambayes Options.py,1.81,1.82 Message-ID: Update of /cvsroot/spambayes/spambayes/spambayes In directory sc8-pr-cvs1:/tmp/cvs-serv3133/spambayes Modified Files: Options.py Log Message: Update imap ssl option docstring. Thanks to Paul Wagland for pointing out the problem & fix. Index: Options.py =================================================================== RCS file: /cvsroot/spambayes/spambayes/spambayes/Options.py,v retrieving revision 1.81 retrieving revision 1.82 diff -C2 -d -r1.81 -r1.82 *** Options.py 21 Sep 2003 07:01:07 -0000 1.81 --- Options.py 6 Oct 2003 01:45:16 -0000 1.82 *************** *** 879,883 **** ("use_ssl", "Connect via a secure socket layer", False, ! """NOT YET IMPLEMENTED""", BOOLEAN, DO_NOT_RESTORE), --- 879,887 ---- ("use_ssl", "Connect via a secure socket layer", False, ! """Use SSL to connect to the server. This allows spambayes to connect ! without sending the password in plain text. ! ! Note that this does not check the server certificate at this point in ! time.""", BOOLEAN, DO_NOT_RESTORE), From anadelonbrin at users.sourceforge.net Sun Oct 5 21:45:46 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Sun Oct 5 21:45:50 2003 Subject: [Spambayes-checkins] spambayes/spambayes Options.py, 1.79.2.1, 1.79.2.2 Message-ID: Update of /cvsroot/spambayes/spambayes/spambayes In directory sc8-pr-cvs1:/tmp/cvs-serv3173/spambayes Modified Files: Tag: release_1_0 Options.py Log Message: Update imap ssl option docstring. Thanks to Paul Wagland for pointing out the problem & fix. Index: Options.py =================================================================== RCS file: /cvsroot/spambayes/spambayes/spambayes/Options.py,v retrieving revision 1.79.2.1 retrieving revision 1.79.2.2 diff -C2 -d -r1.79.2.1 -r1.79.2.2 *** Options.py 21 Sep 2003 07:01:32 -0000 1.79.2.1 --- Options.py 6 Oct 2003 01:45:44 -0000 1.79.2.2 *************** *** 839,843 **** ("use_ssl", "Connect via a secure socket layer", False, ! """NOT YET IMPLEMENTED""", BOOLEAN, DO_NOT_RESTORE), --- 839,847 ---- ("use_ssl", "Connect via a secure socket layer", False, ! """Use SSL to connect to the server. This allows spambayes to connect ! without sending the password in plain text. ! ! Note that this does not check the server certificate at this point in ! time.""", BOOLEAN, DO_NOT_RESTORE), From anadelonbrin at users.sourceforge.net Sun Oct 5 21:46:37 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Sun Oct 5 21:46:40 2003 Subject: [Spambayes-checkins] spambayes/scripts sb_imapfilter.py,1.12,1.13 Message-ID: Update of /cvsroot/spambayes/spambayes/scripts In directory sc8-pr-cvs1:/tmp/cvs-serv3316/scripts Modified Files: sb_imapfilter.py Log Message: When we mark a message as deleted, mark it as read (seen) as well. This apparently helps some mail clients, and makes sense anyway. Index: sb_imapfilter.py =================================================================== RCS file: /cvsroot/spambayes/spambayes/scripts/sb_imapfilter.py,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** sb_imapfilter.py 3 Oct 2003 06:02:47 -0000 1.12 --- sb_imapfilter.py 6 Oct 2003 01:46:35 -0000 1.13 *************** *** 423,427 **** imap.SelectFolder(self.previous_folder.name) self.previous_folder = None ! response = imap.uid("STORE", self.uid, "+FLAGS.SILENT", "(\\Deleted)") self._check(response, 'store') --- 423,427 ---- imap.SelectFolder(self.previous_folder.name) self.previous_folder = None ! response = imap.uid("STORE", self.uid, "+FLAGS.SILENT", "(\\Deleted \\Seen)") self._check(response, 'store') From anadelonbrin at users.sourceforge.net Sun Oct 5 22:05:47 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Sun Oct 5 22:05:50 2003 Subject: [Spambayes-checkins] spambayes/scripts sb_imapfilter.py, 1.7.2.2, 1.7.2.3 Message-ID: Update of /cvsroot/spambayes/spambayes/scripts In directory sc8-pr-cvs1:/tmp/cvs-serv5831/scripts Modified Files: Tag: release_1_0 sb_imapfilter.py Log Message: I missed a bit of Sjoerd's fix; here it is. Index: sb_imapfilter.py =================================================================== RCS file: /cvsroot/spambayes/spambayes/scripts/sb_imapfilter.py,v retrieving revision 1.7.2.2 retrieving revision 1.7.2.3 diff -C2 -d -r1.7.2.2 -r1.7.2.3 *** sb_imapfilter.py 3 Oct 2003 02:58:36 -0000 1.7.2.2 --- sb_imapfilter.py 6 Oct 2003 02:05:45 -0000 1.7.2.3 *************** *** 333,338 **** except OverflowError: pass ! else: ! return Time2Internaldate(time.time()) def get_substance(self): --- 333,337 ---- except OverflowError: pass ! return Time2Internaldate(time.time()) def get_substance(self): From anadelonbrin at users.sourceforge.net Sun Oct 5 22:30:00 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Sun Oct 5 22:30:05 2003 Subject: [Spambayes-checkins] spambayes/spambayes Stats.py,1.1,1.2 Message-ID: Update of /cvsroot/spambayes/spambayes/spambayes In directory sc8-pr-cvs1:/tmp/cvs-serv9049/spambayes Modified Files: Stats.py Log Message: Add Tim's fix for the stats to the web interface stats as well. i.e. round the percentages, don't truncate them. Index: Stats.py =================================================================== RCS file: /cvsroot/spambayes/spambayes/spambayes/Stats.py,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** Stats.py 30 Sep 2003 04:18:05 -0000 1.1 --- Stats.py 6 Oct 2003 02:29:58 -0000 1.2 *************** *** 92,97 **** format_dict.update(self.__dict__) push("SpamBayes has processed %(num_seen)d messages - " \ ! "%(cls_ham)d (%(perc_ham)d%%) good, " \ ! "%(cls_spam)d (%(perc_spam)d%%) spam " \ "and %(cls_unsure)d (%(perc_unsure)d%%) unsure." % format_dict) push("%(trn_ham)d message(s) were manually " \ --- 92,97 ---- format_dict.update(self.__dict__) push("SpamBayes has processed %(num_seen)d messages - " \ ! "%(cls_ham)d (%(perc_ham).0f%%) good, " \ ! "%(cls_spam)d (%(perc_spam).0f%%) spam " \ "and %(cls_unsure)d (%(perc_unsure)d%%) unsure." % format_dict) push("%(trn_ham)d message(s) were manually " \ From anadelonbrin at users.sourceforge.net Sun Oct 5 22:38:24 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Sun Oct 5 22:38:26 2003 Subject: [Spambayes-checkins] spambayes CHANGELOG.txt,1.20,1.21 Message-ID: Update of /cvsroot/spambayes/spambayes In directory sc8-pr-cvs1:/tmp/cvs-serv10525 Modified Files: CHANGELOG.txt Log Message: Bring up to date. Index: CHANGELOG.txt =================================================================== RCS file: /cvsroot/spambayes/spambayes/CHANGELOG.txt,v retrieving revision 1.20 retrieving revision 1.21 diff -C2 -d -r1.20 -r1.21 *** CHANGELOG.txt 26 Sep 2003 18:20:03 -0000 1.20 --- CHANGELOG.txt 6 Oct 2003 02:38:22 -0000 1.21 *************** *** 1,8 **** [Note that all dates are in English, not American format - i.e. day/month/year] ! Alpha Release 7 ! =============== Skip Montanaro 26/09/2003 Correct sense of include_trained test in mbox_train. Skip Montanaro 26/09/2003 Dump TRAINED_HDR global. Reference options[...] instead. Alpha Release 6 --- 1,48 ---- [Note that all dates are in English, not American format - i.e. day/month/year] ! Release 1.1a1 ! ============= ! Tony Meyer 06/10/2003 Add Tim's fix for the stats to the web interface stats as well. i.e. round the percentages, don't truncate them. ! Tony Meyer 06/10/2003 imapfilter: When we mark a message as deleted, mark it as read (seen) as well. ! Richie Hindle 04/10/2003 Fix the help icon to look like the rest. ! Tony Meyer 03/10/2003 If sb_imapfilter.py is run without any switches, just serve the web interface (but don't launch a browser). ! Tim Peters 03/10/2003 Outlook: Stop spam and unsure messages being double-counted in the stats. ! Tony Meyer 02/10/2003 Fix a bug where messages wouldn't be trained via the web interface although no error would be reported (introduced after the previous release). ! Tony Meyer 02/10/2003 Provide a partially filled-in bug report message via the web interface. ! Tim Peters 01/10/2003 Round (not truncate) the stats information in the Outlook plugin. ! Tony Meyer 30/09/2003 Improve autoconfigure script to find the location of various config files. ! Tony Meyer 30/09/2003 Add basic statistics information to the web interface. ! Tony Meyer 29/09/2003 Add a basic help system to the web interface. ! Tony Meyer 29/09/2003 Add warning information to the web interface, for example if the user has imbalanced training, or not much training. ! Mark Hammond 29/09/2003 Don't start the pop3proxy service if a proxy is already running. ! Mark Hammond 29/09/2003 Outlook: Add slightly better stats, and a better framework to extend. Skip Montanaro 26/09/2003 Correct sense of include_trained test in mbox_train. Skip Montanaro 26/09/2003 Dump TRAINED_HDR global. Reference options[...] instead. + Mark Hammond 25/09/2003 Add patch [ 809008 ] safe start/stop and exlusive execution on windows + Tony Meyer 24/09/2003 sb_filter.py: If the -n switch was before the -d/-p switch, then the name wouldn't be used. This is rather unintuitive, so fix this so that the -d/-p name is used wherever the -n switch is. + Adam Walker 24/09/2003 pop3proxy_tray: Check if the web interface port can be bound as a simple test of if the proxy is running. + Tony Meyer 20/09/2003 smtpproxy is now only a module, not a script. Use sb_server instead. + Tony Meyer 20/09/2003 Consolidate some of the many message classes - in particular Corpus.Message is removed in favour of message.Message + Tony Meyer 20/09/2003 Improve the 'Find Message' query on the front page of the web UI. + Tony Meyer 20/09/2003 Add an advanced word query to the web UI. + Tony Meyer 20/09/2003 Make the review messages page on the web UI more customizable. + + 1.0 Releases + ************ + + Alpha Release 7 + =============== + Tony Meyer 06/10/2003 Trivial fix for imap over ssl being offered when it is available. + Tony Meyer 03/10/2003 Fix [ 810342 ] sb_smtpproxy does not work with smtplib.SMTP.sendmail() + Tony Meyer 03/10/2003 Fix [ spambayes-Bugs-816400 ] Crash because of bad date. + Sjoerd Mullender 02/10/2003 imapfilter: if problems occur parsing the date, just use the current date/time. + Tony Meyer 30/09/2003 Fix [ 814322 ] AttributeError: hdrtxt + Tony Meyer 29/09/2003 smtpproxy: If we successfully trained a message from the pop3proxy cache or imap server, we still said that we couldn't find it. Fix. + Tony Meyer 29/09/2003 smtpproxy: Fix a minor printing error that would cause a traceback. + Tony Meyer 29/09/2003 imapfilter: Fix trying to view imap folders before restarting and after entering in details. + Tony Meyer 28/09/2003 Don't use 'pragma: no_cache' to try and stop browsers caching the web interface pages. + Tony Meyer 26/09/2003 If the user is using Windows, also install pop3proxy_service.py and pop3proxy_tray.py. + Tony Meyer 24/09/2003 Fix sb_xmlrpcserver to work with the renamed options/scripts. + Tony Meyer 24/09/2003 Fix [ spambayes-Bugs-809769 ] TypeError when training 1.0a6 Alpha Release 6 From anadelonbrin at users.sourceforge.net Sun Oct 5 22:38:52 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Sun Oct 5 22:38:55 2003 Subject: [Spambayes-checkins] spambayes CHANGELOG.txt,1.19,1.19.2.1 Message-ID: Update of /cvsroot/spambayes/spambayes In directory sc8-pr-cvs1:/tmp/cvs-serv10672 Modified Files: Tag: release_1_0 CHANGELOG.txt Log Message: Bring up to date. Index: CHANGELOG.txt =================================================================== RCS file: /cvsroot/spambayes/spambayes/CHANGELOG.txt,v retrieving revision 1.19 retrieving revision 1.19.2.1 diff -C2 -d -r1.19 -r1.19.2.1 *** CHANGELOG.txt 18 Sep 2003 22:20:36 -0000 1.19 --- CHANGELOG.txt 6 Oct 2003 02:38:50 -0000 1.19.2.1 *************** *** 1,4 **** --- 1,19 ---- [Note that all dates are in English, not American format - i.e. day/month/year] + Alpha Release 7 + =============== + Tony Meyer 06/10/2003 Trivial fix for imap over ssl being offered when it is available. + Tony Meyer 03/10/2003 Fix [ 810342 ] sb_smtpproxy does not work with smtplib.SMTP.sendmail() + Tony Meyer 03/10/2003 Fix [ spambayes-Bugs-816400 ] Crash because of bad date. + Sjoerd Mullender 02/10/2003 imapfilter: if problems occur parsing the date, just use the current date/time. + Tony Meyer 30/09/2003 Fix [ 814322 ] AttributeError: hdrtxt + Tony Meyer 29/09/2003 smtpproxy: If we successfully trained a message from the pop3proxy cache or imap server, we still said that we couldn't find it. Fix. + Tony Meyer 29/09/2003 smtpproxy: Fix a minor printing error that would cause a traceback. + Tony Meyer 29/09/2003 imapfilter: Fix trying to view imap folders before restarting and after entering in details. + Tony Meyer 28/09/2003 Don't use 'pragma: no_cache' to try and stop browsers caching the web interface pages. + Tony Meyer 26/09/2003 If the user is using Windows, also install pop3proxy_service.py and pop3proxy_tray.py. + Tony Meyer 24/09/2003 Fix sb_xmlrpcserver to work with the renamed options/scripts. + Tony Meyer 24/09/2003 Fix [ spambayes-Bugs-809769 ] TypeError when training 1.0a6 + Alpha Release 6 =============== From anadelonbrin at users.sourceforge.net Sun Oct 5 23:01:03 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Sun Oct 5 23:01:05 2003 Subject: [Spambayes-checkins] spambayes/windows autoconfigure.py,1.6,1.7 Message-ID: Update of /cvsroot/spambayes/spambayes/windows In directory sc8-pr-cvs1:/tmp/cvs-serv13760/windows Modified Files: autoconfigure.py Log Message: Eudora 6 comes with a folder called "Junk", so default to using that. Index: autoconfigure.py =================================================================== RCS file: /cvsroot/spambayes/spambayes/windows/autoconfigure.py,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** autoconfigure.py 30 Sep 2003 05:23:53 -0000 1.6 --- autoconfigure.py 6 Oct 2003 03:01:01 -0000 1.7 *************** *** 165,169 **** # another day, however. filter_filename = "%s%sFilters.pce" % (config_location, os.sep) ! spam_folder_name = "Junk Mail" unsure_folder_name = "Possible Junk" header_name = options["Headers", "classification_header_name"] --- 165,169 ---- # another day, however. filter_filename = "%s%sFilters.pce" % (config_location, os.sep) ! spam_folder_name = "Junk" unsure_folder_name = "Possible Junk" header_name = options["Headers", "classification_header_name"] From anadelonbrin at users.sourceforge.net Mon Oct 6 20:35:35 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Mon Oct 6 20:35:38 2003 Subject: [Spambayes-checkins] spambayes/scripts sb_imapfilter.py,1.13,1.14 Message-ID: Update of /cvsroot/spambayes/spambayes/scripts In directory sc8-pr-cvs1:/tmp/cvs-serv19121/scripts Modified Files: sb_imapfilter.py Log Message: I think this will fix [ spambayes-Bugs-818552 ] Exchange 2000 IMAPserver & imaplib.error: APPEND command er Index: sb_imapfilter.py =================================================================== RCS file: /cvsroot/spambayes/spambayes/scripts/sb_imapfilter.py,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** sb_imapfilter.py 6 Oct 2003 01:46:35 -0000 1.13 --- sb_imapfilter.py 7 Oct 2003 00:35:32 -0000 1.14 *************** *** 404,408 **** # The \Recent flag can be fetched, but cannot be stored # We must remove it from the list if it is there. ! flags = re.sub(r"\\Recent ?|\\ ?Recent", "", flags) else: flags = None --- 404,408 ---- # The \Recent flag can be fetched, but cannot be stored # We must remove it from the list if it is there. ! flags = re.sub(r"\\Recent ?| ?\\Recent", "", flags) else: flags = None From anadelonbrin at users.sourceforge.net Mon Oct 6 20:35:53 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Mon Oct 6 20:35:55 2003 Subject: [Spambayes-checkins] spambayes/scripts sb_imapfilter.py, 1.7.2.3, 1.7.2.4 Message-ID: Update of /cvsroot/spambayes/spambayes/scripts In directory sc8-pr-cvs1:/tmp/cvs-serv19206/scripts Modified Files: Tag: release_1_0 sb_imapfilter.py Log Message: I think this will fix [ spambayes-Bugs-818552 ] Exchange 2000 IMAPserver & imaplib.error: APPEND command er Index: sb_imapfilter.py =================================================================== RCS file: /cvsroot/spambayes/spambayes/scripts/sb_imapfilter.py,v retrieving revision 1.7.2.3 retrieving revision 1.7.2.4 diff -C2 -d -r1.7.2.3 -r1.7.2.4 *** sb_imapfilter.py 6 Oct 2003 02:05:45 -0000 1.7.2.3 --- sb_imapfilter.py 7 Oct 2003 00:35:50 -0000 1.7.2.4 *************** *** 404,408 **** # The \Recent flag can be fetched, but cannot be stored # We must remove it from the list if it is there. ! flags = re.sub(r"\\Recent ?|\\ ?Recent", "", flags) else: flags = None --- 404,408 ---- # The \Recent flag can be fetched, but cannot be stored # We must remove it from the list if it is there. ! flags = re.sub(r"\\Recent ?| ?\\Recent", "", flags) else: flags = None From anadelonbrin at users.sourceforge.net Mon Oct 6 20:36:32 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Mon Oct 6 20:36:34 2003 Subject: [Spambayes-checkins] spambayes/scripts sb_server.py,1.10,1.11 Message-ID: Update of /cvsroot/spambayes/spambayes/scripts In directory sc8-pr-cvs1:/tmp/cvs-serv19329/scripts Modified Files: sb_server.py Log Message: Fix [ spambayes-Bugs-818871 ] sb_server.py calls undefined variable Index: sb_server.py =================================================================== RCS file: /cvsroot/spambayes/spambayes/scripts/sb_server.py,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** sb_server.py 29 Sep 2003 04:43:09 -0000 1.10 --- sb_server.py 7 Oct 2003 00:36:30 -0000 1.11 *************** *** 713,720 **** small = "ham" if big is not None: ! self.warning = "%s\nWarning: you have much more %s than %s - " \ "SpamBayes works best with approximately even " \ ! "numbers of ham and spam." % (db_status, big, ! small) else: self.warning = "" --- 713,719 ---- small = "ham" if big is not None: ! self.warning = "Warning: you have much more %s than %s - " \ "SpamBayes works best with approximately even " \ ! "numbers of ham and spam." % (big, small) else: self.warning = "" From anadelonbrin at users.sourceforge.net Tue Oct 7 23:12:49 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Tue Oct 7 23:12:52 2003 Subject: [Spambayes-checkins] website faq.txt,1.47,1.48 Message-ID: Update of /cvsroot/spambayes/website In directory sc8-pr-cvs1:/tmp/cvs-serv3587 Modified Files: faq.txt Log Message: Add a FAQ about setting the Outlook plug-in to move spam to the deleted items folder. Index: faq.txt =================================================================== RCS file: /cvsroot/spambayes/website/faq.txt,v retrieving revision 1.47 retrieving revision 1.48 diff -C2 -d -r1.47 -r1.48 *** faq.txt 2 Oct 2003 00:02:18 -0000 1.47 --- faq.txt 8 Oct 2003 03:12:47 -0000 1.48 *************** *** 584,587 **** --- 584,610 ---- register a hit on the spammer's server. + + Why can't I set spam to be moved to the Deleted Items folder? + ------------------------------------------------------------- + + The problem with this is that you can also set SpamBayes to train all + messages moved to the designated spam folder. If you set the deleted + items folder as the spam folder (early versions of the plug-in allowed + this), then *all* messages that you delete would be trained as spam. + + To get this restriction removed, you'll have to convince the developers + that there is a way to do this without confusing people - for example, + if we let you choose the deleted items folder as the spam folder, only + if the 'incremental training' option was off, people would get confused + about why it sometimes works and sometimes doesn't. + + Note that Outlook 2003 has a "Junk Mail" folder that has many of the + deleted items folder's properties, and you *can* get SpamBayes to move + spam to this folder. You may also find some good advice in the answer + to `the question about getting SpamBayes to delete spam`_. + + .. _`the question about getting SpamBayes to delete spam`: #how-can-i-configure-spambayes-to-delete-spam-rather-than-moving-it + + Using SpamBayes =============== From anadelonbrin at users.sourceforge.net Wed Oct 8 00:04:37 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Wed Oct 8 00:04:40 2003 Subject: [Spambayes-checkins] spambayes/spambayes message.py, 1.39, 1.40 storage.py, 1.35, 1.36 Message-ID: Update of /cvsroot/spambayes/spambayes/spambayes In directory sc8-pr-cvs1:/tmp/cvs-serv11152/spambayes Modified Files: message.py storage.py Log Message: Improvements to the messageinfo db: * If the (stats) db uses a pickle, then use a pickle for the messageinfo as well. * Close the db when we are no longer using it (the Python docs say that __del__ isn't guaranteed to be called here, but this is better than nothing. Something needs to explicitly close it, really. * I'm not convinced (someone hit me if I'm wrong) that we were ever sync()ing the db, so make sure that we are. * For safety, allow setId() to be called if an id is already set, as long as it's the same id. (So setId("one"); setId("one") is ok). * The pop3proxy didn't actually store the training status of messages (again this is odd, so hit me if I'm wrong), so fix that, too. It would be fantastic if these fixed some of the corruption problems :) Please try at your convenience (if you had any problems) and let -dev know. Using a pickle surely must get rid of the problems. Index: message.py =================================================================== RCS file: /cvsroot/spambayes/spambayes/spambayes/message.py,v retrieving revision 1.39 retrieving revision 1.40 diff -C2 -d -r1.39 -r1.40 *** message.py 2 Oct 2003 05:50:43 -0000 1.39 --- message.py 8 Oct 2003 04:04:35 -0000 1.40 *************** *** 94,98 **** --- 94,100 ---- import sys import types + import errno import shelve + import pickle import email *************** *** 108,129 **** CRLF_RE = re.compile(r'\r\n|\r|\n') ! class MessageInfoDB: ! def __init__(self, db_name, mode='c'): ! self.mode = mode self.db_name = db_name - try: - self.dbm = dbmstorage.open(self.db_name, self.mode) - self.db = shelve.Shelf(self.dbm) - except dbmstorage.error: - # This probably means that we don't have a dbm module - # available. Print out a warning, and continue on - # (not persisting any of this data). - if options["globals", "verbose"]: - print "Warning: no dbm modules available for MessageInfoDB" - self.dbm = self.db = None - - def store(self): - if self.db is not None: - self.db.sync() def _getState(self, msg): --- 110,116 ---- CRLF_RE = re.compile(r'\r\n|\r|\n') ! class MessageInfoBase(object): ! def __init__(self, db_name): self.db_name = db_name def _getState(self, msg): *************** *** 137,144 **** --- 124,193 ---- if self.db is not None: self.db[msg.getId()] = (msg.c, msg.t) + self.store() def _delState(self, msg): if self.db is not None: del self.db[msg.getId()] + self.store() + + class MessageInfoPickle(MessageInfoBase): + def __init__(self, db_name, pickle_type=1): + MessageInfoBase.__init__(self, db_name) + self.mode = pickle_type + self.load() + + def load(self): + try: + fp = open(self.db_name, 'rb') + except IOError, e: + if e.errno == errno.ENOENT: + # New pickle + self.db = {} + else: + raise + else: + self.db = pickle.load(fp) + fp.close() + + def close(self): + # we keep no resources open - nothing to do + pass + + def store(self): + fp = open(self.db_name, 'wb') + pickle.dump(self.db, fp, self.mode) + fp.close() + + class MessageInfoDB(MessageInfoBase): + def __init__(self, db_name, mode='c'): + MessageInfoBase.__init__(self, db_name) + self.mode = mode + self.load() + + def load(self): + try: + self.dbm = dbmstorage.open(self.db_name, self.mode) + self.db = shelve.Shelf(self.dbm) + except dbmstorage.error: + # This probably means that we don't have a dbm module + # available. Print out a warning, and continue on + # (not persisting any of this data). + if options["globals", "verbose"]: + print "Warning: no dbm modules available for MessageInfoDB" + self.dbm = self.db = None + + def __del__(self): + self.close() + + def close(self): + # Close our underlying database. Better not assume all databases + # have close functions! + def noop(): pass + getattr(self.db, "close", noop)() + getattr(self.dbm, "close", noop)() + + def store(self): + if self.db is not None: + self.db.sync() # This should come from a Mark Hammond idea of a master db *************** *** 148,152 **** message_info_db_name = options["Storage", "messageinfo_storage_file"] message_info_db_name = os.path.expanduser(message_info_db_name) ! msginfoDB = MessageInfoDB(message_info_db_name) class Message(email.Message.Message): --- 197,204 ---- message_info_db_name = options["Storage", "messageinfo_storage_file"] message_info_db_name = os.path.expanduser(message_info_db_name) ! if options["Storage", "persistent_use_database"]: ! msginfoDB = MessageInfoDB(message_info_db_name) ! else: ! msginfoDB = MessageInfoPickle(message_info_db_name) class Message(email.Message.Message): *************** *** 182,186 **** def setId(self, id): ! if self.id: raise ValueError, "MsgId has already been set, cannot be changed" --- 234,238 ---- def setId(self, id): ! if self.id and self.id != id: raise ValueError, "MsgId has already been set, cannot be changed" Index: storage.py =================================================================== RCS file: /cvsroot/spambayes/spambayes/spambayes/storage.py,v retrieving revision 1.35 retrieving revision 1.36 diff -C2 -d -r1.35 -r1.36 *** storage.py 24 Sep 2003 05:28:53 -0000 1.35 --- storage.py 8 Oct 2003 04:04:35 -0000 1.36 *************** *** 577,581 **** def onAddMessage(self, message): '''A message is being added to an observed corpus.''' - self.train(message) --- 577,580 ---- *************** *** 588,595 **** self.bayes.learn(message.tokenize(), self.is_spam) # self.updateprobs) def onRemoveMessage(self, message): '''A message is being removed from an observed corpus.''' - self.untrain(message) --- 587,595 ---- self.bayes.learn(message.tokenize(), self.is_spam) # self.updateprobs) + message.setId(message.key()) + message.RememberTrained(self.is_spam) def onRemoveMessage(self, message): '''A message is being removed from an observed corpus.''' self.untrain(message) *************** *** 604,611 **** # can raise ValueError if database is fouled. If this is the case, # then retraining is the only recovery option. def trainAll(self, corpus): '''Train all the messages in the corpus''' - for msg in corpus: self.train(msg) --- 604,611 ---- # can raise ValueError if database is fouled. If this is the case, # then retraining is the only recovery option. + message.RememberTrained(None) def trainAll(self, corpus): '''Train all the messages in the corpus''' for msg in corpus: self.train(msg) *************** *** 613,617 **** def untrainAll(self, corpus): '''Untrain all the messages in the corpus''' - for msg in corpus: self.untrain(msg) --- 613,616 ---- *************** *** 620,627 **** class SpamTrainer(Trainer): '''Trainer for spam''' - def __init__(self, bayes, updateprobs=NO_UPDATEPROBS): '''Constructor''' - Trainer.__init__(self, bayes, True, updateprobs) --- 619,624 ---- *************** *** 629,636 **** class HamTrainer(Trainer): '''Trainer for ham''' - def __init__(self, bayes, updateprobs=NO_UPDATEPROBS): '''Constructor''' - Trainer.__init__(self, bayes, False, updateprobs) --- 626,631 ---- From anadelonbrin at users.sourceforge.net Wed Oct 8 00:12:49 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Wed Oct 8 00:12:51 2003 Subject: [Spambayes-checkins] spambayes/spambayes message.py,1.37,1.37.2.1 Message-ID: Update of /cvsroot/spambayes/spambayes/spambayes In directory sc8-pr-cvs1:/tmp/cvs-serv12237/spambayes Modified Files: Tag: release_1_0 message.py Log Message: Backport (some) improvements to the messageinfo db: * If the (stats) db uses a pickle, then use a pickle for the messageinfo as well. * Close the db when we are no longer using it (the Python docs say that __del__ isn't guaranteed to be called here, but this is better than nothing. Something needs to explicitly close it, really. * I'm not convinced (someone hit me if I'm wrong) that we were ever sync()ing the db, so make sure that we are. * For safety, allow setId() to be called if an id is already set, as long as it's the same id. (So setId("one"); setId("one") is ok). Index: message.py =================================================================== RCS file: /cvsroot/spambayes/spambayes/spambayes/message.py,v retrieving revision 1.37 retrieving revision 1.37.2.1 diff -C2 -d -r1.37 -r1.37.2.1 *** message.py 18 Sep 2003 03:58:59 -0000 1.37 --- message.py 8 Oct 2003 04:12:47 -0000 1.37.2.1 *************** *** 92,95 **** --- 92,97 ---- import types import re + import errno + import pickle import email # for message_from_string *************** *** 107,114 **** CRLF_RE = re.compile(r'\r\n|\r|\n') ! class MessageInfoDB: def __init__(self, db_name, mode='c'): self.mode = mode ! self.db_name = db_name try: self.dbm = dbmstorage.open(self.db_name, self.mode) --- 109,166 ---- CRLF_RE = re.compile(r'\r\n|\r|\n') ! class MessageInfoBase(object): ! def __init__(self, db_name): ! self.db_name = db_name ! ! def _getState(self, msg): ! if self.db is not None: ! try: ! (msg.c, msg.t) = self.db[msg.getId()] ! except KeyError: ! pass ! ! def _setState(self, msg): ! if self.db is not None: ! self.db[msg.getId()] = (msg.c, msg.t) ! ! def _delState(self, msg): ! if self.db is not None: ! del self.db[msg.getId()] ! ! class MessageInfoPickle(MessageInfoBase): ! def __init__(self, db_name, pickle_type=1): ! MessageInfoBase.__init__(self, db_name) ! self.mode = pickle_type ! self.load() ! ! def load(self): ! try: ! fp = open(self.db_name, 'rb') ! except IOError, e: ! if e.errno == errno.ENOENT: ! # New pickle ! self.db = {} ! else: ! raise ! else: ! self.db = pickle.load(fp) ! fp.close() ! ! def close(self): ! # we keep no resources open - nothing to do ! pass ! ! def store(self): ! fp = open(self.db_name, 'wb') ! pickle.dump(self.db, fp, self.mode) ! fp.close() ! ! class MessageInfoDB(MessageInfoBase): def __init__(self, db_name, mode='c'): + MessageInfoBase.__init__(self, db_name) self.mode = mode ! self.load() ! ! def load(self): try: self.dbm = dbmstorage.open(self.db_name, self.mode) *************** *** 122,143 **** self.dbm = self.db = None ! def store(self): ! if self.db is not None: ! self.db.sync() ! def _getState(self, msg): ! if self.db is not None: ! try: ! (msg.c, msg.t) = self.db[msg.getId()] ! except KeyError: ! pass ! def _setState(self, msg): if self.db is not None: ! self.db[msg.getId()] = (msg.c, msg.t) - def _delState(self, msg): - if self.db is not None: - del self.db[msg.getId()] # This should come from a Mark Hammond idea of a master db --- 174,191 ---- self.dbm = self.db = None ! def __del__(self): ! self.close() ! def close(self): ! # Close our underlying database. Better not assume all databases ! # have close functions! ! def noop(): pass ! getattr(self.db, "close", noop)() ! getattr(self.dbm, "close", noop)() ! def store(self): if self.db is not None: ! self.db.sync() # This should come from a Mark Hammond idea of a master db *************** *** 147,151 **** message_info_db_name = options["Storage", "messageinfo_storage_file"] message_info_db_name = os.path.expanduser(message_info_db_name) ! msginfoDB = MessageInfoDB(message_info_db_name) class Message(email.Message.Message): --- 195,202 ---- message_info_db_name = options["Storage", "messageinfo_storage_file"] message_info_db_name = os.path.expanduser(message_info_db_name) ! if options["Storage", "persistent_use_database"]: ! msginfoDB = MessageInfoDB(message_info_db_name) ! else: ! msginfoDB = MessageInfoPickle(message_info_db_name) class Message(email.Message.Message): *************** *** 181,185 **** def setId(self, id): ! if self.id: raise ValueError, "MsgId has already been set, cannot be changed" --- 232,236 ---- def setId(self, id): ! if self.id and self.id != id: raise ValueError, "MsgId has already been set, cannot be changed" From anadelonbrin at users.sourceforge.net Wed Oct 8 00:59:42 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Wed Oct 8 00:59:48 2003 Subject: [Spambayes-checkins] spambayes CHANGELOG.txt,1.19.2.1,1.19.2.2 Message-ID: Update of /cvsroot/spambayes/spambayes In directory sc8-pr-cvs1:/tmp/cvs-serv17356 Modified Files: Tag: release_1_0 CHANGELOG.txt Log Message: Bring up to date. Index: CHANGELOG.txt =================================================================== RCS file: /cvsroot/spambayes/spambayes/CHANGELOG.txt,v retrieving revision 1.19.2.1 retrieving revision 1.19.2.2 diff -C2 -d -r1.19.2.1 -r1.19.2.2 *** CHANGELOG.txt 6 Oct 2003 02:38:50 -0000 1.19.2.1 --- CHANGELOG.txt 8 Oct 2003 04:59:40 -0000 1.19.2.2 *************** *** 3,6 **** --- 3,10 ---- Alpha Release 7 =============== + Tony Meyer 08/10/2003 If the (stats) db uses a pickle, then use a pickle for the messageinfo db as well. + Tony Meyer 08/10/2003 Try and close the db when we are no longer using it. + Tony Meyer 08/10/2003 Ensure that we store the messageinfo database when changes are made. + Tony Meyer 07/10/2003 Fix [ 818552 ] Exchange 2000 IMAPserver & imaplib.error: APPEND command er Tony Meyer 06/10/2003 Trivial fix for imap over ssl being offered when it is available. Tony Meyer 03/10/2003 Fix [ 810342 ] sb_smtpproxy does not work with smtplib.SMTP.sendmail() *************** *** 14,18 **** Tony Meyer 26/09/2003 If the user is using Windows, also install pop3proxy_service.py and pop3proxy_tray.py. Tony Meyer 24/09/2003 Fix sb_xmlrpcserver to work with the renamed options/scripts. ! Tony Meyer 24/09/2003 Fix [ spambayes-Bugs-809769 ] TypeError when training 1.0a6 Alpha Release 6 --- 18,22 ---- Tony Meyer 26/09/2003 If the user is using Windows, also install pop3proxy_service.py and pop3proxy_tray.py. Tony Meyer 24/09/2003 Fix sb_xmlrpcserver to work with the renamed options/scripts. ! Tony Meyer 24/09/2003 Fix [ 809769 ] TypeError when training 1.0a6 Alpha Release 6 From anadelonbrin at users.sourceforge.net Wed Oct 8 01:00:34 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Wed Oct 8 01:00:37 2003 Subject: [Spambayes-checkins] spambayes CHANGELOG.txt,1.21,1.22 Message-ID: Update of /cvsroot/spambayes/spambayes In directory sc8-pr-cvs1:/tmp/cvs-serv17591 Modified Files: CHANGELOG.txt Log Message: Bring up to date. Index: CHANGELOG.txt =================================================================== RCS file: /cvsroot/spambayes/spambayes/CHANGELOG.txt,v retrieving revision 1.21 retrieving revision 1.22 diff -C2 -d -r1.21 -r1.22 *** CHANGELOG.txt 6 Oct 2003 02:38:22 -0000 1.21 --- CHANGELOG.txt 8 Oct 2003 05:00:30 -0000 1.22 *************** *** 3,6 **** --- 3,8 ---- Release 1.1a1 ============= + Tony Meyer 08/10/2003 When training via the web interface record the training in the messageinfo db. + Tony Meyer 07/10/2003 Fix [ 818871 ] sb_server.py calls undefined variable Tony Meyer 06/10/2003 Add Tim's fix for the stats to the web interface stats as well. i.e. round the percentages, don't truncate them. Tony Meyer 06/10/2003 imapfilter: When we mark a message as deleted, mark it as read (seen) as well. *************** *** 33,36 **** --- 35,42 ---- Alpha Release 7 =============== + Tony Meyer 08/10/2003 If the (stats) db uses a pickle, then use a pickle for the messageinfo db as well. + Tony Meyer 08/10/2003 Try and close the db when we are no longer using it. + Tony Meyer 08/10/2003 Ensure that we store the messageinfo database when changes are made. + Tony Meyer 07/10/2003 Fix [ 818552 ] Exchange 2000 IMAPserver & imaplib.error: APPEND command er Tony Meyer 06/10/2003 Trivial fix for imap over ssl being offered when it is available. Tony Meyer 03/10/2003 Fix [ 810342 ] sb_smtpproxy does not work with smtplib.SMTP.sendmail() *************** *** 44,48 **** Tony Meyer 26/09/2003 If the user is using Windows, also install pop3proxy_service.py and pop3proxy_tray.py. Tony Meyer 24/09/2003 Fix sb_xmlrpcserver to work with the renamed options/scripts. ! Tony Meyer 24/09/2003 Fix [ spambayes-Bugs-809769 ] TypeError when training 1.0a6 Alpha Release 6 --- 50,54 ---- Tony Meyer 26/09/2003 If the user is using Windows, also install pop3proxy_service.py and pop3proxy_tray.py. Tony Meyer 24/09/2003 Fix sb_xmlrpcserver to work with the renamed options/scripts. ! Tony Meyer 24/09/2003 Fix [ 809769 ] TypeError when training 1.0a6 Alpha Release 6 From anadelonbrin at users.sourceforge.net Wed Oct 8 23:04:17 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Wed Oct 8 23:04:20 2003 Subject: [Spambayes-checkins] spambayes/spambayes hammiebulk.py, 1.10, 1.10.2.1 Message-ID: Update of /cvsroot/spambayes/spambayes/spambayes In directory sc8-pr-cvs1:/tmp/cvs-serv21864/spambayes Modified Files: Tag: release_1_0 hammiebulk.py Log Message: Fix bug reported on the list by John D. Somehow an old-style options statement was left in hammiebulk. Index: hammiebulk.py =================================================================== RCS file: /cvsroot/spambayes/spambayes/spambayes/hammiebulk.py,v retrieving revision 1.10 retrieving revision 1.10.2.1 diff -C2 -d -r1.10 -r1.10.2.1 *** hammiebulk.py 18 Sep 2003 15:36:30 -0000 1.10 --- hammiebulk.py 9 Oct 2003 03:04:15 -0000 1.10.2.1 *************** *** 69,74 **** # Probability at which a message is considered spam ! SPAM_THRESHOLD = options.spam_cutoff ! HAM_THRESHOLD = options.ham_cutoff --- 69,74 ---- # Probability at which a message is considered spam ! SPAM_THRESHOLD = options["Categorization", "spam_cutoff"] ! HAM_THRESHOLD = options["Categorization", "ham_cutoff"] From anadelonbrin at users.sourceforge.net Wed Oct 8 23:04:50 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Wed Oct 8 23:04:56 2003 Subject: [Spambayes-checkins] spambayes/spambayes hammiebulk.py,1.10,1.11 Message-ID: Update of /cvsroot/spambayes/spambayes/spambayes In directory sc8-pr-cvs1:/tmp/cvs-serv21895/spambayes Modified Files: hammiebulk.py Log Message: Fix bug reported on the list by John D. Somehow an old-style options statement was left in hammiebulk. Index: hammiebulk.py =================================================================== RCS file: /cvsroot/spambayes/spambayes/spambayes/hammiebulk.py,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** hammiebulk.py 18 Sep 2003 15:36:30 -0000 1.10 --- hammiebulk.py 9 Oct 2003 03:04:48 -0000 1.11 *************** *** 69,74 **** # Probability at which a message is considered spam ! SPAM_THRESHOLD = options.spam_cutoff ! HAM_THRESHOLD = options.ham_cutoff --- 69,74 ---- # Probability at which a message is considered spam ! SPAM_THRESHOLD = options["Categorization", "spam_cutoff"] ! HAM_THRESHOLD = options["Categorization", "ham_cutoff"] From anadelonbrin at users.sourceforge.net Thu Oct 9 18:39:59 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Thu Oct 9 18:40:02 2003 Subject: [Spambayes-checkins] spambayes NEWTRICKS.txt,1.3,1.4 Message-ID: Update of /cvsroot/spambayes/spambayes In directory sc8-pr-cvs1:/tmp/cvs-serv8748 Modified Files: NEWTRICKS.txt Log Message: Add an idea from Thomas Bornhaupt. Index: NEWTRICKS.txt =================================================================== RCS file: /cvsroot/spambayes/spambayes/NEWTRICKS.txt,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** NEWTRICKS.txt 15 Sep 2003 22:41:31 -0000 1.3 --- NEWTRICKS.txt 9 Oct 2003 22:39:57 -0000 1.4 *************** *** 20,21 **** --- 20,24 ---- level. Also a token indicating the ratio of message length to the number of tokens, and a token indicating the number of tokens. + + - A token indicating the ratio of hapax legomena to previously seen + tokens in the message. From mhammond at users.sourceforge.net Thu Oct 9 21:01:15 2003 From: mhammond at users.sourceforge.net (Mark Hammond) Date: Thu Oct 9 21:01:19 2003 Subject: [Spambayes-checkins] spambayes/Outlook2000 msgstore.py,1.76,1.77 Message-ID: Update of /cvsroot/spambayes/spambayes/Outlook2000 In directory sc8-pr-cvs1:/tmp/cvs-serv29394 Modified Files: msgstore.py Log Message: It is no longer necessary to pre-load our default message store, and doing so caused us to fail if this default store was in offline mode. Index: msgstore.py =================================================================== RCS file: /cvsroot/spambayes/spambayes/Outlook2000/msgstore.py,v retrieving revision 1.76 retrieving revision 1.77 diff -C2 -d -r1.76 -r1.77 *** msgstore.py 15 Sep 2003 06:25:33 -0000 1.76 --- msgstore.py 10 Oct 2003 01:01:12 -0000 1.77 *************** *** 169,173 **** self.mapi_msg_stores = {} self.default_store_bin_eid = None - self._GetMessageStore(None) os.chdir(cwd) --- 169,172 ---- From montanaro at users.sourceforge.net Fri Oct 10 22:37:45 2003 From: montanaro at users.sourceforge.net (Skip Montanaro) Date: Fri Oct 10 22:37:49 2003 Subject: [Spambayes-checkins] spambayes NEWTRICKS.txt,1.4,1.5 Message-ID: Update of /cvsroot/spambayes/spambayes In directory sc8-pr-cvs1:/tmp/cvs-serv32567 Modified Files: NEWTRICKS.txt Log Message: add strip punctuation and map digits ideas Index: NEWTRICKS.txt =================================================================== RCS file: /cvsroot/spambayes/spambayes/NEWTRICKS.txt,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** NEWTRICKS.txt 9 Oct 2003 22:39:57 -0000 1.4 --- NEWTRICKS.txt 11 Oct 2003 02:37:42 -0000 1.5 *************** *** 23,24 **** --- 23,32 ---- - A token indicating the ratio of hapax legomena to previously seen tokens in the message. + + - Punctuation sometimes gets inserted in otherwise spammy words or phrases, + e.g.: "Ch-eck ou=t ou-r sel)ection _of grea)t R_X -emgffj". It might be + helpful to try stripping punctuation. (Idea from Paul Sorenson) + + - Similarly, some letters get replaced by numbers, e.g.: "V1agra" instead of + "Viagra". Mapping numbers to suitable letters might help in some + situations. From anadelonbrin at users.sourceforge.net Mon Oct 13 00:49:54 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Mon Oct 13 00:49:58 2003 Subject: [Spambayes-checkins] website unix.ht,1.7,1.8 Message-ID: Update of /cvsroot/spambayes/website In directory sc8-pr-cvs1:/tmp/cvs-serv27307 Modified Files: unix.ht Log Message: Add the two contributed scripts to run sb_server as a daemon. Should a combination of these be added to the contrib directory, perhaps? Index: unix.ht =================================================================== RCS file: /cvsroot/spambayes/website/unix.ht,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** unix.ht 25 Sep 2003 01:20:20 -0000 1.7 --- unix.ht 13 Oct 2003 04:49:52 -0000 1.8 *************** *** 54,58 ****

If your mail program fetches mail using POP3, then you should run pop3proxy.py.

IMAP

--- 54,193 ----

If your mail program fetches mail using POP3, then you should run sb_server.py. ! !

You might wish to set sb_server.py to run as a daemon - Fernando NIO and ! Dave Handley have provided these scripts (respectively) which will allow you ! to do this: !

! #!/bin/bash
! #
! # spambayes:    Starts the spam filter as a pop3 proxy
! #
! # Version:      @(#) /etc/init.d/spambayes 1.0
! #
! # chkconfig: - 95 21
! # description: This shell script takes care of starting and stopping \
! #              spambayes pop3 proxy
! # processname: sb_server.py
! #
! # Source function library.
! . /etc/init.d/functions
! 
! SBPROXY=/opt/bin/sb_server.py
! SBLOG=/var/log/spam.log
! SBDIR=/opt/sb_data
! 
! [ -x $SBPROXY ] || exit 0
! 
! RETVAL=0
! 
! start () {
!     date >> $SBLOG
!     echo -n "Starting SpamBayes POP3 proxy: "
!     if [ ! -d $SBDIR ] ; then
!       echo "Repertoire $SBDIR non present" >> $SBLOG
!       RETVAL=1
!     else 
!       cd $SBDIR
!       ($SBPROXY 2>&1 >> $SBLOG) &
!       RETVAL=$?
!     fi
!     action "" [ $RETVAL = 0 ]
!     return $RETVAL
! }
! 
! stop () {
!     # stop daemon
!     date >> $SBLOG
!     echo -n "Stopping SpamBayes POP3 proxy: "
!     killproc $SBPROXY 1
!     RETVAL=$?
!     echo 
!       [ $RETVAL = 0 ] 
!     return $RETVAL
! }
! 
! restart () {
!     stop
!     start
!     RETVAL=$?
!     return $RETVAL
! }
! 
! # See how we were called.
! case "$1" in
!     start)
! 	start
! 	;;
!     stop)
! 	stop
! 	;;
!     status)
! 	status $SBPROXY
! 	RETVAL=$?
! 	;;
!     restart)
! 	restart
! 	;;
!     *)
!         echo "Usage: $0 {start|stop|restart|status}"
!         RETVAL=1
! esac
! 
! exit $RETVAL
! 
!
!
! #!/bin/sh
! #
! # spamd         This shell script takes care of starting and stopping
! #               the spambayes deamon.
! #
! # Author:       Dave Handley
! # Date:         11 Oct 03
! #
! 
! # Source function library.
! . /etc/rc.d/init.d/functions
! 
! # Source networking configuration.
! . /etc/sysconfig/network
! 
! RETVAL=0
! 
! # See how we were called.
! case "$1" in
!   start)
! 	# Start daemons.
! 	echo -n "Starting spamd: "
! 	cd /etc/spamd/
! 	daemon /usr/local/bin/sb_server.py &
! 	RETVAL=$?
! 	echo
! 	;;
!   stop)
! 	# Stop daemons.
! 	echo -n "Shutting down spamd: "
! 	killproc sb_server.py
! 	RETVAL=$?
! 	echo
! 	;;
!   restart|reload)
! 	$0 stop
! 	$0 start
! 	RETVAL=$?
! 	;;
!   status)
! 	status sb_server.py
! 	RETVAL=$?
! 	;;
!   *)
! 	echo "Usage: spamd {start|stop|restart|status}"
! 	exit 1
! esac
! 
! exit $RETVAL
! 
!

IMAP

From anadelonbrin at users.sourceforge.net Mon Oct 13 17:30:59 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Mon Oct 13 17:31:20 2003 Subject: [Spambayes-checkins] website faq.txt,1.48,1.49 Message-ID: Update of /cvsroot/spambayes/website In directory sc8-pr-cvs1:/tmp/cvs-serv12742 Modified Files: faq.txt Log Message: Add three new FAQs - one for the DBRunRecovery error (based on the most recent comments to the list from me and Richie), one for the 1.0a6 database problem, and one for the fact that pop3proxy_service and pop3proxy_tray are not installed by setup.py in releases up to and including 1.0a6. Index: faq.txt =================================================================== RCS file: /cvsroot/spambayes/website/faq.txt,v retrieving revision 1.48 retrieving revision 1.49 diff -C2 -d -r1.48 -r1.49 *** faq.txt 8 Oct 2003 03:12:47 -0000 1.48 --- faq.txt 13 Oct 2003 21:30:56 -0000 1.49 *************** *** 1031,1037 **** then you are probably not using dumbdbm. If you have three files (probably called ``hammie.db.dir``, ``hammie.db.dat`` and ``hammie.db.bak``), then you ! most likely are using dumbdbm, and should stop. ! Support for dumbdbm will be dropped in a future release. Note that none of this applies to the Outlook plug-in, which avoids it --- 1031,1038 ---- then you are probably not using dumbdbm. If you have three files (probably called ``hammie.db.dir``, ``hammie.db.dat`` and ``hammie.db.bak``), then you ! most likely are using dumbdbm, and should stop. Note that users of the ! pop3proxy_service can not currently use which_database.py. ! Support for dumbdbm has been dropped since release 1.0a6. Note that none of this applies to the Outlook plug-in, which avoids it *************** *** 1040,1043 **** --- 1041,1105 ---- .. _which_database.py: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/*checkout*/spambayes/spambayes/utilities/which_database.py?rev=HEAD&content-type=text/plain .. _pybsddb: http://pybsddb.sourceforge.net/ + + + I get a "DBRunRecoveryError" message. + ------------------------------------- + + If you get a message that looks like: + DBRunRecoveryError: (-30982, 'DB_RUNRECOVERY: Fatal error, run database + recovery -- fatal region error detected; run recovery') + This, sadly, means that your training database is corrupted, and you have + no choice but to delete it and train again from scratch. We don't know what + causes this to happen, but we are trying to fix it. If you find it happens + reliably for you (ie. the problem always comes back after deleting the + database and retraining), please post a message saying as much to + spambayes@python.org - no-one has yet found a case where we can reliably + reproduce the problem, so tracking it down is proving very difficult. + + If you don't want to risk it happening again, switch to using the pickle + storage (web interface: Configuration / Advanced Configuration / + Storage Options / Use database for storage: No) instead. + + Note, however, that there are two issues with this: + + * If you have an existing database and use the web interface to change + to a pickle, you'll get a '500' error as spambayes tries to open your + non-pickle as a pickle. You can simply stop SpamBayes, remove the old + database, and start SpamBayes up again to fix this. + * The "message info" database in the 1.0x releases *always* uses a dbm, + not a pickle. (This is fixed in cvs). Unless you are using + sb_imapfilter.py, you can just delete this file if it becomes corrupted, + though (assuming normal use of spambayes). Note that if you are using a + pickle and get a DBRunRecoveryError, it *has* to be this file that is + corrupted (a pickle will never give you one of those errors). + + You may also wish to read the `my database is corrupted`_ FAQ. + + .. _my database is corrupted: #my-database-keeps-getting-corrupted + + + The readme says that I can delete the files after doing "setup.py install", but then I can't find pop3proxy_service.py or pop3proxy_tray.py. + -------------------------------------------------------------------------------------------------------------------------------------------- + + This is a mistake in either the readme or setup.py in the 1.0a6 release. + It's fixed for the next release, so that pop3proxy_service.py and + pop3proxy_tray.py will also be installed to the Python scripts directory + (if you are running Windows). + For the moment, you just have to copy those files manually, or just not + delete them, and run them from the expanded archive location. + + + I can't train via the web interface in 1.0a6! + --------------------------------------------- + + There is a known problem with the 1.0a6 release, which is fixed in CVS, + and so fixed for the next release. Basically you can't use the database + after making any changes via the web interface configuration pages. + To work around this, either restart SpamBayes after using the configuration + pages, or use 1.0a5 until the next release comes out. + + The '500' error you receive will end with "Object does not support item + assignment". It may also show up on other pages than the review messages + one, such as looking up a word in the database. From anadelonbrin at users.sourceforge.net Mon Oct 13 17:44:29 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Mon Oct 13 17:44:32 2003 Subject: [Spambayes-checkins] spambayes NEWTRICKS.txt,1.5,1.6 Message-ID: Update of /cvsroot/spambayes/spambayes In directory sc8-pr-cvs1:/tmp/cvs-serv15987 Modified Files: NEWTRICKS.txt Log Message: Add the suggestions from [ 817813 ] Consider bad spelling a sign of spam Index: NEWTRICKS.txt =================================================================== RCS file: /cvsroot/spambayes/spambayes/NEWTRICKS.txt,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** NEWTRICKS.txt 11 Oct 2003 02:37:42 -0000 1.5 --- NEWTRICKS.txt 13 Oct 2003 21:44:27 -0000 1.6 *************** *** 20,24 **** level. Also a token indicating the ratio of message length to the number of tokens, and a token indicating the number of tokens. ! - A token indicating the ratio of hapax legomena to previously seen tokens in the message. --- 20,26 ---- level. Also a token indicating the ratio of message length to the number of tokens, and a token indicating the number of tokens. ! Also, [817813] add a "not in database" token (I'm not sure about this ! one, but I can't articulate why). ! - A token indicating the ratio of hapax legomena to previously seen tokens in the message. *************** *** 31,32 **** --- 33,38 ---- "Viagra". Mapping numbers to suitable letters might help in some situations. + + - [817813] Add a spelling checker and reasonable sized dictionary and generate + a "not in dictionary" token. + From anadelonbrin at users.sourceforge.net Mon Oct 13 18:02:12 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Mon Oct 13 18:02:15 2003 Subject: [Spambayes-checkins] spambayes CHANGELOG.txt,1.22,1.23 Message-ID: Update of /cvsroot/spambayes/spambayes In directory sc8-pr-cvs1:/tmp/cvs-serv20177 Modified Files: CHANGELOG.txt Log Message: Copy Skip's mboxtrain fix into the 1_0 branch. Index: CHANGELOG.txt =================================================================== RCS file: /cvsroot/spambayes/spambayes/CHANGELOG.txt,v retrieving revision 1.22 retrieving revision 1.23 diff -C2 -d -r1.22 -r1.23 *** CHANGELOG.txt 8 Oct 2003 05:00:30 -0000 1.22 --- CHANGELOG.txt 13 Oct 2003 22:02:09 -0000 1.23 *************** *** 19,23 **** Mark Hammond 29/09/2003 Don't start the pop3proxy service if a proxy is already running. Mark Hammond 29/09/2003 Outlook: Add slightly better stats, and a better framework to extend. - Skip Montanaro 26/09/2003 Correct sense of include_trained test in mbox_train. Skip Montanaro 26/09/2003 Dump TRAINED_HDR global. Reference options[...] instead. Mark Hammond 25/09/2003 Add patch [ 809008 ] safe start/stop and exlusive execution on windows --- 19,22 ---- *************** *** 48,51 **** --- 47,51 ---- Tony Meyer 29/09/2003 imapfilter: Fix trying to view imap folders before restarting and after entering in details. Tony Meyer 28/09/2003 Don't use 'pragma: no_cache' to try and stop browsers caching the web interface pages. + Skip Montanaro 26/09/2003 Correct sense of include_trained test in mbox_train. Tony Meyer 26/09/2003 If the user is using Windows, also install pop3proxy_service.py and pop3proxy_tray.py. Tony Meyer 24/09/2003 Fix sb_xmlrpcserver to work with the renamed options/scripts. From anadelonbrin at users.sourceforge.net Mon Oct 13 18:03:14 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Mon Oct 13 18:03:16 2003 Subject: [Spambayes-checkins] spambayes CHANGELOG.txt,1.19.2.2,1.19.2.3 Message-ID: Update of /cvsroot/spambayes/spambayes In directory sc8-pr-cvs1:/tmp/cvs-serv20315 Modified Files: Tag: release_1_0 CHANGELOG.txt Log Message: Copy Skip's mboxtrain fix into the 1_0 branch. Index: CHANGELOG.txt =================================================================== RCS file: /cvsroot/spambayes/spambayes/CHANGELOG.txt,v retrieving revision 1.19.2.2 retrieving revision 1.19.2.3 diff -C2 -d -r1.19.2.2 -r1.19.2.3 *** CHANGELOG.txt 8 Oct 2003 04:59:40 -0000 1.19.2.2 --- CHANGELOG.txt 13 Oct 2003 22:03:11 -0000 1.19.2.3 *************** *** 16,19 **** --- 16,20 ---- Tony Meyer 29/09/2003 imapfilter: Fix trying to view imap folders before restarting and after entering in details. Tony Meyer 28/09/2003 Don't use 'pragma: no_cache' to try and stop browsers caching the web interface pages. + Skip Montanaro 26/09/2003 Correct sense of include_trained test in mbox_train. Tony Meyer 26/09/2003 If the user is using Windows, also install pop3proxy_service.py and pop3proxy_tray.py. Tony Meyer 24/09/2003 Fix sb_xmlrpcserver to work with the renamed options/scripts. From anadelonbrin at users.sourceforge.net Mon Oct 13 18:03:14 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Mon Oct 13 18:03:19 2003 Subject: [Spambayes-checkins] spambayes/scripts sb_mboxtrain.py,1.3,1.3.2.1 Message-ID: Update of /cvsroot/spambayes/spambayes/scripts In directory sc8-pr-cvs1:/tmp/cvs-serv20315/scripts Modified Files: Tag: release_1_0 sb_mboxtrain.py Log Message: Copy Skip's mboxtrain fix into the 1_0 branch. Index: sb_mboxtrain.py =================================================================== RCS file: /cvsroot/spambayes/spambayes/scripts/sb_mboxtrain.py,v retrieving revision 1.3 retrieving revision 1.3.2.1 diff -C2 -d -r1.3 -r1.3.2.1 *** sb_mboxtrain.py 18 Sep 2003 15:36:30 -0000 1.3 --- sb_mboxtrain.py 13 Oct 2003 22:03:12 -0000 1.3.2.1 *************** *** 158,166 **** if msg_train(h, msg, is_spam, force): trained += 1 ! if not options["Headers", "include_trained"]: # Write it out with the Unix "From " line outf.write(msg.as_string(True)) ! if not options["Headers", "include_trained"]: outf.seek(0) try: --- 158,166 ---- if msg_train(h, msg, is_spam, force): trained += 1 ! if options["Headers", "include_trained"]: # Write it out with the Unix "From " line outf.write(msg.as_string(True)) ! if options["Headers", "include_trained"]: outf.seek(0) try: From anadelonbrin at users.sourceforge.net Mon Oct 13 21:54:57 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Mon Oct 13 21:55:00 2003 Subject: [Spambayes-checkins] spambayes CHANGELOG.txt, 1.23, 1.24 README-DEVEL.txt, 1.5, 1.6 Message-ID: Update of /cvsroot/spambayes/spambayes In directory sc8-pr-cvs1:/tmp/cvs-serv24856 Modified Files: CHANGELOG.txt README-DEVEL.txt Log Message: Bring changelog up-to-date. Add some hints (based on Tim's comments) about how to go about *using* the test setup, including interpreting the results. This is from memory and Tim's most recent post, so there's lots more hints from the archives that I'll try and get around to adding at some point (unless someone beats me to it). Index: CHANGELOG.txt =================================================================== RCS file: /cvsroot/spambayes/spambayes/CHANGELOG.txt,v retrieving revision 1.23 retrieving revision 1.24 diff -C2 -d -r1.23 -r1.24 *** CHANGELOG.txt 13 Oct 2003 22:02:09 -0000 1.23 --- CHANGELOG.txt 14 Oct 2003 01:54:51 -0000 1.24 *************** *** 3,6 **** --- 3,7 ---- Release 1.1a1 ============= + Mark Hammond 10/10/2003 It is no longer necessary to pre-load our default message store, and doing so caused us to fail if this default store was in offline mode. Tony Meyer 08/10/2003 When training via the web interface record the training in the messageinfo db. Tony Meyer 07/10/2003 Fix [ 818871 ] sb_server.py calls undefined variable *************** *** 34,37 **** --- 35,39 ---- Alpha Release 7 =============== + Tony Meyer 09/10/2003 An old-style option was left in hammiebulk; fix this. Tony Meyer 08/10/2003 If the (stats) db uses a pickle, then use a pickle for the messageinfo db as well. Tony Meyer 08/10/2003 Try and close the db when we are no longer using it. Index: README-DEVEL.txt =================================================================== RCS file: /cvsroot/spambayes/spambayes/README-DEVEL.txt,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** README-DEVEL.txt 20 Sep 2003 05:01:07 -0000 1.5 --- README-DEVEL.txt 14 Oct 2003 01:54:52 -0000 1.6 *************** *** 320,323 **** --- 320,452 ---- a single training set), but harder to spot using N-fold c-v. + Testing a change and posting the results + ======================================== + + (Adapted from clues Tim posted on the spambayes and spambayes-dev lists) + + Firstly, setup your data as above; it's really not worth the hassle to + come up with a different scheme. If you use the Outlook plug-in, the + export.py script in the Outlook2000 directory will export all the spam + and ham in your 'training' folders for you into this format (or close + enough). + + Basically the idea is that you should have 10 sets of data, each with + around 500 messages in them; this means about 5000 spam and 5000 ham. + Obviously if you're testing something to do with the size of a corpus, + you'll want to change that. You then want to run + timcv.py -n 10 > std.txt + (call std.txt whatever you like), and then + rates.py std.txt + You end up with two files, std.txt, which has the raw results, and stds.txt, + which has more of a summary of the results. + + Now make the change to the code or options, and repeat the process, + giving the files different names (note that rates.py will automatically + choose the name for the output file, based on the input one). + + You've now got the data you need, but you have to interpret it. The + simplest way of all is just to post it to spambayes-dev@python.org and let + someone else do it for you . The data you should post is the output of + cmp.py stds.txt alts.txt + along with the output of + table.py stds.txt alts.txt + (note that these just print to stdout). + + Other information you can find in the 'raw' output (std.txt, above) are + histograms of the ham/spam spread, and a copy of the options settings. + + Interpreting cmp.py output + -------------------------- + + (Using an example from Tim on spambayes-dev) + + > cv_octs.txt -> cv_oct_subjs.txt + > -> tested 488 hams & 897 spams against 1824 hams & 3501 spams + > -> tested 462 hams & 863 spams against 1850 hams & 3535 spams + > -> tested 475 hams & 863 spams against 1837 hams & 3535 spams + > -> tested 430 hams & 887 spams against 1882 hams & 3511 spams + > -> tested 457 hams & 888 spams against 1855 hams & 3510 spams + > -> tested 488 hams & 897 spams against 1824 hams & 3501 spams + > -> tested 462 hams & 863 spams against 1850 hams & 3535 spams + > -> tested 475 hams & 863 spams against 1837 hams & 3535 spams + > -> tested 430 hams & 887 spams against 1882 hams & 3511 spams + > -> tested 457 hams & 888 spams against 1855 hams & 3510 spams + > + > false positive percentages + > 0.000 0.000 tied + > 0.000 0.000 tied + > 0.000 0.000 tied + > 0.000 0.000 tied + > 0.219 0.219 tied + > + > won 0 times + > tied 5 times + > lost 0 times + + So all 5 runs tied on FP. That tells us much more than that the *net* + effect across 5 runs was nil on FP: it tells us that there are no hidden + glitches hiding behind that "net nothing" -- it was no change across the board. + + > total unique fp went from 1 to 1 tied + > mean fp % went from 0.0437636761488 to 0.0437636761488 tied + > + > false negative percentages + > 2.007 2.007 tied + > 1.390 1.390 tied + > 1.622 1.622 tied + > 2.029 1.917 won -5.52% + > 2.703 2.477 won -8.36% + > + > won 2 times + > tied 3 times + > lost 0 times + + When evaluating a small change, I'm heartened to see that in no run did it lose. + At worst it tied, and twice it helped a little. That's encouraging. + + What the histograms would tell us that we can't tell from this is whether you + could have done just as well without the change by raising your ham cutoff a little. + That would also tie on FP, and *may* also get rid of the same number (or even + more) of FN. + + > total unique fn went from 86 to 83 won -3.49% + > mean fn % went from 1.95029003772 to 1.88269707836 won -3.47% + > + > ham mean ham sdev + > 0.57 0.58 +1.75% 4.63 4.77 +3.02% + > 0.08 0.07 -12.50% 1.20 1.01 -15.83% + > 0.36 0.29 -19.44% 3.61 3.23 -10.53% + > 0.08 0.11 +37.50% 0.89 1.18 +32.58% + > 0.72 0.76 +5.56% 6.80 7.06 +3.82% + > + > ham mean and sdev for all runs + > 0.37 0.37 +0.00% 4.10 4.16 +1.46% + + That's a good example of grand averages hiding the truth: the averaged change + in the mean ham score was 0 across all 5 runs, but *within* the 5 runs it slobbered + around wildly, from decreasing 20% to increasing 40%(!). + + > spam mean spam sdev + > 96.43 96.44 +0.01% 15.89 15.89 +0.00% + > 97.01 97.07 +0.06% 13.79 13.70 -0.65% + > 97.14 97.16 +0.02% 14.05 14.02 -0.21% + > 96.52 96.56 +0.04% 15.65 15.52 -0.83% + > 95.53 95.63 +0.10% 17.47 17.31 -0.92% + > + > spam mean and sdev for all runs + > 96.52 96.57 +0.05% 15.46 15.37 -0.58% + + That's good to see: it's a consistent win for spam scores across runs, + although an almost imperceptible one. It's good when the mean spam score rises, + and it's good when sdev (for ham or spam) decreases. + + > ham/spam mean difference: 96.15 96.20 +0.05 + + This is a slight win for the chance, although seeing the details gives cause + to worry some about the effect on ham: the ham sdev increased overall, and + the effects on ham mean and ham sdev varied wildly across runs. OTOH, the + "before" numbers for ham mean and ham sdev varied wildly across runs already. + That gives cause to worry some about the data . + Making a source release From anadelonbrin at users.sourceforge.net Mon Oct 13 22:05:46 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Mon Oct 13 22:05:48 2003 Subject: [Spambayes-checkins] spambayes CHANGELOG.txt,1.19.2.3,1.19.2.4 Message-ID: Update of /cvsroot/spambayes/spambayes In directory sc8-pr-cvs1:/tmp/cvs-serv26463 Modified Files: Tag: release_1_0 CHANGELOG.txt Log Message: Bring changelog up-to-date. Index: CHANGELOG.txt =================================================================== RCS file: /cvsroot/spambayes/spambayes/CHANGELOG.txt,v retrieving revision 1.19.2.3 retrieving revision 1.19.2.4 diff -C2 -d -r1.19.2.3 -r1.19.2.4 *** CHANGELOG.txt 13 Oct 2003 22:03:11 -0000 1.19.2.3 --- CHANGELOG.txt 14 Oct 2003 02:05:43 -0000 1.19.2.4 *************** *** 3,6 **** --- 3,7 ---- Alpha Release 7 =============== + Tony Meyer 09/10/2003 An old-style option was left in hammiebulk; fix this. Tony Meyer 08/10/2003 If the (stats) db uses a pickle, then use a pickle for the messageinfo db as well. Tony Meyer 08/10/2003 Try and close the db when we are no longer using it. From montanaro at users.sourceforge.net Tue Oct 14 15:10:07 2003 From: montanaro at users.sourceforge.net (Skip Montanaro) Date: Tue Oct 14 15:10:13 2003 Subject: [Spambayes-checkins] spambayes/utilities which_database.py,1.4,1.5 Message-ID: Update of /cvsroot/spambayes/spambayes/utilities In directory sc8-pr-cvs1:/tmp/cvs-serv4934 Modified Files: which_database.py Log Message: need to call os.path.expanduser() since paths like ~/hammie.db are valid in the options file Index: which_database.py =================================================================== RCS file: /cvsroot/spambayes/spambayes/utilities/which_database.py,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** which_database.py 26 Sep 2003 04:23:49 -0000 1.4 --- which_database.py 14 Oct 2003 19:10:04 -0000 1.5 *************** *** 73,77 **** print ! hammie = options["Storage", "persistent_storage_file"] use_dbm = options["Storage", "persistent_use_database"] if not use_dbm: --- 73,77 ---- print ! hammie = os.path.expanduser(options["Storage", "persistent_storage_file"]) use_dbm = options["Storage", "persistent_use_database"] if not use_dbm: From montanaro at users.sourceforge.net Tue Oct 14 15:24:08 2003 From: montanaro at users.sourceforge.net (Skip Montanaro) Date: Tue Oct 14 15:24:11 2003 Subject: [Spambayes-checkins] spambayes/utilities which_database.py,1.5,1.6 Message-ID: Update of /cvsroot/spambayes/spambayes/utilities In directory sc8-pr-cvs1:/tmp/cvs-serv7406 Modified Files: which_database.py Log Message: fix bug in dbhash/bsddb[3] distinction avoid overriding builtin 'str' Index: which_database.py =================================================================== RCS file: /cvsroot/spambayes/spambayes/utilities/which_database.py,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** which_database.py 14 Oct 2003 19:10:04 -0000 1.5 --- which_database.py 14 Oct 2003 19:24:06 -0000 1.6 *************** *** 44,49 **** db["1"] = "1" db.close() ! str = whichdb.whichdb("dumbdb") ! if str: print "Dumbdbm is available." else: --- 44,49 ---- db["1"] = "1" db.close() ! dbstr = whichdb.whichdb("dumbdb") ! if dbstr: print "Dumbdbm is available." else: *************** *** 53,58 **** db["1"] = "1" db.close() ! str = whichdb.whichdb("dbhash") ! if str == "dbhash": print "Dbhash is available." else: --- 53,58 ---- db["1"] = "1" db.close() ! dbstr = whichdb.whichdb("dbhash") ! if dbstr == "dbhash": print "Dbhash is available." else: *************** *** 60,70 **** if bsddb is None: ! str = "" else: db = bsddb.hashopen("bsddb3", "c") db["1"] = "1" db.close() ! str = whichdb.whichdb("bsddb3") ! if str == "dbhash": print "Bsddb[3] is available." else: --- 60,70 ---- if bsddb is None: ! dbstr = "" else: db = bsddb.hashopen("bsddb3", "c") db["1"] = "1" db.close() ! dbstr = whichdb.whichdb("bsddb3") ! if dbstr == "dbhash": print "Bsddb[3] is available." else: *************** *** 85,93 **** if db_type == "dbhash": # could be dbhash or bsddb3 ! try: ! db = dbhash.open(hammie, "c") ! except: ! print "Your storage %s is a: bsddb3" % (hammie,) ! return elif db_type is None: print "Your storage %s is unreadable." % (hammie,) --- 85,98 ---- if db_type == "dbhash": # could be dbhash or bsddb3 ! # only bsddb3 has a __version__ attribute - old bsddb module does not ! if hasattr(bsddb, '__version__'): ! try: ! db = bsddb.hashopen(hammie, "r") ! except bsddb.error: ! pass ! else: ! db.close() ! print "Your storage", hammie, "is a: bsddb[3]" ! return elif db_type is None: print "Your storage %s is unreadable." % (hammie,) From anadelonbrin at users.sourceforge.net Tue Oct 14 18:27:12 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Tue Oct 14 18:27:19 2003 Subject: [Spambayes-checkins] spambayes README-DEVEL.txt,1.6,1.7 Message-ID: Update of /cvsroot/spambayes/spambayes In directory sc8-pr-cvs1:/tmp/cvs-serv14029 Modified Files: README-DEVEL.txt Log Message: Apparently 200 is a suitable lower bound on the number of messages in each test set, so fix the bit that asks for 500. Index: README-DEVEL.txt =================================================================== RCS file: /cvsroot/spambayes/spambayes/README-DEVEL.txt,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** README-DEVEL.txt 14 Oct 2003 01:54:52 -0000 1.6 --- README-DEVEL.txt 14 Oct 2003 22:27:09 -0000 1.7 *************** *** 332,336 **** Basically the idea is that you should have 10 sets of data, each with ! around 500 messages in them; this means about 5000 spam and 5000 ham. Obviously if you're testing something to do with the size of a corpus, you'll want to change that. You then want to run --- 332,336 ---- Basically the idea is that you should have 10 sets of data, each with ! 200 to 500 messages in them; this means about 2500 spam and 2500 ham. Obviously if you're testing something to do with the size of a corpus, you'll want to change that. You then want to run From mhammond at users.sourceforge.net Wed Oct 15 00:11:14 2003 From: mhammond at users.sourceforge.net (Mark Hammond) Date: Wed Oct 15 00:11:19 2003 Subject: [Spambayes-checkins] spambayes/Outlook2000 config_wizard.py, 1.7, 1.8 Message-ID: Update of /cvsroot/spambayes/spambayes/Outlook2000 In directory sc8-pr-cvs1:/tmp/cvs-serv2285 Modified Files: config_wizard.py Log Message: The config wizard did not handle msgstore exceptions correctly. Index: config_wizard.py =================================================================== RCS file: /cvsroot/spambayes/spambayes/Outlook2000/config_wizard.py,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** config_wizard.py 29 Aug 2003 00:08:43 -0000 1.7 --- config_wizard.py 15 Oct 2003 04:11:12 -0000 1.8 *************** *** 44,49 **** for id in ids: # Only get the folders that actually exist. ! if manager.message_store.GetFolder(id) is not None: new_config.filter.watch_folder_ids.append(id) if not new_config.filter.watch_folder_ids: for folder in manager.message_store.YieldReceiveFolders(): --- 44,53 ---- for id in ids: # Only get the folders that actually exist. ! try: ! manager.message_store.GetFolder(id) ! # if we get here, it exists! new_config.filter.watch_folder_ids.append(id) + except manager.message_store.MsgStoreException: + pass if not new_config.filter.watch_folder_ids: for folder in manager.message_store.YieldReceiveFolders(): *************** *** 52,64 **** fc = manager.config.filter if fc.spam_folder_id: ! folder = manager.message_store.GetFolder(fc.spam_folder_id) ! if folder is not None: new_config.filter.spam_folder_id = folder.GetID() wc.spam_folder_name = "" if fc.unsure_folder_id: ! folder = manager.message_store.GetFolder(fc.unsure_folder_id) ! if folder is not None: new_config.filter.unsure_folder_id = folder.GetID() wc.unsure_folder_name = "" tc = manager.config.training if tc.ham_folder_ids: --- 56,72 ---- fc = manager.config.filter if fc.spam_folder_id: ! try: ! folder = manager.message_store.GetFolder(fc.spam_folder_id) new_config.filter.spam_folder_id = folder.GetID() wc.spam_folder_name = "" + except manager.message_store.MsgStoreException: + pass if fc.unsure_folder_id: ! try: ! folder = manager.message_store.GetFolder(fc.unsure_folder_id) new_config.filter.unsure_folder_id = folder.GetID() wc.unsure_folder_name = "" + except manager.message_store.MsgStoreException: + pass tc = manager.config.training if tc.ham_folder_ids: From mhammond at users.sourceforge.net Wed Oct 15 00:12:27 2003 From: mhammond at users.sourceforge.net (Mark Hammond) Date: Wed Oct 15 00:12:30 2003 Subject: [Spambayes-checkins] spambayes/Outlook2000/dialogs FolderSelector.py, 1.30, 1.31 Message-ID: Update of /cvsroot/spambayes/spambayes/Outlook2000/dialogs In directory sc8-pr-cvs1:/tmp/cvs-serv2408 Modified Files: FolderSelector.py Log Message: Add comments reflecting the structure code has been cloned to the new win32gui_struct module. Index: FolderSelector.py =================================================================== RCS file: /cvsroot/spambayes/spambayes/Outlook2000/dialogs/FolderSelector.py,v retrieving revision 1.30 retrieving revision 1.31 diff -C2 -d -r1.30 -r1.31 *** FolderSelector.py 9 Sep 2003 02:14:28 -0000 1.30 --- FolderSelector.py 15 Oct 2003 04:12:25 -0000 1.31 *************** *** 153,156 **** --- 153,159 ---- return root + # XXX - Note - the following structure code has been copied into the new + # XXX - win32gui_struct module. One day we can rip this in preference + # XXX - for this new standard win32all module # Helpers for the ugly win32 structure packing/unpacking def _GetMaskAndVal(val, default, mask, flag): *************** *** 253,256 **** --- 256,260 ---- item = UnpackTVItem(buf_item) return hwndFrom, id, code, item + # XXX - end of code copied to win32gui_struct.py ######################################################################### From npickett at users.sourceforge.net Wed Oct 15 00:44:43 2003 From: npickett at users.sourceforge.net (Neale Pickett) Date: Wed Oct 15 00:44:46 2003 Subject: [Spambayes-checkins] website server_side.ht, 1.2, 1.3 unix.ht, 1.8, 1.9 Message-ID: Update of /cvsroot/spambayes/website In directory sc8-pr-cvs1:/tmp/cvs-serv8402 Modified Files: server_side.ht unix.ht Log Message: * Replace "hammiefilter" with "sb_filter" in a few places Index: server_side.ht =================================================================== RCS file: /cvsroot/spambayes/website/server_side.ht,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** server_side.ht 24 Sep 2003 06:16:51 -0000 1.2 --- server_side.ht 15 Oct 2003 04:44:41 -0000 1.3 *************** *** 37,41 ****
  #!/bin/sh
! /usr/bin/hammiefilter.py -d /var/spambayes/hammie.db -f | /usr/sbin/sendmail -f $*
  
--- 37,41 ----
  #!/bin/sh
! /usr/local/bin/sb_filter.py -d /var/spambayes/hammie.db -f | /usr/sbin/sendmail -f $*
  
Index: unix.ht =================================================================== RCS file: /cvsroot/spambayes/website/unix.ht,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** unix.ht 13 Oct 2003 04:49:52 -0000 1.8 --- unix.ht 15 Oct 2003 04:44:41 -0000 1.9 *************** *** 19,23 **** delivery agent and your email package picks up your primary mail from a local spool file (e.g. /var/spool/mail), you will probably find ! hammiefilter.py the easiest application to integrate into your mail environment.

An example setup is as follows (thanks to Alister Forbes for contributing this): --- 19,23 ---- delivery agent and your email package picks up your primary mail from a local spool file (e.g. /var/spool/mail), you will probably find ! sb_filter.py the easiest application to integrate into your mail environment.

An example setup is as follows (thanks to Alister Forbes for contributing this): *************** *** 25,35 ****

  • Install spambayes with the usual
    setup.py install
  • Create the database that spambayes will use to test your incoming mail: !
    /usr/local/bin/hammiefilter.py -d $HOME/.hammie.db -n
  • Train it on your existing mail. This is optional, but a good idea. -g is the flag for the known good mail, and -s is for known spam !
    /usr/local/bin/mboxtrain.py -d $HOME/.hammie.db -g $HOME/Mail/inbox -s $HOME/Mail/spam
  • Adding the following recipes to the top of your .procmailrc will get the spam and unsure stuff out of the way. Allowing everything else to be filtered as per your normal procmail recipes.
            :0fw:hamlock
    !       | /usr/local/bin/hammiefilter.py -d $HOME/.hammie.db
      
            :0
    --- 25,35 ----
      
  • Install spambayes with the usual
    setup.py install
  • Create the database that spambayes will use to test your incoming mail: !
    /usr/local/bin/sb_filter.py -d $HOME/.hammie.db -n
  • Train it on your existing mail. This is optional, but a good idea. -g is the flag for the known good mail, and -s is for known spam !
    /usr/local/bin/sb_mboxtrain.py -d $HOME/.hammie.db -g $HOME/Mail/inbox -s $HOME/Mail/spam
  • Adding the following recipes to the top of your .procmailrc will get the spam and unsure stuff out of the way. Allowing everything else to be filtered as per your normal procmail recipes.
            :0fw:hamlock
    !       | /usr/local/bin/sb_filter.py -d $HOME/.hammie.db
      
            :0
    ***************
    *** 43,47 ****
      
  • For ongoing training, there is a handy little cronjob that will run at 2:21 am every morning, training the database with good mail from Inbox and spam from caughtspam. Just add the following to your crontab !
    21 2 * * * /usr/local/bin/mboxtrain.py -d $HOME/.hammie.db -g $HOME/Mail/Inbox -s $HOME/Mail/spam
  • --- 43,47 ----
  • For ongoing training, there is a handy little cronjob that will run at 2:21 am every morning, training the database with good mail from Inbox and spam from caughtspam. Just add the following to your crontab !
    21 2 * * * /usr/local/bin/sb_mboxtrain.py -d $HOME/.hammie.db -g $HOME/Mail/Inbox -s $HOME/Mail/spam
  • *************** *** 225,229 **** Ftoc_Iterate line { set msgid [ Ftoc_MsgNumber $line ] ! eval {MhExec hammie.py -d -s $mhProfile(path)/$exmh(folder)/$msgid } } } --- 225,229 ---- Ftoc_Iterate line { set msgid [ Ftoc_MsgNumber $line ] ! eval {MhExec sb_filter.py -s $mhProfile(path)/$exmh(folder)/$msgid } } } *************** *** 233,237 **** Ftoc_Iterate line { set msgid [ Ftoc_MsgNumber $line ] ! eval {MhExec hammie.py -d -g $mhProfile(path)/$exmh(folder)/$msgid } } } --- 233,237 ---- Ftoc_Iterate line { set msgid [ Ftoc_MsgNumber $line ] ! eval {MhExec sb_filter.py -g $mhProfile(path)/$exmh(folder)/$msgid } } } From npickett at users.sourceforge.net Wed Oct 15 01:02:11 2003 From: npickett at users.sourceforge.net (Neale Pickett) Date: Wed Oct 15 01:02:14 2003 Subject: [Spambayes-checkins] spambayes/scripts sb_filter.py,1.3,1.4 Message-ID: Update of /cvsroot/spambayes/spambayes/scripts In directory sc8-pr-cvs1:/tmp/cvs-serv12145/scripts Modified Files: sb_filter.py Log Message: * Modified muttrc and spambayes.el that actually work with what's being shipped :) * Expanded documentation of sb_filter.py Index: sb_filter.py =================================================================== RCS file: /cvsroot/spambayes/spambayes/scripts/sb_filter.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** sb_filter.py 24 Sep 2003 06:53:36 -0000 1.3 --- sb_filter.py 15 Oct 2003 05:02:08 -0000 1.4 *************** *** 33,39 **** [EXPERIMENTAL] filter and train based on the result (you must make sure to untrain all mistakes later) ! * -g [EXPERIMENTAL] (re)train as a good (ham) message ! * -s [EXPERIMENTAL] (re)train as a bad (spam) message * -G --- 33,39 ---- [EXPERIMENTAL] filter and train based on the result (you must make sure to untrain all mistakes later) ! *+ -g [EXPERIMENTAL] (re)train as a good (ham) message ! *+ -s [EXPERIMENTAL] (re)train as a bad (spam) message * -G *************** *** 79,86 **** ! mutt configuration. This binds the 'H' key to retrain the message as ham, and prompt for a folder to move it to. The 'S' key retrains as ! spam, and moves to a 'spam' folder. ! XXX: add this """ --- 79,93 ---- ! mutt configuration: This binds the 'H' key to retrain the message as ham, and prompt for a folder to move it to. The 'S' key retrains as ! spam, and moves to a 'spam' folder. See contrib/muttrc in the spambayes ! distribution for other neat mutt tricks. ! ! macro index S "|sb_filter.py -s | procmail\n" ! macro pager S "|sb_filter.py -s | procmail\n" ! macro index H "|sb_filter.py -g | procmail\n" ! macro pager H "|sb_filter.py -g | procmail\n" ! color index red black "~h 'X-Spambayes-Disposition: spam' ~F" ! """ From npickett at users.sourceforge.net Wed Oct 15 01:02:10 2003 From: npickett at users.sourceforge.net (Neale Pickett) Date: Wed Oct 15 01:02:15 2003 Subject: [Spambayes-checkins] spambayes/contrib muttrc, 1.3, 1.4 spambayes.el, 1.4, 1.5 Message-ID: Update of /cvsroot/spambayes/spambayes/contrib In directory sc8-pr-cvs1:/tmp/cvs-serv12145/contrib Modified Files: muttrc spambayes.el Log Message: * Modified muttrc and spambayes.el that actually work with what's being shipped :) * Expanded documentation of sb_filter.py Index: muttrc =================================================================== RCS file: /cvsroot/spambayes/spambayes/contrib/muttrc,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** muttrc 5 Jun 2003 04:28:37 -0000 1.3 --- muttrc 15 Oct 2003 05:02:08 -0000 1.4 *************** *** 7,16 **** ## ## :0fw ! ## | hammiefilter.py -t ## ## ! ## This binds 'S' to refile as spam and move to a 'caughtspam' folder. ! ## 'H' will refile as ham and move to your inbox. You will want to use ! ## these on every misclassified message. ## ## As a special bonus, all tagged spam will be colored red on black. --- 7,17 ---- ## ## :0fw ! ## | sb_filter.py -t ## ## ! ## This binds 'S' to train on the current message as spam, and 'H' to ! ## train on the current message as ham. Both of these commands ! ## re-classify the message and send it through procmail, so you'll have ! ## two copies after running them. ## ## As a special bonus, all tagged spam will be colored red on black. *************** *** 20,26 **** ## helping out with the muttisms. ## ! folder-hook . "macro index S '|hammiefilter.py -s\n =caughtspam\n'" ! folder-hook . "macro pager S '|hammiefilter.py -s\n =caughtspam\n'" ! folder-hook . "macro index H '|hammiefilter.py -g\r !\r'" ! folder-hook . "macro pager H '|hammiefilter.py -g\r !\r'" color index red black "~h 'X-Spambayes-Disposition: spam' ~F" --- 21,38 ---- ## helping out with the muttisms. ## ! macro index S "|sb_filter.py -s | procmail\n" ! macro pager S "|sb_filter.py -s | procmail\n" ! macro index H "|sb_filter.py -g | procmail\n" ! macro pager H "|sb_filter.py -g | procmail\n" color index red black "~h 'X-Spambayes-Disposition: spam' ~F" + + ## If you're feeling bold and don't mind the possibility of losing mail, + ## you can uncomment these lines. These bindings automatically delete + ## the message in addition to retraining and sending through procmail. + ## If there's a problem with sb_filter, though, the message will be lost + ## forever. + ## + #macro index S "|sb_filter.py -s | procmail\n" + #macro pager S "|sb_filter.py -s | procmail\n" + #macro index H "|sb_filter.py -g | procmail\n" + #macro pager H "|sb_filter.py -g | procmail\n" Index: spambayes.el =================================================================== RCS file: /cvsroot/spambayes/spambayes/contrib/spambayes.el,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** spambayes.el 10 Jun 2003 14:03:26 -0000 1.4 --- spambayes.el 15 Oct 2003 05:02:08 -0000 1.5 *************** *** 1,5 **** ;; spambayes.el -- integrate spambayes into Gnus and VM ;; Copyright (C) 2003 Neale Pickett ! ;; Time-stamp: <2003-06-06 10:07:09 neale> ;; This is free software; you can redistribute it and/or modify it under --- 1,5 ---- ;; spambayes.el -- integrate spambayes into Gnus and VM ;; Copyright (C) 2003 Neale Pickett ! ;; Time-stamp: <2003-10-14 21:59:11 neale> ;; This is free software; you can redistribute it and/or modify it under *************** *** 19,42 **** ;; Purpose: ;; ! ;; Functions to put spambayes into Gnus. ! ;; ! ;; This assumes you are already filtering with a procmail recipie ! ;; similar to: ! ;; ! ;; :0fw ! ;; | hammiefilter.py -t ! ;; ! ;; If you can't run procmail on all your incoming messages, you shold ! ;; have a look at spam.el, which is included with Oort Gnus. ! ;; ! ;; This binds "B s" to "refile as spam", and "B h" to "refile as ham". ! ;; After refiling, the message is rescored and respooled. I haven't yet ! ;; run across a case where refiling doesn't change a message's score ! ;; well into the ham or spam range. If this happens to you, please let ! ;; me know. - ;; Installation: - ;; - ;; ;; GNUS ;; ---- --- 19,24 ---- ;; Purpose: ;; ! ;; Functions to put spambayes into Gnus and VM. ;; GNUS ;; ---- *************** *** 44,55 **** ;; following lines in ~/.gnus: ;; ! ;; (load-library "spambayes") ! ;; (add-hook ! ;; 'gnus-sum-load-hook ! ;; (lambda nil ! ;; (define-key gnus-summary-mode-map [(B) (s)] 'spambayes-gnus-refile-as-spam) ! ;; (define-key gnus-summary-mode-map [(B) (h)] 'spambayes-gnus-refile-as-ham))) ;; ;; ;; VM (Courtesy of Prabhu Ramachandran ) ;; ---- --- 26,55 ---- ;; following lines in ~/.gnus: ;; ! ;; (setq gnus-sum-load-hook ! ;; (lambda () ! ;; (require 'spambayes) ! ;; (define-key gnus-summary-mode-map [(B) (s)] 'spambayes-gnus-refile-as-spam) ! ;; (define-key gnus-summary-mode-map [(B) (h)] 'spambayes-gnus-refile-as-ham))) ! ;; ! ;; In summary mode, "B h" will refile a message as ham, and "B s", ! ;; appropriately enough, will refile a message as spam. ;; ;; + ;; You can also put the following in ~/.gnus to run messages through the + ;; filter as Gnus reads them in: + ;; + ;; (setq nnmail-prepare-incoming-message-hook 'spambayes-filter-buffer) + ;; + ;; You can then use Gnus message splitting (looking at the + ;; X-Spambayes-Classification header) to file messages based on the + ;; spambayes score. + ;; + ;; Some folks may prefer using procmail to score messages when they + ;; arrive. See README.txt in the distribution for more information on + ;; how to do this. + + + + ;; VM (Courtesy of Prabhu Ramachandran ) ;; ---- *************** *** 70,74 **** ;; ) ;; ) ! ;; ;; Hitting the 'A' key will refile messages to the SPAM and UNSURE folders. ;; --- 70,74 ---- ;; ) ;; ) ! ;; ;; Hitting the 'A' key will refile messages to the SPAM and UNSURE folders. ;; *************** *** 83,94 **** ! (defvar spambayes-spam-group "spam" ! "Group name for spam messages") ! ! (defvar spambayes-hammiefilter "~/src/spambayes/hammiefilter.py" ! "Path to the hammiefilter program") ;; Gnus (defun spambayes-gnus-retrain (is-spam) "Retrain on all processable articles, or the one under the cursor. --- 83,108 ---- ! (defvar spambayes-filter-program "/usr/local/bin/sb_filter.py" ! "Path to the sb_filter program.") + ;; Gnus + (defun spambayes-filter-buffer (&optional buffer) + "Filter a buffer through Spambayes. + + This pipes the a buffer through Spambayes, which adds its headers. The + output of Spambayes replaces the contents of the buffer. If no buffer + is specified, the current buffer is used. + " + (shell-command-on-region + (point-min) + (point-max) + (concat + spambayes-filter-program + " -f") + (or buffer (current-buffer)) + t)) + (defun spambayes-gnus-retrain (is-spam) "Retrain on all processable articles, or the one under the cursor. *************** *** 108,112 **** (point-max) (concat ! spambayes-hammiefilter (if is-spam " -s" " -g") " -f") --- 122,126 ---- (point-max) (concat ! spambayes-filter-program (if is-spam " -s" " -g") " -f") *************** *** 128,132 **** "Retrain and refilter all process-marked messages as spam, then respool them" (interactive) ! (spambayes-retrain 't) (gnus-summary-respool-article nil (gnus-group-method gnus-newsgroup-name))) --- 142,146 ---- "Retrain and refilter all process-marked messages as spam, then respool them" (interactive) ! (spambayes-gnus-retrain 't) (gnus-summary-respool-article nil (gnus-group-method gnus-newsgroup-name))) *************** *** 134,141 **** "Retrain and refilter all process-marked messages as ham, then respool them" (interactive) ! (spambayes-retrain nil) (gnus-summary-respool-article nil (gnus-group-method gnus-newsgroup-name))) ;;; VM --- 148,156 ---- "Retrain and refilter all process-marked messages as ham, then respool them" (interactive) ! (spambayes-gnus-retrain nil) (gnus-summary-respool-article nil (gnus-group-method gnus-newsgroup-name))) + ;;; VM *************** *** 148,154 **** (interactive) (message (concat "Retraining" (if is-spam " as SPAM" " as HAM") " ...")) ! (vm-pipe-message-to-command ! (concat spambayes-hammiefilter (if is-spam " -s" " -g") " -f") nil) ! (message (concat "Done retraining messages" (if is-spam " as SPAM" " as HAM") ".") ) ) --- 163,169 ---- (interactive) (message (concat "Retraining" (if is-spam " as SPAM" " as HAM") " ...")) ! (vm-pipe-message-to-command ! (concat spambayes-filter-program (if is-spam " -s" " -g") " -f") nil) ! (message (concat "Done retraining messages" (if is-spam " as SPAM" " as HAM") ".") ) ) *************** *** 165,166 **** --- 180,183 ---- (spambayes-vm-retrain nil) ) + + (provide 'spambayes) From richiehindle at users.sourceforge.net Wed Oct 15 02:57:21 2003 From: richiehindle at users.sourceforge.net (Richie Hindle) Date: Wed Oct 15 03:16:16 2003 Subject: [Spambayes-checkins] spambayes/spambayes Dibbler.py,1.7,1.8 Message-ID: Update of /cvsroot/spambayes/spambayes/spambayes In directory sc8-pr-cvs1:/tmp/cvs-serv29003 Modified Files: Dibbler.py Log Message: Increased the auth-digest login timeout from one minute to twenty. One minute was making it time out before people even had time to fill in the training page. Index: Dibbler.py =================================================================== RCS file: /cvsroot/spambayes/spambayes/spambayes/Dibbler.py,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** Dibbler.py 2 Sep 2003 22:47:48 -0000 1.7 --- Dibbler.py 15 Oct 2003 06:57:19 -0000 1.8 *************** *** 583,589 **** def _getCurrentNonce(self): """Returns the current nonce value. This value is a Base64 encoding ! of current time plus one minute. This means the nonce will expire a ! minute from now.""" ! timeString = time.asctime(time.localtime(time.time() + 60)) return base64.encodestring(timeString).rstrip('\n=') --- 583,589 ---- def _getCurrentNonce(self): """Returns the current nonce value. This value is a Base64 encoding ! of current time plus 20 minutes. This means the nonce will expire 20 ! minutes from now.""" ! timeString = time.asctime(time.localtime(time.time() + 20*60)) return base64.encodestring(timeString).rstrip('\n=') From montanaro at users.sourceforge.net Wed Oct 15 09:06:43 2003 From: montanaro at users.sourceforge.net (Skip Montanaro) Date: Wed Oct 15 09:06:48 2003 Subject: [Spambayes-checkins] spambayes README-DEVEL.txt,1.7,1.8 Message-ID: Update of /cvsroot/spambayes/spambayes In directory sc8-pr-cvs1:/tmp/cvs-serv20194 Modified Files: README-DEVEL.txt Log Message: Remove the 2500 spam and ham reference. It didn't follow from the 200-500 messages per bucket. Index: README-DEVEL.txt =================================================================== RCS file: /cvsroot/spambayes/spambayes/README-DEVEL.txt,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** README-DEVEL.txt 14 Oct 2003 22:27:09 -0000 1.7 --- README-DEVEL.txt 15 Oct 2003 13:06:41 -0000 1.8 *************** *** 332,338 **** Basically the idea is that you should have 10 sets of data, each with ! 200 to 500 messages in them; this means about 2500 spam and 2500 ham. ! Obviously if you're testing something to do with the size of a corpus, ! you'll want to change that. You then want to run timcv.py -n 10 > std.txt (call std.txt whatever you like), and then --- 332,338 ---- Basically the idea is that you should have 10 sets of data, each with ! 200 to 500 messages in them. Obviously if you're testing something to ! do with the size of a corpus, you'll want to change that. You then want ! to run timcv.py -n 10 > std.txt (call std.txt whatever you like), and then From anadelonbrin at users.sourceforge.net Wed Oct 15 18:58:45 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Wed Oct 15 18:58:48 2003 Subject: [Spambayes-checkins] website quotes.ht,1.7,1.8 Message-ID: Update of /cvsroot/spambayes/website In directory sc8-pr-cvs1:/tmp/cvs-serv9170 Modified Files: quotes.ht Log Message: Add an off-the-cuff compliment about spambayes from a wired news article. Index: quotes.ht =================================================================== RCS file: /cvsroot/spambayes/website/quotes.ht,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** quotes.ht 2 Oct 2003 00:02:18 -0000 1.7 --- quotes.ht 15 Oct 2003 22:58:42 -0000 1.8 *************** *** 66,69 **** --- 66,78 ----

    +

    + Outlook 2003 accurately blocked roughly 85 percent of an average day's spam, + while 2002 topped out at about 65 percent, an increase of 20 percent more + junk e-mail filtered. That said, free open-source filters like SpamBayes + can block about 98 percent of spam. + Michelle Delio praising the improvements in Outlook's built-in spam filtering in + a Wired News article. +

    +

    What we are saying about us

    From anadelonbrin at users.sourceforge.net Thu Oct 16 17:21:02 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Thu Oct 16 17:21:07 2003 Subject: [Spambayes-checkins] website faq.txt,1.49,1.50 Message-ID: Update of /cvsroot/spambayes/website In directory sc8-pr-cvs1:/tmp/cvs-serv14719 Modified Files: faq.txt Log Message: Make the FAQ more accurately reflect current reality. Index: faq.txt =================================================================== RCS file: /cvsroot/spambayes/website/faq.txt,v retrieving revision 1.49 retrieving revision 1.50 diff -C2 -d -r1.49 -r1.50 *** faq.txt 13 Oct 2003 21:30:56 -0000 1.49 --- faq.txt 16 Oct 2003 21:21:00 -0000 1.50 *************** *** 87,91 **** ------------------------------------ ! There are four mailing lists which support SpamBayes: 1. The `SpamBayes list`_ provides a place for users to get help with --- 87,91 ---- ------------------------------------ ! There are five mailing lists which support SpamBayes: 1. The `SpamBayes list`_ provides a place for users to get help with *************** *** 102,105 **** --- 102,111 ---- developers. + 5. The `SpamBayes bugs list`_ receives copies of all the bug, patch, + support requests and feature request reports that are submitted via the + `sourceforge`_ system. This is generally only of interest to developers + (you can use the sourceforge system to monitor any individual bugs that + you are interested in). + All the mailing lists are managed by Mailman, which uses pipermail to archive messages. There is no search capability, so your best bet is to use *************** *** 117,120 **** --- 123,128 ---- .. _SpamBayes announcements list: http://mail.python.org/mailman/listinfo/spambayes-announce .. _SpamBayes checkins list: http://mail.python.org/mailman/listinfo/spambayes-checkins + .. _SpamBayes bugs list: http://mail.python.org/mailman/listinfo/spambayes-bugs + .. _sourceforge: http://www.sourceforge.net *************** *** 243,251 **** instance. ! 7. The Hammie script. This does three jobs: command-line training, procmail ! filtering, and XML-RPC. See below for details of how to use Hammie for ! training, and how to use it as procmail filter. Hammie can also run as an XML-RPC server, so that a programmer can write code that uses a remote ! server to classify emails programmatically - see hammiesrv.py. 8. The IMAP filter. This is a cross between the POP3 proxy and the Outlook --- 251,259 ---- instance. ! 7. The filter script. This does three jobs: command-line training, procmail ! filtering, and XML-RPC. See below for details of how to use sb_filter for ! training, and how to use it as procmail filter. SpamBayes can also run as an XML-RPC server, so that a programmer can write code that uses a remote ! server to classify emails programmatically - see sb_xmlrpcsrv.py. 8. The IMAP filter. This is a cross between the POP3 proxy and the Outlook *************** *** 262,273 **** ------------------------------- ! The Hammie script is called hammie.py. The POP3 proxy lives in pop3proxy.py, ! and the smtpproxy lives in smtpproxy.py. The IMAP filter lives in ! imapfilter.py. The Outlook plug-in lives in the Outlook2000 subdirectory ! - see the README.txt in that directory for more information on that. As well as these components, there's also a whole pile of utility scripts, ! test harnesses and so on - see README.txt and TESTING.txt in the ! SpamBayes distribution for more information. --- 270,283 ---- ------------------------------- ! The filter script is called sb_filter.py. The POP3 proxy lives in sb_server.py; ! to upload to the server use sb_upload.py. The IMAP filter lives in ! sb_imapfilter.py. These all live in the scripts directory - Windows users ! can find non-command-line versions in the windows directory. The Outlook ! plug-in lives in the Outlook2000 subdirectory - see the README.txt in that ! directory for more information on that. As well as these components, there's also a whole pile of utility scripts, ! test harnesses and so on - see README.txt, README-DEVEL.txt and TESTING.txt ! in the SpamBayes distribution for more information. *************** *** 284,295 **** difficult to create a plugin for it. ! You can use pop3proxy and/or imapfilter with Outlook Express, however you ! must have either the alpha 3 release, or a recent CVS snapshot in order to ! do so (alpha 2 does not include all the necessary features). Because Outlook Express does not let you filter on arbitrary headers (like ! X-Spambayes-Classification), pop3proxy must add the classification to the "To:" line, or the "Subject" line. ! Pop3proxy/imapfilter aren't quite as 'transparent' as the Outlook plugin, but they're still quite easy to use/setup, and they use the same core, so the results will be the same. We are working on an alternative that should --- 294,303 ---- difficult to create a plugin for it. ! You can use sb_server and/or sb_imapfilter with Outlook Express. Because Outlook Express does not let you filter on arbitrary headers (like ! X-Spambayes-Classification), sb_server must add the classification to the "To:" line, or the "Subject" line. ! sb_server/sb_imapfilter aren't quite as 'transparent' as the Outlook plugin, but they're still quite easy to use/setup, and they use the same core, so the results will be the same. We are working on an alternative that should *************** *** 305,309 **** :0fw ! | /opt/spambayes/hammiefilter.py Follow that with a recipe to check the results and take action:: --- 313,317 ---- :0fw ! | /opt/spambayes/sb_filter.py Follow that with a recipe to check the results and take action:: *************** *** 324,328 **** (vm-save-message (expand-file-name "~/tmp/newspam")) (vm-add-message-labels "trained" 1)) ! (vm-pipe-message-to-command "hammiefilter.py -s >/dev/null" nil)) (defun train-as-nonspam () --- 332,336 ---- (vm-save-message (expand-file-name "~/tmp/newspam")) (vm-add-message-labels "trained" 1)) ! (vm-pipe-message-to-command "sb_filter.py -s >/dev/null" nil)) (defun train-as-nonspam () *************** *** 331,335 **** (vm-save-message (expand-file-name "~/tmp/newham")) (vm-add-message-labels "trained" 1)) ! (vm-pipe-message-to-command "hammiefilter.py -g >/dev/null" nil)) (define-key vm-mode-map "ls" 'train-as-spam) --- 339,343 ---- (vm-save-message (expand-file-name "~/tmp/newham")) (vm-add-message-labels "trained" 1)) ! (vm-pipe-message-to-command "sb_filter.py -g >/dev/null" nil)) (define-key vm-mode-map "ls" 'train-as-spam) *************** *** 347,351 **** IMAP_ proxies which are part of the SpamBayes source. ! .. _POP3: http://spambayes.sf.net/applications.html#pop3 .. _IMAP: http://spambayes.sf.net/applications.html#imap --- 355,359 ---- IMAP_ proxies which are part of the SpamBayes source. ! .. _POP3: http://spambayes.sf.net/applications.html#sb_server .. _IMAP: http://spambayes.sf.net/applications.html#imap *************** *** 374,380 **** modify. ! 3. Configure pop3proxy for each of Eudora's personalities' POP3 servers, specifying a separate port for each. For example 1110, 1120, 1130 and ! 1140 for four personalities. Do the same for smtpproxy - for example 1115, 1125, 1135 and 1145 corresponding to the four POP3 servers. --- 382,388 ---- modify. ! 3. Configure sb_server for each of Eudora's personalities' POP3 servers, specifying a separate port for each. For example 1110, 1120, 1130 and ! 1140 for four personalities. Do the same for sb_smtpproxy - for example 1115, 1125, 1135 and 1145 corresponding to the four POP3 servers. *************** *** 429,433 **** Previous versions of the binary had a number of problems with various versions of Outlook/Windows. However, to our knowledge, the current version ! should work with any combination of Windows/Outlook versions. Please let us know if this is not the case. The `troubleshooting guide`_ for the Outlook plugin contains the most up-to-date help for working around known problems. --- 437,441 ---- Previous versions of the binary had a number of problems with various versions of Outlook/Windows. However, to our knowledge, the current version ! should work with any combination of Windows/Outlook versions. Please let us know if this is not the case. The `troubleshooting guide`_ for the Outlook plugin contains the most up-to-date help for working around known problems. *************** *** 435,441 **** If you fall into that category, note that you must have applied all the technical refreshes released by Microsoft to use the plugin successfully. ! Better yet, upgrade to the final version when it's available. ! .. _troubleshooting guide: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/*checkout*/spambayes/spambayes/Outlook2000/docs/troubleshooting.html?rev=HEAD&content-type=text/plain --- 443,449 ---- If you fall into that category, note that you must have applied all the technical refreshes released by Microsoft to use the plugin successfully. ! Better yet, upgrade to the final version now that it's available. ! .. _troubleshooting guide: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/*checkout*/spambayes/spambayes/Outlook2000/docs/troubleshooting.html?rev=HEAD&content-type=text/html *************** *** 455,483 **** -------------------------------------------------------- ! This is a 'hidden' feature in the post 003 releases of the binary (also post ! alpha3 source releases and CVS). Details about how to enable this feature ! can be found in the "configuration.html" file in the "docs" directory in ! the folder SpamBayes was installed to. You can also set up mail that is ! trained using the "Delete as spam" button to be marked as read, rather than ! all mail classified as spam. However, you should also see the ! `envelope icon question`_. .. _`envelope icon question`: #how-can-I-get-rid-of-the-envelope-tray-icon-for-spam - Outlook forgets all training/configuration when I quit and start again - ---------------------------------------------------------------------- - - This is a known problem with the 002 release of the plug-in (or earlier). - What is probably happening is that Outlook is not shutting down properly - or completely, or is being forced to shut down too quickly. This version - of the plug-in only saves training/configuration data on shut-down, so - this can result in training/configuration being lost. To get around this - problem, exit Outlook (not by restarting/shutting down the machine), and - make sure that it is completely shut down (use the Task Manager to check). - This should save your training and configuration. The 003 release (and - later) saves as required, so avoids this issue. - - Can I back up the Outlook database? Should I do this? ------------------------------------------------------ --- 463,473 ---- -------------------------------------------------------- ! Yes, in version 008 and above of the plugin. You can find this on the ! filtering tab of the SpamBayes manager dialog. However, you should also ! see the `envelope icon question`_. .. _`envelope icon question`: #how-can-I-get-rid-of-the-envelope-tray-icon-for-spam Can I back up the Outlook database? Should I do this? ------------------------------------------------------ *************** *** 534,537 **** --- 524,529 ---- 4. Changed the action to "copy" or "move", rather than "untouched" + 5. Ticked the "enable SpamBayes" checkbox on the first tab of the dialog. + How can I get rid of the envelope tray icon for spam? *************** *** 548,552 **** Until someone comes up with a clever solution for all of this, you'll have to ! put up with the little envelope, sorry. --- 540,545 ---- Until someone comes up with a clever solution for all of this, you'll have to ! put up with the little envelope, sorry. Note that there is a feature request ! already open for this, which you may add to if you have comments to make. *************** *** 562,570 **** require you to perform a full re-train. Will "Show Spam Clues" notify a spammer that I opened their message? -------------------------------------------------------------------- We think not (but we don't have the source code to Outlook to check ! for sure). In general, there are 2 ways spammers can determine this; the first is via an automatic 'Read Receipt' (but this is unusual, as the "from" address is generally forged so the receipt goes nowhere --- 555,564 ---- require you to perform a full re-train. + Will "Show Spam Clues" notify a spammer that I opened their message? -------------------------------------------------------------------- We think not (but we don't have the source code to Outlook to check ! for sure). In general, there are two ways spammers can determine this; the first is via an automatic 'Read Receipt' (but this is unusual, as the "from" address is generally forged so the receipt goes nowhere *************** *** 618,622 **** that it doesn't work as well with Western European language. It might work very well with them if these default values are changed in the user's ini ! file: [Tokenizer] --- 612,617 ---- that it doesn't work as well with Western European language. It might work very well with them if these default values are changed in the user's ini ! file (note that for Outlook users, this means the default_bayes_customize.ini ! file, rather than the one called Outlook.ini, or named after your profile): [Tokenizer] *************** *** 654,661 **** number of spams as hams. ! You can train it on lots of messages in one go by either using the Hammie script as explained in the "Command-line training" section, or by giving messages to the web interface via the "Train" form on the Home page. You ! can train on individual messages (which is tedious) or using mbox files. --- 649,657 ---- number of spams as hams. ! You can train it on lots of messages in one go by either using the sb_filter script as explained in the "Command-line training" section, or by giving messages to the web interface via the "Train" form on the Home page. You ! can train on individual messages (which is tedious), using mbox files or ! using Outlook Express dbx files. *************** *** 668,681 **** spambayes_spam@localhost, and if the message should have been classified as ham, forward it to spambayes_ham@localhost. You can still review the ! training through the web interface, if you wish to do so. ! ! Note that you must set (via the web interface) the "add mail id to" option ! in order to use this. You can also use this id to find a particular message ! via the web interface. Note that some mail clients (particularly Outlook Express) do not forward ! all headers when you bounce, forward or redirect mail. For these clients, ! you will need to set (via the web interface) the "add mail id to" option to ! body, which will add a unique id to the body of each message you receive. --- 664,674 ---- spambayes_spam@localhost, and if the message should have been classified as ham, forward it to spambayes_ham@localhost. You can still review the ! training through the web interface, if you wish to do so. You should ensure ! that the "lookup message in cache" option is set to True/Yes before you use ! this. Note that some mail clients (particularly Outlook Express) do not forward ! all headers when you bounce, forward or redirect mail. We do not recommend ! using the SMTP proxy with these clients. *************** *** 687,691 **** containing nothing but ham, you can train SpamBayes using a command like:: ! hammie.py -g ~/tmp/newham -s ~/tmp/newspam The above command is OS-centric (e.g., UNIX, or Windows command prompt). --- 680,684 ---- containing nothing but ham, you can train SpamBayes using a command like:: ! sb_mboxtrain.py -g ~/tmp/newham -s ~/tmp/newspam The above command is OS-centric (e.g., UNIX, or Windows command prompt). *************** *** 703,707 **** The plugin does *not* train on all incoming mail. However, if you use the "Delete as spam" and "Recover from spam" buttons, those messages will be ! (re)trained as necessary. --- 696,702 ---- The plugin does *not* train on all incoming mail. However, if you use the "Delete as spam" and "Recover from spam" buttons, those messages will be ! (re)trained as necessary. If you have set it to use incremental training ! then it will also train on messages which are moved into the spam folder ! and those folders that you are 'watching'. *************** *** 730,734 **** never seen this particular flavor of spam before), or maybe there aren't enough clues in the message which the system is aware of as strong spam ! clues. --- 725,733 ---- never seen this particular flavor of spam before), or maybe there aren't enough clues in the message which the system is aware of as strong spam ! clues. You should look at the clues that SpamBayes generated, and that ! should give you an idea of the reason for the classification. Both the ! web interface and the Outlook plug-in let you view the clues that make ! up the message. If you still can't figure out the reason why, you can ! ask the mailing list for advice. *************** *** 806,810 **** `bayescustomize.ini` or `.spambayesrc`. In here you can configure the name and type of your database, your ham and spam cutoffs, and so on. The ! default values for all the options, and the documentation for them, lives in Options.py. --- 805,809 ---- `bayescustomize.ini` or `.spambayesrc`. In here you can configure the name and type of your database, your ham and spam cutoffs, and so on. The ! default values for all the options, and the documentation for them, live in Options.py. *************** *** 892,896 **** Sadly, not much is done in the way of testing these days. Hopefully this will change, though, and if you're interested it's definately an option. ! Check out the README for information about how to get started. This is the way to go if you have a new idea, too - even if you convince someone else to develop it, we'll expect you to put in time to test its effectiveness. --- 891,895 ---- Sadly, not much is done in the way of testing these days. Hopefully this will change, though, and if you're interested it's definately an option. ! Check out the README-DEVEL for information about how to get started. This is the way to go if you have a new idea, too - even if you convince someone else to develop it, we'll expect you to put in time to test its effectiveness. *************** *** 956,960 **** "persistent_storage_file" option (also in the "Storage" section). ! If you specify your database on the command line ("pop3proxy.py -d hammie.db", for example), then you should use the "-D" switch instead. Note, however, that it is likely that these switches will change in a future release, and --- 955,959 ---- "persistent_storage_file" option (also in the "Storage" section). ! If you specify your database on the command line ("sb_server.py -d hammie.db", for example), then you should use the "-D" switch instead. Note, however, that it is likely that these switches will change in a future release, and *************** *** 987,991 **** also do this via the web configuration, without having to alter the configuration file manually. The option you are after is called ! ``Allowed remote connections``. --- 986,991 ---- also do this via the web configuration, without having to alter the configuration file manually. The option you are after is called ! ``Allowed remote connections``. In versions after 1.0a5, you can also ! set the interface to use HTTP-AUTH, either Basic or Digest. *************** *** 993,1001 **** ------------------------------------------------------------------------------ ! If you use pop3proxy or imapfilter, haven't set anything up, and run it and get an error that ends with ``socket.error: (10013, 'Permission denied')``, then this probably means that port 8880, which SpamBayes is trying to use to present the web interface, is already taken on your machine. Try using ! ``pop3proxy.py -u 8881 -b`` (or ``imapfilter.py -u 8881 -b``), or another port that you know is free and available on your machine. --- 993,1001 ---- ------------------------------------------------------------------------------ ! If you use sb_server or sb_imapfilter, haven't set anything up, and run it and get an error that ends with ``socket.error: (10013, 'Permission denied')``, then this probably means that port 8880, which SpamBayes is trying to use to present the web interface, is already taken on your machine. Try using ! ``sb_server.py -u 8881 -b`` (or ``sb_imapfilter.py -u 8881 -b``), or another port that you know is free and available on your machine. From anadelonbrin at users.sourceforge.net Mon Oct 20 18:41:59 2003 From: anadelonbrin at users.sourceforge.net (Tony Meyer) Date: Mon Oct 20 18:42:06 2003 Subject: [Spambayes-checkins] website docs.ht,1.17,1.18 Message-ID: Update of /cvsroot/spambayes/website In directory sc8-pr-cvs1:/tmp/cvs-serv20330 Modified Files: docs.ht Log Message: Add info about and a link to the wiki. Index: docs.ht =================================================================== RCS file: /cvsroot/spambayes/website/docs.ht,v retrieving revision 1.17 retrieving revision 1.18 diff -C2 -d -r1.17 -r1.18 *** docs.ht 25 Sep 2003 01:20:20 -0000 1.17 --- docs.ht 20 Oct 2003 22:41:56 -0000 1.18 *************** *** 6,9 **** --- 6,14 ----