nopSolutions/nopCommerce · critical · Exception

Default email account cannot be loaded

Error message

Default email account cannot be loaded

What it means

Thrown by InstallMessageTemplatesAsync during initial data installation. Message templates need an EmailAccountId, so the installer grabs the first EmailAccount in the table. If the EmailAccounts table is empty, there is no account to reference, so installation cannot proceed. This signals the email-account seeding step (which normally runs before this) failed or was skipped.

Source

Thrown at src/Libraries/Nop.Services/Installation/InstallRequiredData.cs:741

                    DisplayName = "Store name",
                    Host = "smtp.mail.com",
                    Port = 25,
                    Username = "123",
                    Password = "123",
                    EnableSsl = false
                }
            };

        await _dataProvider.BulkInsertEntitiesAsync(emailAccounts);
    }

    /// <summary>
    /// Installs a default message templates
    /// </summary>
    /// <returns>A task that represents the asynchronous operation</returns>
    protected virtual async Task InstallMessageTemplatesAsync()
    {
        var eaGeneral = await Table<EmailAccount>().FirstOrDefaultAsync() ?? throw new Exception("Default email account cannot be loaded");

        var messageTemplates = new List<MessageTemplate>
            {
                new() {
                    Name = MessageTemplateSystemNames.BLOG_COMMENT_STORE_OWNER_NOTIFICATION,
                    Subject = "%Store.Name%. New blog comment.",
                    Body = $"<p>{Environment.NewLine}<a href=\"%Store.URL%\">%Store.Name%</a>{Environment.NewLine}<br />{Environment.NewLine}<br />{Environment.NewLine}A new blog comment has been created for blog post \"%BlogComment.BlogPostTitle%\".{Environment.NewLine}</p>{Environment.NewLine}",
                    IsActive = true,
                    EmailAccountId = eaGeneral.Id
                },
                new() {
                    Name = MessageTemplateSystemNames.BACK_IN_STOCK_NOTIFICATION,
                    Subject = "%Store.Name%. Back in stock notification",
                    Body = $"<p>{Environment.NewLine}<a href=\"%Store.URL%\">%Store.Name%</a>{Environment.NewLine}<br />{Environment.NewLine}<br />{Environment.NewLine}Hello %Customer.FullName%,{Environment.NewLine}<br />{Environment.NewLine}Product <a target=\"_blank\" href=\"%BackInStockSubscription.ProductUrl%\">%BackInStockSubscription.ProductName%</a> is in stock.{Environment.NewLine}</p>{Environment.NewLine}",
                    IsActive = true,
                    EmailAccountId = eaGeneral.Id
                },
                new() {

View on GitHub (pinned to 64bdf2ff08)

Solutions

  1. Run the full installer in its default order so InstallEmailAccountsAsync executes before message templates.
  2. Reset the database to a clean state and reinstall from scratch.
  3. Verify the EmailAccounts table has at least one row before triggering installation.
  4. If customizing install steps, ensure email account seeding precedes message template seeding.

Example fix

// before - templates installed before any email account exists
await InstallMessageTemplatesAsync();

// after - seed accounts first
await InstallEmailAccountsAsync();
await InstallMessageTemplatesAsync();
Defensive patterns

Strategy: validation

Validate before calling

// Confirm an email account exists before installing message templates
if (!await Table<EmailAccount>().AnyAsync())
    throw new InvalidOperationException("Seed an EmailAccount before installing message templates.");

Type guard

// Ensure the table is non-empty as a precondition
static async Task<bool> HasEmailAccountAsync(IRepository<EmailAccount> repo)
    => await repo.Table.AnyAsync();

Try / catch

try { await InstallMessageTemplatesAsync(); }
catch (Exception ex) when (ex.Message == "Default email account cannot be loaded")
{ /* seed email accounts then retry installation */ }

Prevention

When it happens

Trigger: Running the nopCommerce installer where InstallEmailAccountsAsync has not inserted any EmailAccount before InstallMessageTemplatesAsync runs; a partially-seeded database where EmailAccounts were deleted/cleared mid-install.

Common situations: Re-running installation against a half-cleaned database; a custom installation order that omits email account seeding; a migration that emptied the EmailAccounts table.

Related errors


AI-assisted analysis of nopSolutions/nopCommerce@64bdf2ff08 (2026-08-13). Data as JSON: /api/errors/64a062fb5702b282. Report an issue: GitHub.