Альтернативы для тестирования SMTP? - PullRequest
1 голос
/ 04 февраля 2010

Я пытаюсь разработать приложение, которое отправляет электронную почту, и наша внутренняя сеть довольно плотно заблокирована, поэтому я не могу ретранслировать через наши внутренние почтовые серверы.

Кто-нибудь когда-нибудь использовал что-то вроде no-ip.com? Есть ли другие альтернативы?

Ответы [ 5 ]

4 голосов
/ 04 февраля 2010

Если вам просто нужно проверить, что электронные письма отправляются на правильные адреса и с правильным содержимым, самый простой способ - это использовать папку для удаления, отредактировав файл app или web.config:

  <system.net>
    <mailSettings>
      <smtp deliveryMethod="SpecifiedPickupDirectory" from="me@myorg.com">
        <specifiedPickupDirectory pickupDirectoryLocation="C:\TestMailDrop"/>
      </smtp>
    </mailSettings>
  </system.net>

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

(Как указывает codekaizen, это также можно сделать в коде, если вы не возражаете против изменения кода / жесткого кодирования папки для отбрасывания и поведения, отличающегося в режиме отладки / выпуска.)

2 голосов
/ 04 февраля 2010

Я бы согласился с вышесказанным ... настройте собственный тестовый SMTP-сервер и используйте его для тестирования.

Вот некоторая информация, которая поможет вам выбрать правильный путь:

http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/e4cf06f5-9a36-474b-ba78-3f287a2b88f2.mspx?mfr=true

http://www.cmsconnect.com/praetor/WebHelpG2/Chapter_2_-_Pre-installation_considerations/Configuring_the_SMTP_Server.htm

http://service1.symantec.com/support/ent-gate.nsf/docid/2007241920754398

2 голосов
/ 04 февраля 2010

Вы можете сохранить письмо на диск:

#if DEBUG
smtpClient.PickupDirectoryLocation = "\\Path\\to\\save\\folder";
smtpClient.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory;
smtpClient.Send(msg);
#endif
1 голос
/ 10 августа 2012

Riffing от @codekaizen, используя AutoFixture.xUnit [который доступен как пакет XUnit с таким именем]: -

    [Theory, AutoData]
    public static void ShouldSendWithCorrectValues( string anonymousFrom, string anonymousRecipients, string anonymousSubject, string anonymousBody )
    {
        anonymousFrom += "@b.com";
        anonymousRecipients += "@c.com";

        using ( var tempDir = new TemporaryDirectoryFixture() )
        {
            var capturingSmtpClient = new CapturingSmtpClientFixture( tempDir.DirectoryPath );
            var sut = new EmailSender( capturingSmtpClient.SmtpClient );

            sut.Send( anonymousFrom, anonymousRecipients, anonymousSubject, anonymousBody );
            string expectedSingleFilename = capturingSmtpClient.EnumeratePickedUpFiles().Single();
            var result = File.ReadAllText( expectedSingleFilename );

            Assert.Contains( "From: " + anonymousFrom, result );
            Assert.Contains( "To: " + anonymousRecipients, result );
            Assert.Contains( "Subject: " + anonymousSubject, result );
            Assert.Contains( anonymousBody, result );
        }
    }

CapturingSmtpClientFixture используется только в тестовом контексте-

    class CapturingSmtpClientFixture
    {
        readonly string _path;
        readonly SmtpClient _smtpClient;

        public CapturingSmtpClientFixture( string path )
        {
            _path = path;
            _smtpClient = new SmtpClient { DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory, PickupDirectoryLocation = _path };
        }

        public SmtpClient SmtpClient
        {
            get { return _smtpClient; }
        }

        public IEnumerable<string> EnumeratePickedUpFiles()
        {
            return Directory.EnumerateFiles( _path );
        }
    }

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

(для полноты здесь TemporaryDirectoryFixture): -

public class TemporaryDirectoryFixture : IDisposable
{
    readonly string _directoryPath;

    public TemporaryDirectoryFixture()
    {
        string randomDirectoryName = Path.GetFileNameWithoutExtension( Path.GetRandomFileName() );

        _directoryPath = Path.Combine( Path.GetTempPath(), randomDirectoryName );

        Directory.CreateDirectory( DirectoryPath );
    }

    public string DirectoryPath
    {
        get { return _directoryPath; }
    }

    public void Dispose()
    {
        try
        {
            if ( Directory.Exists( _directoryPath ) )
                Directory.Delete( _directoryPath, true );
        }
        catch ( IOException )
        {
            // Give other process a chance to release their handles
            // see /307725/nevozmozhno-udalit-katalog-s-pomoschy-directory-delete-put-istina#307751
            Thread.Sleep( 0 );
            try
            {
                Directory.Delete( _directoryPath, true );
            }
            catch
            {
                var longDelayS = 2;
                try
                {
                    // This time we'll have to be _really_ patient
                    Thread.Sleep( TimeSpan.FromSeconds( longDelayS ) );
                    Directory.Delete( _directoryPath, true );
                }
                catch ( Exception ex )
                {
                    throw new Exception( @"Could not delete " + GetType() + @" directory: """ + _directoryPath + @""" due to locking, even after " + longDelayS + " seconds", ex );
                }
            }
        }
    }
}

и скелет EmailSender:

public class EmailSender
{
    readonly SmtpClient _smtpClient;

    public EmailSender( SmtpClient smtpClient )
    {
        if ( smtpClient == null )
            throw new ArgumentNullException( "smtpClient" );

        _smtpClient = smtpClient;
    }

    public void Send( string from, string recipients, string subject, string body )
    {
        _smtpClient.Send( from, recipients, subject, body );
    }
}
0 голосов
/ 04 февраля 2010

Обычный ответ - запускать SMTP локально под IIS, но вы должны быть осторожны с тем, кому вы отправляете. На самом деле может быть лучше отправить на обычный SMTP-сервер и настроить таргетинг только на учетные записи в вашем домене.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...