@Test(expected = SendFailedException.class)
  public void testFreeMarkerTextMailMessageSendFailed() {
    String uuid = java.util.UUID.randomUUID().toString();
    String subject = "Text Message from $version Mail - " + uuid;
    String version = "Seam 3";

    // Port is two off so this should fail
    Wiser wiser = new Wiser(mailConfig.getServerPort() + 2);
    wiser.setHostname(mailConfig.getServerHost());
    try {
      wiser.start();

      person.setName(toName);
      person.setEmail(toAddress);

      mailMessage
          .get()
          .from(fromAddress)
          .replyTo(replyToAddress)
          .to(toAddress)
          .subject(new FreeMarkerTemplate(subject))
          .bodyText(
              new FreeMarkerTemplate(
                  resourceProvider.loadResourceStream("template.text.freemarker")))
          .put("person", person)
          .put("version", version)
          .importance(MessagePriority.HIGH)
          .send(session.get());
    } finally {
      stop(wiser);
    }
  }
  @Test(expected = SendFailedException.class)
  public void testTextMailMessageSendFailed() {
    String uuid = java.util.UUID.randomUUID().toString();
    String subject = "Text Message from $version Mail - " + uuid;
    String version = "Seam 3";
    mailConfig.setServerHost("localHost");
    mailConfig.setServerPort(8977);

    // Port is two off so this should fail
    Wiser wiser = new Wiser(mailConfig.getServerPort() + 2);
    try {
      wiser.start();

      person.setName(toName);
      person.setEmail(toAddress);

      mailMessage
          .get()
          .from(fromAddress, fromName)
          .replyTo(replyToAddress)
          .to(toAddress, toName)
          .subject(subject)
          .bodyText(new RenderTemplate(templateCompiler.get(), textTemplatePath))
          .put("person", person)
          .put("version", version)
          .importance(MessagePriority.HIGH)
          .send(session.get());
    } finally {
      stop(wiser);
    }
  }
  @Test
  public void testSMTPSessionAuthentication() throws MessagingException, MalformedURLException {
    String subject = "HTML+Text Message from Seam Mail - " + java.util.UUID.randomUUID().toString();
    mailConfig.setServerHost("localHost");
    mailConfig.setServerPort(8978);

    Wiser wiser = new Wiser(mailConfig.getServerPort());
    wiser
        .getServer()
        .setAuthenticationHandlerFactory(
            new EasyAuthenticationHandlerFactory(new SMTPAuthenticator("test", "test12!")));
    try {
      wiser.start();

      person.setName(toName);
      person.setEmail(toAddress);

      mailMessage
          .get()
          .from(fromAddress)
          .to(person.getEmail())
          .subject(subject)
          .put("person", person)
          .put("version", "Seam 3")
          .bodyHtmlTextAlt(
              new FreeMarkerTemplate(
                  resourceProvider.loadResourceStream("template.html.freemarker")),
              new FreeMarkerTemplate(
                  resourceProvider.loadResourceStream("template.text.freemarker")))
          .importance(MessagePriority.LOW)
          .deliveryReceipt(fromAddress)
          .readReceipt("seam.test")
          .addAttachment(
              "template.html.freemarker",
              "text/html",
              ContentDisposition.ATTACHMENT,
              resourceProvider.loadResourceStream("template.html.freemarker"))
          .addAttachment(
              new URLAttachment(
                  "http://design.jboss.org/seam/logo/final/seam_mail_85px.png",
                  "seamLogo.png",
                  ContentDisposition.INLINE))
          .send(gmailSession);
    } finally {
      stop(wiser);
    }

    Assert.assertTrue(
        "Didn't receive the expected amount of messages. Expected 1 got "
            + wiser.getMessages().size(),
        wiser.getMessages().size() == 1);

    MimeMessage mess = wiser.getMessages().get(0).getMimeMessage();

    Assert.assertEquals(
        "Subject has been modified", subject, MimeUtility.unfold(mess.getHeader("Subject", null)));
  }
  @Test
  public void testFreeMarkerTextMailMessage() throws MessagingException, IOException {
    String uuid = java.util.UUID.randomUUID().toString();
    String subject = "Text Message from ${version} Mail - " + uuid;
    String version = "Seam 3";
    String mergedSubject = "Text Message from " + version + " Mail - " + uuid;

    Wiser wiser = new Wiser(mailConfig.getServerPort());
    wiser.setHostname(mailConfig.getServerHost());
    try {
      wiser.start();

      person.setName(toName);
      person.setEmail(toAddress);

      mailMessage
          .get()
          .from(MailTestUtil.getAddressHeader(fromName, fromAddress))
          .replyTo(replyToAddress)
          .to(MailTestUtil.getAddressHeader(toName, toAddress))
          .subject(new FreeMarkerTemplate(subject))
          .bodyText(
              new FreeMarkerTemplate(
                  resourceProvider.loadResourceStream("template.text.freemarker")))
          .put("person", person)
          .put("version", version)
          .importance(MessagePriority.HIGH)
          .send(session.get());
    } finally {
      stop(wiser);
    }

    Assert.assertTrue(
        "Didn't receive the expected amount of messages. Expected 1 got "
            + wiser.getMessages().size(),
        wiser.getMessages().size() == 1);

    MimeMessage mess = wiser.getMessages().get(0).getMimeMessage();

    Assert.assertEquals(
        MailTestUtil.getAddressHeader(fromName, fromAddress), mess.getHeader("From", null));
    Assert.assertEquals(
        MailTestUtil.getAddressHeader(replyToAddress), mess.getHeader("Reply-To", null));
    Assert.assertEquals(
        MailTestUtil.getAddressHeader(toName, toAddress), mess.getHeader("To", null));
    Assert.assertEquals(
        "Subject has been modified",
        mergedSubject,
        MimeUtility.unfold(mess.getHeader("Subject", null)));
    Assert.assertEquals(MessagePriority.HIGH.getPriority(), mess.getHeader("Priority", null));
    Assert.assertEquals(MessagePriority.HIGH.getX_priority(), mess.getHeader("X-Priority", null));
    Assert.assertEquals(MessagePriority.HIGH.getImportance(), mess.getHeader("Importance", null));
    Assert.assertTrue(mess.getHeader("Content-Type", null).startsWith("multipart/mixed"));

    MimeMultipart mixed = (MimeMultipart) mess.getContent();
    BodyPart text = mixed.getBodyPart(0);

    Assert.assertTrue(mixed.getContentType().startsWith("multipart/mixed"));
    Assert.assertEquals(1, mixed.getCount());

    Assert.assertTrue(text.getContentType().startsWith("text/plain; charset=UTF-8"));
    Assert.assertEquals(
        expectedTextBody(person.getName(), version), MailTestUtil.getStringContent(text));
  }
  @Test
  public void testFreeMarkerHTMLTextAltMailMessage() throws MessagingException, IOException {
    String subject = "HTML+Text Message from Seam Mail - " + java.util.UUID.randomUUID().toString();
    String version = "Seam 3";
    EmailMessage emailMessage;

    Wiser wiser = new Wiser(mailConfig.getServerPort());
    wiser.setHostname(mailConfig.getServerHost());
    try {
      wiser.start();

      person.setName(toName);
      person.setEmail(toAddress);

      emailMessage =
          mailMessage
              .get()
              .from(MailTestUtil.getAddressHeader(fromName, fromAddress))
              .to(MailTestUtil.getAddressHeader(person.getName(), person.getEmail()))
              .subject(subject)
              .put("person", person)
              .put("version", version)
              .bodyHtmlTextAlt(
                  new FreeMarkerTemplate(
                      resourceProvider.loadResourceStream("template.html.freemarker")),
                  new FreeMarkerTemplate(
                      resourceProvider.loadResourceStream("template.text.freemarker")))
              .importance(MessagePriority.LOW)
              .deliveryReceipt(fromAddress)
              .readReceipt("seam.test")
              .addAttachment(
                  "template.html.freemarker",
                  "text/html",
                  ContentDisposition.ATTACHMENT,
                  resourceProvider.loadResourceStream("template.html.freemarker"))
              .addAttachment(
                  new URLAttachment(
                      "http://design.jboss.org/seam/logo/final/seam_mail_85px.png",
                      "seamLogo.png",
                      ContentDisposition.INLINE))
              .send();
    } finally {
      stop(wiser);
    }

    Assert.assertTrue(
        "Didn't receive the expected amount of messages. Expected 1 got "
            + wiser.getMessages().size(),
        wiser.getMessages().size() == 1);

    MimeMessage mess = wiser.getMessages().get(0).getMimeMessage();

    Assert.assertEquals(
        MailTestUtil.getAddressHeader(fromName, fromAddress), mess.getHeader("From", null));
    Assert.assertEquals(
        MailTestUtil.getAddressHeader(toName, toAddress), mess.getHeader("To", null));
    Assert.assertEquals(
        "Subject has been modified", subject, MimeUtility.unfold(mess.getHeader("Subject", null)));
    Assert.assertEquals(MessagePriority.LOW.getPriority(), mess.getHeader("Priority", null));
    Assert.assertEquals(MessagePriority.LOW.getX_priority(), mess.getHeader("X-Priority", null));
    Assert.assertEquals(MessagePriority.LOW.getImportance(), mess.getHeader("Importance", null));
    Assert.assertTrue(mess.getHeader("Content-Type", null).startsWith("multipart/mixed"));

    MimeMultipart mixed = (MimeMultipart) mess.getContent();
    MimeMultipart related = (MimeMultipart) mixed.getBodyPart(0).getContent();
    MimeMultipart alternative = (MimeMultipart) related.getBodyPart(0).getContent();
    BodyPart attachment = mixed.getBodyPart(1);
    BodyPart inlineAttachment = related.getBodyPart(1);

    BodyPart textAlt = alternative.getBodyPart(0);
    BodyPart html = alternative.getBodyPart(1);

    Assert.assertTrue(mixed.getContentType().startsWith("multipart/mixed"));
    Assert.assertEquals(2, mixed.getCount());

    Assert.assertTrue(related.getContentType().startsWith("multipart/related"));
    Assert.assertEquals(2, related.getCount());

    Assert.assertTrue(html.getContentType().startsWith("text/html"));
    Assert.assertEquals(
        expectedHtmlBody(emailMessage, person.getName(), person.getEmail(), version),
        MailTestUtil.getStringContent(html));

    Assert.assertTrue(textAlt.getContentType().startsWith("text/plain"));
    Assert.assertEquals(
        expectedTextBody(person.getName(), version), MailTestUtil.getStringContent(textAlt));

    Assert.assertTrue(attachment.getContentType().startsWith("text/html"));
    Assert.assertEquals("template.html.freemarker", attachment.getFileName());

    Assert.assertTrue(inlineAttachment.getContentType().startsWith("image/png;"));
    Assert.assertEquals("seamLogo.png", inlineAttachment.getFileName());
  }
  @Test
  public void testTextMailMessageSpecialCharacters() throws MessagingException, IOException {

    String uuid = java.util.UUID.randomUUID().toString();
    String subject = "Special Char ü from ${version} Mail - " + uuid;
    String version = "Seam 3";
    String mergedSubject = "Special Char ü from " + version + " Mail - " + uuid;
    String specialTextBody = "This is a Text Body with a special character - ü - ${version}";
    String mergedSpecialTextBody = "This is a Text Body with a special character - ü - " + version;

    String messageId = "*****@*****.**";

    Wiser wiser = new Wiser(mailConfig.getServerPort());
    wiser.setHostname(mailConfig.getServerHost());
    try {
      wiser.start();

      person.setName(toName);
      person.setEmail(toAddress);

      mailMessage
          .get()
          .from(MailTestUtil.getAddressHeader(fromName, fromAddress))
          .replyTo(replyToAddress)
          .to(MailTestUtil.getAddressHeader(toName, toAddress))
          .subject(new FreeMarkerTemplate(subject))
          .bodyText(new FreeMarkerTemplate(specialTextBody))
          .importance(MessagePriority.HIGH)
          .messageId(messageId)
          .put("version", version)
          .send(session.get());
    } finally {
      stop(wiser);
    }

    Assert.assertTrue(
        "Didn't receive the expected amount of messages. Expected 1 got "
            + wiser.getMessages().size(),
        wiser.getMessages().size() == 1);

    MimeMessage mess = wiser.getMessages().get(0).getMimeMessage();

    System.out.println(subject);
    System.out.println(MimeUtility.decodeText(MimeUtility.unfold(mess.getHeader("Subject", null))));
    System.out.println(mergedSubject);

    Assert.assertEquals(
        "Subject has been modified",
        mergedSubject,
        MimeUtility.decodeText(MimeUtility.unfold(mess.getHeader("Subject", null))));

    MimeMultipart mixed = (MimeMultipart) mess.getContent();
    BodyPart text = mixed.getBodyPart(0);

    Assert.assertTrue(mixed.getContentType().startsWith("multipart/mixed"));
    Assert.assertEquals(1, mixed.getCount());

    Assert.assertTrue(text.getContentType().startsWith("text/plain; charset=UTF-8"));
    Assert.assertEquals(
        mergedSpecialTextBody, MimeUtility.decodeText(MailTestUtil.getStringContent(text)));
  }
  @Test
  public void testHTMLMailMessage() throws MessagingException, IOException {
    String subject = "HTML Message from Seam Mail - " + java.util.UUID.randomUUID().toString();
    String version = "Seam 3";
    EmailMessage emailMessage;
    mailConfig.setServerHost("localHost");
    mailConfig.setServerPort(8977);

    Wiser wiser = new Wiser(mailConfig.getServerPort());
    try {
      wiser.start();

      person.setName(toName);
      person.setEmail(toAddress);

      emailMessage =
          mailMessage
              .get()
              .from(fromAddress, fromName)
              .replyTo(replyToAddress, replyToName)
              .to(person)
              .subject(subject)
              .bodyHtml(new RenderTemplate(templateCompiler.get(), htmlTemplatePath))
              .put("person", person)
              .put("version", version)
              .importance(MessagePriority.HIGH)
              .addAttachment(
                  new URLAttachment(
                      "http://design.jboss.org/seam/logo/final/seam_mail_85px.png",
                      "seamLogo.png",
                      ContentDisposition.INLINE))
              .send(session.get());
    } finally {
      stop(wiser);
    }

    Assert.assertTrue(
        "Didn't receive the expected amount of messages. Expected 1 got "
            + wiser.getMessages().size(),
        wiser.getMessages().size() == 1);

    MimeMessage mess = wiser.getMessages().get(0).getMimeMessage();

    Assert.assertEquals(
        MailTestUtil.getAddressHeader(fromName, fromAddress), mess.getHeader("From", null));
    Assert.assertEquals(
        MailTestUtil.getAddressHeader(replyToName, replyToAddress),
        mess.getHeader("Reply-To", null));
    Assert.assertEquals(
        MailTestUtil.getAddressHeader(toName, toAddress), mess.getHeader("To", null));
    Assert.assertEquals(
        "Subject has been modified", subject, MimeUtility.unfold(mess.getHeader("Subject", null)));
    Assert.assertEquals(MessagePriority.HIGH.getPriority(), mess.getHeader("Priority", null));
    Assert.assertEquals(MessagePriority.HIGH.getX_priority(), mess.getHeader("X-Priority", null));
    Assert.assertEquals(MessagePriority.HIGH.getImportance(), mess.getHeader("Importance", null));
    Assert.assertTrue(mess.getHeader("Content-Type", null).startsWith("multipart/mixed"));

    MimeMultipart mixed = (MimeMultipart) mess.getContent();
    MimeMultipart related = (MimeMultipart) mixed.getBodyPart(0).getContent();
    BodyPart html = related.getBodyPart(0);
    BodyPart attachment1 = related.getBodyPart(1);

    Assert.assertTrue(mixed.getContentType().startsWith("multipart/mixed"));
    Assert.assertEquals(1, mixed.getCount());

    Assert.assertTrue(related.getContentType().startsWith("multipart/related"));
    Assert.assertEquals(2, related.getCount());

    Assert.assertTrue(html.getContentType().startsWith("text/html"));
    Assert.assertEquals(
        expectedHtmlBody(emailMessage, person.getName(), person.getEmail(), version),
        MailTestUtil.getStringContent(html));

    Assert.assertTrue(attachment1.getContentType().startsWith("image/png;"));
    Assert.assertEquals("seamLogo.png", attachment1.getFileName());
  }