Beispiel #1
0
        public async Task RejectInvalidMailbox()
        {
            var channel = new MockSmtpChannel();
            var mail    = new SmtpMailMessage(new SmtpPath("*****@*****.**"));
            var builder = new MockMailBuilder {
                PendingMail = mail
            };
            var command = new RecipientCommand(
                builder,
                channel,
                TestHelpers.MakeSettings(
                    "test.vaettir.net",
                    new[] { new SmtpAcceptDomain("test.vaettir.net") })
                );

            command.Initialize("TO:<no-at>");
            await command.ExecuteAsync(CancellationToken.None);

            SmtpTestHelper.AssertResponse(channel, SmtpReplyCode.InvalidArguments);
            Assert.Same(mail, builder.PendingMail);
        }
Beispiel #2
0
            // '' <summary>
            // '' send mail with integrated retry mechanism
            // '' </summary>
            public bool SendMail(SmtpMailMessage mail)
            {
                var intRetryInterval = 333;

                try
                {
                    SendMailInternal(mail);
                }
                catch (Exception ex)
                {
                    _intRetries++;

                    if (_blnDebugMode)
                    {
                        Debug.WriteLine("--> SendMail Exception Caught");
                        Debug.WriteLine(ex.Message);
                    }

                    if ((_intRetries <= _intMaxRetries))
                    {
                        //Thread.CurrentThread.Sleep(intRetryInterval);
                        Thread.Sleep(intRetryInterval);
                        SendMail(mail);
                    }
                    else
                    {
                        throw;
                    }
                }

                if (_blnDebugMode)
                {
                    Debug.WriteLine(("sent after " + _intRetries));
                }

                _intRetries = 1;
                return(true);
            }
Beispiel #3
0
        public async Task AcceptRelayDomain()
        {
            var channel = new MockSmtpChannel();
            var mail    = new SmtpMailMessage(new SmtpPath("*****@*****.**"));
            var builder = new MockMailBuilder {
                PendingMail = mail
            };
            var command = new RecipientCommand(
                builder,
                channel,
                TestHelpers.MakeSettings(
                    "test.vaettir.net",
                    relayDomains: new[] { new SmtpRelayDomain("test.vaettir.net", "elsewhere.vaettir.net") })
                );

            command.Initialize("TO:<*****@*****.**>");
            await command.ExecuteAsync(CancellationToken.None);

            SmtpTestHelper.AssertResponse(channel, SmtpReplyCode.Okay);
            Assert.Same(mail, builder.PendingMail);
            Assert.Single(mail.Recipents);
            Assert.Equal("*****@*****.**", mail.Recipents[0]);
        }
Beispiel #4
0
        public async Task MailInProgressRejected()
        {
            var channel = new MockSmtpChannel();
            var message = new SmtpMailMessage(new SmtpPath(null));
            var builder = new MockMailBuilder
            {
                PendingMail = message
            };
            var user    = new MockUserStore(false);
            var command = new MailCommand(
                channel,
                builder,
                TestHelpers.MakeSettings(
                    "test.vaettir.net",
                    new[] { new SmtpAcceptDomain("test.vaettir.net") }),
                user);

            command.Initialize("FROM:<*****@*****.**>");
            await command.ExecuteAsync(CancellationToken.None);

            SmtpTestHelper.AssertResponse(channel, SmtpReplyCode.BadSequence);
            Assert.Same(message, builder.PendingMail);
        }
