📄 bayesiananalysis.java
字号:
try { analyzer.initSqlQueries(datasource.getConnection(), getMailetContext()); } catch (Exception e) { throw new MessagingException("Exception initializing queries", e); } try { loadData(datasource.getConnection()); } catch (java.sql.SQLException se) { throw new MessagingException("SQLException loading data", se); } } /** * Scans the mail and determines the spam probability. * * @param mail The Mail message to be scanned. * @throws MessagingException if a problem arises */ public void service(Mail mail) throws MessagingException { try { MimeMessage message = mail.getMessage(); if (ignoreLocalSender) { // ignore the message if the sender is local if (mail.getSender() != null && getMailetContext().isLocalServer(mail.getSender().getHost())) { return; } } String [] headerArray = message.getHeader(headerName); // ignore the message if already analyzed if (headerArray != null && headerArray.length > 0) { return; } ByteArrayOutputStream baos = new ByteArrayOutputStream(); double probability; if (message.getSize() < getMaxSize()) { message.writeTo(baos); probability = analyzer.computeSpamProbability(new BufferedReader(new StringReader(baos.toString()))); } else { probability = 0.0; } mail.setAttribute(MAIL_ATTRIBUTE_NAME, new Double(probability)); message.setHeader(headerName, Double.toString(probability)); DecimalFormat probabilityForm = (DecimalFormat) DecimalFormat.getInstance(); probabilityForm.applyPattern("##0.##%"); String probabilityString = probabilityForm.format(probability); String senderString; if (mail.getSender() == null) { senderString = "null"; } else { senderString = mail.getSender().toString(); } if (probability > 0.1) { log(headerName + ": " + probabilityString + "; From: " + senderString + "; Recipient(s): " + getAddressesString(mail.getRecipients())); appendToSubject(message, " [" + probabilityString + (probability > 0.9 ? " SPAM" : " spam") + "]"); } saveChanges(message); } catch (Exception e) { log("Exception: " + e.getMessage(), e); throw new MessagingException("Exception thrown", e); } } private void loadData(Connection conn) throws java.sql.SQLException { try { // this is synchronized to avoid concurrent update of the corpus synchronized(JDBCBayesianAnalyzer.DATABASE_LOCK) { analyzer.tokenCountsClear(); analyzer.loadHamNSpam(conn); analyzer.buildCorpus(); analyzer.tokenCountsClear(); } log("BayesianAnalysis Corpus loaded"); touchLastCorpusLoadTime(); } finally { if (conn != null) { theJDBCUtil.closeJDBCConnection(conn); } } } private String getAddressesString(Collection addresses) { if (addresses == null) { return "null"; } Iterator iter = addresses.iterator(); StringBuffer sb = new StringBuffer(); sb.append('['); for (int i = 0; iter.hasNext(); i++) { sb.append(iter.next()); if (i + 1 < addresses.size()) { sb.append(", "); } } sb.append(']'); return sb.toString(); } private void appendToSubject(MimeMessage message, String toAppend) { try { String subject = message.getSubject(); if (subject == null) { message.setSubject(toAppend, "iso-8859-1"); } else { message.setSubject(toAppend + " " + subject, "iso-8859-1"); } } catch (MessagingException ex) {} } private void sendReplyFromPostmaster(Mail mail, String stringContent) throws MessagingException { try { MailAddress notifier = getMailetContext().getPostmaster(); MailAddress senderMailAddress = mail.getSender(); MimeMessage message = mail.getMessage(); //Create the reply message MimeMessage reply = new MimeMessage(Session.getDefaultInstance(System.getProperties(), null)); //Create the list of recipients in the Address[] format InternetAddress[] rcptAddr = new InternetAddress[1]; rcptAddr[0] = senderMailAddress.toInternetAddress(); reply.setRecipients(Message.RecipientType.TO, rcptAddr); //Set the sender... reply.setFrom(notifier.toInternetAddress()); //Create the message body MimeMultipart multipart = new MimeMultipart(); //Add message as the first mime body part MimeBodyPart part = new MimeBodyPart(); part.setContent(stringContent, "text/plain"); part.setHeader(RFC2822Headers.CONTENT_TYPE, "text/plain"); multipart.addBodyPart(part); reply.setContent(multipart); reply.setHeader(RFC2822Headers.CONTENT_TYPE, multipart.getContentType()); //Create the list of recipients in our MailAddress format Set recipients = new HashSet(); recipients.add(senderMailAddress); //Set additional headers if (reply.getHeader(RFC2822Headers.DATE)==null){ reply.setHeader(RFC2822Headers.DATE, rfc822DateFormat.format(new java.util.Date())); } String subject = message.getSubject(); if (subject == null) { subject = ""; } if (subject.indexOf("Re:") == 0){ reply.setSubject(subject); } else { reply.setSubject("Re:" + subject); } reply.setHeader(RFC2822Headers.IN_REPLY_TO, message.getMessageID()); //Send it off... getMailetContext().sendMail(notifier, recipients, reply); } catch (Exception e) { log("Exception found sending reply", e); } } /** * Saves changes resetting the original message id. */ private void saveChanges(MimeMessage message) throws MessagingException { String messageId = message.getMessageID(); message.saveChanges(); if (messageId != null) { message.setHeader(RFC2822Headers.MESSAGE_ID, messageId); } } private static class CorpusLoader extends Thread { private BayesianAnalysis analysis; private CorpusLoader(BayesianAnalysis analysis) { super("BayesianAnalysis Corpus Loader"); this.analysis = analysis; } /** Thread entry point. */ public void run() { analysis.log("CorpusLoader thread started: will wake up every " + CORPUS_RELOAD_INTERVAL + " ms"); try { Thread.sleep(CORPUS_RELOAD_INTERVAL); while (true) { if (analysis.getLastCorpusLoadTime() < JDBCBayesianAnalyzer.getLastDatabaseUpdateTime()) { analysis.log("Reloading Corpus ..."); try { analysis.loadData(analysis.datasource.getConnection()); analysis.log("Corpus reloaded"); } catch (java.sql.SQLException se) { analysis.log("SQLException: ", se); } } if (Thread.interrupted()) { break; } Thread.sleep(CORPUS_RELOAD_INTERVAL); } } catch (InterruptedException ex) { interrupt(); } } } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -