void Ehlo (CancellationToken cancellationToken)
{
SmtpResponse response;
response = SendEhlo (true, cancellationToken);
// Some SMTP servers do not accept an EHLO after authentication (despite the rfc saying it is required).
if (authenticated && response.StatusCode == SmtpStatusCode.BadCommandSequence)
return;
if (response.StatusCode != SmtpStatusCode.Ok) {
// Try sending HELO instead...
response = SendEhlo (false, cancellationToken);
if (response.StatusCode != SmtpStatusCode.Ok)
throw new SmtpCommandException (SmtpErrorCode.UnexpectedStatusCode, response.StatusCode, response.Response);
} else {
// Clear the extensions
capabilities = SmtpCapabilities.None;
AuthenticationMechanisms.Clear ();
MaxSize = 0;
var lines = response.Response.Split ('\n');
for (int i = 0; i < lines.Length; i++) {
// Outlook.com replies with "250-8bitmime" instead of "250-8BITMIME"
// (strangely, it correctly capitalizes all other extensions...)
var capability = lines[i].Trim ().ToUpperInvariant ();
if (capability.StartsWith ("AUTH", StringComparison.Ordinal)) {
int index = 4;
capabilities |= SmtpCapabilities.Authentication;
if (index < capability.Length && capability[index] == '=')
index++;
var mechanisms = capability.Substring (index);
foreach (var mechanism in mechanisms.Split (new [] { ' ' }, StringSplitOptions.RemoveEmptyEntries))
AuthenticationMechanisms.Add (mechanism);
} else if (capability.StartsWith ("SIZE", StringComparison.Ordinal)) {
int index = 4;
uint size;
capabilities |= SmtpCapabilities.Size;
while (index < capability.Length && char.IsWhiteSpace (capability[index]))
index++;
if (uint.TryParse (capability.Substring (index), out size))
MaxSize = size;
} else if (capability == "DSN") {
capabilities |= SmtpCapabilities.Dsn;
} else if (capability == "BINARYMIME") {
capabilities |= SmtpCapabilities.BinaryMime;
} else if (capability == "CHUNKING") {
capabilities |= SmtpCapabilities.Chunking;
} else if (capability == "ENHANCEDSTATUSCODES") {
capabilities |= SmtpCapabilities.EnhancedStatusCodes;
} else if (capability == "8BITMIME") {
capabilities |= SmtpCapabilities.EightBitMime;
} else if (capability == "PIPELINING") {
capabilities |= SmtpCapabilities.Pipelining;
} else if (capability == "STARTTLS") {
capabilities |= SmtpCapabilities.StartTLS;
} else if (capability == "SMTPUTF8") {
capabilities |= SmtpCapabilities.UTF8;
}
}
}
}