Это нетривиальное приложение. Некоторые идеи, которые должны помочь:
Масштабируемость SMTP
В целом, масштабирование сетевого приложения означает возможность масштабирования (как на большем количестве машин), а не на увеличение (более дорогая машина). Это означает, что несколько серверов могут обрабатывать запросы SMTP. Обратите внимание, что для этого, вероятно, потребуется поддержка на сетевом уровне (маршрутизаторы, которые могут распространять сообщения в «ферму SMTP»).
Да, для масштабирования и масштабирования SMTP вы, вероятно, захотите использовать несколько потоков (вероятно, из какого-то пула потоков). Обратите внимание, что реализация многопоточных сокетов не является тривиальной.
Что касается процессов, я думаю, что один процесс (скорее всего, служба Windows) с несколькими потоками для каждого SMTP-сервера - это хороший путь.
Масштабируемость базы данных
Имейте в виду, что база данных также может быть узким местом масштабируемости. Для проектирования больших нагрузок вы хотели бы иметь возможность горизонтального масштабирования и уровня данных. Это означает возможность записи на более чем один сервер БД. Это приводит к возможности создания отчетов с набора серверов баз данных (что намного сложнее, чем с одного).
Надежность SMTP
Это проблема / требование? Если это так, это еще одна причина для поддержки фермы (ну, если у нас есть несколько серверов для надежности, мы можем назвать это кластером) серверов вместо одного. Обратите внимание, что у фермы должен быть способ сообщить кластеру, что он вышел из строя (возможно, с помощью какого-то механизма биения).
Надежность базы данных
Чтобы сделать базу данных надежной, вам также потребуется выполнить некоторую кластеризацию. Это не дешево и не тривиально (но было сделано несколько раз с несколькими платформами баз данных).
Очередь
Один из способов справиться с скачками нагрузки на сервер - поставить сообщения в очередь. Таким образом, сервер может продолжать передавать сообщения, но вы не ждете, пока цепочка расширяемых модулей завершит их обработку. Обратите внимание, что это добавляет еще один уровень сложности и точку отказа в системе.
Расширяемость
Один из способов приближения к добавлению таких функций, как ведение журнала базы данных и сканирование вложений, заключается в добавлении цепочки «MessageInsepctors» или «MessageHandlers». Возможно, вы захотите разрешить их настройку в определенном порядке (например, проверка на вирусы перед регистрацией, чтобы не регистрировать зараженные элементы).
Другим аспектом, который необходимо учитывать, является то, какие подключаемые модули могут блокировать прохождение сообщения (например, антивирусный сканер) и подключаемый модуль, который может выполняться после прохождения сообщения (регистрация).
С точки зрения добавления поддержки подключаемого модуля вы можете использовать что-то вроде MEF (Managed Extensibility Framework).
Изобретая колесо
Внедрение всей этой функциональности потребует значительного времени на разработку. Возможно, будет дешевле / быстрее / проще просто купить готовое решение, которое сделает все это за вас (эта проблема уже была решена несколько раз).