Тестирование SMTP с .net

Мне нужно настроить SMTP-сервер для тестирования моего веб-сайта, который отправляет электронные письма (для подтверждения регистрации и т. Д.).

На самом деле я не хочу, чтобы электронное письмо было отправлено, я просто хочу убедиться, что мой код правильный. Поэтому я хочу иметь возможность проверить, например, что электронное письмо помещено в папку очереди.

Кто-нибудь может порекомендовать SMTP-сервер, который легко настроить?


person iasksillyquestions    schedule 15.02.2009    source источник


Ответы (17)


Также существует Papercut, который представляет собой SMTP-сервер, который будет получать сообщения, но не доставлять их куда-либо (что позволяет уверен, что они отправляются правильно). Полученные сообщения отображаются в небольшом графическом интерфейсе пользователя, а также записываются в каталог.

person Sean Carpenter    schedule 15.02.2009

В .NET SmtpClient можно настроить для отправки электронной почты, поместив его в каталог для получения.

Конструктор SmtpClient по умолчанию берет свои настройки из app.config, поэтому для тестовой среды мы можем настроить его следующим образом.

<configuration>
    <system.net>
        <mailSettings>
            <smtp deliveryMethod="specifiedPickupDirectory">
                <specifiedPickupDirectory pickupDirectoryLocation="path to a directory" />
            </smtp>
        </mailSettings>
    </system.net>
</configuration>

Ссылка MSDN - элемент app.config mailSettings http://msdn.microsoft.com/en-us/library/w355a94k.aspx

person Lachlan Roche    schedule 18.02.2010
comment
Если вы не используете .net 4.5, будьте осторожны при указании сетевого хоста, иначе вы получите исключение при удалении smtpclient - см. SmtpClient сообщает об исключении InvalidOperationException при удалении сразу после отправки почты и используется каталог самовывоза, в частности, ответ Раймонда - person Dan F; 25.10.2012
comment
Ответ @argatxa правильный относительно использования указанного элементаPickupDirectory. Вышеупомянутое не совсем правильно, см. msdn.microsoft.com/en-us /library/ms164241.aspx - person A. Murray; 30.07.2013

Проект smtp4dev - еще один фиктивный SMTP-сервер. Мне это нравится, потому что у него красивый и простой пользовательский интерфейс, который регистрирует сообщения и позволяет просматривать содержимое последних сообщений. Написано на C # с помощью установщика MSI. Исходный код доступен.

person Don Kirkby    schedule 02.11.2009
comment
Мне это тоже нравится. Голосовать за! - person granadaCoder; 06.08.2012
comment
Релиз в ссылке больше не существует, поэтому используйте эту простую ссылку: smtp4dev.codeplex.com - person Csaba Toth; 19.03.2013
comment
Спасибо, @Csaba Toth, я не могу вспомнить, почему я связался с конкретным выпуском, поэтому я перешел на домашнюю страницу проекта. - person Don Kirkby; 19.03.2013
comment
Красивое и простое консольное приложение. Если вам нужна программа просмотра eml (а она еще не установлена) ... это отличный компаньон: sourceforge.net/projects/mbox-viewer/?source=typ_redirect - person granadaCoder; 18.08.2015

Для ребят из .NET. Все просто.

Мы занимались этим, а затем один из разработчиков вспомнил о настройке конфигурации, которая позволяет вам переопределить способ отправки электронных писем.

Это создаст файл для каждого электронного письма и оставит его в покое.

<system.net>
    <mailSettings>
      <smtp deliveryMethod="SpecifiedPickupDirectory">
        <specifiedPickupDirectory pickupDirectoryLocation="\\SharedFolder\MailDrop\" />
      </smtp>      
    </mailSettings>
  </system.net>
person argatxa    schedule 18.02.2010

Я думаю, что сообщение в блоге Простой макет SMTP-сервера для .NET дает то, что вам нужно: макет SMTP-сервера

Мок SMTP-сервера - это, по сути, поддельный SMTP-сервер, который можно использовать для модульного тестирования приложений, отправляющих сообщения электронной почты.

Кроме того, поиск в Google имитационного сервера smtp предоставить вам выбор SMTP-серверов для тестирования. Нравится:

  • Dumbster - поддельный SMTP-сервер Java
  • nDumbster - порт Дамбстера для .NET
person f3lix    schedule 15.02.2009
comment
Дамбстер позволяет вашему модульному тесту запустить службу SMTP, протестировать некоторый код отправки, а затем сделать утверждения о том, сколько писем было отправлено, каково их содержимое и так далее. - person Don Kirkby; 03.11.2009
comment
nDumpster кажется неподдерживаемым и очень медленным, поэтому не совсем подходит для модульных тестов. См. Блоги .blackmarble.co.uk / blogs / rfennell / archive / 2008/09/27 /. - person Anders Rune Jensen; 06.04.2011

Альтернативный способ сделать это - создать оболочку вокруг SmtpClient, которая реализует тот же интерфейс. Затем введите и используйте оболочку в своем классе. Затем при модульном тестировании вы можете заменить фиктивную оболочку, которая ожидает вызовов методов и ответов.

ИЗМЕНИТЬ: оболочка необходима (по крайней мере, для RhinoMocks), потому что SmtpClient не является производным от интерфейса и не имеет виртуальных методов. Если вы используете фреймворк для имитации, который может напрямую имитировать класс без виртуальных методов, вы можете пропустить оболочку и напрямую внедрить макет SmtpClient.

