HOWTO · Go

GoLang メールバリデーター

このチュートリアルでは、Go でメールを検証する方法を示します。

このチュートリアルでは、GoLang でメールを検証する方法を示します。

電子メールには特定の形式が必要です。 そうしないと、機能しません。 そのため、電子メール システムを構築する際に電子メールの検証が重要になります。 このチュートリアルでは、GoLang で電子メールを検証するためのさまざまな方法を示します。

正規表現を使用して GoLang 電子メール バリデーターを作成する

regex は、さまざまなプログラミング言語のさまざまな形式を検証するために使用されます。 GoLang は、さまざまな形式を検証するパッケージ regexp も提供し、電子メールの検証に使用できます。

例を試してみましょう:

package main

import (
    "fmt"
    "regexp"
)

func main() {
    string1 := "delftstack.123@hotmail.com"
    string2 := "demo@delftstack.com"
    string3 := "demo@delftstack.tv"
    string4 := "demohotmail.com"
    string5 := "demo@"

    // regex pattern for email ^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$
    RegexPattern := regexp.MustCompile("^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$")

    fmt.Printf("Email 1: %v :%v\n", string1, RegexPattern.MatchString(string1))
    fmt.Printf("Email 2: %v :%v\n", string2, RegexPattern.MatchString(string2))
    fmt.Printf("Email 3: %v :%v\n", string3, RegexPattern.MatchString(string3))
    fmt.Printf("Email 4: %v :%v\n", string4, RegexPattern.MatchString(string4))
    fmt.Printf("Email 5: %v :%v\n", string5, RegexPattern.MatchString(string5))
    fmt.Printf("\nThe regex email pattern: %v\n", RegexPattern.String())

}

上記のコードは、Go 言語の regexp パッケージを使用して、正規表現に基づいてメールを検証します。 上記のコードの出力を参照してください。

Email 1: delftstack.123@hotmail.com :true
Email 2: demo@delftstack.com :true
Email 3: demo@delftstack.tv :true
Email 4: demohotmail.com :false
Email 5: demo@ :false

The regex email pattern: ^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$

Mail API を使用して GoLang Email Validator を作成する

GoLang の mail API には、メールの検証に使用される mail.ParseAddress メソッドがあります。 この関数は、RFC 5322 アドレスを解析します。また、name <local-part@domain> 形式を使用して、文字列が電子メールかどうかを確認することもできます。

mail.ParseAddress メソッドを使用して電子メールバリデーターを実装する方法を見てみましょう。

package main

import (
    "fmt"
    "net/mail"
)

func EmailValidator(EmailAddress string) (string, bool) {
    a, b := mail.ParseAddress(EmailAddress)
    if b != nil {
        return "", false
    }
    return a.Address, true
}

var EmailAddresses = []string{
    "delftstack.123@hotmail.com",
    "Delftstack <demo@delftstack.com>",
    "demo@delftstack.tv",
    "demohotmail.com",
    "demo@",
}

func main() {
    for _, e_address := range EmailAddresses {
        if emailaddress, ok := EmailValidator(e_address); ok {
            fmt.Printf("The Input: %-30s Valadity: %-10t Email Address: %s\n", e_address, ok, emailaddress)
        } else {
            fmt.Printf("The Input: %-30s Valadity: %-10t\n", e_address, ok)
        }
    }
}

上記のコードは、mail.ParseAddress メソッドを使用して EmailValidator として関数を作成します。 このコードは、電子メールの配列の検証をチェックします。

出力を参照してください。

The Input: delftstack.123@hotmail.com     Valadity: true       Email Address: delftstack.123@hotmail.com
The Input: Delftstack <demo@delftstack.com> Valadity: true       Email Address: demo@delftstack.com
The Input: demo@delftstack.tv             Valadity: true       Email Address: demo@delftstack.tv
The Input: demohotmail.com                Valadity: false
The Input: demo@                          Valadity: false

GoLang Email Validator のメソッドを作成する

正規表現が難しい、またはパッケージをロードする際にあいまいさがあるとします。 その場合、GoLang コードに基づいてメソッドを作成し、標準形式に基づいて電子メールを検証することもできます。

以下に例を示します。

package main

import (
    "fmt"
    "strings"
    "unicode"
)

func EmailValidator(emailaddress string) bool {
    if emailaddress == "" {
        return false
    }
    if CheckSpace(emailaddress) {
        return false
    }

    AttheRate := strings.IndexByte(emailaddress, '@')
    if AttheRate == -1 {
        return false
    }

    localPart := emailaddress[:AttheRate]
    if localPart == "" {
        return false
    }

    DomainCheck := emailaddress[AttheRate+1:]
    if DomainCheck == "" {
        return false
    }

    LastDot := strings.IndexByte(DomainCheck, '.')
    if LastDot == -1 || LastDot == 0 || LastDot == len(DomainCheck)-1 {
        return false
    }

    if strings.Index(DomainCheck, "..") != -1 {
        return false
    }

    AfterDot := strings.LastIndexByte(DomainCheck, '.')
    return 2 <= len([]rune(DomainCheck[AfterDot+1:]))
}

func CheckSpace(emailaddress string) bool {
    for _, a := range emailaddress {
        if unicode.IsSpace(a) {
            return true
        }
    }
    return false
}

func main() {
    string1 := "delftstack.123@hotmail.com"
    string2 := "demo@delftstack.com"
    string3 := "demo@delftstack.tv"
    string4 := "demohotmail.com"
    string5 := "demo@"

    fmt.Printf("Email 1: %v :%v\n", string1, EmailValidator(string1))
    fmt.Printf("Email 2: %v :%v\n", string2, EmailValidator(string2))
    fmt.Printf("Email 3: %v :%v\n", string3, EmailValidator(string3))
    fmt.Printf("Email 4: %v :%v\n", string4, EmailValidator(string4))
    fmt.Printf("Email 5: %v :%v\n", string5, EmailValidator(string5))

}

上記のコードは、純粋に GoLang コードに基づいてメソッドを作成し、電子メールの検証をチェックします。 出力を見てみましょう:

Email 1: delftstack.123@hotmail.com :true
Email 2: demo@delftstack.com :true
Email 3: demo@delftstack.tv :true
Email 4: demohotmail.com :false
Email 5: demo@ :false