Esempio n. 1
0
        /// <summary>
        /// Tries the parse email address.
        /// </summary>
        /// <param name="email">The data.</param>
        /// <param name="parsedAddress">The parsed address.</param>
        /// <param name="throwExceptionIfFail">if set to <c>true</c> [throw exception if fail].</param>
        /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
        public static bool TryParseEmailAddress(string email, out ParseAddressInfo parsedAddress, bool throwExceptionIfFail)
        {
            Encapsulation.TryValidateParam(email, nameof(email));

            return(TryParseEmailAddress(email, false, email.Length - 1, out parsedAddress, throwExceptionIfFail));
        }
Esempio n. 2
0
        private static bool TryParseEmailAddress(string data, bool expectMultipleAddresses, int index, out ParseAddressInfo parseAddressInfo, bool throwExceptionIfFail)
        {
            Debug.Assert(!string.IsNullOrEmpty(data));
            Debug.Assert(index >= 0 && index < data.Length, "Index out of range: " + index + ", " + data.Length);

            // Parsed components to be assembled as a MailAddress later
            string displayName;

            // Skip comments and whitespace
            if (!TryReadCfwsAndThrowIfIncomplete(data, index, out index, throwExceptionIfFail))
            {
                parseAddressInfo = default;
                return(false);
            }

            // Do we expect angle brackets around the address?
            // e.g. ("display name" <user@domain>)
            bool expectAngleBracket = false;

            if (data[index] == dotNetTips.Utility.Standard.Common.ControlChars.EndAngleBracket)
            {
                expectAngleBracket = true;
                index--;
            }

            if (!TryParseDomain(data, ref index, out string domain, throwExceptionIfFail))
            {
                parseAddressInfo = default;
                return(false);
            }

            // The next character after the domain must be the '@' symbol
            if (data[index] != dotNetTips.Utility.Standard.Common.ControlChars.At)
            {
                if (throwExceptionIfFail)
                {
                    throw new FormatException("Invalid email address.");
                }
                else
                {
                    parseAddressInfo = default;
                    return(false);
                }
            }

            // Skip the '@' symbol
            index--;

            if (!TryParseLocalPart(data, ref index, expectAngleBracket, expectMultipleAddresses, out var localPart, throwExceptionIfFail))
            {
                parseAddressInfo = default;
                return(false);
            }

            // Check for a matching angle bracket around the address
            if (expectAngleBracket)
            {
                if (index >= 0 && data[index] == dotNetTips.Utility.Standard.Common.ControlChars.StartAngleBracket)
                {
                    index--; // Skip the angle bracket

                    // Skip whitespace, but leave comments, as they may be part of the display name.
                    if (!WhitespaceReader.TryReadFwsReverse(data, index, out index, throwExceptionIfFail))
                    {
                        parseAddressInfo = default;
                        return(false);
                    }
                }
                else
                {
                    // Mismatched angle brackets
                    if (throwExceptionIfFail)
                    {
                        throw new FormatException($"Invalid character: {( index >= 0 ? data[index] : dotNetTips.Utility.Standard.Common.ControlChars.EndAngleBracket )}.");
                    }
                    else
                    {
                        parseAddressInfo = default;
                        return(false);
                    }
                }
            }

            // Is there anything left to parse?
            // There could still be a display name or another address
            if (index >= 0 && !(expectMultipleAddresses && data[index] == dotNetTips.Utility.Standard.Common.ControlChars.Comma))
            {
                if (!TryParseDisplayName(data, ref index, expectMultipleAddresses, out displayName, throwExceptionIfFail))
                {
                    parseAddressInfo = default;
                    return(false);
                }
            }
            else
            {
                displayName = string.Empty;
            }

            parseAddressInfo = new ParseAddressInfo(displayName, localPart, domain);
            return(true);
        }