6

優れたC#ユーザーのように、私はこのMailAddressオブジェクトを使用して電子メールアドレスを検証します。

私のクライアントがjohn@gmail.彼の電子メールを入力しました。これはによって検証されMailAddress、私のソフトウェアを壊しました。以下のコードで例外がスローされると思いますが、そうではありません。

static void Main(string[] args)
{
    string addressmail = string.Empty;

    try
    {
        MailAddress mail = new MailAddress(@"john@gmail.");
        addressmail = mail.Address;
    }
    catch (FormatException)
    {
        // address is invalid
    }

    // address is valid
    Console.WriteLine(addressmail);
}

このような偽のメールアドレスを捕まえる方法を知っていますか?

4

6 に答える 6

4

この場合、少なくともRFC822に従って、MSによる有効な電子メールアドレスの実装は正しくないと思います。私は実際にあなたのコードを試したことがないので、あなたが言うようにそれがうまくいくと思います。

SMTPサーバーに実際に接続し、アドレスが有効であることを確認するように要求するなど、電子メールアドレスを検証する方法は他にもあります(ここここで説明されています)。それをしなければ、あなたはいつも少し問題を抱えることになります。個人的には、いくつかの仕様に従って電子メールアドレスを検証するのに多くの時間を費やす価値はないと思います(私たちが自由に使えるクイックチェックを超えて、たとえばあなたのコード)-実際のテストは、そのアドレスで電子メールが受信されるかどうかですあなたがそれを送るならば。簡単な電子メール検証でこれを確認できますが、すべての場合に適切であるとは限りませんが、その場合は運が悪いです。

于 2011-08-24T11:29:40.137 に答える
4

MailAddressタイプでは、電子メールアドレスの検証のサポートが非常に制限されており、.NET 4.0以降、関連するIETF標準のほとんどをサポートしていません。電子メールアドレスの構文を検証する必要がある場合は、おそらく通常の式を使用せずに、主題に関する現在のすべての標準をサポートする.NETコンポーネントであるEmailVerify.NET(RFC 1123、RFC 2821)を確認することをお勧めします。、RFC 2822、RFC 3696、RFC 4291、RFC 5321、RFC 5322)。必要に応じて、コンポーネントでは、DNS、SMTP、メールボックスのチェックなど、アドレスに対して追加のテストを実行することもできます。

免責事項:私はこの製品のリード開発者です。

于 2011-08-24T22:01:37.883 に答える
1

どういうわけか修正されたバージョン、ホストを検証するためのMailAddressと単純な正規表現の混合:

SLaksのアドバイスによる静的正規表現

private static readonly Regex hostReg = new Regex(@"(\w+)\.(\w+)");

public bool IsMailAddress(string addParam)
        {
            try
            {
                MailAddress mail = new MailAddress(addParam);
                string address = mail.Address;

                //not handled by MailAdress, which is a shame
                return hostReg.IsMatch(mail.Host);
            }
            catch (FormatException)
            {
                //address is invalid
                return false;
            }
            catch (Exception)
            {
                return false;
            }
        }
于 2011-08-24T14:14:32.737 に答える
1

MailboxValidatorには、使用できる無料のAPIがあります。http://www.mailboxvalidator.com/plans#apiで無料のAPIプランにサインアップするだけで、C#クラスhttp://www.mailboxvalidator.com/dotnetもあるため、統合の部分は非常に簡単です。 API呼び出しをラップします。

C#クラスコードはhttps://github.com/MailboxValidator/mailboxvalidator-csharpにあります

NuGet( https://www.nuget.org/packages/MailboxValidator.SingleValidation/ )を介してMailboxValidator SingleValidationクラスをインストールするには、パッケージマネージャーコンソールで次のコマンドを実行します。

Install-Package MailboxValidator.SingleValidation

次に、次のようにクラスを使用できます。

using System;
using System.Windows.Forms;
using MailboxValidator;

namespace TestMailboxValidatorCSharp
{
    public class TestMailboxValidatorCSharp
    {
        static void Main(string[] args)
        {
            var mbv = new SingleValidation("PASTE_YOUR_API_KEY_HERE");
            String results = "";
            try
            {
                MBVResult rec = mbv.ValidateEmail("example@example.com");

                if (rec.ErrorCode == "")
                {
                    results += "email_address: " + rec.EmailAddress + "\n";
                    results += "domain: " + rec.Domain + "\n";
                    results += "is_free: " + rec.IsFree + "\n";
                    results += "is_syntax: " + rec.IsSyntax + "\n";
                    results += "is_domain: " + rec.IsDomain + "\n";
                    results += "is_smtp: " + rec.IsSMTP + "\n";
                    results += "is_verified: " + rec.IsVerified + "\n";
                    results += "is_server_down: " + rec.IsServerDown + "\n";
                    results += "is_greylisted: " + rec.IsGreylisted + "\n";
                    results += "is_disposable: " + rec.IsDisposable + "\n";
                    results += "is_suppressed: " + rec.IsSuppressed + "\n";
                    results += "is_role: " + rec.IsRole + "\n";
                    results += "is_high_risk: " + rec.IsHighRisk + "\n";
                    results += "is_catchall: " + rec.IsCatchall + "\n";
                    results += "mailboxvalidator_score: " + rec.MailboxValidatorScore + "\n";
                    results += "time_taken: " + rec.TimeTaken + "\n";
                    results += "status: " + rec.Status + "\n";
                    results += "credits_available: " + rec.CreditsAvailable + "\n";
                }
                else
                {
                    results += "error_code: " + rec.ErrorCode + "\n";
                    results += "error_message: " + rec.ErrorMessage + "\n";
                }

                results += "version: " + rec.Version + "\n";
                MessageBox.Show(results);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message + "\n" + ex.StackTrace);
            }
        }
    }
}
于 2017-08-10T01:09:15.417 に答える
0

MailAddressは、RFC822を廃止するRFC2822との互換性を試みます。MailAddressのソースコードを読むと、一部の電子メールクライアントとの互換性のためだけにエンドドットが受け入れられていることがわかります。正規表現を使用して電子メールアドレスを検証することは正しいことではありません(RFC2822を参照)。最善の方法は、MailAddressが行ったようにパーサーを実装することです。

MailAddressParserが使用するDotAtomReaderを参照してください

于 2016-08-12T15:55:42.993 に答える
0

無料のソリューションではありませんが、Cobisiの電子メール検証ライブラリは、さまざまなレベルの精度(Syntax、IspSpecificSyntax、DeaDomain、Dns、DeaMailExchanger、Smtp、Mailbox、CatchAll)内で電子メールが有効かどうかを判断できます。

var engine = new VerificationEngine();
var result = engine.Run("john@example.com",
                        VerificationLevel.Mailbox).Result;

if (result.LastStatus == VerificationStatus.Success)
{
    // TODO: Show a message box with the great news
}

免責事項:私は会社やプロジェクトとは関係ありません。

于 2017-08-09T18:00:37.763 に答える