SQL Server Storage Provider

Enterprise-grade message storage with Microsoft SQL Server and Azure SQL Database.

Enterprise Features

ACID CompliantAuto Schema CreationMessage CompressionFull-Text SearchAzure SQL Support

Installation

dotnet add package Zetian
dotnet add package Zetian.Storage.SqlServer

Quick Start

QuickStart.cs
using Zetian.Server;
using Zetian.Storage.SqlServer.Extensions;

// Basic setup - table created automatically
var server = new SmtpServerBuilder()
    .Port(25)
    .WithSqlServerStorage(
        "Server=localhost;Database=SmtpDb;Trusted_Connection=true;")
    .Build();

await server.StartAsync();

Advanced Configuration

AdvancedConfig.cs
var server = new SmtpServerBuilder()
    .Port(25)
    .WithSqlServerStorage(
        "Server=localhost;Database=SmtpStorage;Integrated Security=true;",
        config =>
        {
            config.TableName = "SmtpMessages";
            config.AttachmentsTableName = "SmtpAttachments";
            config.SchemaName = "mail";
            config.AutoCreateTable = true;
            config.StoreAttachmentsSeparately = true;
            config.CompressMessageBody = true;
            config.MaxMessageSizeMB = 50;
            config.EnableRetry = true;
            config.MaxRetryAttempts = 3;
        })
    .Build();

Configuration Options

OptionDefaultDescription
TableName"SmtpMessages"Main messages table
SchemaName"dbo"Database schema
AutoCreateTabletrueAuto-create tables
StoreAttachmentsSeparatelyfalseSeparate attachments table
CompressMessageBodyfalseGZIP compression
MaxMessageSizeMB100Max message size

Connection Strings

ConnectionStrings.cs
// Windows Authentication
"Server=localhost;Database=SmtpDb;Trusted_Connection=true;"

// SQL Server Authentication
"Server=localhost;Database=SmtpDb;User Id=sa;Password=YourPassword;"

// Azure SQL Database
"Server=tcp:yourserver.database.windows.net,1433;
 Initial Catalog=SmtpDb;User ID=yourusername;Password=yourpassword;
 Encrypt=True;TrustServerCertificate=False;"

// Named Instance
"Server=localhost\SQLEXPRESS;Database=SmtpDb;Trusted_Connection=true;"

Table Schema

Schema.sql
-- Messages table (auto-created)
CREATE TABLE [SmtpMessages] (
    Id BIGINT IDENTITY(1,1) PRIMARY KEY,
    MessageId NVARCHAR(255) NOT NULL UNIQUE,
    SessionId NVARCHAR(255) NOT NULL,
    FromAddress NVARCHAR(500),
    ToAddresses NVARCHAR(MAX) NOT NULL,
    Subject NVARCHAR(1000),
    ReceivedDate DATETIME2 NOT NULL,
    MessageSize BIGINT NOT NULL,
    MessageBody VARBINARY(MAX) NOT NULL,
    IsCompressed BIT DEFAULT 0,
    Headers NVARCHAR(MAX),
    HasAttachments BIT DEFAULT 0,
    AttachmentCount INT DEFAULT 0,
    RemoteIP NVARCHAR(45),
    CreatedAt DATETIME2 DEFAULT GETUTCDATE()
);

Performance & Security

Enable Compression

Reduces storage by 60-80%

Connection Pooling

Adjust pool size for load

Use Least Privilege

Grant minimal permissions

Enable TDE

Encryption at rest