4

asp.net mvc アプリケーションを使用してメールを送信しようとしています。SMTP クライアントは web.config で構成されます。

<mailSettings>
    <smtp from="noreply@test.sk">
        <network host="mail.test.sk" defaultCredentials="false" userName="noreply@test.sk" password="pass" port="25"/>
</smtp>
</mailSettings>

C#:

using (SmtpClient client = new SmtpClient())
{
    MailMessage message = new MailMessage(from, to, subject, body);
    client.Timeout = 10000;
    client.Send(message);
    return false;
}

問題は、Outlook を使用して電子メールを送信しようとするまで機能しない (タイムアウト例外が発生する) ことです。Outlook でメールを送信した直後に、Web アプリケーションでも正常に送信されます。私のIPからのすべての電子メールを認証できるようにする、outlookが行っている特別な種類の認証はありますか?? Outlookで送信して初めて機能する理由は何ですか?

ところで:VS asp.net開発サーバーでアプリケーションを実行しています。Web ホスティング サーバーにデプロイすると、動作しません (タイムアウト)。私の Web ホスティング プロバイダーは、そのサーバーには従来の smtp 認証があると教えてくれました (smtp の前に pop3 ではありません)。

編集:

それが機能し、telnetで試したり、wiresharkでトレースしたりしたところ、次の方法で通信が開始されたことがわかりました。

220 mail2.hostmaster.sk ESMTP Postfix
EHLO fernet-PC
250-mail2.hostmaster.sk
250-PIPELINING
250-SIZE 104857600
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
...

うまくいかなかったとき (前日に試しただけ) と比較すると、コミュニケーション全体は次のようになりました。

220-mail2.hostmaster.sk ESMTP Postfix
EHLO fernet-PC
250-mail2.hostmaster.sk
250-SIZE 104857600
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN

そのため、サポートされている認証方法とパイプラインのサポートには違いがあります。System.Net.Mail.SmtpClient は、どの認証方法を使用する必要があるのか​​ わからないため、スタックしてタイムアウト例外が発生していると思います。

興味深いのは、Outlook が接続してメールを送信するのに問題がないことです。

時間がなくなったので、smtp サーバーを使用しないことで問題を解決しました。代わりに gmail の smtp サーバーを使用しています。エイリアスを必要なものに設定した新しいGmailアカウントを作成したため、最初の外観ではメールがGmailから送信されたようには見えません。

4

1 に答える 1

0

サイトで同様の問題を修正し、問題の調査中にこの質問に出くわしました。

次のコードは、Google Apps for Business で機能します。

public class SendSMTPEmail
    {
    public static void SendText(string ToName, string ToEmail, string FromName, string FromEmail, string Subject, string Content)
    {
        MailAddress from = new MailAddress(ToEmail, ToName);
        MailAddress to = new MailAddress(ToEmail, ToName);

        var smtp = new SmtpClient
        {
            Host = "smtp.gmail.com",
            Port = 587,
            EnableSsl = true,
            DeliveryMethod = SmtpDeliveryMethod.Network,
            Credentials = new NetworkCredential("username@googlemail.com", "yourpassword"),
            Timeout = 20000
        };

        MailMessage message = new MailMessage()
        {
            From = from,
            Body = Content,
            Subject = Subject
        };

        message.To.Add(to);

        smtp.Send(message);

    }
}

これは役に立ちますか?

于 2013-05-02T10:59:14.070 に答える