【问题标题】:Creating a email message in Java without a mail session在没有邮件会话的 Java 中创建电子邮件消息
【发布时间】:2013-07-09 20:13:45
【问题描述】:

我想在我的应用程序中创建一个实用方法,它接受电子邮件作为参数并知道如何发送它。此实用程序方法将负责了解哪个 SMTP 服务器使用什么凭据来连接它。

javax.mail 遇到的问题是 javax.mail.Message 类和 javax.mail.MimeMessageclass 期望 javax.mail.Session 对象作为构造函数的参数。所以我不能有像

这样的方法签名
private static void sendMail(javax.mail.Message);

因为如果没有我试图抽象的所有细节,我的客户端类将无法构造消息。他们必须知道如何通过连接到邮件服务器来创建会话。

有没有办法在没有会话的情况下创建消息,或者是一个封装不需要会话的电子邮件的类?

【问题讨论】:

  • 您是否查看过 Apache Commons 电子邮件包,或者您是否设置为 javax.mail
  • 我使用 Apache commons。我对涉及开源软件包的解决方案感到非常满意。

标签: java email jakarta-mail


【解决方案1】:

MimeMessage 类将接受空会话。如果您创建这样的消息,Transport.send 可能无法发送您的 MimeMessage 要解决此问题,您只需管理自己的会话和传输对象,然后使用非静态 Transport.sendMessage 方法。

public void forward(Session session, Message m) throws MessagingException {
    Address[] all = m.getAllRecipients();
    if (all == null) { //Don't pass null to sendMessage.
        all = new InternetAddress[0];
    }

    Transport t;
    try {
        // Session properties 'mail.transport.protocol.rfc822'
        // and 'mail.transport.protocol' can be used to change
        // between SMTP or SMTPS.

        if (all.length != 0) {
            t = session.getTransport(all[0]);
        } else {
            t = session.getTransport();
        }
    } catch (NoSuchProviderException punt) {
        try {
            t = session.getTransport("smtp"); //Just a guess.
        } catch (NoSuchProviderException fail) {
            if (fail.setNextException(punt)) {
                throw fail;
            } else {
                punt.setNextException(fail);
                throw punt;
            }
        }
    }

    m.saveChanges(); //Computes additional headers.

    t.connect("host", 25, "user", "pass"); //Or use one of the many other connect method overloads.
    try {
        t.sendMessage(m, all);
    } finally {
        try {
            t.close();
        } catch (MessagingException warning) {
        }
    }
}

【讨论】:

    【解决方案2】:

    使用Apache Commons Email,可以将以下任何代码添加到 sendMail 方法中,具体取决于您想要设置的位置。

        HtmlEmail email = new HtmlEmail();
        //email.setDebug(debugMode);
        email.setBounceAddress("bouce@domain.biz");
        email.setHostName("mySMTPHost");
    
    
        email.setFrom("myAddress@mydomain.com");
        email.addTo(emailAddress);
        email.addBcc("bccAddres");
    
        email.setSubject("Your Subject");
        email.setAuthentication("recipient@snailmail.org", "password");
        email.setSSL(true);
        email.setSmtpPort(465);
        email.setHtmlMsg(html);
    
    public static void sendMail(org.apache.commons.mail.HtmlEmail email)
    {       
        email.send();
    }
    

    【讨论】:

    【解决方案3】:

    如果您使用的是 Spring 框架/spring boot,您可以将 Spring JavaMailSenderImpl 注入到您的类中,然后执行(显然您也需要将 SMTP 服务器属性注入到邮件发送者中):

    MimeMessage mimeMessage = javaMailSender.createMimeMessage();
    

    您需要将以下依赖项添加到您的应用中才能正常工作:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>
    

    【讨论】:

      【解决方案4】:

      不要让每个客户端自己创建消息类,而是让他们从您的实用程序类中获取消息对象。然后实用程序类可以构造带有所需会话信息的消息对象。

      【讨论】:

      • 某个库中是否已经构建了这样的消息实用程序对象,或者这是我必须创建的东西?
      • 我认为你需要创建它。甚至 spring 在 JavaMailSenderImpl 中也使用了 session 对象。 static.springsource.org/spring/docs/2.0.8/api/org/…
      • 这个答案缺少一个代码示例,或者至少应该清楚地指出你在说什么实用程序类(-1)
      • @BastianVoigt 他显然是在谈论 OP 表示他想要创建的实用程序类
      猜你喜欢
      • 2021-02-06
      • 2014-09-05
      • 1970-01-01
      • 2011-03-27
      • 1970-01-01
      • 2013-10-20
      • 2018-05-09
      • 2013-07-25
      • 2013-05-21
      相关资源
      最近更新 更多