6

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

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

private static void sendMail(javax.mail.Message);

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

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

4

4 回答 4

7

该类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) {
        }
    }
}
于 2013-07-19T13:20:26.817 回答
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();
}
于 2013-07-09T20:47:51.273 回答
2

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

MimeMessage mimeMessage = javaMailSender.createMimeMessage();

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

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-mail</artifactId>
    </dependency>
于 2014-02-13T10:34:47.960 回答
1

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

于 2013-07-09T22:32:51.693 回答