Golang проверка MX-записей через файл txt

Есть файл большой mail.txt он содержит 1млн строк мне нужно отделять домены и проверять на MX-Записи доменов Выглядит он вот так:

[email protected]

А мне нужно, отрезать почту и выводить массив строк, например вот так

gazetaweb.com

у меня есть вот такой код, который проверяет мх-записи

package main

import (
    "fmt"
    "net"
    "os"
    "log"
    "ioutil"

)

func ReadFileDomains() {
    file, err := os.Open("mail.txt")
    if err != nil {
        log.Fatal(err)
    }
    defer func() {
        if err = file.Close(); err != nil {
            log.Fatal(err)
        }
    }()

    b, err := ioutil.ReadAll(file)
    fmt.Print(b)
}

func CheckEmail() {
    domains := ReadFileDomains()
    txtrecords, _ := net.LookupTXT(domains())

    for _, txt := range txtrecords {
        fmt.Println(txt)
    }
}

Суть в том, что мне нужно быстро чекать домены и передать метод чтения файла доменов в net.LookupTXT(ReadFileDomains) и записать результат файла


Ответы (1 шт):

Автор решения: Senior Pomidor

в LookupTXT нужно передавать вам домен в виде строки. а для этого вам нужно сначала получить эти данные из файла. читайте, проверяйте, передаете в net.LookupTXT строку

import (
    "bufio"
    "fmt"
    "net/mail"
    "os"
    "strings"
)

func ReadFileLines() []string {
    lines, err := readLines("mail.txt")
    if err != nil {
        return []string{}
    }

    return lines
}

func CheckEmail() {
    for _, txt := range ReadFileLines() {
        _, err := mail.ParseAddress(txt)
        if err != nil {
            fmt.Printf("invalid address: %s\n ", txt)
            continue
        }

        if ok, domain := check(txt); ok {
            fmt.Printf("tada: %s\n", domain)
        }
    }
}

func check(email string) (bool, string){
    at := strings.LastIndex(email, "@")
    if at >= 0 {
        username, domain := email[:at], email[at+1:]
        fmt.Printf("Username: %s, Domain: %s\n", username, domain)
        return true, domain
    }

    return false, ""
}

func readLines(path string) ([]string, error) {
    file, err := os.Open(path)
    if err != nil {
        return nil, err
    }
    defer file.Close()

    var lines []string
    scanner := bufio.NewScanner(file)
    for scanner.Scan() {
        lines = append(lines, scanner.Text())
    }
    return lines, scanner.Err()
}


func main() {
    CheckEmail()
}

файл mail.txt

[email protected]
[email protected]
s.ingall@google)

выхлоп:

Username: s.ingall, Domain: gazetaweb.com
tada: gazetaweb.com
Username: s.ingall, Domain: gazeb.com
tada: gazeb.com
invalid address: s.ingall@google)

→ Ссылка