Ejemplo n.º 1
0
        /// <summary>
        /// Initializes a new instance of the <see cref="SendEmailProtocol"/> class.
        /// </summary>
        /// <param name="smtpServerConnectionDefinition">Locates an SMTP server along with credentials for connecting to the server.</param>
        public SendEmailProtocol(
            SmtpServerConnectionDefinition smtpServerConnectionDefinition)
        {
            new { smtpServerConnectionDefinition }.AsArg().Must().NotBeNull();

            this.smtpServerConnectionDefinition = smtpServerConnectionDefinition;
        }
Ejemplo n.º 2
0
        public static async Task ExecuteAsync___Should_return_SendEmailResponse_with_SendEmailResult_FailedToAuthenticateWithServer___When_when_credentials_are_invalid()
        {
            // Arrange
            var smtpServerConnectionDefinition = new SmtpServerConnectionDefinition("email-smtp.us-east-1.amazonaws.com", 587, SecureConnectionMethod.StartTls, "username", "password");

            var sendEmailRequest = A.Dummy <SendEmailRequest>();

            var operation = new SendEmailOp(sendEmailRequest);

            var protocol = new SendEmailProtocol(smtpServerConnectionDefinition);

            // Act
            var actual = await protocol.ExecuteAsync(operation);

            // Assert
            actual.SendEmailResult.AsTest().Must().BeEqualTo(SendEmailResult.FailedToAuthenticateWithServer);
        }
        static SmtpServerConnectionDefinitionTest()
        {
            ConstructorArgumentValidationTestScenarios
            .AddScenario(() =>
                         new ConstructorArgumentValidationTestScenario <SmtpServerConnectionDefinition>
            {
                Name             = "constructor should throw ArgumentOutOfRangeException when parameter 'port' is = 0",
                ConstructionFunc = () =>
                {
                    var referenceObject = A.Dummy <SmtpServerConnectionDefinition>();

                    var result = new SmtpServerConnectionDefinition(
                        referenceObject.Host,
                        0,
                        referenceObject.SecureConnectionMethod,
                        referenceObject.Username,
                        referenceObject.ClearTextPassword);

                    return(result);
                },
                ExpectedExceptionType            = typeof(ArgumentOutOfRangeException),
                ExpectedExceptionMessageContains = new[] { "port", },
            })
            .AddScenario(() =>
                         new ConstructorArgumentValidationTestScenario <SmtpServerConnectionDefinition>
            {
                Name             = "constructor should throw ArgumentOutOfRangeException when parameter 'port' is < 0",
                ConstructionFunc = () =>
                {
                    var referenceObject = A.Dummy <SmtpServerConnectionDefinition>();

                    var result = new SmtpServerConnectionDefinition(
                        referenceObject.Host,
                        A.Dummy <NegativeInteger>(),
                        referenceObject.SecureConnectionMethod,
                        referenceObject.Username,
                        referenceObject.ClearTextPassword);

                    return(result);
                },
                ExpectedExceptionType            = typeof(ArgumentOutOfRangeException),
                ExpectedExceptionMessageContains = new[] { "port", },
            })
            .AddScenario(() =>
                         new ConstructorArgumentValidationTestScenario <SmtpServerConnectionDefinition>
            {
                Name             = "constructor should throw ArgumentOutOfRangeException when parameter 'port' is > 65535",
                ConstructionFunc = () =>
                {
                    var referenceObject = A.Dummy <SmtpServerConnectionDefinition>();

                    var result = new SmtpServerConnectionDefinition(
                        referenceObject.Host,
                        65536,
                        referenceObject.SecureConnectionMethod,
                        referenceObject.Username,
                        referenceObject.ClearTextPassword);

                    return(result);
                },
                ExpectedExceptionType            = typeof(ArgumentOutOfRangeException),
                ExpectedExceptionMessageContains = new[] { "port", },
            });
        }
