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

Ste*_*ler 5 java email javax.mail

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

我遇到的问题javax.mailjavax.mail.Message类和javax.mail.MimeMessage类期望一个javax.mail.Session对象作为构造函数的参数.所以我不能像这样的方法签名

private static void sendMail(javax.mail.Message);
Run Code Online (Sandbox Code Playgroud)

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

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

jme*_*ens 6

MimeMessage班将接受空会话.如果您创建了此类消息,则Transport.send可能无法发送您MimeMessage只需要管理自己的会话和传输对象的To解决方法,然后使用非静态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) {
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


tha*_*guy 5

使用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();
}
Run Code Online (Sandbox Code Playgroud)