func GreyMailFromAdd(w http.ResponseWriter, r *http.Request, ctx *Context) (err error) { id := ctx.Vars["id"] log.LogTrace("Greylist add mail %s", id) //we need a user to sign to if ctx.User == nil { log.LogWarn("Please login to add to grey list!") http.NotFound(w, r) return } // we need a user to be admin if ctx.User.IsSuperuser == false { http.NotFound(w, r) return } // we need to load email m, err := ctx.Ds.Load(id) if err != nil { log.LogTrace("Greylist mail Id not found %s", id) http.NotFound(w, r) return } e := fmt.Sprintf("%s@%s", m.From.Mailbox, m.From.Domain) if to, _ := ctx.Ds.IsGreyMail(e, "from"); to == 0 { log.LogTrace("Greylist inserting mail %s", e) gm := data.GreyMail{ Id: bson.NewObjectId(), CreatedBy: ctx.User.Id.Hex(), CreatedAt: time.Now(), IsActive: true, Email: e, Local: m.From.Mailbox, Domain: m.From.Domain, Type: "from", } if err = ctx.Ds.Emails.Insert(gm); err != nil { log.LogError("Error inserting grey list: %s", err) http.NotFound(w, r) return } return } http.NotFound(w, r) return }
func ContentFromString(data string) *Content { log.LogTrace("Parsing Content from string: <%d>", len(data)) x := strings.SplitN(data, "\r\n\r\n", 2) h := make(map[string][]string, 0) if len(x) == 2 { headers, body := x[0], x[1] hdrs := strings.Split(headers, "\r\n") var lastHdr = "" for _, hdr := range hdrs { if lastHdr != "" && strings.HasPrefix(hdr, " ") { h[lastHdr][len(h[lastHdr])-1] = h[lastHdr][len(h[lastHdr])-1] + hdr } else if strings.Contains(hdr, ": ") { y := strings.SplitN(hdr, ": ", 2) key, value := y[0], y[1] // TODO multiple header fields h[key] = []string{value} lastHdr = key } else { log.LogWarn("Found invalid header: '%s'", hdr) } } //log.LogTrace("Found body: '%s'", body) return &Content{ Size: len(data), Headers: h, Body: body, //Body: "", } } else { return &Content{ Size: len(data), Headers: h, Body: x[0], TextBody: x[0], } } }
func (ds *DataStore) SaveMail() { log.LogTrace("Running SaveMail Rotuines") var err error var recon bool for { mc := <-ds.SaveMailChan msg := ParseSMTPMessage(mc, mc.Domain, ds.Config.MimeParser) if ds.Config.Storage == "mongodb" { mc.Hash, err = ds.Storage.(*MongoDB).Store(msg) // if mongo conection is broken, try to reconnect only once if err == io.EOF && !recon { log.LogWarn("Connection error trying to reconnect") ds.Storage = CreateMongoDB(ds.Config) recon = true //try to save again mc.Hash, err = ds.Storage.(*MongoDB).Store(msg) } if err == nil { recon = false log.LogTrace("Save Mail Client hash : <%s>", mc.Hash) mc.Notify <- 1 //Notify web socket ds.NotifyMailChan <- mc.Hash } else { mc.Notify <- -1 log.LogError("Error storing message: %s", err) } } } }
func (c *Client) logWarn(msg string, args ...interface{}) { // Update metrics //expWarnsTotal.Add(1) log.LogWarn("SMTP[%v]<%v> %v", c.remoteHost, c.id, fmt.Sprintf(msg, args...)) }