mirror of
https://github.com/AfterShip/email-verifier.git
synced 2025-02-06 09:44:47 +00:00
MOD: load meta data from metata_*.go files && add build metadata tools
This commit is contained in:
parent
9935cbb31c
commit
dda1dd7913
File diff suppressed because it is too large
Load Diff
@ -1,3 +1,7 @@
|
||||
.ddns.org
|
||||
.findhere.com
|
||||
.freeservers.com
|
||||
.zzn.com
|
||||
1033edge.com
|
||||
11mail.com
|
||||
123.com
|
143
cmd/build_metadata/main.go
Normal file
143
cmd/build_metadata/main.go
Normal file
@ -0,0 +1,143 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"os"
|
||||
"os/exec"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
// writeFile writes content to a file
|
||||
func writeFile(filePath string, data []byte) {
|
||||
if _, err := os.Stat(filePath); os.IsNotExist(err) {
|
||||
log.Fatalf("no such file: %s make sure running from the root of the repo directory", filePath)
|
||||
}
|
||||
|
||||
fmt.Printf("Writing new %s\n", filePath)
|
||||
err := ioutil.WriteFile(filePath, data, os.FileMode(0664))
|
||||
if err != nil {
|
||||
log.Fatalf("Error writing '%s': %s", filePath, err)
|
||||
}
|
||||
}
|
||||
|
||||
type fileInfo struct {
|
||||
path string
|
||||
varName string
|
||||
srcPath string
|
||||
description string
|
||||
}
|
||||
|
||||
func buildMetaDataFile() {
|
||||
var files []fileInfo
|
||||
files = append(files,
|
||||
fileInfo{
|
||||
path: "disposable.txt",
|
||||
varName: "disposableDomains",
|
||||
srcPath: "../../metadata_disposable.go",
|
||||
description: "// map to store disposable domains data",
|
||||
},
|
||||
fileInfo{
|
||||
path: "free.txt",
|
||||
varName: "freeDomains",
|
||||
srcPath: "../../metadata_free.go",
|
||||
description: "// map to store free domains data",
|
||||
},
|
||||
fileInfo{
|
||||
path: "role.txt",
|
||||
varName: "roleAccounts",
|
||||
srcPath: "../../metadata_role.go",
|
||||
description: "// map to store role-based accounts data",
|
||||
},
|
||||
)
|
||||
|
||||
for _, f := range files {
|
||||
log.Printf("Building map for: %s\n", f.path)
|
||||
file, err := os.Open(f.path)
|
||||
if err != nil {
|
||||
panic(fmt.Sprintf("open meta data f %s fail: %v ", f, err))
|
||||
}
|
||||
|
||||
output := bytes.Buffer{}
|
||||
output.WriteString("package emailverifier\n\n")
|
||||
output.WriteString(f.description + "\n")
|
||||
output.WriteString(fmt.Sprintf("var %s = map[string]bool {\n", f.varName))
|
||||
|
||||
scanner := bufio.NewScanner(file)
|
||||
scanner.Split(bufio.ScanLines)
|
||||
|
||||
data := make(map[string]bool)
|
||||
for scanner.Scan() {
|
||||
key := scanner.Text()
|
||||
|
||||
if !data[key] {
|
||||
output.WriteString("\t")
|
||||
output.WriteString(strconv.Quote(key))
|
||||
output.WriteString(": ")
|
||||
output.WriteString("true")
|
||||
output.WriteString(",\n")
|
||||
|
||||
}
|
||||
data[key] = true
|
||||
}
|
||||
output.WriteString("}")
|
||||
log.Printf("Read %d mappings in %s\n", len(data), f.path)
|
||||
|
||||
err = file.Close()
|
||||
if err != nil {
|
||||
panic(fmt.Sprintf("close role meta data file %s fail: %v ", f.path, err))
|
||||
}
|
||||
writeFile(f.srcPath, output.Bytes())
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func updateMetaData() {
|
||||
cmd := exec.Command(
|
||||
"/bin/bash",
|
||||
"-c",
|
||||
"./update.sh",
|
||||
)
|
||||
|
||||
stdout, err := cmd.StdoutPipe()
|
||||
if err != nil {
|
||||
log.Fatalf("error calling update.sh to update meta data: %s", err.Error())
|
||||
}
|
||||
stderr, err := cmd.StderrPipe()
|
||||
if err != nil {
|
||||
log.Fatalf("error calling update.sh to update meta data: %s", err.Error())
|
||||
}
|
||||
if err = cmd.Start(); err != nil {
|
||||
log.Fatalf("error executing update.sh to update meta data: %s", err.Error())
|
||||
}
|
||||
data, err := ioutil.ReadAll(stderr)
|
||||
if err != nil {
|
||||
log.Fatalf("error reading update.sh result: %s : %s", err.Error(), data)
|
||||
}
|
||||
outputBuf := bufio.NewReader(stdout)
|
||||
|
||||
for {
|
||||
output, _, err := outputBuf.ReadLine()
|
||||
if err != nil {
|
||||
if err != io.EOF {
|
||||
log.Fatal(err)
|
||||
}
|
||||
break
|
||||
}
|
||||
log.Println(string(output))
|
||||
}
|
||||
|
||||
if err = cmd.Wait(); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
updateMetaData()
|
||||
buildMetaDataFile()
|
||||
}
|
@ -1,6 +1,6 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# description: for updating misc databases, including custom free domains and disposable domains.
|
||||
# description: for updating meta databases, including custom free domains and disposable domains.
|
||||
|
||||
set -e
|
||||
export LC_ALL=C
|
||||
@ -36,4 +36,4 @@ cat $new ./free.txt \
|
||||
| comm -23 - ./disposable.txt > $tmp
|
||||
mv $tmp ./free.txt
|
||||
|
||||
echo 'Complete!'
|
||||
echo 'Complete Updating meta databases!'
|
@ -49,16 +49,16 @@ func updateDisposableDomains(source string) error {
|
||||
}
|
||||
|
||||
// clear up invalid disposable domains
|
||||
disposableDomains.Range(func(key, value interface{}) bool {
|
||||
disposableSyncDomains.Range(func(key, value interface{}) bool {
|
||||
if _, exists := newDomains[key.(string)]; !exists {
|
||||
disposableDomains.Delete(key)
|
||||
disposableSyncDomains.Delete(key)
|
||||
}
|
||||
return true
|
||||
})
|
||||
|
||||
// update new domain data
|
||||
for _, d := range domains {
|
||||
disposableDomains.Store(d, struct{}{})
|
||||
disposableSyncDomains.Store(d, struct{}{})
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
112609
metadata_disposable.go
Normal file
112609
metadata_disposable.go
Normal file
File diff suppressed because it is too large
Load Diff
4476
metadata_free.go
Normal file
4476
metadata_free.go
Normal file
File diff suppressed because it is too large
Load Diff
893
metadata_role.go
Normal file
893
metadata_role.go
Normal file
@ -0,0 +1,893 @@
|
||||
package emailverifier
|
||||
|
||||
// map to store role-based accounts data
|
||||
var roleAccounts = map[string]bool {
|
||||
"2015": true,
|
||||
"2016": true,
|
||||
"2017": true,
|
||||
"2018": true,
|
||||
"2019": true,
|
||||
"2020": true,
|
||||
"abuse": true,
|
||||
"academy": true,
|
||||
"accessibility": true,
|
||||
"account": true,
|
||||
"accountant": true,
|
||||
"accounting": true,
|
||||
"accountmanager": true,
|
||||
"accountmanagers": true,
|
||||
"accounts": true,
|
||||
"accountspayable": true,
|
||||
"acquisition": true,
|
||||
"admin": true,
|
||||
"admin1": true,
|
||||
"administracao": true,
|
||||
"administracion": true,
|
||||
"administrador": true,
|
||||
"administratie": true,
|
||||
"administratif": true,
|
||||
"administration": true,
|
||||
"administrativo": true,
|
||||
"administrator": true,
|
||||
"administrators": true,
|
||||
"admins": true,
|
||||
"adminteam": true,
|
||||
"admissions": true,
|
||||
"adops": true,
|
||||
"ads": true,
|
||||
"adventure": true,
|
||||
"advertise": true,
|
||||
"advertising": true,
|
||||
"advertisingsales": true,
|
||||
"advice": true,
|
||||
"advisor": true,
|
||||
"advisors": true,
|
||||
"adwords": true,
|
||||
"affiliate": true,
|
||||
"affiliates": true,
|
||||
"agence": true,
|
||||
"agencia": true,
|
||||
"agency": true,
|
||||
"agents": true,
|
||||
"alarm": true,
|
||||
"alarms": true,
|
||||
"alert": true,
|
||||
"alerts": true,
|
||||
"alexa": true,
|
||||
"all": true,
|
||||
"all-employees": true,
|
||||
"all-pms": true,
|
||||
"all-staff": true,
|
||||
"all-team": true,
|
||||
"all-users": true,
|
||||
"all.employees": true,
|
||||
"all.staff": true,
|
||||
"all.users": true,
|
||||
"all_staff": true,
|
||||
"alla": true,
|
||||
"alle": true,
|
||||
"allemployees": true,
|
||||
"allhands": true,
|
||||
"allsales": true,
|
||||
"allstaff": true,
|
||||
"allstudents": true,
|
||||
"allteachers": true,
|
||||
"allteam": true,
|
||||
"allusers": true,
|
||||
"alpha": true,
|
||||
"alphas": true,
|
||||
"alumni": true,
|
||||
"ambassadors": true,
|
||||
"amministrazione": true,
|
||||
"analysts": true,
|
||||
"analytics": true,
|
||||
"android": true,
|
||||
"angels": true,
|
||||
"animation": true,
|
||||
"announce": true,
|
||||
"announcements": true,
|
||||
"ap": true,
|
||||
"api": true,
|
||||
"app": true,
|
||||
"apple": true,
|
||||
"application": true,
|
||||
"applications": true,
|
||||
"apply": true,
|
||||
"appointments": true,
|
||||
"apps": true,
|
||||
"archives": true,
|
||||
"asistente": true,
|
||||
"asset": true,
|
||||
"assistanthead": true,
|
||||
"assistencia": true,
|
||||
"assistenza": true,
|
||||
"associates": true,
|
||||
"associates-all": true,
|
||||
"ateam": true,
|
||||
"atencionalcliente": true,
|
||||
"atendimento": true,
|
||||
"auctions": true,
|
||||
"available": true,
|
||||
"backend": true,
|
||||
"backend-dev": true,
|
||||
"backup": true,
|
||||
"bd": true,
|
||||
"benefits": true,
|
||||
"berlin": true,
|
||||
"bestellung": true,
|
||||
"beta": true,
|
||||
"biblioteca": true,
|
||||
"bibliotheque": true,
|
||||
"billing": true,
|
||||
"bills": true,
|
||||
"biuro": true,
|
||||
"biz": true,
|
||||
"bizdev": true,
|
||||
"blog": true,
|
||||
"board": true,
|
||||
"bod": true,
|
||||
"bookclub": true,
|
||||
"booking": true,
|
||||
"bookings": true,
|
||||
"boston": true,
|
||||
"boxoffice": true,
|
||||
"brand": true,
|
||||
"branding": true,
|
||||
"brands": true,
|
||||
"brandsolutions": true,
|
||||
"broadcast": true,
|
||||
"buchhaltung": true,
|
||||
"bugs": true,
|
||||
"build": true,
|
||||
"bursar": true,
|
||||
"busdev": true,
|
||||
"business": true,
|
||||
"business_team": true,
|
||||
"businessdevelopment": true,
|
||||
"ca": true,
|
||||
"caltrain": true,
|
||||
"campaign": true,
|
||||
"campaigns": true,
|
||||
"campusteam": true,
|
||||
"capacitacion": true,
|
||||
"captain": true,
|
||||
"captains": true,
|
||||
"care": true,
|
||||
"career": true,
|
||||
"careers": true,
|
||||
"catering": true,
|
||||
"central": true,
|
||||
"centro": true,
|
||||
"ceo": true,
|
||||
"ceos": true,
|
||||
"channel-sales": true,
|
||||
"chat": true,
|
||||
"chatter": true,
|
||||
"chef": true,
|
||||
"chicago": true,
|
||||
"china": true,
|
||||
"citymanagers": true,
|
||||
"classof2016": true,
|
||||
"classof2017": true,
|
||||
"classof2018": true,
|
||||
"classof2019": true,
|
||||
"classroom_teachers": true,
|
||||
"client": true,
|
||||
"clientes": true,
|
||||
"clients": true,
|
||||
"clientservices": true,
|
||||
"clinic": true,
|
||||
"cloud": true,
|
||||
"cm": true,
|
||||
"co-op": true,
|
||||
"coach": true,
|
||||
"coaches": true,
|
||||
"coaching": true,
|
||||
"code": true,
|
||||
"colaboradores": true,
|
||||
"colegio": true,
|
||||
"com": true,
|
||||
"comenzi": true,
|
||||
"comercial": true,
|
||||
"comercial1": true,
|
||||
"comercial2": true,
|
||||
"comments": true,
|
||||
"commercial": true,
|
||||
"commerciale": true,
|
||||
"commissions": true,
|
||||
"committee": true,
|
||||
"comms": true,
|
||||
"communication": true,
|
||||
"communications": true,
|
||||
"community": true,
|
||||
"company": true,
|
||||
"company.wide": true,
|
||||
"compete": true,
|
||||
"competition": true,
|
||||
"compliance": true,
|
||||
"compras": true,
|
||||
"compta": true,
|
||||
"comptabilite": true,
|
||||
"comunicacao": true,
|
||||
"comunicacion": true,
|
||||
"comunicaciones": true,
|
||||
"comunicazione": true,
|
||||
"concierge": true,
|
||||
"conference": true,
|
||||
"connect": true,
|
||||
"consultant": true,
|
||||
"consultas": true,
|
||||
"consulting": true,
|
||||
"consultoria": true,
|
||||
"contabil": true,
|
||||
"contabilidad": true,
|
||||
"contabilidade": true,
|
||||
"contabilita": true,
|
||||
"contact": true,
|
||||
"contactenos": true,
|
||||
"contacto": true,
|
||||
"contactus": true,
|
||||
"contador": true,
|
||||
"contato": true,
|
||||
"content": true,
|
||||
"contractor": true,
|
||||
"contractors": true,
|
||||
"contracts": true,
|
||||
"controller": true,
|
||||
"coordinator": true,
|
||||
"copyright": true,
|
||||
"core": true,
|
||||
"coreteam": true,
|
||||
"corp": true,
|
||||
"corporate": true,
|
||||
"corporatesales": true,
|
||||
"council": true,
|
||||
"courrier": true,
|
||||
"creative": true,
|
||||
"crew": true,
|
||||
"crm": true,
|
||||
"cs": true,
|
||||
"csm": true,
|
||||
"csteam": true,
|
||||
"cultura": true,
|
||||
"culture": true,
|
||||
"customer": true,
|
||||
"customer.service": true,
|
||||
"customercare": true,
|
||||
"customerfeedback": true,
|
||||
"customers": true,
|
||||
"customerservice": true,
|
||||
"customerservicecenter": true,
|
||||
"customerservices": true,
|
||||
"customersuccess": true,
|
||||
"customersupport": true,
|
||||
"custserv": true,
|
||||
"daemon": true,
|
||||
"data": true,
|
||||
"database": true,
|
||||
"deals": true,
|
||||
"dean": true,
|
||||
"delivery": true,
|
||||
"demo": true,
|
||||
"denver": true,
|
||||
"departures": true,
|
||||
"deploy": true,
|
||||
"deputy": true,
|
||||
"deputyhead": true,
|
||||
"design": true,
|
||||
"designer": true,
|
||||
"designers": true,
|
||||
"dev": true,
|
||||
"developer": true,
|
||||
"developers": true,
|
||||
"development": true,
|
||||
"devnull": true,
|
||||
"devops": true,
|
||||
"devs": true,
|
||||
"devteam": true,
|
||||
"digital": true,
|
||||
"digsitesvalue": true,
|
||||
"direccion": true,
|
||||
"direction": true,
|
||||
"director": true,
|
||||
"directors": true,
|
||||
"directory": true,
|
||||
"diretoria": true,
|
||||
"direzione": true,
|
||||
"discuss": true,
|
||||
"dispatch": true,
|
||||
"diversity": true,
|
||||
"dns": true,
|
||||
"docs": true,
|
||||
"domain": true,
|
||||
"domainmanagement": true,
|
||||
"domains": true,
|
||||
"donations": true,
|
||||
"donors": true,
|
||||
"download": true,
|
||||
"dreamteam": true,
|
||||
"ecommerce": true,
|
||||
"editor": true,
|
||||
"editorial": true,
|
||||
"editors": true,
|
||||
"education": true,
|
||||
"einkauf": true,
|
||||
"email": true,
|
||||
"emergency": true,
|
||||
"employee": true,
|
||||
"employees": true,
|
||||
"employment": true,
|
||||
"eng": true,
|
||||
"eng-all": true,
|
||||
"engagement": true,
|
||||
"engineering": true,
|
||||
"engineers": true,
|
||||
"english": true,
|
||||
"enq": true,
|
||||
"enquire": true,
|
||||
"enquires": true,
|
||||
"enquiries": true,
|
||||
"enquiry": true,
|
||||
"enrollment": true,
|
||||
"enterprise": true,
|
||||
"equipe": true,
|
||||
"equipo": true,
|
||||
"error": true,
|
||||
"errors": true,
|
||||
"escritorio": true,
|
||||
"europe": true,
|
||||
"event": true,
|
||||
"events": true,
|
||||
"everybody": true,
|
||||
"everyone": true,
|
||||
"exec": true,
|
||||
"execs": true,
|
||||
"execteam": true,
|
||||
"executive": true,
|
||||
"executives": true,
|
||||
"expenses": true,
|
||||
"expert": true,
|
||||
"experts": true,
|
||||
"export": true,
|
||||
"facilities": true,
|
||||
"facturacion": true,
|
||||
"faculty": true,
|
||||
"family": true,
|
||||
"farmacia": true,
|
||||
"faturamento": true,
|
||||
"fax": true,
|
||||
"fbl": true,
|
||||
"feedback": true,
|
||||
"fellows": true,
|
||||
"finance": true,
|
||||
"financeiro": true,
|
||||
"financeiro2": true,
|
||||
"finanzas": true,
|
||||
"firmapost": true,
|
||||
"fiscal": true,
|
||||
"food": true,
|
||||
"football": true,
|
||||
"founders": true,
|
||||
"france": true,
|
||||
"franchise": true,
|
||||
"friends": true,
|
||||
"frontdesk": true,
|
||||
"frontend": true,
|
||||
"frontoffice": true,
|
||||
"fte": true,
|
||||
"ftp": true,
|
||||
"fulltime": true,
|
||||
"fun": true,
|
||||
"fundraising": true,
|
||||
"gardner": true,
|
||||
"geeks": true,
|
||||
"general": true,
|
||||
"geral": true,
|
||||
"giving": true,
|
||||
"global": true,
|
||||
"grants": true,
|
||||
"graphics": true,
|
||||
"group": true,
|
||||
"growth": true,
|
||||
"hackathon": true,
|
||||
"hackers": true,
|
||||
"head": true,
|
||||
"head.office": true,
|
||||
"headoffice": true,
|
||||
"heads": true,
|
||||
"headteacher": true,
|
||||
"hello": true,
|
||||
"help": true,
|
||||
"helpdesk": true,
|
||||
"hi": true,
|
||||
"highschool": true,
|
||||
"hiring": true,
|
||||
"hola": true,
|
||||
"home": true,
|
||||
"homes": true,
|
||||
"hosting": true,
|
||||
"hostmaster": true,
|
||||
"hotel": true,
|
||||
"house": true,
|
||||
"hq": true,
|
||||
"hr": true,
|
||||
"hrdept": true,
|
||||
"hsstaff": true,
|
||||
"hsteachers": true,
|
||||
"humanresources": true,
|
||||
"ideas": true,
|
||||
"implementation": true,
|
||||
"import": true,
|
||||
"inbound": true,
|
||||
"inbox": true,
|
||||
"india": true,
|
||||
"info": true,
|
||||
"infor": true,
|
||||
"informacion": true,
|
||||
"informatica": true,
|
||||
"information": true,
|
||||
"informatique": true,
|
||||
"informativo": true,
|
||||
"infra": true,
|
||||
"infrastructure": true,
|
||||
"ingenieria": true,
|
||||
"innovation": true,
|
||||
"inoc": true,
|
||||
"inquiries": true,
|
||||
"inquiry": true,
|
||||
"insidesales": true,
|
||||
"insights": true,
|
||||
"instagram": true,
|
||||
"insurance": true,
|
||||
"integration": true,
|
||||
"integrations": true,
|
||||
"intern": true,
|
||||
"internal": true,
|
||||
"international": true,
|
||||
"internet": true,
|
||||
"interns": true,
|
||||
"internship": true,
|
||||
"invest": true,
|
||||
"investment": true,
|
||||
"investor": true,
|
||||
"investorrelations": true,
|
||||
"investors": true,
|
||||
"invoice": true,
|
||||
"invoices": true,
|
||||
"invoicing": true,
|
||||
"ios": true,
|
||||
"iphone": true,
|
||||
"ir": true,
|
||||
"ispfeedback": true,
|
||||
"ispsupport": true,
|
||||
"it": true,
|
||||
"ithelp": true,
|
||||
"itsupport": true,
|
||||
"itunes": true,
|
||||
"jira": true,
|
||||
"job": true,
|
||||
"jobs": true,
|
||||
"join": true,
|
||||
"jornalismo": true,
|
||||
"junk": true,
|
||||
"kontakt": true,
|
||||
"kundeservice": true,
|
||||
"la": true,
|
||||
"lab": true,
|
||||
"laboratorio": true,
|
||||
"labs": true,
|
||||
"ladies": true,
|
||||
"latam": true,
|
||||
"launch": true,
|
||||
"lead": true,
|
||||
"leaders": true,
|
||||
"leadership": true,
|
||||
"leadership-team": true,
|
||||
"leadershipteam": true,
|
||||
"leads": true,
|
||||
"leasing": true,
|
||||
"legal": true,
|
||||
"letters": true,
|
||||
"library": true,
|
||||
"licensing": true,
|
||||
"links": true,
|
||||
"list": true,
|
||||
"list-request": true,
|
||||
"login": true,
|
||||
"logistica": true,
|
||||
"logistics": true,
|
||||
"logistiek": true,
|
||||
"lt": true,
|
||||
"lunch": true,
|
||||
"mail": true,
|
||||
"mailbox": true,
|
||||
"maildaemon": true,
|
||||
"mailer-daemon": true,
|
||||
"mailerdaemon": true,
|
||||
"mailing": true,
|
||||
"maintenance": true,
|
||||
"management": true,
|
||||
"management-group": true,
|
||||
"management.team": true,
|
||||
"management_team": true,
|
||||
"manager": true,
|
||||
"managers": true,
|
||||
"marketing": true,
|
||||
"marketing-ops": true,
|
||||
"marketing-team": true,
|
||||
"marketingteam": true,
|
||||
"marketplace": true,
|
||||
"master": true,
|
||||
"mayor": true,
|
||||
"md": true,
|
||||
"media": true,
|
||||
"meetup": true,
|
||||
"member": true,
|
||||
"members": true,
|
||||
"membership": true,
|
||||
"mentors": true,
|
||||
"metrics": true,
|
||||
"mgmt": true,
|
||||
"middleschool": true,
|
||||
"misc": true,
|
||||
"mkt": true,
|
||||
"mktg": true,
|
||||
"mobile": true,
|
||||
"monitor": true,
|
||||
"monitoring": true,
|
||||
"montreal": true,
|
||||
"msstaff": true,
|
||||
"msteachers": true,
|
||||
"mt": true,
|
||||
"music": true,
|
||||
"network": true,
|
||||
"newbiz": true,
|
||||
"newbusiness": true,
|
||||
"news": true,
|
||||
"newsletter": true,
|
||||
"newyork": true,
|
||||
"nntp": true,
|
||||
"no-reply": true,
|
||||
"no.replay": true,
|
||||
"no.reply": true,
|
||||
"nobody": true,
|
||||
"noc": true,
|
||||
"none": true,
|
||||
"noreply": true,
|
||||
"noresponse": true,
|
||||
"northamerica": true,
|
||||
"nospam": true,
|
||||
"notes": true,
|
||||
"notifications": true,
|
||||
"notify": true,
|
||||
"nps": true,
|
||||
"null": true,
|
||||
"ny": true,
|
||||
"nyc": true,
|
||||
"nyoffice": true,
|
||||
"offboarding": true,
|
||||
"offers": true,
|
||||
"office": true,
|
||||
"officeadmin": true,
|
||||
"officemanager": true,
|
||||
"officers": true,
|
||||
"officestaff": true,
|
||||
"offtopic": true,
|
||||
"oficina": true,
|
||||
"onboarding": true,
|
||||
"online": true,
|
||||
"onsite": true,
|
||||
"ooo": true,
|
||||
"operaciones": true,
|
||||
"operations": true,
|
||||
"ops": true,
|
||||
"order": true,
|
||||
"orders": true,
|
||||
"ordini": true,
|
||||
"outage": true,
|
||||
"outreach": true,
|
||||
"owners": true,
|
||||
"parents": true,
|
||||
"paris": true,
|
||||
"partner": true,
|
||||
"partners": true,
|
||||
"partnerships": true,
|
||||
"parts": true,
|
||||
"pay": true,
|
||||
"payment": true,
|
||||
"payments": true,
|
||||
"paypal": true,
|
||||
"payroll": true,
|
||||
"pd": true,
|
||||
"people": true,
|
||||
"peoplemanagers": true,
|
||||
"peopleops": true,
|
||||
"performance": true,
|
||||
"personnel": true,
|
||||
"phish": true,
|
||||
"phishing": true,
|
||||
"photos": true,
|
||||
"planning": true,
|
||||
"platform": true,
|
||||
"pm": true,
|
||||
"portfolio": true,
|
||||
"post": true,
|
||||
"postbox": true,
|
||||
"postfix": true,
|
||||
"postmaster": true,
|
||||
"ppc": true,
|
||||
"pr": true,
|
||||
"prefeitura": true,
|
||||
"presales": true,
|
||||
"presidencia": true,
|
||||
"president": true,
|
||||
"presidente": true,
|
||||
"press": true,
|
||||
"presse": true,
|
||||
"prime": true,
|
||||
"principal": true,
|
||||
"principals": true,
|
||||
"privacy": true,
|
||||
"procurement": true,
|
||||
"prod": true,
|
||||
"produccion": true,
|
||||
"product": true,
|
||||
"product-team": true,
|
||||
"product.growth": true,
|
||||
"product.management": true,
|
||||
"product.managers": true,
|
||||
"product.team": true,
|
||||
"production": true,
|
||||
"productmanagers": true,
|
||||
"products": true,
|
||||
"productteam": true,
|
||||
"produto": true,
|
||||
"program": true,
|
||||
"programs": true,
|
||||
"project": true,
|
||||
"projectmanagers": true,
|
||||
"projects": true,
|
||||
"promo": true,
|
||||
"promotions": true,
|
||||
"protocollo": true,
|
||||
"proveedores": true,
|
||||
"publicidade": true,
|
||||
"publisher": true,
|
||||
"publishers": true,
|
||||
"purchase": true,
|
||||
"purchases": true,
|
||||
"purchasing": true,
|
||||
"qa": true,
|
||||
"qualidade": true,
|
||||
"questions": true,
|
||||
"quotes": true,
|
||||
"random": true,
|
||||
"realestate": true,
|
||||
"receipts": true,
|
||||
"recepcion": true,
|
||||
"reception": true,
|
||||
"receptionist": true,
|
||||
"recruit": true,
|
||||
"recruiter": true,
|
||||
"recruiters": true,
|
||||
"recruiting": true,
|
||||
"recruitment": true,
|
||||
"recrutement": true,
|
||||
"recursoshumanos": true,
|
||||
"redacao": true,
|
||||
"redaccion": true,
|
||||
"redaction": true,
|
||||
"redazione": true,
|
||||
"referrals": true,
|
||||
"register": true,
|
||||
"registrar": true,
|
||||
"registration": true,
|
||||
"relacionamento": true,
|
||||
"release": true,
|
||||
"releases": true,
|
||||
"remote": true,
|
||||
"remove": true,
|
||||
"rentals": true,
|
||||
"report": true,
|
||||
"reporting": true,
|
||||
"reports": true,
|
||||
"request": true,
|
||||
"requests": true,
|
||||
"research": true,
|
||||
"reservaciones": true,
|
||||
"reservas": true,
|
||||
"reservation": true,
|
||||
"reservations": true,
|
||||
"residents": true,
|
||||
"response": true,
|
||||
"restaurant": true,
|
||||
"resume": true,
|
||||
"resumes": true,
|
||||
"retail": true,
|
||||
"returns": true,
|
||||
"revenue": true,
|
||||
"rezervari": true,
|
||||
"rfp": true,
|
||||
"rnd": true,
|
||||
"rockstars": true,
|
||||
"root": true,
|
||||
"rrhh": true,
|
||||
"rsvp": true,
|
||||
"sales": true,
|
||||
"sales-team": true,
|
||||
"sales.team": true,
|
||||
"sales1": true,
|
||||
"sales2": true,
|
||||
"salesengineers": true,
|
||||
"salesforce": true,
|
||||
"salesops": true,
|
||||
"salesteam": true,
|
||||
"sanfrancisco": true,
|
||||
"school": true,
|
||||
"schooloffice": true,
|
||||
"science": true,
|
||||
"sdr": true,
|
||||
"se": true,
|
||||
"search": true,
|
||||
"seattle": true,
|
||||
"secretaria": true,
|
||||
"secretariaat": true,
|
||||
"secretaris": true,
|
||||
"secretary": true,
|
||||
"security": true,
|
||||
"sekretariat": true,
|
||||
"sem": true,
|
||||
"seniors": true,
|
||||
"seo": true,
|
||||
"server": true,
|
||||
"service": true,
|
||||
"serviceclient": true,
|
||||
"servicedesk": true,
|
||||
"services": true,
|
||||
"servicioalcliente": true,
|
||||
"sf": true,
|
||||
"sf-office": true,
|
||||
"sfo": true,
|
||||
"sfoffice": true,
|
||||
"sfteam": true,
|
||||
"shareholders": true,
|
||||
"shipping": true,
|
||||
"shop": true,
|
||||
"shopify": true,
|
||||
"shopping": true,
|
||||
"signup": true,
|
||||
"signups": true,
|
||||
"singapore": true,
|
||||
"sistemas": true,
|
||||
"site": true,
|
||||
"smtp": true,
|
||||
"social": true,
|
||||
"socialclub": true,
|
||||
"socialmedia": true,
|
||||
"socios": true,
|
||||
"software": true,
|
||||
"solutions": true,
|
||||
"soporte": true,
|
||||
"sos": true,
|
||||
"spam": true,
|
||||
"sponsorship": true,
|
||||
"sport": true,
|
||||
"squad": true,
|
||||
"staff": true,
|
||||
"startups": true,
|
||||
"stats": true,
|
||||
"stockholm": true,
|
||||
"store": true,
|
||||
"stories": true,
|
||||
"strategy": true,
|
||||
"stripe": true,
|
||||
"student": true,
|
||||
"students": true,
|
||||
"studio": true,
|
||||
"submissions": true,
|
||||
"submit": true,
|
||||
"subscribe": true,
|
||||
"subscriptions": true,
|
||||
"success": true,
|
||||
"suggestions": true,
|
||||
"supervisor": true,
|
||||
"supervisors": true,
|
||||
"suporte": true,
|
||||
"supply": true,
|
||||
"support": true,
|
||||
"support-team": true,
|
||||
"supportteam": true,
|
||||
"suprimentos": true,
|
||||
"sydney": true,
|
||||
"sysadmin": true,
|
||||
"system": true,
|
||||
"systems": true,
|
||||
"ta": true,
|
||||
"talent": true,
|
||||
"tax": true,
|
||||
"teachers": true,
|
||||
"team": true,
|
||||
"teamleaders": true,
|
||||
"teamleads": true,
|
||||
"tech": true,
|
||||
"technical": true,
|
||||
"technik": true,
|
||||
"technology": true,
|
||||
"techops": true,
|
||||
"techsupport": true,
|
||||
"techteam": true,
|
||||
"tecnologia": true,
|
||||
"tesoreria": true,
|
||||
"test": true,
|
||||
"testgroup": true,
|
||||
"testing": true,
|
||||
"the.principal": true,
|
||||
"theoffice": true,
|
||||
"theteam": true,
|
||||
"tickets": true,
|
||||
"time": true,
|
||||
"timesheets": true,
|
||||
"todos": true,
|
||||
"tools": true,
|
||||
"tour": true,
|
||||
"trade": true,
|
||||
"trainers": true,
|
||||
"training": true,
|
||||
"transport": true,
|
||||
"travel": true,
|
||||
"treasurer": true,
|
||||
"tribe": true,
|
||||
"trustees": true,
|
||||
"turismo": true,
|
||||
"twitter": true,
|
||||
"uk": true,
|
||||
"undisclosed-recipients": true,
|
||||
"unsubscribe": true,
|
||||
"update": true,
|
||||
"updates": true,
|
||||
"us": true,
|
||||
"usa": true,
|
||||
"usenet": true,
|
||||
"user": true,
|
||||
"users": true,
|
||||
"usteam": true,
|
||||
"uucp": true,
|
||||
"ux": true,
|
||||
"vendas": true,
|
||||
"vendas1": true,
|
||||
"vendas2": true,
|
||||
"vendor": true,
|
||||
"vendors": true,
|
||||
"ventas": true,
|
||||
"ventas1": true,
|
||||
"ventas2": true,
|
||||
"verkauf": true,
|
||||
"verwaltung": true,
|
||||
"video": true,
|
||||
"vip": true,
|
||||
"voicemail": true,
|
||||
"volunteer": true,
|
||||
"volunteering": true,
|
||||
"volunteers": true,
|
||||
"vorstand": true,
|
||||
"warehouse": true,
|
||||
"watercooler": true,
|
||||
"web": true,
|
||||
"webadmin": true,
|
||||
"webdesign": true,
|
||||
"webdev": true,
|
||||
"webinars": true,
|
||||
"webmaster": true,
|
||||
"website": true,
|
||||
"webteam": true,
|
||||
"welcome": true,
|
||||
"whois": true,
|
||||
"wholesale": true,
|
||||
"women": true,
|
||||
"wordpress": true,
|
||||
"work": true,
|
||||
"workshop": true,
|
||||
"writers": true,
|
||||
"www": true,
|
||||
"zentrale": true,
|
||||
}
|
7
misc.go
7
misc.go
@ -6,10 +6,7 @@ import (
|
||||
)
|
||||
|
||||
var (
|
||||
disposableDomains sync.Map // map to store disposable domains data
|
||||
disposableDomainsLoaded bool // whether disposableDomains is loaded or not
|
||||
freeDomains map[string]bool // map to store free domains data
|
||||
roleAccounts map[string]bool // map to store role-based accounts data
|
||||
disposableSyncDomains sync.Map // concurrent safe map to store disposable domains data
|
||||
)
|
||||
|
||||
// IsRoleAccount checks if username is a role-based account
|
||||
@ -26,6 +23,6 @@ func (v *Verifier) IsFreeDomain(domain string) bool {
|
||||
func (v *Verifier) IsDisposable(domain string) bool {
|
||||
domain = domainToASCII(domain)
|
||||
d := parsedDomain(domain)
|
||||
_, found := disposableDomains.Load(d)
|
||||
_, found := disposableSyncDomains.Load(d)
|
||||
return found
|
||||
}
|
||||
|
90
verifier.go
90
verifier.go
@ -1,11 +1,7 @@
|
||||
package emailverifier
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/markbates/pkger"
|
||||
)
|
||||
|
||||
// Verifier is an email verifier. Create one by calling NewVerifier
|
||||
@ -30,12 +26,15 @@ type Result struct {
|
||||
Gravatar *Gravatar `json:"gravatar"` // whether or not have gravatar for the email
|
||||
}
|
||||
|
||||
// init loads disposable_domain meta data to disposableSyncDomains which are safe for concurrent use
|
||||
func init() {
|
||||
for d := range disposableDomains {
|
||||
disposableSyncDomains.Store(d, struct{}{})
|
||||
}
|
||||
}
|
||||
|
||||
// NewVerifier creates a new email verifier
|
||||
func NewVerifier() *Verifier {
|
||||
loadDisposableDomains()
|
||||
loadFreeDomains()
|
||||
loadRoleAccounts()
|
||||
|
||||
return &Verifier{
|
||||
fromEmail: defaultFromEmail,
|
||||
helloName: defaultHelloName,
|
||||
@ -146,81 +145,6 @@ func (v *Verifier) HelloName(domain string) *Verifier {
|
||||
return v
|
||||
}
|
||||
|
||||
// loadFreeDomains loads free_domain data
|
||||
func loadFreeDomains() {
|
||||
if len(freeDomains) > 0 {
|
||||
return
|
||||
}
|
||||
|
||||
freeDomainFile, err := pkger.Open(freeDomainDataPath)
|
||||
if err != nil {
|
||||
panic(fmt.Sprintf("open free domains' data file fail: %v ", err))
|
||||
}
|
||||
|
||||
scanner := bufio.NewScanner(freeDomainFile)
|
||||
scanner.Split(bufio.ScanLines)
|
||||
|
||||
freeDomains = make(map[string]bool)
|
||||
for scanner.Scan() {
|
||||
freeDomains[scanner.Text()] = true
|
||||
}
|
||||
|
||||
err = freeDomainFile.Close()
|
||||
if err != nil {
|
||||
panic(fmt.Sprintf("close free domains' data file fail: %v ", err))
|
||||
}
|
||||
}
|
||||
|
||||
// loadDisposableDomains loads disposable_domain data
|
||||
func loadDisposableDomains() {
|
||||
if disposableDomainsLoaded {
|
||||
return
|
||||
}
|
||||
|
||||
disposableDomainFile, err := pkger.Open(disposableDomainDataPath)
|
||||
if err != nil {
|
||||
panic(fmt.Sprintf("open disposable domains' data file fail: %v ", err))
|
||||
}
|
||||
|
||||
scanner := bufio.NewScanner(disposableDomainFile)
|
||||
scanner.Split(bufio.ScanLines)
|
||||
|
||||
for scanner.Scan() {
|
||||
disposableDomains.Store(scanner.Text(), struct{}{})
|
||||
}
|
||||
|
||||
err = disposableDomainFile.Close()
|
||||
if err != nil {
|
||||
panic(fmt.Sprintf("close disposable domains' data file fail: %v ", err))
|
||||
}
|
||||
disposableDomainsLoaded = true
|
||||
}
|
||||
|
||||
// loadRoleAccounts loads role_account data
|
||||
func loadRoleAccounts() {
|
||||
if len(roleAccounts) > 0 {
|
||||
return
|
||||
}
|
||||
|
||||
roleAccountFile, err := pkger.Open(roleAccountDataPath)
|
||||
if err != nil {
|
||||
panic(fmt.Sprintf("open role accounts' data file fail: %v ", err))
|
||||
}
|
||||
|
||||
scanner := bufio.NewScanner(roleAccountFile)
|
||||
scanner.Split(bufio.ScanLines)
|
||||
|
||||
roleAccounts = make(map[string]bool)
|
||||
for scanner.Scan() {
|
||||
roleAccounts[scanner.Text()] = true
|
||||
}
|
||||
|
||||
err = roleAccountFile.Close()
|
||||
if err != nil {
|
||||
panic(fmt.Sprintf("close role accounts' data file fail: %v ", err))
|
||||
}
|
||||
}
|
||||
|
||||
func (v *Verifier) calculateReachable(s *SMTP) string {
|
||||
if !v.smtpCheckEnabled {
|
||||
return reachableUnknown
|
||||
|
Loading…
x
Reference in New Issue
Block a user