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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

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

Eclipse

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

API

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

Q&A

解決済

1回答

185閲覧

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

Lorraine

総合スコア10

Java

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

Eclipse

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

API

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

0グッド

0クリップ

投稿2018/06/03 15:26

前提・実現したいこと

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

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

該当のソースコード

Java

1// 大雑把なのは失礼。部分的生成機能、共通的に持っている機能、DAO等は省いております。 2// 送信部分なので部分抜粋 3// denshisyomeiというのが電子署名生成機能になります。 4// このdenshisyomeiを携帯会社番号がその他の番号で来た時のみ生成機能を呼ぶという処理にしたい 5//配信処理 6if(dasiyouMailAddress ! = null){ 7//共通処理にて配信を行う。 8try { 9 sendService.sendMail(meilhonbun,mailkenmei,denshisyomei); 10}catch(hogeerror e){ 11hoge.hogelog(e,param); 12return end; 13 } 14}

java

1// メール配信用のメソッド(メール配信制御) 2private String getsendMail(SQLMap sqlmap,Sreing keitaikaisyaNo) throws SQLExeption { 3 4List(maikeruDTO)maiDtoList = null; 5//パラメータ設定 6ParaDto paraDto = new maikeruDto(); 7//携帯会社番号 8maikeruDto.setKeitaiNo(keitaiNo); 9 10mailIdDto.List = hogehogehoge..... //省略

Java

1//携帯会社番号(変数)取得用メソッド 2@param keitaiNo 携帯会社番号 3@param watasikaiNo 携帯会社番号 4@return 変数配列 5 6private String[] get maikerukeitaiNo(String keitaiNo,String watasikaiNo ){ 7// 携帯番号の番号取得 8String keitaiType = keitaiNo.subString(0,1); 9String mailProperty=("0","0","0","0","0","0","0","0","0","0","0","0","0"); 10if (BigCont,OOTEKAISYABANNGO1.equals(keitaiType)){ 11// 携帯会社1 12// 色々持ってるこの辺は省きます 13} else if (BigCont,OOTEKAISYABANNGO2.equals(keitaiType)){ 14// 携帯会社2 15// 色々持ってるこの辺は省きます 16} else if (BigCont,OOTEKAISYABANNGO3.equals(keitaiType)){ 17// 携帯会社3 18// 色々持ってるこの辺は省きます 19else { 20//その他(上を除いたこいつの時に電子署名をつけたい) 21// その他分類会社 22// 色々持ってるこの辺は省きます 23return mailProperty; 24)

試したこと

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

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

Eclipse,Java8,windows,SpringBoot

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/06/03 20:49

コードの解説・説明についてはコードブロックの外に書いてください。コードは実際のコードをそのまま再現するものです。コードのコメントにしてしまうと非常に読みづらいです。
m.ts10806

2018/06/03 20:51

提示ソースのどこにも定義されていないBigContという変数がいきなり使われていますが、これは?回答者の多くは提示コードで再現確認を行うことがあります。省略が多すぎると的確な回答が得られない可能性があります。
euledge

2018/06/03 22:26

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

退会済みユーザー

2018/06/03 22:29

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

退会済みユーザー

2018/06/03 23:41

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

回答1

0

自己解決

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

Java

