Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

分割メールの送信方法

サイズの重い添付ファイルを分割してメール送信したいのですが、WEBで調べてもほとんどヒットしません。

メール送信時にContentTypeにmessage/partialを設定してみましたが、受信した結果、メールは一つになるのですが、添付ファイルが結合されません・・・。
ちなみにapache commonsで試しました。

javaMail,jafなどありますがこちらでは分割送信できるのでしょうか。

できるできないでよいのでお答えいただけないでしょうか。
よろしくお願いします

8

回答

84041

閲覧

8件の回答

評価

0

message/partialをどう扱うかはメールクライアントによる
が、それは大丈夫?

実際のヘッダは以下のようになってるんだろうか。
メール自体は結合されたというなら、大丈夫だとは思うけど
念のため。

http://cast-a-spell.at.webry.info/200801/article_15.html

評価

0

$さん

ご返信ありがとうございます。
outlook Expressにて3分割したメールヘッダと
apache commonsで送信したメールヘッダを比較しましたが、差分は見つかりませんでした。

しかし、ヘッダの後のソースを見ると差分がありました。

成功しているメールのヘッダの後ろは1件目、
Subject:From XXXX
Message-Id:XXXXX
....
Content-Type: multipart/mixed;
boundary="---_XXXXX_"
Content-Transfer-Encoding:7bit


-------_XXXXXXXX_
Content-Type:text/plain; charset="US-ASCII"
Content-Transfer-Encoding:7bit


-------_XXXXXXXX_
Content-Type: application/octet-stream; name="XXX"
Content-Disposition:attachment;filename="XXX"
Content-Transfer-Encoding: base64

以下は分割したバイナリ
/92382jfkldhhgfldgfgfdgf
fdfdfdfdjgljlfjdsklfjdf
.....................
.........

2件目はヘッダ情報の後ろはバイナリのみ
3件目はヘッダ情報の後ろにバイナリのみ

となっているのに対し、apache commonsで送信したソースには3件ともヘッダ情報のうしろに
-------=_PartXXXXXXXX
Content-Type:application/octet-stream; name=XXX
Content-Transfer-Encoding:base64
Content-Disposion:attachment;filename=XXXXX

以下は分割したバイナリ
/92382jfkldhhgfldgfgfdgf
fdfdfdfdjgljlfjdsklfjdf
.....................

となっております。
apache commonsではできないのでしょうか。
週末になりますが、ソースを載せてさせていただきます。

よろしくお願いいたします。

評価

0

使ったことないから分からないなあ。
使い方が違うのかもしれないし。

分割メール程度なら、手で実装しても良いと思うが。

評価

0

$さん

私が作成したソースは以下のような感じです。
WEBに転がっていたサンプルに
分割メールの設定をして以下のメールを2回実行するような作りです。
しかし、上手くアウトルックエクスプレスで結合することができない状態です。
何か誤りがありましたらご指摘願います。



import java.io.UnsupportedEncodingException;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;

public class test {

