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"));
これについて助けてくれてありがとう。
使用している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);
}
それを試してみてください。
オプションを「SecureSocketOptions.Auto」に設定できます。
await client.ConnectAsync(mailService.Host, mailService.Port, SecureSocketOptions.Auto);
MailKitは、SSLまたはTLSの使用を自動的に決定します。
MailKit Doc によると
Connect(string Host,int port,bool useSsl,CancellationToken cancellationToken = null)
UseSsl引数は、クライアントがSSLでラップされた接続を確立するかどうかのみを制御します。つまり、useSslパラメータがfalseの場合でも、メールサーバーがSTARTTLS拡張機能をサポートしていれば、SSL/TLSを使用できます。