{"record":{"id":"b3744843d11e1374","repo":"OrchardCMS/OrchardCore","slug":"name-is-an-invalid-email-provider-name","errorCode":null,"errorMessage":"'${name}' is an invalid Email provider name.","messagePattern":"'(.+?)' is an invalid Email provider name\\.","errorType":"exception","errorClass":"InvalidEmailProviderException","httpStatus":null,"severity":"error","filePath":"src/OrchardCore/OrchardCore.Email.Core/Services/DefaultEmailProviderResolver.cs","lineNumber":39,"sourceCode":"\n    public ValueTask<IEmailProvider> GetAsync(string name = null)\n    {\n        var emailOptions = _emailOptions.CurrentValue;\n        var providerOptions = _providerOptions.CurrentValue;\n\n        if (string.IsNullOrEmpty(name))\n        {\n            name = emailOptions.DefaultProviderName;\n        }\n\n        if (!string.IsNullOrEmpty(name))\n        {\n            if (providerOptions.Providers.TryGetValue(name, out var providerType))\n            {\n                return ValueTask.FromResult(_serviceProvider.CreateInstance<IEmailProvider>(providerType.Type));\n            }\n\n            throw new InvalidEmailProviderException(name);\n        }\n\n        return ValueTask.FromResult<IEmailProvider>(null);\n    }\n}\n","sourceCodeStart":21,"sourceCodeEnd":45,"githubUrl":"https://github.com/OrchardCMS/OrchardCore/blob/4306c0717fe573f6fca1b4955909ddab6a192807/src/OrchardCore/OrchardCore.Email.Core/Services/DefaultEmailProviderResolver.cs#L21-L45","documentation":"DefaultEmailProviderResolver resolves an IEmailProvider by configured provider name. If the requested name exists in EmailProviderOptions.Providers the configured type is instantiated; otherwise it throws InvalidEmailProviderException with the offending name. This message surfaces when code requests an email provider name that is not configured/registered.","triggerScenarios":"Calling IEmailProviderResolver.GetAsync(name) (or resolving the default provider path) with a name that has no matching key in EmailProviderOptions.Providers — e.g. settings stored a provider name from a different module configuration or before a rename.","commonSituations":"Renaming a provider (e.g. smtp) while persisted EmailSettings still reference the old name; multi-tenant setups where one tenant has the provider configured and another does not; typos in the provider name passed to GetAsync.","solutions":["Verify EmailProviderOptions.Providers actually contains the requested key (check Email admin settings or options setup)","Fix the persisted/default EmailSettings to reference an existing provider name","Register the provider type in EmailProviderOptions before resolving it","Guard the caller: validate the name against the resolver's configured names before calling GetAsync"],"exampleFix":"// before\nvar provider = await _emailProviderResolver.GetAsync(\"sendgrid\"); // not configured\n// after\nvar options = _optionsMonitor.CurrentValue;\nif (options.Providers.ContainsKey(\"sendgrid\"))\n{\n    provider = await _emailProviderResolver.GetAsync(\"sendgrid\");\n}","handlingStrategy":"validation","validationCode":"var options = _optionsMonitor.CurrentValue;\nif (!options.Providers.ContainsKey(providerName))\n    throw new InvalidOperationException($\"Email provider '{providerName}' is not configured\");","typeGuard":"bool IsConfiguredProvider(string name, IOptionsMonitor<EmailProviderOptions> o) => o.CurrentValue.Providers.ContainsKey(name);","tryCatchPattern":"try { provider = await resolver.GetAsync(name); } catch (InvalidEmailProviderException ex) { _logger.LogError(ex, \"Unknown email provider {Name}\", name); provider = await resolver.GetAsync(EmailConstants.DefaultProvider); }","preventionTips":["Centralize provider-name constants instead of raw strings","When renaming providers, migrate persisted EmailSettings","Keep per-tenant email settings in sync with configured providers"],"tags":["email","provider","configuration","lookup-failed"],"backgroundTag":"invalid-config-value","analyzedSha":"4306c0717fe573f6fca1b4955909ddab6a192807","analyzedAt":"2026-09-13T17:41:05.024Z","contentChangedAt":"2026-09-13T17:41:05.024Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}