Example #1
0
        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);
                    }
                }
            }
        }
Example #2
0
        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));
                }
            }
        }
Example #3
0
        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);
        }