Beispiel #5
0
            // '' <summary>
            // '' send an email via trivial SMTP implementation
            // '' </summary>
            private void SendMailInternal(SmtpMailMessage mail)
            {
                IPHostEntry iphost;
                var         tcp = new TcpClient();

                // -- resolve server text name to an IP address
                try
                {
                    iphost = Dns.GetHostByName(_strServer);
                }
                catch (Exception e)
                {
                    throw new Exception(("Unable to resolve server name " + _strServer), e);
                }

                // -- attempt to connect to the server by IP address and port number
                try
                {
                    tcp.Connect(iphost.AddressList[0], _intPort);
                }
                catch (Exception e)
                {
                    throw new Exception(("Unable to connect to SMTP server at " + (_strServer + (":" + _intPort))), e);
                }

                // -- make sure we get the SMTP welcome message
                Command(tcp, string.Empty, "220");
                Command(tcp, ("HELO " + Environment.MachineName));

                // --
                // -- authenticate if we have username and password
                // -- http://www.ietf.org/rfc/rfc2554.txt
                // --
                if (((_strUserName + _strUserPassword).Length > 0))
                {
                    Command(tcp, "auth login", "334 VXNlcm5hbWU6");

                    // VXNlcm5hbWU6=base64'Username:'******'Password:'
                    Command(tcp, ToBase64(_strUserPassword), "235");
                }

                if (string.IsNullOrWhiteSpace(mail.From))
                {
                    if (IsWebHosted())
                    {
                        mail.From = (HttpContext.Current.Request.ServerVariables["server_name"] +
                                     ("@" + _strDefaultDomain));
                    }
                    else
                    {
                        mail.From = (
                            AppDomain.CurrentDomain.FriendlyName.ToLower() +
                            ("." + (Environment.MachineName.ToLower() +
                                    ("@" + _strDefaultDomain))));
                    }
                }

                Command(tcp, ("MAIL FROM: <" + (mail.From + ">")));

                // -- send email to more than one recipient
                var strRecipients = mail.To.Split(_strAddressSeperator.ToCharArray());

                foreach (var strRecipient in strRecipients)
                {
                    Command(tcp, ("RCPT TO: <" + (strRecipient + ">")));
                }

                Command(tcp, "DATA", "354");
                var sb = new StringBuilder();

                // With...
                // -- write common email headers
                sb.Append(("To: " + (mail.To + Environment.NewLine)));
                sb.Append(("From: " + (mail.From + Environment.NewLine)));
                sb.Append(("Subject: " + (mail.Subject + Environment.NewLine)));

                if (_blnPlainTextOnly)
                {
                    // -- write plain text body
                    sb.Append(Environment.NewLine + (mail.Body + Environment.NewLine));
                }
                else
                {
                    // -- typical case; mixed content will be displayed side-by-side
                    var strContentType = "multipart/mixed";

                    if ((!string.IsNullOrWhiteSpace(mail.Body)) && (!string.IsNullOrWhiteSpace(mail.BodyHTML)))
                    {
                        strContentType = "multipart/alternative";
                    }

                    sb.Append(("MIME-Version: 1.0" + Environment.NewLine));
                    sb.Append(("Content-Type: " +
                               (strContentType + ("; boundary=\"NextMimePart\"" + Environment.NewLine))));
                    sb.Append(("Content-Transfer-Encoding: 7bit" + Environment.NewLine));
                    //  -- default content (for non-MIME compliant email clients, should be extremely rare)
                    sb.Append(("This message is in MIME format. Since your mail reader does not understand " +
                               Environment.NewLine));
                    sb.Append(("this format, some or all of this message may not be legible." + Environment.NewLine));

                    // -- handle text body (if any)
                    if (!string.IsNullOrWhiteSpace(mail.Body))
                    {
                        sb.Append((Environment.NewLine + ("--NextMimePart" + Environment.NewLine)));
                        sb.Append(("Content-Type: text/plain;" + Environment.NewLine));
                        sb.Append((Environment.NewLine + (mail.Body + Environment.NewLine)));
                    }

                    //  -- handle HTML body (if any)
                    if (!string.IsNullOrWhiteSpace(mail.BodyHTML))
                    {
                        sb.Append((Environment.NewLine + ("--NextMimePart" + Environment.NewLine)));
                        sb.Append(("Content-Type: text/html; charset=iso-8859-1" + Environment.NewLine));
                        sb.Append((Environment.NewLine + (mail.BodyHTML + Environment.NewLine)));
                    }

                    // -- handle attachment (if any)
                    if (!string.IsNullOrWhiteSpace(mail.AttachmentPath))
                    {
                        sb.Append(FileToMimeString(mail.AttachmentPath, mail.AttachmentFilename));
                    }

                    if (!string.IsNullOrWhiteSpace(mail.AttachmentText))
                    {
                        sb.Append(ToMimeString(mail.AttachmentText, mail.AttachmentFilename));
                    }
                }

                // -- <crlf>.<crlf> marks end of message content
                sb.Append(Environment.NewLine + ("." + Environment.NewLine));

                Command(tcp, sb.ToString());
                Command(tcp, "QUIT", string.Empty);
                tcp.Close();
            }
Beispiel #6
0
        public ISenderService ComposeMessage(string from, string cc = "", string bcc = "", string readReceipt = "", bool htmlBody = false)
        {
            var message = new SmtpMailMessage(from, cc, bcc, readReceipt, null, htmlBody);

            return(new EMailServiceSender(_smtpClient, message));
        }
Beispiel #7
0
 public EMailServiceSender(ISmtpClient smtpClient, SmtpMailMessage message)
 {
     _smtpClient = smtpClient;
     _message    = message;
 }