Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

blog:2011:0611_constructing_mhtml_files_in_java_using_javamail_api [2011/06/11 14:18] (aktuální)
petr vytvořeno
Řádek 1: Řádek 1:
 +====== Constructing MHTML files in Java using JavaMail API ======
 +Apparently, there is no library for creating [[wikipedia>MHTML]] files. (If you know one, [[http://petr.pudlak.name/contact/|let me know]].)
 +
 +However, this can be easily performed using JavaMail API, as demonstrated in the following example. It assumes there is an image named ''pooh.jpg'' in its working directory and produces ''example.mhtml'' containing a very simple web page with the image.
 +<file java MHTMLExample.java java>
 +/*
 +    Author: Petr Pudlak, 2011, http://petr.pudlak.name/contact/
 +
 +    This program is free software: you can redistribute it and/or modify it
 +    under the terms of the GNU Lesser General Public License as published by
 +    the Free Software Foundation, either version 3 of the License, or (at your
 +    option) any later version.
 +
 +    This program is distributed in the hope that it will be useful, but WITHOUT
 +    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 +    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
 +    License for more details.
 +
 +    You should have received a copy of the GNU Lesser General Public License
 +    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 +*/
 +import javax.mail.*;
 +import javax.mail.internet.*;
 +import javax.activation.*;
 +import java.io.*;
 +import java.util.*;
 +
 +/**
 + * Example how to construct a MHT (AKA MHTML) file in Java using JavaMail
 + * API. Creates a simple HTML page (from a String) with an image, which is
 + * pulled from a file. Requires mail.jar in the classpath (and also Java
 + * Activation Framework if JDK version is less than 1.6).
 + *
 + * The program expects a file named <em>pooh.jpg</em> in the current directory
 + * and produces a very simple MHT archive to stdout.
 + */
 +public class MHTMLExample
 +{
 +    public static void main(String argv[]) throws Exception
 +    {
 +        // get system properties
 +        Properties props = new Properties();
 +        // System.getProperties();
 +        // create a new session
 +        Session session = Session.getInstance(props, null);
 +        // construct a MIME message message
 +        MimeMessage message = new MimeMessage(session);
 +        MimeMultipart mpart = new MimeMultipart("related");
 +        String htmlPage =
 +            "<html><head><title>Example</title></head>" +
 +            "<body><p>ExampleExampleSome text..." +
 +            "<img src='pooh.jpg'></p></body>";
 +        mpart.addBodyPart(bodyPart(
 +            new StringSource("text/html", "index.html", htmlPage) ));
 +        mpart.addBodyPart(bodyPart(new FileDataSource("pooh.jpg")));
 +        message.setContent(mpart);
 +        // the subject is displayed as the window title in the browser
 +        message.setSubject("MHTML example");
 +        // one can set the URL of the original page:
 +        message.addHeader("Content-Location", "index.html");
 +
 +        // Save to example.mhtml
 +        FileOutputStream out = new FileOutputStream("example.mhtml");
 +        message.writeTo(out);
 +        out.close();
 +    }
 +    static BodyPart bodyPart(DataSource ds) throws MessagingException
 +    {
 +        MimeBodyPart body = new MimeBodyPart();
 +        DataHandler dh = new DataHandler(ds);
 +        body.setDisposition("inline");
 +        body.setDataHandler(dh);
 +        body.setFileName(dh.getName());
 +        // the URL of the file; we set it simply to its name
 +        body.addHeader("Content-Location", dh.getName());
 +        return body;
 +    }
 +
 +    /**
 +     * A simple in-memory implementation of {@link DataSource}.
 +     */
 +    static final class StringSource implements DataSource
 +    {
 +        private final String contentType;
 +        private final String name;
 +        private final byte[] data;
 +        public StringSource(String contentType, String name, String data)
 +        {
 +            this.contentType = contentType;
 +            this.data = data.getBytes();
 +            this.name = name;
 +        }
 +        public String getContentType()
 +        {
 +            return contentType;
 +        }
 +        public OutputStream getOutputStream() throws IOException
 +        {
 +            throw new IOException();
 +        }
 +        public InputStream getInputStream() throws IOException
 +        {
 +            return new ByteArrayInputStream(data);
 +        }
 +        public String getName()
 +        {
 +            return name;
 +        }
 +    }
 +}
 +</file>