func procMsg(msg ClientMessage, datasource *datasource.DataSource) { rcpt := make([]string, 0, 100) toHost := strings.Split(msg.To, "@")[1] if isAllowedHost(toHost) { user, err := datasource.UserByEmail(msg.To) if err == nil { rcpt = append(rcpt, user.InboxAddr) } else { group, err := datasource.GroupByEmail(msg.To) if err == nil { for _, member := range group.Members { user, err = datasource.UserByEmail(member) if err == nil { rcpt = append(rcpt, user.InboxAddr) } } } else { logln(1, "Can't find such user or group") return } } } logln(1, fmt.Sprintf("%s", msg.From)) fromHost := strings.Split(msg.From, "@")[1] if isAllowedHost(fromHost) { if msg.Auth == false || msg.Username != msg.From { logln(1, fmt.Sprintf("%s %s", msg.Username, msg.From)) logln(1, "Not authenticated") return } } for _, email := range rcpt { logln(1, email) host := strings.Split(email, "@")[1] nss, err := net.LookupMX(host) if err == nil { for _, ns := range nss { logln(1, fmt.Sprintf("%s %d", ns.Host, ns.Pref)) } curMsg := msg curMsg.To = email sendMsg(nss[0], curMsg) } else { logln(1, "Error in lookup MX") } } }