如何使用MimeMultipart的JavaMail覆盖默认的唯一边界字符串并创建自己的边界?

时间:2012-11-05 14:22:11

标签: java javamail mime-types mime-message

我有一个我使用的网络应用程序需要特定的边界字符串(“公司mime边界”)。

当我做

时,我没有找到覆盖MimeMultipart默认行为的方法

Multipart mp = new MimeMultipart();

构造函数总是创建一个唯一的边界字符串,我想覆盖此行为以拥有自己的边界字符串,但由于找不到任何API,因此无法执行此操作。

即使我在内容类型中设置它,它也不起作用并且创建一个唯一的边界字符串,因为MimeMultipart正在创建一个默认的边界字符串。

mimeMsg.setHeader("Content-Type","multipart/mixed;boundary="company mime boundary");

任何人都可以建议/帮助我。

如何覆盖此默认行为?

1 个答案:

答案 0 :(得分:3)

来自javax.mail.Multipart

  

mail.mime.multipart.ignoreexistingboundaryparameter系统属性可以设置为true以使任何边界被忽略,而是在消息中搜索边界线

尝试将此属性设置为true,然后使用

添加自己的属性
mimeMsg.setHeader("Content-Type","");

我没有实现它,但我相信它可以工作

<强>更新

尝试对MimeMultipart类进行子类化并覆盖getBoundaryMethod()。请参阅以下示例代码:

import javax.activation.DataSource;
import javax.mail.MessagingException;
import javax.mail.internet.ContentType;
import javax.mail.internet.MimeMultipart;
public class MyMimeMultyPart extends MimeMultipart {
    /**
     * DataSource that provides our InputStream.
     */
    protected DataSource ds;

    /**
     * Indicates if the data has been parsed.
     */
    protected boolean parsed = true;

    private ContentType type;

    public MyMimeMultyPart(DataSource dataSource) throws MessagingException {
        super(dataSource);
    }

    public MyMimeMultyPart(String subtype) {
        type = new ContentType("multipart", subtype, null);
        type.setParameter("boundary", getBoundary());
        contentType = type.toString();
    }

    public MyMimeMultyPart() {
        super();
    }

    private static int part;

    private synchronized static String getBoundary() {
        int i;
        synchronized (MimeMultipart.class) {
            i = part++;
        }
        StringBuffer buf = new StringBuffer(64);
        buf.append("----=_Part_").append(i).append('_').append((new Object()).hashCode()).append('.').append(System.currentTimeMillis());
        return buf.toString();
    }
}