1

現在、私はSMTPコードを介してメールを送信しています

SmtpClient client = new SmtpClient();
client.DeliveryMethod = SmtpDeliveryMethod.Network;
//client.EnableSsl = true;
client.Send(msg);

メールが配信されているか、コードを使用してsmtp例外を使用していないという配信ステータスを確認する必要があります

4

2 に答える 2

3

@Chase は技術的には正しいですが、ルート上の SMTP サーバーがこの拡張機能をサポートしている場合、配信ステータス通知を受け取ることができます。

System.Net.Mail でこれを行う方法はわかりませんが、MailKitを使用すると、実際に受信者の配信ステータス通知を要求できます。

MailKit で最初に行う必要があることは (これに適した API を見つけるまで)、次のように独自の SmtpClient クラスをセットアップすることです。

class MySmtpClient : SmtpClient
{
    public MySmtpClient ()
    {
    }

    /// <summary>
    /// Get the envelope identifier to be used with delivery status notifications.
    /// </summary>
    /// <remarks>
    /// <para>The envelope identifier, if non-empty, is useful in determining which message
    /// a delivery status notification was issued for.</para>
    /// <para>The envelope identifier should be unique and may be up to 100 characters in
    /// length, but must consist only of printable ASCII characters and no white space.</para>
    /// <para>For more information, see rfc3461, section 4.4.</para>
    /// </remarks>
    /// <returns>The envelope identifier.</returns>
    /// <param name="message">The message.</param>
    protected override string GetEnvelopeId (MimeMessage message)
    {
        // The Message-Id header is probably the easiest way to go...
        return message.MessageId;
    }

    /// <summary>
    /// Get the types of delivery status notification desired for the specified recipient mailbox.
    /// </summary>
    /// <remarks>
    /// Gets the types of delivery status notification desired for the specified recipient mailbox.
    /// </remarks>
    /// <returns>The desired delivery status notification type.</returns>
    /// <param name="message">The message being sent.</param>
    /// <param name="mailbox">The mailbox.</param>
    protected override DeliveryStatusNotification? GetDeliveryStatusNotifications (MimeMessage message, MailboxAddress mailbox)
    {
        // Since you want to know whether the message got delivered or not,
        // you'll probably want to get notifications for Success and Failure.
        return DeliveryStatusNotification.Success | DeliveryStatusNotification.Failure;
    }
}

次に、それを取得したら、次のように使用します。

using (var client = new MySmtpClient ()) {
    client.Connect ("smtp.gmail.com", 465, true);
    client.Authenticate ("username", "password");
    client.Send (message);
    client.Disconnect (true);
}

これで何が起こるかというと、成功または失敗の通知があるたびに、アカウントの受信トレイ (使用するものに応じて POP3 または IMAP) にメールが配信され、multipart/report通常は他の 3 つの MIME パーツが含まれる MIME パーツが含まれます。 : 人間が読める説明、message/delivery-statusいくつかのキーと値のペアを含む本文を持つ MIME 部分と、元のメッセージ (または場合によってはヘッダーのみ) を含む 3 番目の部分を持ちます。

現在、MailKit にはmessage/delivery-statusMIME パーツを処理するための特別な MIME クラスはありませんが、次のようにコンテンツを解析することでこれを回避できます。

var mds = message.BodyParts.OfType<MimePart>.Where (x => x.ContentType.Matches ("message", "delivery-status")).FirstOrDefault ();
if (mds != null) {
    using (var memory = new MemoryStream ()) {
        mds.ContentObject.DecodeTo (memory);
        memory.Position = 0;

        // the content of a message/delivery-status MIME part is a
        // collection of header groups. The first group of headers
        // will contain the per-message status headers while each
        // group after that will contain status headers for a
        // particular recipient.
        var groups = new List<HeaderList> ();
        while (memory.Position < memory.Length)
            groups.Add (HeaderList.Load (memory));

        // TODO: take a look at the specific "headers" to get the info we 
        // care about. For more info on what these header field names and
        // values are, take a look at https://tools.ietf.org/html/rfc3464
    }
}

更新: MIME パーツのコンテンツの解析を処理する MessageDeliveryStatus クラスを MimeKit に追加しましたが、2 日前にリリースを行ったばかりmessage/delivery-statusなので、別のリリースを行うまでに最大 2 週間かかる場合があります。この新しいクラスは、リリース時に MimeKit 1.2.8 で見つかると期待しています。

于 2015-07-06T13:13:09.037 に答える
1

あなたはそれをチェックすることはできません。SMTPを使用しているため、配信が成功したかどうかを判断することはできません。メールは配信中にルーティングされます。いくつかの便利なトリックは、送信する前にメールアドレスが有効であることを確認し、実際の受信トレイとして単一の返信なしアドレスを設定し、POP3を使用してメールアカウントにアクセスし、バウンスバックメッセージを探すことです. SMTP の仕組みの詳細

于 2015-07-04T12:38:08.527 に答える