Ejemplo n.º 4
0
        private static async Task <SendEmailResponse> SendMessageAsync(
            MimeMessage mimeMessage,
            SmtpServerConnectionDefinition smtpServerConnectionDefinition)
        {
            using (var logStream = new MemoryStream())
            {
                using (var protocolLogger = new ProtocolLogger(logStream, leaveOpen: false))
                {
                    using (var smtpClient = new MailKit.Net.Smtp.SmtpClient(protocolLogger))
                    {
                        SendEmailResponse result;

                        string logMessages;

                        var secureSocketOptions = GetSecureSocketOptions(smtpServerConnectionDefinition.SecureConnectionMethod);

                        try
                        {
                            await smtpClient.ConnectAsync(smtpServerConnectionDefinition.Host, smtpServerConnectionDefinition.Port, secureSocketOptions);
                        }
                        catch (Exception ex)
                        {
                            logMessages = GetLogMessages(logStream);

                            result = new SendEmailResponse(SendEmailResult.FailedToConnectToServer, ex.ToString(), logMessages);

                            return(result);
                        }

                        try
                        {
                            await smtpClient.AuthenticateAsync(smtpServerConnectionDefinition.Username, smtpServerConnectionDefinition.ClearTextPassword);
                        }
                        catch (Exception ex)
                        {
                            logMessages = GetLogMessages(logStream);

                            result = new SendEmailResponse(SendEmailResult.FailedToAuthenticateWithServer, ex.ToString(), logMessages);

                            return(result);
                        }

                        try
                        {
                            await smtpClient.SendAsync(mimeMessage);
                        }
                        catch (Exception ex)
                        {
                            logMessages = GetLogMessages(logStream);

                            result = new SendEmailResponse(SendEmailResult.FailedToSendEmailToServer, ex.ToString(), logMessages);

                            return(result);
                        }

                        try
                        {
                            await smtpClient.DisconnectAsync(true);
                        }
                        catch (Exception)
                        {
                            // This doesn't constitute a failure; the email has been sent.
                        }

                        logMessages = GetLogMessages(logStream);

                        result = new SendEmailResponse(SendEmailResult.Success, null, logMessages);

                        return(result);
                    }
                }
            }
        }
Ejemplo n.º 5
0
        public EmailDummyFactory()
        {
            AutoFixtureBackedDummyFactory.ConstrainDummyToExclude(SecureConnectionMethod.Unknown);
            AutoFixtureBackedDummyFactory.ConstrainDummyToExclude(SendEmailResult.Unknown);

            AutoFixtureBackedDummyFactory.AddDummyCreator(() =>
            {
                // DeliveryNotificationOptions.Never cannot be used in combination with any other flag
                // otherwise adding options to the MailMessage will throw.
                var validValues = EnumExtensions.GetAllPossibleEnumValues <DeliveryNotificationOptions>().Where(_ => !_.HasFlag(DeliveryNotificationOptions.Never)).ToList();

                var indexToUse = ThreadSafeRandom.Next(0, validValues.Count);

                var result = validValues[indexToUse];

                return(result);
            });

            AutoFixtureBackedDummyFactory.AddDummyCreator(() =>
            {
                var result = new SmtpServerConnectionDefinition(A.Dummy <string>(), A.Dummy <PositiveInteger>().ThatIs(_ => _ < 65000), A.Dummy <SecureConnectionMethod>(), A.Dummy <string>(), A.Dummy <string>());

                return(result);
            });

            AutoFixtureBackedDummyFactory.AddDummyCreator(() =>
            {
                var address = Invariant($"{A.Dummy<Guid>()}@example.com");

                var firstNames = new[] { "Bob", "Sara", "Jane", "Joe", "Tommy", "Nora" };

                var lastNames = new[] { "Jones", "Smith", "Tailor", "Wright", "Glass", "Willis" };

                var firstNameIndex = ThreadSafeRandom.Next(0, firstNames.Length);

                var lastNameIndex = ThreadSafeRandom.Next(0, lastNames.Length);

                var name = firstNames[firstNameIndex] + " " + lastNames[lastNameIndex];

                var result = new EmailMailbox(address, name);

                return(result);
            });

            AutoFixtureBackedDummyFactory.AddDummyCreator(() =>
            {
                var result = new SendEmailRequestedEvent <Version>(A.Dummy <Version>(), A.Dummy <DateTime>().ToUniversalTime(), A.Dummy <SendEmailRequest>());

                return(result);
            });

            AutoFixtureBackedDummyFactory.AddDummyCreator(() =>
            {
                var emailResponse = new SendEmailResponse(A.Dummy <SendEmailResult>().ThatIsNot(SendEmailResult.Success), A.Dummy <string>());

                var result = new FailedToSendEmailEvent <Version>(A.Dummy <Version>(), A.Dummy <DateTime>().ToUniversalTime(), emailResponse);

                return(result);
            });

            AutoFixtureBackedDummyFactory.AddDummyCreator(() =>
            {
                var emailResponse = new SendEmailResponse(SendEmailResult.Success, null, A.Dummy <string>());

                var result = new SucceededInSendingEmailEvent <Version>(A.Dummy <Version>(), A.Dummy <DateTime>().ToUniversalTime(), emailResponse);

                return(result);
            });

            AutoFixtureBackedDummyFactory.AddDummyCreator(() =>
            {
                var sendEmailResult = A.Dummy <SendEmailResult>();

                var exceptionToString = sendEmailResult == SendEmailResult.Success
                    ? null
                    : A.Dummy <string>();

                var communicationLog = A.Dummy <string>();

                var result = new SendEmailResponse(sendEmailResult, exceptionToString, communicationLog);

                return(result);
            });
        }
