func (spmf *SubjectPrefixMatchFilter) Filter(mail mailfile.Mail) Result { log.Printf("Run %s, Mail:%s\n", spmf, mail.Name()) spmf.total.Inc(1) matched := false for _, subjectPrefix := range spmf.subjectPrefixes { if strings.HasPrefix(mail.Subject(), subjectPrefix) { matched = true spmf.matched.Inc(1) break } } if !matched { return Incoming } return spmf.next.Filter(mail) }
func (sof *RelayOnlyFilter) Filter(mail mailfile.Mail) Result { log.Printf("Run %s, Mail:%s\n", sof, mail.Name()) sof.total.Inc(1) sendOut := false for _, address := range mail.To() { if !strings.HasSuffix(address.Address, sof.localDomain) { sendOut = true sof.numOfRelay.Inc(1) break } } if !sendOut { return Incoming } return sof.next.Filter(mail) }
func (cf *CachingProxy) Filter(mail mailfile.Mail) Result { log.Printf("Run %s, Mail:%s\n", cf, mail.Name()) cf.total.Inc(1) keyer, ok := cf.target.(CacheKey) if !ok { log.Fatalf("%s should implement CacheKey interface\n", cf.target) return None } key := keyer.Key(mail) cf.rwm.RLock() for e := cf.l.Front(); e != nil; e = e.Next() { if t, ok := e.Value.(*CacheEntry); ok { if key == t.key { cf.rwm.RUnlock() cf.hit.Inc(1) return t.result } } } cf.rwm.RUnlock() result := cf.target.Filter(mail) cf.rwm.Lock() cf.l.PushFront(&CacheEntry{key, result}) if cf.l.Len() > cf.size { cf.l.Remove(cf.l.Back()) } cf.cached.Update(int64(cf.l.Len())) cf.rwm.Unlock() return result }
func (cih *ContentInspectionUpdater) Update(mail mailfile.Mail) { if leaner, ok := cih.anlz.(analyzer.Learner); ok { log.Printf("Run %s, Mail:%s\n", cih, mail.Name()) cih.total.Inc(1) post, err := mailpost.Parse(mail) mail.Close() if err != nil { cih.malformed.Inc(1) log.Printf("ContentInspectionUpdater: Err:%v, Mail:%s\n", err, mail.Path()) return } leaner.Learn(post.Subject, cih.class) leaner.Learn(post.Content, cih.class) err = os.Remove(mail.Path()) if err != nil { log.Println(err) } } }
func (cif *ContentInspectionFilter) Filter(mail mailfile.Mail) Result { log.Printf("Run %s, Mail:%s\n", cif, mail.Name()) cif.total.Inc(1) post, err := mailpost.Parse(mail) mail.Close() if err != nil { cif.malformed.Inc(1) log.Printf("ContentInspectionFilter: Err:%v, Mail:%s\n", err, mail.Path()) return cif.next.Filter(mail) } class := cif.anlz.Test(post.Subject + " " + post.Content) cif.counters[class].Inc(1) if cif.allPass || analyzer.Good == class { return cif.next.Filter(mail) } return Quarantine }
func Parse(mail mailfile.Mail) (*post.Post, error) { //JavaTWO即 將於 7/20盛 大舉辦!即日起可享早鳥優惠, 將New iPad帶 回家! if !strings.HasPrefix(mail.Subject(), "JWorld@TW") { return nil, ErrNotSupport } //JWorld@TW新文章通知:Hello JavaFX! Part 3 for _, prefix := range []string{"JWorld@TW新文章通知:"} { if strings.HasPrefix(mail.Subject(), prefix) { return article.Parse(mail.Content()) } } //JWorld@TW, 回覆通知 if strings.HasPrefix(mail.Subject(), "JWorld@TW, 回覆通知") { return general.Parse(mail.Content()) } //JWorld@TW新話題通知:*.class如何反編譯回*.java還能正常執行? //JWorld@TW話題更新通知:Guava 教學系列文章 for _, prefix := range []string{"JWorld@TW新話題通知:", "JWorld@TW話題更新通知:", "JWorld@TW話題更新通知:"} { if strings.HasPrefix(mail.Subject(), prefix) { return general.Parse(mail.Content()) } } return nil, ErrNotSupport }
func (df *DeliverFilter) Filter(mail mailfile.Mail) Result { log.Printf("Run %s, Mail:%s\n", df, mail.Name()) df.total.Inc(1) result := df.next.Filter(mail) df.counters[result].Inc(1) if result == None { log.Fatalf("DeliverFilter: the filter result should not be None, Mail:%s\n", mail.Name()) } destination := filepath.Join(df.paths[result], mail.Name()) log.Printf("Move to %s, Mail:%s\n", destination, mail.Name()) err := os.Rename(mail.Path(), destination) if err != nil { log.Printf("DeliverFilter: Err:%v, Mail:%s\n", err, mail.Name()) } return None }
func (cif *ContentInspectionFilter) Key(mail mailfile.Mail) string { return mail.Subject() }
func (ddf *DefaultDestinationFilter) Filter(mail mailfile.Mail) Result { log.Printf("Run %s, Mail:%s\n", ddf, mail.Name()) ddf.total.Inc(1) return Incoming }