web-dev-qa-db-ja.com

MailkitSMTP-StartTLSおよびTLSフラグ

SmtpClient経由でiCloudに接続しようとしています

私が使用している設定は次のとおりです。

サーバー名:smtp.mail.me.com
SSLが必要:はい
SSLを使用しているときにエラーメッセージが表示された場合は、代わりにTLSまたはSTARTTLSを使用してみてください。
ポート:587
SMTP認証が必要:はい-関連するユーザー名とパスワードを使用

SSLを使用すると、「予期しないパケット形式が原因でハンドシェイクに失敗しました」というメッセージが表示されます。

SSLビジュアルスタジオデバッガーを使用しない場合、接続時にハングします。

問題は、SmtpClientにtlsを使用するように指示していないことだと思いますが、これを行う方法に関するドキュメントが見つかりません。

コードは次のとおりです。

using (var client = new SmtpClient()) {
    client.Timeout = 1000 * 20;
    //client.Capabilities.
    client.AuthenticationMechanisms.Remove ("XOAUTH2");

    client.Connect("SMTP.mail.me.com", 587, false); //dies here
    //client.Connect(servername, port, useSsl);
    //can I set tls or starttls here??
    client.Authenticate(username, password);
    client.Send(FormatOptions.Default, message);
}

TLSまたはStartTLSを手動で設定できますか?私が試したのは次のことですが、うまくいかなかったようです

client.Connect(new Uri("smtp://" + servername + ":" + port + "/?starttls=true"));

これについて助けてくれてありがとう。

11
cavej03

使用しているConnect()メソッドでは、SSLでラップされた接続の有効化/無効化のみが許可されます。これはStartTLSと同じではありません。

混乱が生じたため、別のConnect()メソッドを実装しました。これにより、何が起こっているのかがより明確になります。

using (var client = new SmtpClient()) {
    // Note: don't set a timeout unless you REALLY know what you are doing.
    //client.Timeout = 1000 * 20;

    // Removing this here won't do anything because the AuthenticationMechanisms
    // do not get populated until the client connects to the server.
    //client.AuthenticationMechanisms.Remove ("XOAUTH2");

    client.Connect ("smtp.mail.me.com", 587, SecureSocketOptions.StartTls);

    client.AuthenticationMechanisms.Remove ("XOAUTH2");

    client.Authenticate (username, password);
    client.Send (message);
}

それを試してみてください。

18
jstedfast

オプションを「SecureSocketOptions.Auto」に設定できます。

await client.ConnectAsync(mailService.Host, mailService.Port,   SecureSocketOptions.Auto);

MailKitは、SSLまたはTLSの使用を自動的に決定します。

0
error505

MailKit Doc によると

Connect(string Host,int port,bool useSsl,CancellationToken cancellationToken = null)

UseSsl引数は、クライアントがSSLでラップされた接続を確立するかどうかのみを制御します。つまり、useSslパラメータがfalseの場合でも、メールサーバーがSTARTTLS拡張機能をサポートしていれば、SSL/TLSを使用できます