Ejemplo n.º 6
0
        public static async Task ExecuteAsync___Should_send_email_and_return_SendEmailResponse_with_SendEmailResult_Success___When_server_connection_is_well_formed()
        {
            // Arrange
            var smtpServerConnectionDefinition = new SmtpServerConnectionDefinition(
                "HOST_NAME_HERE",
                587,
                SecureConnectionMethod.StartTls,
                "USERNAME_HERE",
                "PASSWORD_HERE");

            var emailParticipants = new EmailParticipants(
                new EmailMailbox("FROM_ADDRESS_HERE"),
                new[] { new EmailMailbox("TO_ADDRESS_HERE") },
                new EmailMailbox[] { },
                new EmailMailbox[] { },
                new EmailMailbox[] { });

            const string heartFileName    = "heart.png";
            const string documentFileName = "document.pdf";

            var heartFileBytes  = AssemblyHelper.ReadEmbeddedResourceAsBytes(heartFileName);
            var heartAttachment = new EmailAttachment(heartFileBytes, heartFileName, MediaType.ImagePng);

            var documentFileBytes  = AssemblyHelper.ReadEmbeddedResourceAsBytes(documentFileName);
            var documentAttachment = new EmailAttachment(documentFileBytes, documentFileName, MediaType.ApplicationPdf);

            const string heartContentId = "heart-content-id";

            var emailContent = new EmailContent(
                "SUBJECT_LINE_HERE",
                "this is some plain text",
                $@"<table style=""border: solid 1px #e9e9e9;"">
                      <tr>
                          <td>A1</td>
                          <td>B1</td>
                          <td>C1</td>
                      </tr>
                      <tr>
                          <td>A2</td>
                          <td><img src=""cid:{heartContentId}""></td>
                          <td>C2</td>
                      </tr>
                      <tr>
                          <td>A3</td>
                          <td>B3</td>
                          <td>C3</td>
                      </tr>
                  </table>",
                new EmailAttachment[]
            {
                documentAttachment,
            },
                new Dictionary <string, EmailAttachment>
            {
                { heartContentId, heartAttachment },
            },
                null,
                null);

            var sendEmailRequest = new SendEmailRequest(emailParticipants, emailContent);

            var operation = new SendEmailOp(sendEmailRequest);

            var protocol = new SendEmailProtocol(smtpServerConnectionDefinition);

            // Act
            var actual = await protocol.ExecuteAsync(operation);

            // Assert
            actual.SendEmailResult.AsTest().Must().BeEqualTo(SendEmailResult.Success);
        }