public class SmtpClientWrapper
{
    private SmtpClient Client { get; set; }

    public SmtpClientWrapper( SmtpClient client )
    {
         this.Client = client;
    }

    public virtual void Send( MailMessage msg )
    {
         this.Client.Send( msg );
    }

    ...
}


public class MyClass
{
    private SmtpClientWrapper Client { get; set; }

    public MyClass( SmtpClientWrapper client )
    {
         this.Client = client;
    }

    public void DoSomethingAndNotify()
    {
         ...
         this.Client.Send( msg );
    }
}

Протестировано (с RhinoMocks) как:

public void DoSomethingAndNotifySendsAMessageTest()
{
     SmtpClientWrapper client = MockRepository.GenerateMock<SmtpClientWrapper>();
     client.Expect( c => c.Send( new MailMessage() ) ).IgnoreArguments();

     MyClass klass = new MyClass( client );

     klass.DoSomethingAndNotify();

     client.VerifyAllExpectations();
}
person tvanfosson    schedule 15.02.2009
comment
Я знаю, что это старый ответ, но я хотел бы отметить, что это хорошая идея, но предоставленный код не отражает то, что вы говорите. Оболочка не реализует интерфейс и не имеет виртуальных методов для переопределения. Лично я предпочитаю использовать интерфейс. Таким образом, этот класс должен реализовывать ISmtpClientWrapper, а затем должны быть сгенерированы mocks с типом ISmtpClientWrapper для достижения того, что вам нужно. В целом, я согласен с вашей рекомендацией. Выполнение этого действия вместо настройки поддельного SMTP-сервера гарантирует, что любой сможет получить ваши тесты и запустить их без дополнительной настройки. - person Jeff LaFay; 05.10.2012
comment
@jlafay - я использовал слово interface в смысле сигнатуры класса, специально не определенной. Я не уверен, что стоит создавать реальный интерфейс, если его будет реализовывать только класс-оболочка. - person tvanfosson; 05.10.2012
comment
верно, но вы должны иметь возможность заглушить фактическую реализацию с помощью интерфейса или виртуальных методов. Похоже, вы отредактировали свой пост несколько часов назад и изменили метод отправки на виртуальный, так что я думаю, что это сработает. Вот почему я упомянул оба решения. Как я уже сказал, я предпочитаю интерфейс, они в любом случае довольно легкие. - person Jeff LaFay; 05.10.2012

Я нашел это - http://improve.dk/archive/2010/07/01/papercut-vs-smtp4dev-testing-mail-sending-locally.aspx, в которых объясняется, как использовать papercut и smtp4dev, которые являются хорошими инструментами.

person Enzero    schedule 22.07.2011

Я использую Antix SMTP Server для разработчиков, который так же просто, как открыть приложение. Он хранит сообщения в папке, и вы можете просматривать их с помощью пользовательского интерфейса. Довольно быстрое / простое решение. Я хотел упомянуть об этом здесь.

См. Также: smtp-сервер разработки для Windows

person Micah    schedule 07.11.2011

DevNull SMTP-сервер регистрирует все кровавые подробности о связи между клиентом и SMTP-сервером. . Похоже, это было бы полезно, если бы вы пытались диагностировать, почему ваш код отправки не работает.

Он написан на Java и развертывается как исполняемый файл jar. Исходный код кажется недоступным.

person Don Kirkby    schedule 02.11.2009

Если у вас Mac OS X, вы можете использовать MockSMTP.app

person Sébastien Gruhier    schedule 19.01.2010

Вы также можете использовать netDumbster.

http://netdumbster.codeplex.com/

person Carlos Mendible    schedule 18.05.2010

есть также мой собственный http://ssfd.codeplex.com/, который представляет собой эмулятор SMTP с открытым исходным кодом. Получает электронные письма и помещает их в папку, доступ к которой можно получить с помощью значка задачи.

person Anthony Johnston    schedule 03.11.2009

Обратите внимание, что классу SmtpClientWrapper, предложенному tvanfosson, требуется чрезвычайно важное ключевое слово virtual в объявлении метода Send, иначе вы снова окажетесь в той же лодке, что и пытаетесь напрямую смоделировать SmtpClient.

person Pete    schedule 01.12.2010
comment
Это должен быть комментарий, а не ответ. - person Michael Freidgeim; 01.12.2016

Согласно многим другим предложениям, бесплатный инструмент, который я использовал довольно часто: http://www.toolheap.com/test-mail-server-tool/

Не совсем для TDD, но полезно при ручном тестировании, так как может выскакивать окно Outlook Express с каждым отправляемым электронным письмом.

person Adam Butler    schedule 16.07.2011

Если у вас установлен Python, вы можете запустить следующий лайнер для запуска отладочного сервера smtp в консоли, который будет выгружать сообщения в stdout:

sudo python -m smtpd -n -c DebuggingServer localhost: 25

взято отсюда: http://muffinresearch.co.uk/archives/2010/10/15/fake-smtp-server-with-python/

person Brad Parks    schedule 31.05.2012

Как отметил Шон Карпентер, Papercut - мощное решение для локальной разработки. Однако, если вы также используете промежуточный или тестовый сервер, mailtrap.io может быть в целом более простым решением, поскольку вы можете использовать тот же подход для вашей среды разработки и постановки.

person theDmi    schedule 03.07.2015

Вы можете использовать Mailnest.io, поскольку это доступный, но очень эффективный инструмент для тестирования электронной почты. У него также есть бесплатный вечный план для ограниченного использования.

person Anish John    schedule 10.08.2020