6

電子メール メッセージを引数として受け取り、その送信方法を知っているアプリでユーティリティ メソッドを作成したいと考えています。このユーティリティ メソッドは、どの SMTP サーバーに接続するためにどの資格情報を使用する必要があるかを知る責任があります。

私が直面している問題javax.mailは、javax.mail.Messageクラスとクラスがコンストラクターへの引数としてオブジェクトをjavax.mail.MimeMessage期待していることです。javax.mail.Sessionだから私は次のようなメソッド署名を持つことはできません

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

クライアント クラスは、抽象化しようとしているすべての詳細なしではメッセージを構築できないためです。メールサーバーに接続してセッションを作成する方法を知っている必要があります。

セッションなしでメッセージを作成する方法、またはセッションを必要としない電子メール メッセージをカプセル化するクラスを作成する方法はありますか?

4

4 に答える 4

7

クラスはMimeMessagenull セッションを受け入れます。このようなメッセージを作成した場合Transport.send、To 回避策を送信できない可能性があり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 に答える