public Task <IBinding> TryCreateAsync(BindingProviderContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            ParameterInfo parameter = context.Parameter;
            SmtpAttribute attribute = parameter.GetCustomAttribute <SmtpAttribute>(inherit: false);

            if (attribute == null)
            {
                return(Task.FromResult <IBinding>(null));
            }

            //if (context.Parameter.ParameterType != typeof(MailMessage) &&
            //    context.Parameter.ParameterType != typeof(MailMessage).MakeByRefType())
            //{
            //    throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture,
            //        "Can't bind SmtpAttribute to type '{0}'.", parameter.ParameterType));
            //}

            if (string.IsNullOrEmpty(_config.Host))
            {
                throw new InvalidOperationException(
                          string.Format("The Smtp Host must be set either via a '{0}' app setting, via a '{0}' environment variable, or directly in code via SmtpConfiguration.Host.",
                                        SmtpConfiguration.AzureWebJobsSmtpHost));
            }

            if (_config.Port == 0)
            {
                throw new InvalidOperationException(
                          string.Format("The Smtp Port must be set either via a '{0}' app setting, via a '{0}' environment variable, or directly in code via SmtpConfiguration.Port.",
                                        SmtpConfiguration.AzureWebJobsSmtpPort));
            }

            if (string.IsNullOrEmpty(_config.User))
            {
                throw new InvalidOperationException(
                          string.Format("The Smtp User must be set either via a '{0}' app setting, via a '{0}' environment variable, or directly in code via SmtpConfiguration.User.",
                                        SmtpConfiguration.AzureWebJobsSmtpUser));
            }

            if (string.IsNullOrEmpty(_config.Password))
            {
                throw new InvalidOperationException(
                          string.Format("The Smtp Password must be set either via a '{0}' app setting, via a '{0}' environment variable, or directly in code via SmtpConfiguration.Password.",
                                        SmtpConfiguration.AzureWebJobsSmtpPassword));
            }

            return(Task.FromResult <IBinding>(new SmtpBinding(parameter, attribute, _config, _nameResolver, context)));
        }
        public SmtpBinding(ParameterInfo parameter, SmtpAttribute attribute, SmtpConfiguration config, INameResolver nameResolver, BindingProviderContext context)
        {
            _parameter    = parameter;
            _attribute    = attribute;
            _config       = config;
            _nameResolver = nameResolver;

            _smtpClient = new SmtpClient();

            _smtpClient.Host        = _config.Host;
            _smtpClient.Port        = _config.Port;
            _smtpClient.EnableSsl   = _config.EnableSsl;
            _smtpClient.Credentials = new NetworkCredential(_config.User, _config.Password);

            if (!string.IsNullOrEmpty(_attribute.To))
            {
                _toFieldBindingTemplate = CreateBindingTemplate(_attribute.To, context.BindingDataContract);
            }

            if (!string.IsNullOrEmpty(_attribute.Cc))
            {
                _ccFieldBindingTemplate = CreateBindingTemplate(_attribute.Cc, context.BindingDataContract);
            }

            if (!string.IsNullOrEmpty(_attribute.Bcc))
            {
                _bccFieldBindingTemplate = CreateBindingTemplate(_attribute.Bcc, context.BindingDataContract);
            }

            if (!string.IsNullOrEmpty(_attribute.From))
            {
                _fromFieldBindingTemplate = CreateBindingTemplate(_attribute.From, context.BindingDataContract);
            }

            if (!string.IsNullOrEmpty(_attribute.Subject))
            {
                _subjectFieldBindingTemplate = CreateBindingTemplate(_attribute.Subject, context.BindingDataContract);
            }

            if (!string.IsNullOrEmpty(_attribute.Body))
            {
                _bodyFieldBindingTemplate = CreateBindingTemplate(_attribute.Body, context.BindingDataContract);
            }
        }