internal void EncodeHeaders(HeaderCollection headers, bool allowUnicode) { if (_headersEncoding == null) { _headersEncoding = Encoding.GetEncoding(MimeBasePart.DefaultCharSet); } System.Diagnostics.Debug.Assert(_headersEncoding != null); for (int i = 0; i < headers.Count; i++) { string headerName = headers.GetKey(i); //certain well-known values are encoded by PrepareHeaders and PrepareEnvelopeHeaders //so we can ignore them because either we encoded them already or there is no //way for the user to have set them. If a header is well known and user settable then //we should encode it here, otherwise we have already encoded it if necessary if (!MailHeaderInfo.IsUserSettable(headerName)) { continue; } string[] values = headers.GetValues(headerName); string encodedValue = string.Empty; for (int j = 0; j < values.Length; j++) { //encode if we need to if (MimeBasePart.IsAscii(values[j], false) || (allowUnicode && MailHeaderInfo.AllowsUnicode(headerName) && // EAI !MailBnfHelper.HasCROrLF(values[j]))) { encodedValue = values[j]; } else { encodedValue = MimeBasePart.EncodeHeaderValue(values[j], _headersEncoding, MimeBasePart.ShouldUseBase64Encoding(_headersEncoding) && !PreferQEncodeForHeaders, headerName.Length); } //potentially there are multiple values per key if (j == 0) { //if it's the first or only value, set will overwrite all the values assigned to that key //which is fine since we have them stored in values[] headers.Set(headerName, encodedValue); } else { //this is a subsequent key, so we must Add it since the first key will have overwritten the //other values headers.Add(headerName, encodedValue); } } } }
internal void PrepareEnvelopeHeaders(bool sendEnvelope, bool allowUnicode) { if (_headersEncoding == null) { _headersEncoding = Encoding.GetEncoding(MimeBasePart.DefaultCharSet); } EncodeHeaders(EnvelopeHeaders, allowUnicode); // Only add X-Sender header if it wasn't already set by the user string xSenderHeader = MailHeaderInfo.GetString(MailHeaderID.XSender); if (!IsHeaderSet(xSenderHeader)) { MailAddress sender = Sender ?? From; EnvelopeHeaders.InternalSet(xSenderHeader, sender.Encode(xSenderHeader.Length, allowUnicode)); } string headerName = MailHeaderInfo.GetString(MailHeaderID.XReceiver); EnvelopeHeaders.Remove(headerName); if (AutomaticallyBuildAndApplyRecipientHeaders) { foreach (MailAddress address in To) { EnvelopeHeaders.InternalAdd(headerName, address.Encode(headerName.Length, allowUnicode)); } foreach (MailAddress address in CC) { EnvelopeHeaders.InternalAdd(headerName, address.Encode(headerName.Length, allowUnicode)); } foreach (MailAddress address in Bcc) { EnvelopeHeaders.InternalAdd(headerName, address.Encode(headerName.Length, allowUnicode)); } } }
internal void PrepareHeaders(bool sendEnvelope, bool allowUnicode) { string headerName; if (_headersEncoding == null) { _headersEncoding = Encoding.GetEncoding(MimeBasePart.DefaultCharSet); } //ContentType is written directly to the stream so remove potential user duplicate Headers.Remove(MailHeaderInfo.GetString(MailHeaderID.ContentType)); Headers[MailHeaderInfo.GetString(MailHeaderID.MimeVersion)] = "1.0"; // add sender to headers first so that it is written first to allow the IIS smtp svc to // send MAIL FROM with the sender if both sender and from are present headerName = MailHeaderInfo.GetString(MailHeaderID.Sender); if (Sender != null && EmitSenderHeader) { Headers.InternalAdd(headerName, Sender.Encode(headerName.Length, allowUnicode)); } else { Headers.Remove(headerName); } headerName = MailHeaderInfo.GetString(MailHeaderID.From); Headers.InternalAdd(headerName, From.Encode(headerName.Length, allowUnicode)); if (AutomaticallyBuildAndApplyRecipientHeaders) { headerName = MailHeaderInfo.GetString(MailHeaderID.To); if (To.Count > 0) { Headers.InternalAdd(headerName, To.Encode(headerName.Length, allowUnicode)); } else { Headers.Remove(headerName); } headerName = MailHeaderInfo.GetString(MailHeaderID.Cc); if (CC.Count > 0) { Headers.InternalAdd(headerName, CC.Encode(headerName.Length, allowUnicode)); } else { Headers.Remove(headerName); } } headerName = MailHeaderInfo.GetString(MailHeaderID.ReplyTo); if (ReplyTo != null) { Headers.InternalAdd(headerName, ReplyTo.Encode(headerName.Length, allowUnicode)); } else if (ReplyToList.Count > 0) { Headers.InternalAdd(headerName, ReplyToList.Encode(headerName.Length, allowUnicode)); } else { Headers.Remove(headerName); } if (!DisplayBccHeader) { Headers.Remove(MailHeaderInfo.GetString(MailHeaderID.Bcc)); } if (AutomaticallyBuildAndApplyRecipientHeaders && DisplayBccHeader && Bcc.Count > 0) { Headers.Remove(MailHeaderInfo.GetString(MailHeaderID.Bcc)); headerName = MailHeaderInfo.GetString(MailHeaderID.Bcc); Headers.InternalAdd(headerName, Bcc.Encode(headerName.Length, allowUnicode)); } if (_priority == MailPriority.High) { Headers[MailHeaderInfo.GetString(MailHeaderID.XPriority)] = "1"; Headers[MailHeaderInfo.GetString(MailHeaderID.Priority)] = "urgent"; Headers[MailHeaderInfo.GetString(MailHeaderID.Importance)] = "high"; } else if (_priority == MailPriority.Low) { Headers[MailHeaderInfo.GetString(MailHeaderID.XPriority)] = "5"; Headers[MailHeaderInfo.GetString(MailHeaderID.Priority)] = "non-urgent"; Headers[MailHeaderInfo.GetString(MailHeaderID.Importance)] = "low"; } //if the priority was never set, allow the app to set the headers directly. else if (((int)_priority) != -1) { Headers.Remove(MailHeaderInfo.GetString(MailHeaderID.XPriority)); Headers.Remove(MailHeaderInfo.GetString(MailHeaderID.Priority)); Headers.Remove(MailHeaderInfo.GetString(MailHeaderID.Importance)); } Headers.InternalAdd(MailHeaderInfo.GetString(MailHeaderID.Date), MailBnfHelper.GetDateTimeString(Date, null)); headerName = MailHeaderInfo.GetString(MailHeaderID.Subject); if (!string.IsNullOrEmpty(_subject)) { if (allowUnicode) { Headers.InternalAdd(headerName, _subject); } else { Headers.InternalAdd(headerName, MimeBasePart.EncodeHeaderValue(_subject, _subjectEncoding, MimeBasePart.ShouldUseBase64Encoding(_subjectEncoding) && !PreferQEncodeForHeaders, headerName.Length)); } } else { Headers.Remove(headerName); } EncodeHeaders(_headers, allowUnicode); }