public Prepare ( EncodingConstraint constraint, int maxLineLength = 78 ) : void | ||
constraint | EncodingConstraint | The encoding constraint. |
maxLineLength | int | The maximum allowable length for a line (not counting the CRLF). Must be between |
return | void |
void Send (FormatOptions options, MimeMessage message, MailboxAddress sender, IList<MailboxAddress> recipients, CancellationToken cancellationToken, ITransferProgress progress) { CheckDisposed (); if (!IsConnected) throw new ServiceNotConnectedException ("The SmtpClient is not connected."); var format = options.Clone (); format.International = format.International || sender.IsInternational || recipients.Any (x => x.IsInternational); format.HiddenHeaders.Add (HeaderId.ContentLength); format.HiddenHeaders.Add (HeaderId.ResentBcc); format.HiddenHeaders.Add (HeaderId.Bcc); format.NewLineFormat = NewLineFormat.Dos; if (format.International && (Capabilities & SmtpCapabilities.UTF8) == 0) throw new NotSupportedException ("The SMTP server does not support the SMTPUTF8 extension."); if (format.International && (Capabilities & SmtpCapabilities.EightBitMime) == 0) throw new NotSupportedException ("The SMTP server does not support the 8BITMIME extension."); // prepare the message if ((Capabilities & SmtpCapabilities.BinaryMime) != 0) message.Prepare (EncodingConstraint.None, MaxLineLength); else if ((Capabilities & SmtpCapabilities.EightBitMime) != 0) message.Prepare (EncodingConstraint.EightBit, MaxLineLength); else message.Prepare (EncodingConstraint.SevenBit, MaxLineLength); // figure out which SMTP extensions we need to use var visitor = new ContentTransferEncodingVisitor (capabilities); visitor.Visit (message); var extensions = visitor.SmtpExtensions; if (format.International) extensions |= SmtpExtension.UTF8; try { // Note: if PIPELINING is supported, MailFrom() and RcptTo() will // queue their commands instead of sending them immediately. MailFrom (message, sender, extensions, cancellationToken); var unique = new HashSet<string> (StringComparer.OrdinalIgnoreCase); foreach (var recipient in recipients) { if (unique.Add (recipient.Address)) RcptTo (message, recipient, cancellationToken); } // Note: if PIPELINING is supported, this will flush all outstanding // MAIL FROM and RCPT TO commands to the server and then process all // of their responses. FlushCommandQueue (sender, recipients, cancellationToken); if ((extensions & SmtpExtension.BinaryMime) != 0) Bdat (format, message, cancellationToken, progress); else Data (format, message, cancellationToken, progress); } catch (ServiceNotAuthenticatedException) { // do not disconnect throw; } catch (SmtpCommandException) { Reset (cancellationToken); throw; } catch { Disconnect (); throw; } }