    /**
     * @param args
     * @throws MessagingException 
     * @throws UnsupportedEncodingException 
     */
    public static void main(String[] args) throws UnsupportedEncodingException, MessagingException {
        // TODO 自動生成されたメソッド・スタブ
        DataHandler imgdh = null;
        FileDataSource fds = new FileDataSource("ファイル名");
        imgdh = new DataHandler(fds);
        Properties props = System.getProperties();
        // SMTPサーバーのアドレスを指定
        props.put("mail.smtp.host","smtp.xxx.ne.jp");
        Session session=Session.getDefaultInstance(props,null);
        MimeMessage mimeMessage=new MimeMessage(session);
        // 送信元メールアドレスと送信者名を指定
        mimeMessage.setFrom(new InternetAddress("mailFrom","","iso-2022-jp"));
        // 送信先メールアドレスを指定
        mimeMessage.setRecipients(Message.RecipientType.TO,"toAddress");
        // メールのタイトルを指定
        mimeMessage.setSubject("メールタイトル","iso-2022-jp"); 
        // マルチパートオブジェクトを生成
        Multipart mp = new MimeMultipart();
        // 1つ目は本文
        MimeBodyPart mbp1 = new MimeBodyPart();
        mbp1.setText("メールの本文を記述", "iso-2022-jp");
        mbp1.setHeader("Content-Type","text/plain");
        mp.addBodyPart(mbp1);
        
        // 2つ目は画像を添付する
        MimeBodyPart mbp2 = new MimeBodyPart();
        // 添付するファイルデータソースを指定
        mbp2.setDataHandler(imgdh);
        mbp2.setFileName(MimeUtility.encodeWord("ファイル名"));
        mp.addBodyPart(mbp2);
        // マルチパートオブジェクトをメッセージに設定
        mimeMessage.setContent(mp);
        mimeMessage.setSentDate(new java.util.Date());
        
        // ★分割メールの設定
        mimeMessage.setHeader("Content-Type", "message/partial; number=1; total=2; id=\"<foo>\"");
        mimeMessage.setHeader("Content-Transfer-Encoding", "7bit");
        // 送信します
        Transport.send(mimeMessage);
    }

}

評価

0

ヘッダを変えてるだけて、実際に分割して送ってないな。

生成したMimeMessageのbodyをStringに書き出し、これを規
定の長さで分割して複数のMimeMessageのbodyに入れ直し、
個々にヘッダを指定して全部transport…て流れでできんのか
な。


標準でそれをやってくれる方法が用意されてるかどうかは、
分からない。

評価

0

$さん

ご回答ありがとうございます。
$さんのおかげでなんとなくイメージが掴めました。
マルチパートではなく、

テキスト送信のイメージでbodyに添付ファイルを書き出す感じでしょうか。

とするとMimeMessage#setText()が使えるような気がするので試してみます。

評価

0

分割メールは、マルチパートでエンコードした「後の」テキ
ストデータが、途中から別のメールの本文になってる感じ。

念のため、「手で実装」というのは、Javamailを使わずに
SMTPをしゃべるクライアントを書けば、てことだった。

評価

0

$さん

いつも回答ありがとうございます。


以下抜粋ですがソースは以下になります。
ファイルを読み込んだあと、bodyに流し込んで
送信してみました。

結果は、分割されたメールは結合されましたが、添付ファイルができませんでした。
やはりライブラリでは限界があるみたいです。

しゃべるSMTPクライアントとはHELOとかそういうのですかね。
調べてみたいと思います。


byte[] array = new byte[maximumSize];
bis = new BufferedInputStream(new FileInputStream(f), 512);

int readable = bis.read(array);
int index = 1;

String subject = msg.getSubject(); 
String references = null;

while(readable > 0) {
    String messageIdTmp = 
    MessageFormat.format(MESSAGE_ID_PATTERN, new Object[] {"" + index, messageId });
    msg.setHeader("Message-ID", messageIdTmp);

    if (references != null) {
    msg.setHeader("References", references);
    }
    references = messageIdTmp;

    String subjectTmp = 
    MessageFormat.format(SUBJECT_PATTERN, new Object[] { subject,"" + index, "" + partSize });
    msg.setSubject(subjectTmp);

    String body = new String(array, 0, readable);
    msg.setText(body);

    String contentType = 
    MessageFormat.format(CONTENT_TYPE_PATTERN, new Object[] {"" + index, "" + partSize,messageId });
    msg.setHeader("Content-Type", contentType);

    Transport.send(mimeMessage);

    readable = bis.read(array);
    index++;
}
}
    private final static String CONTENT_TYPE_PATTERN = "message/partial; number={0}; total={1}; id=\"<{2}>\"";
    private final static String MESSAGE_ID_PATTERN = "<{0}.{1}>";
    private final static String SUBJECT_PATTERN = "{0}[{1}/{2}]";

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。