質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.84%

  • Java

    12499questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Eclipse

    1528questions

    Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

  • API

    1328questions

    APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Javaでの、メール機能の分岐処理について

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 119

sougoukanri

score 3

 前提・実現したいこと

お世話になっております。最近Javaの勉強をかなり久しぶりにやり直して、どうしても現時点で疑問が払拭できないのでどうか皆様方のアドバイス等いただければ幸いです。

実現したいことは、シンプルにJavaでのメール配信の際に携帯会社番号によって電子署名を添付するかしないかを判断したいとういうものになります。
ただ分岐すればいいだけかな?と思いますが、勉強中の身の故、サンプルとか頂ければ尚のことありがたいです。

 該当のソースコード

// 大雑把なのは失礼。部分的生成機能、共通的に持っている機能、DAO等は省いております。
// 送信部分なので部分抜粋
// denshisyomeiというのが電子署名生成機能になります。
// このdenshisyomeiを携帯会社番号がその他の番号で来た時のみ生成機能を呼ぶという処理にしたい
//配信処理
if(dasiyouMailAddress ! = null){
//共通処理にて配信を行う。
try {
 sendService.sendMail(meilhonbun,mailkenmei,denshisyomei);
}catch(hogeerror e){
hoge.hogelog(e,param);
return end;
 }
}
// メール配信用のメソッド(メール配信制御)
private String getsendMail(SQLMap sqlmap,Sreing keitaikaisyaNo) throws SQLExeption {

List(maikeruDTO)maiDtoList = null;
//パラメータ設定
ParaDto paraDto = new maikeruDto();
//携帯会社番号
maikeruDto.setKeitaiNo(keitaiNo);

mailIdDto.List = hogehogehoge..... //省略
//携帯会社番号(変数)取得用メソッド
@param keitaiNo 携帯会社番号
@param watasikaiNo 携帯会社番号
@return 変数配列

private String[] get maikerukeitaiNo(String keitaiNo,String watasikaiNo ){
// 携帯番号の番号取得
String keitaiType = keitaiNo.subString(0,1);
String mailProperty=("0","0","0","0","0","0","0","0","0","0","0","0","0");
if (BigCont,OOTEKAISYABANNGO1.equals(keitaiType)){
// 携帯会社1
// 色々持ってるこの辺は省きます
} else if (BigCont,OOTEKAISYABANNGO2.equals(keitaiType)){
// 携帯会社2
// 色々持ってるこの辺は省きます
} else if (BigCont,OOTEKAISYABANNGO3.equals(keitaiType)){
// 携帯会社3
// 色々持ってるこの辺は省きます
else {
//その他(上を除いたこいつの時に電子署名をつけたい)
// その他分類会社
// 色々持ってるこの辺は省きます
return mailProperty;
)

 試したこと

携帯会社番号を分け送信するとこまで来たが、そこで署名分けをするところをでつまずいている。

 補足情報(FW/ツールのバージョンなど)

Eclipse,Java8,windows,SpringBoot

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • euledge

    2018/06/04 07:26

    関数getsendMailがやりたいことは何ですか? メール配信用メソッドというコメントだけでは何をするものなのかわからないです。また関数名にget send 2つの動詞があるのもどちらをやりたいのかがわからないです。そもそも今回の質問の中身に関係あるコードでしょうか?関係ないのであれば記載しないほうが良いです。

    キャンセル

  • asahina1979

    2018/06/04 07:29

    コンパイルエラーだから付与されないんじゃね(ブロック構造)

    キャンセル

  • asahina1979

    2018/06/04 08:41

    しかし、いつの時代のを参考にしたんだろう。特定ドメインごとに証明書を変更しなくてはいけないとか(ガラケー時代はあったはずだが)

    キャンセル

回答 1

check解決した方法

0

古いソースを作ってました...携帯キャリアに対し、DTOないで取得した値をもとにifで分岐し、電子署名くっ付けたら解決しました。

public class BcMailSample {

    /** 秘密鍵 */
    private PrivateKey key;

    /** 証明書 */
    private X509Certificate certificate;

    public static void main(String[] args) throws Exception {
        BcMailSample mail = new BcMailSample();
        mail.loadCertificateFile("verisign.p12");
        mail.sendSignedMail();
    }

    /** 証明書付きメールを送信する。 */
    private void sendSignedMail() throws Exception {
        MimeMessage message = createMimeMessage();
        message.saveChanges();
        Transport.send(message);
    }

    /**
     * MimeMessageを生成する。
     * @return MimeMessage
     */
    private MimeMessage createMimeMessage() throws Exception {
        Properties properties = new Properties();
        properties.put("mail.smtp.host", "****");
        properties.put("mail.host", "****");
        properties.put("mail.smtp.port", "25");

        Session session = Session.getInstance(properties);
        MimeMessage message = new MimeMessage(session);
        message.setSubject("タイトル", "utf-8");
        message.setRecipients(Message.RecipientType.TO, "to");
        message.setFrom(new InternetAddress("from"));
        message.setContent(createSignedBody());
        return message;
    }

    /**
     * 署名付きの本文を生成する。
     */
    private Multipart createSignedBody() throws Exception {
        MimeBodyPart body = new MimeBodyPart();
        body.setText("メール本文", "utf-8");

        //--------------------------------------------------------------------------------
        // 添付ファイルがある場合ここから
        //--------------------------------------------------------------------------------
        MimeMultipart multipart = new MimeMultipart();
        File file = new File("BcMailSample.java");
        ByteArrayDataSource dataSource = new ByteArrayDataSource(new FileInputStream(file), "text/plain");
        DataHandler dataHandler = new DataHandler(dataSource);
        MimeBodyPart filePart = new MimeBodyPart();
        filePart.setDataHandler(dataHandler);
        filePart.setFileName("BcMailSample.java");
        multipart.addBodyPart(body);            // 本文
        multipart.addBodyPart(filePart);        // 添付ファイル
        MimeBodyPart allBody = new MimeBodyPart();
        allBody.setContent(multipart);
        //--------------------------------------------------------------------------------
        // 添付ファイルがある場合ここまで
        //--------------------------------------------------------------------------------

        SMIMESignedGenerator generator = new SMIMESignedGenerator();
        generator.addSignerInfoGenerator(createSignerInfoGenerator());

        List<X509Certificate> certificateList = new ArrayList<>();
        certificateList.add(certificate);
        generator.addCertificates(new JcaCertStore(certificateList));

        //return generator.generate(allBody);      // 添付ファイル有りの場合
        return generator.generate(body);
    }

    /**
     * 電子署名を生成するためのジェネレータを生成する。
     *
     * @return 電子署名を生成するためのジェネレータ
     */
    private SignerInfoGenerator createSignerInfoGenerator() throws Exception {
        ASN1EncodableVector encodableVector = new ASN1EncodableVector();

        IssuerAndSerialNumber issuerAndSerialNumberFor = SMIMEUtil.createIssuerAndSerialNumberFor(certificate);
        encodableVector.add(new SMIMEEncryptionKeyPreferenceAttribute(issuerAndSerialNumberFor));

        AttributeTable attributeTable = new AttributeTable(encodableVector);
        JcaSimpleSignerInfoGeneratorBuilder simpleSignerInfoGeneratorBuilder = new JcaSimpleSignerInfoGeneratorBuilder();
        simpleSignerInfoGeneratorBuilder.setSignedAttributeGenerator(attributeTable);
        return simpleSignerInfoGeneratorBuilder.build("SHA1withRSA", key, certificate);
    }

    /**
     * 証明書からもろもろロード。
     *
     * @param certificateFile 証明書ファイル
     */
    private void loadCertificateFile(String certificateFile) throws Exception {
        KeyStore keyStore;
        try (InputStream stream = new FileInputStream(certificateFile)) {
            keyStore = KeyStore.getInstance("pkcs12");
            keyStore.load(stream, "password".toCharArray());
        }
        // キーエントリのエイリアス名を取得
        String aliasName = getAliasName(keyStore);
        key = (PrivateKey) keyStore.getKey(aliasName, "password".toCharArray());
        certificate = (X509Certificate) keyStore.getCertificate(aliasName);
    }

    /**
     * エリアス名を取得する。
     *
     * @param keyStore キーストア
     * @return エリアス名
     */
    private String getAliasName(KeyStore keyStore) throws KeyStoreException {
        Enumeration<String> aliases = keyStore.aliases();
        while (aliases.hasMoreElements()) {
            String alias = aliases.nextElement();
            if (keyStore.isKeyEntry(alias)) {
                return alias;
            }
        }
        throw new IllegalArgumentException("key entry was not found.");
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.84%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    Javaのemumのエレガントな使い方

    Javaのenumのエレガントな使い方を探しています。 これまで、①「定数を型安全かつ便利に使えるクラス」ぐらいの認識しかなく、そこまで価値を感じていませんでした。しかし、②

  • 解決済

    Java if文を多様しないで組みたい

    現在Javaにて名前と科目を入力したら登録した点数がでるプログラムを組んでいます。 エラーは無いのですがif文を多様してしまっているのでif文をあまり使わずに作りたいです。

  • 解決済

    メソッドを使ったプログラムを作りたいです

    前提・実現したいこと Javaのメソッドを使う問題を解いています。 問題は以下の通りです。 ↓ 好物を元に動物の名前と特徴を出力するプログラム  ・作成するクラス 

  • 解決済

    Java リストの使いかたについて

    リストの中で1番面積が大きい図形を返す Javaのコードでmaxの中身が分かりません。  リストの使いかたがいまいち分からず、、、教えてください。 該当のソースコード p

  • 解決済

    クラスリストの比較でcontainsが動作してくれない

    containsを用いて2つのクラスリストを比較したいのですが、うまく動作してくれません。 class Order{ public int id; publi

  • 解決済

    Javaでそれぞれの英単語のTFIDFの求め方がわかりません。

    Javaを独学で勉強中のJava初心者です。Javaで英文テキストファイルを読み込みそれぞれの英単語のTFIDFを表示させるプログラムを作りたいのですが、どうしてもうまくできません

  • 解決済

    Javaでのcsv読み取り、合計、上位5位のみ書き出し

    前提・実現したいこと 1)Javaで下図のようなcsvデータ(学校のテストの結果)を読み取る 氏名,英語,国語,数学 山田,80,70,60, 佐藤,70,50,90,

  • 解決済

    引数の引渡しについて

    前提・実現したいこと 1番目の引数(str_userid)から2番目の引数(str_userid)に 数値を渡したいのですが、どうしたらよろしいのでしょうか? ちなみに1番目

同じタグがついた質問を見る

  • Java

    12499questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Eclipse

    1528questions

    Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

  • API

    1328questions

    APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。