1public class BcMailSample { 2 3 /** 秘密鍵 */ 4 private PrivateKey key; 5 6 /** 証明書 */ 7 private X509Certificate certificate; 8 9 public static void main(String[] args) throws Exception { 10 BcMailSample mail = new BcMailSample(); 11 mail.loadCertificateFile("verisign.p12"); 12 mail.sendSignedMail(); 13 } 14 15 /** 証明書付きメールを送信する。 */ 16 private void sendSignedMail() throws Exception { 17 MimeMessage message = createMimeMessage(); 18 message.saveChanges(); 19 Transport.send(message); 20 } 21 22 /** 23 * MimeMessageを生成する。 24 * @return MimeMessage 25 */ 26 private MimeMessage createMimeMessage() throws Exception { 27 Properties properties = new Properties(); 28 properties.put("mail.smtp.host", "****"); 29 properties.put("mail.host", "****"); 30 properties.put("mail.smtp.port", "25"); 31 32 Session session = Session.getInstance(properties); 33 MimeMessage message = new MimeMessage(session); 34 message.setSubject("タイトル", "utf-8"); 35 message.setRecipients(Message.RecipientType.TO, "to"); 36 message.setFrom(new InternetAddress("from")); 37 message.setContent(createSignedBody()); 38 return message; 39 } 40 41 /** 42 * 署名付きの本文を生成する。 43 */ 44 private Multipart createSignedBody() throws Exception { 45 MimeBodyPart body = new MimeBodyPart(); 46 body.setText("メール本文", "utf-8"); 47 48 //-------------------------------------------------------------------------------- 49 // 添付ファイルがある場合ここから 50 //-------------------------------------------------------------------------------- 51 MimeMultipart multipart = new MimeMultipart(); 52 File file = new File("BcMailSample.java"); 53 ByteArrayDataSource dataSource = new ByteArrayDataSource(new FileInputStream(file), "text/plain"); 54 DataHandler dataHandler = new DataHandler(dataSource); 55 MimeBodyPart filePart = new MimeBodyPart(); 56 filePart.setDataHandler(dataHandler); 57 filePart.setFileName("BcMailSample.java"); 58 multipart.addBodyPart(body); // 本文 59 multipart.addBodyPart(filePart); // 添付ファイル 60 MimeBodyPart allBody = new MimeBodyPart(); 61 allBody.setContent(multipart); 62 //-------------------------------------------------------------------------------- 63 // 添付ファイルがある場合ここまで 64 //-------------------------------------------------------------------------------- 65 66 SMIMESignedGenerator generator = new SMIMESignedGenerator(); 67 generator.addSignerInfoGenerator(createSignerInfoGenerator()); 68 69 List<X509Certificate> certificateList = new ArrayList<>(); 70 certificateList.add(certificate); 71 generator.addCertificates(new JcaCertStore(certificateList)); 72 73 //return generator.generate(allBody); // 添付ファイル有りの場合 74 return generator.generate(body); 75 } 76 77 /** 78 * 電子署名を生成するためのジェネレータを生成する。 79 * 80 * @return 電子署名を生成するためのジェネレータ 81 */ 82 private SignerInfoGenerator createSignerInfoGenerator() throws Exception { 83 ASN1EncodableVector encodableVector = new ASN1EncodableVector(); 84 85 IssuerAndSerialNumber issuerAndSerialNumberFor = SMIMEUtil.createIssuerAndSerialNumberFor(certificate); 86 encodableVector.add(new SMIMEEncryptionKeyPreferenceAttribute(issuerAndSerialNumberFor)); 87 88 AttributeTable attributeTable = new AttributeTable(encodableVector); 89 JcaSimpleSignerInfoGeneratorBuilder simpleSignerInfoGeneratorBuilder = new JcaSimpleSignerInfoGeneratorBuilder(); 90 simpleSignerInfoGeneratorBuilder.setSignedAttributeGenerator(attributeTable); 91 return simpleSignerInfoGeneratorBuilder.build("SHA1withRSA", key, certificate); 92 } 93 94 /** 95 * 証明書からもろもろロード。 96 * 97 * @param certificateFile 証明書ファイル 98 */ 99 private void loadCertificateFile(String certificateFile) throws Exception { 100 KeyStore keyStore; 101 try (InputStream stream = new FileInputStream(certificateFile)) { 102 keyStore = KeyStore.getInstance("pkcs12"); 103 keyStore.load(stream, "password".toCharArray()); 104 } 105 // キーエントリのエイリアス名を取得 106 String aliasName = getAliasName(keyStore); 107 key = (PrivateKey) keyStore.getKey(aliasName, "password".toCharArray()); 108 certificate = (X509Certificate) keyStore.getCertificate(aliasName); 109 } 110 111 /** 112 * エリアス名を取得する。 113 * 114 * @param keyStore キーストア 115 * @return エリアス名 116 */ 117 private String getAliasName(KeyStore keyStore) throws KeyStoreException { 118 Enumeration<String> aliases = keyStore.aliases(); 119 while (aliases.hasMoreElements()) { 120 String alias = aliases.nextElement(); 121 if (keyStore.isKeyEntry(alias)) { 122 return alias; 123 } 124 } 125 throw new IllegalArgumentException("key entry was not found."); 126 } 127}

投稿2018/06/08 01:58

Lorraine

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問