在没有邮件会话的情况下使用Java创建电子邮件

时间:2013-07-09 20:13:45

标签: java email javax.mail

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

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

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

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

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

4 个答案:

答案 0 :(得分:5)

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 {
        if (all.length != 0) {
            t = session.getTransport(all[0]);
        } else {
            t = session.getTransport("smtp");
        }
    } catch (NoSuchProviderException tryDefault) {
        try {
            t = session.getTransport();
        } catch (NoSuchProviderException fail) {
            if (fail.setNextException(tryDefault)) {
                throw fail;
            } else {
                tryDefault.setNextException(fail);
                throw tryDefault;
            }
        }
    }


    m.saveChanges();

    t.connect("host", 25, "user", "pass");
    try {
        t.sendMessage(m, all);
    } finally {
        try {
            t.close();
        } catch (MessagingException warning) {
        }
    }
}

答案 1 :(得分:4)

使用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();
}

答案 2 :(得分:2)

如果你正在使用Spring框架/ spring引导,你可以在你的类中注入一个Spring JavaMailSenderImpl,并且(显然你也需要将SMTP服务器属性注入邮件发送者):

MimeMessage mimeMessage = javaMailSender.createMimeMessage();

您需要将以下依赖项添加到您的应用中才能实现此目的:

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

答案 3 :(得分:1)

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