apache-mime4j-project-0.7.2/0000755000000000000000000000000011702050564014266 5ustar rootrootapache-mime4j-project-0.7.2/storage/0000755000000000000000000000000011702050530015723 5ustar rootrootapache-mime4j-project-0.7.2/storage/src/0000755000000000000000000000000011702050530016512 5ustar rootrootapache-mime4j-project-0.7.2/storage/src/main/0000755000000000000000000000000011702050530017436 5ustar rootrootapache-mime4j-project-0.7.2/storage/src/main/java/0000755000000000000000000000000011702050530020357 5ustar rootrootapache-mime4j-project-0.7.2/storage/src/main/java/org/0000755000000000000000000000000011702050530021146 5ustar rootrootapache-mime4j-project-0.7.2/storage/src/main/java/org/apache/0000755000000000000000000000000011702050530022367 5ustar rootrootapache-mime4j-project-0.7.2/storage/src/main/java/org/apache/james/0000755000000000000000000000000011702050530023466 5ustar rootrootapache-mime4j-project-0.7.2/storage/src/main/java/org/apache/james/mime4j/0000755000000000000000000000000011702050530024653 5ustar rootrootapache-mime4j-project-0.7.2/storage/src/main/java/org/apache/james/mime4j/storage/0000755000000000000000000000000011702050530026317 5ustar rootroot././@LongLink0000000000000000000000000000015700000000000011570 Lustar rootrootapache-mime4j-project-0.7.2/storage/src/main/java/org/apache/james/mime4j/storage/TempFileStorageProvider.javaapache-mime4j-project-0.7.2/storage/src/main/java/org/apache/james/mime4j/storage/TempFileStoragePro0000644000000000000000000001501411702050530031756 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.storage; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.HashSet; import java.util.Iterator; import java.util.Set; /** * A {@link StorageProvider} that stores the data in temporary files. The files * are stored either in a user-specified directory or the default temporary-file * directory (specified by system property java.io.tmpdir). *

* Example usage: * *

 * File directory = new File("/tmp/mime4j");
 * StorageProvider provider = new TempFileStorageProvider(directory);
 * DefaultStorageProvider.setInstance(provider);
 * 
*/ public class TempFileStorageProvider extends AbstractStorageProvider { private static final String DEFAULT_PREFIX = "m4j"; private final String prefix; private final String suffix; private final File directory; /** * Equivalent to using constructor * TempFileStorageProvider("m4j", null, null). */ public TempFileStorageProvider() { this(DEFAULT_PREFIX, null, null); } /** * Equivalent to using constructor * TempFileStorageProvider("m4j", null, directory). */ public TempFileStorageProvider(File directory) { this(DEFAULT_PREFIX, null, directory); } /** * Creates a new TempFileStorageProvider using the given * values. * * @param prefix * prefix for generating the temporary file's name; must be at * least three characters long. * @param suffix * suffix for generating the temporary file's name; may be * null to use the suffix ".tmp". * @param directory * the directory in which the file is to be created, or * null if the default temporary-file directory is * to be used (specified by the system property * java.io.tmpdir). * @throws IllegalArgumentException * if the given prefix is less than three characters long or the * given directory does not exist and cannot be created (if it * is not null). */ public TempFileStorageProvider(String prefix, String suffix, File directory) { if (prefix == null || prefix.length() < 3) throw new IllegalArgumentException("invalid prefix"); if (directory != null && !directory.isDirectory() && !directory.mkdirs()) throw new IllegalArgumentException("invalid directory"); this.prefix = prefix; this.suffix = suffix; this.directory = directory; } public StorageOutputStream createStorageOutputStream() throws IOException { File file = File.createTempFile(prefix, suffix, directory); file.deleteOnExit(); return new TempFileStorageOutputStream(file); } private static final class TempFileStorageOutputStream extends StorageOutputStream { private File file; private OutputStream out; public TempFileStorageOutputStream(File file) throws IOException { this.file = file; this.out = new FileOutputStream(file); } @Override public void close() throws IOException { super.close(); out.close(); } @Override protected void write0(byte[] buffer, int offset, int length) throws IOException { out.write(buffer, offset, length); } @Override protected Storage toStorage0() throws IOException { // out has already been closed because toStorage calls close return new TempFileStorage(file); } } private static final class TempFileStorage implements Storage { private File file; private static final Set filesToDelete = new HashSet(); public TempFileStorage(File file) { this.file = file; } public void delete() { // deleting a file might not immediately succeed if there are still // streams left open (especially under Windows). so we keep track of // the files that have to be deleted and try to delete all these // files each time this method gets invoked. // a better but more complicated solution would be to start a // separate thread that tries to delete the files periodically. synchronized (filesToDelete) { if (file != null) { filesToDelete.add(file); file = null; } for (Iterator iterator = filesToDelete.iterator(); iterator .hasNext();) { File file = iterator.next(); if (file.delete()) { iterator.remove(); } } } } public InputStream getInputStream() throws IOException { if (file == null) throw new IllegalStateException("storage has been deleted"); return new BufferedInputStream(new FileInputStream(file)); } } } ././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/storage/src/main/java/org/apache/james/mime4j/storage/MultiReferenceStorage.javaapache-mime4j-project-0.7.2/storage/src/main/java/org/apache/james/mime4j/storage/MultiReferenceStor0000644000000000000000000001122411702050530032023 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.storage; import java.io.IOException; import java.io.InputStream; /** *

* A wrapper around another {@link Storage} that also maintains a reference * counter. The inner storage gets deleted only if the reference counter reaches * zero. *

*

* Reference counting is used to delete the storage when it is no longer needed. * So, any users of this class should note: *

*
    *
  • The reference count is set up one on construction. In all other cases, * {@link #addReference()} should be called when the storage is shared.
  • *
  • The caller of {@link #addReference()} should ensure that * {@link #delete()} is called once and only once.
  • *
  • Sharing the {@link Storage} instance passed into * {@link #MultiReferenceStorage(Storage)} may lead to miscounting and premature * deletion
  • *
*/ public class MultiReferenceStorage implements Storage { private final Storage storage; private int referenceCounter; /** * Creates a new MultiReferenceStorage instance for the given * back-end. The reference counter is initially set to one so the caller * does not have to call {@link #addReference()} after this constructor. * * @param storage * storage back-end that should be reference counted. * @throws IllegalArgumentException * when storage is null */ public MultiReferenceStorage(Storage storage) { if (storage == null) throw new IllegalArgumentException(); this.storage = storage; this.referenceCounter = 1; // caller holds first reference } /** * Increments the reference counter. * * @throws IllegalStateException * if the reference counter is zero which implies that the * backing storage has already been deleted. */ public void addReference() { incrementCounter(); } /** * Decrements the reference counter and deletes the inner * Storage object if the reference counter reaches zero. *

* A client that holds a reference to this object must make sure not to * invoke this method a second time. * * @throws IllegalStateException * if the reference counter is zero which implies that the * backing storage has already been deleted. */ public void delete() { if (decrementCounter()) { storage.delete(); } } /** * Returns the input stream of the inner Storage object. * * @return an input stream. */ public InputStream getInputStream() throws IOException { return storage.getInputStream(); } /** * Synchronized increment of reference count. * * @throws IllegalStateException * when counter is already zero */ private synchronized void incrementCounter() { if (referenceCounter == 0) throw new IllegalStateException("storage has been deleted"); referenceCounter++; } /** * Synchronized decrement of reference count. * * @return true when counter has reached zero, false otherwise * @throws IllegalStateException * when counter is already zero */ private synchronized boolean decrementCounter() { if (referenceCounter == 0) throw new IllegalStateException("storage has been deleted"); return --referenceCounter == 0; } } ././@LongLink0000000000000000000000000000016000000000000011562 Lustar rootrootapache-mime4j-project-0.7.2/storage/src/main/java/org/apache/james/mime4j/storage/ThresholdStorageProvider.javaapache-mime4j-project-0.7.2/storage/src/main/java/org/apache/james/mime4j/storage/ThresholdStoragePr0000644000000000000000000001274211702050530032033 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.storage; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.SequenceInputStream; import org.apache.james.mime4j.util.ByteArrayBuffer; /** * A {@link StorageProvider} that keeps small amounts of data in memory and * writes the remainder to another StorageProvider (the back-end) * if a certain threshold size gets exceeded. *

* Example usage: * *

 * StorageProvider tempStore = new TempFileStorageProvider();
 * StorageProvider provider = new ThresholdStorageProvider(tempStore, 4096);
 * DefaultStorageProvider.setInstance(provider);
 * 
*/ public class ThresholdStorageProvider extends AbstractStorageProvider { private final StorageProvider backend; private final int thresholdSize; /** * Creates a new ThresholdStorageProvider for the given * back-end using a threshold size of 2048 bytes. */ public ThresholdStorageProvider(StorageProvider backend) { this(backend, 2048); } /** * Creates a new ThresholdStorageProvider for the given * back-end and threshold size. * * @param backend * used to store the remainder of the data if the threshold size * gets exceeded. * @param thresholdSize * determines how much bytes are kept in memory before that * back-end storage provider is used to store the remainder of * the data. */ public ThresholdStorageProvider(StorageProvider backend, int thresholdSize) { if (backend == null) throw new IllegalArgumentException(); if (thresholdSize < 1) throw new IllegalArgumentException(); this.backend = backend; this.thresholdSize = thresholdSize; } public StorageOutputStream createStorageOutputStream() { return new ThresholdStorageOutputStream(); } private final class ThresholdStorageOutputStream extends StorageOutputStream { private final ByteArrayBuffer head; private StorageOutputStream tail; public ThresholdStorageOutputStream() { final int bufferSize = Math.min(thresholdSize, 1024); head = new ByteArrayBuffer(bufferSize); } @Override public void close() throws IOException { super.close(); if (tail != null) tail.close(); } @Override protected void write0(byte[] buffer, int offset, int length) throws IOException { int remainingHeadSize = thresholdSize - head.length(); if (remainingHeadSize > 0) { int n = Math.min(remainingHeadSize, length); head.append(buffer, offset, n); offset += n; length -= n; } if (length > 0) { if (tail == null) tail = backend.createStorageOutputStream(); tail.write(buffer, offset, length); } } @Override protected Storage toStorage0() throws IOException { if (tail == null) return new MemoryStorageProvider.MemoryStorage(head.buffer(), head.length()); return new ThresholdStorage(head.buffer(), head.length(), tail .toStorage()); } } private static final class ThresholdStorage implements Storage { private byte[] head; private final int headLen; private Storage tail; public ThresholdStorage(byte[] head, int headLen, Storage tail) { this.head = head; this.headLen = headLen; this.tail = tail; } public void delete() { if (head != null) { head = null; tail.delete(); tail = null; } } public InputStream getInputStream() throws IOException { if (head == null) throw new IllegalStateException("storage has been deleted"); InputStream headStream = new ByteArrayInputStream(head, 0, headLen); InputStream tailStream = tail.getInputStream(); return new SequenceInputStream(headStream, tailStream); } } } ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootapache-mime4j-project-0.7.2/storage/src/main/java/org/apache/james/mime4j/storage/StorageProvider.javaapache-mime4j-project-0.7.2/storage/src/main/java/org/apache/james/mime4j/storage/StorageProvider.ja0000644000000000000000000000447211702050530031761 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.storage; import java.io.IOException; import java.io.InputStream; /** * Provides a strategy for storing the contents of an InputStream * or retrieving the content written to an OutputStream. */ public interface StorageProvider { /** * Stores the contents of the given InputStream. * * @param in stream containing the data to store. * @return a {@link Storage} instance that can be used to retrieve the * stored content. * @throws IOException if an I/O error occurs. */ Storage store(InputStream in) throws IOException; /** * Creates a {@link StorageOutputStream} where data to be stored can be * written to. Subsequently the user can call * {@link StorageOutputStream#toStorage() toStorage()} on that object to get * a {@link Storage} instance that holds the data that has been written. * * @return a {@link StorageOutputStream} where data can be written to. * @throws IOException * if an I/O error occurs. */ StorageOutputStream createStorageOutputStream() throws IOException; } ././@LongLink0000000000000000000000000000015600000000000011567 Lustar rootrootapache-mime4j-project-0.7.2/storage/src/main/java/org/apache/james/mime4j/storage/DefaultStorageProvider.javaapache-mime4j-project-0.7.2/storage/src/main/java/org/apache/james/mime4j/storage/DefaultStorageProv0000644000000000000000000000646011702050530032030 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.storage; /** * Allows for a default {@link StorageProvider} instance to be configured on an * application level. *

* The default instance can be set by either calling * {@link #setInstance(StorageProvider)} when the application starts up or by * setting the system property * org.apache.james.mime4j.defaultStorageProvider to the class * name of a StorageProvider implementation. *

* If neither option is used or if the class instantiation fails this class * provides a pre-configured default instance. */ public class DefaultStorageProvider { /** Value is org.apache.james.mime4j.defaultStorageProvider */ public static final String DEFAULT_STORAGE_PROVIDER_PROPERTY = "org.apache.james.mime4j.defaultStorageProvider"; private static volatile StorageProvider instance = null; static { initialize(); } private DefaultStorageProvider() { } /** * Returns the default {@link StorageProvider} instance. * * @return the default {@link StorageProvider} instance. */ public static StorageProvider getInstance() { return instance; } /** * Sets the default {@link StorageProvider} instance. * * @param instance * the default {@link StorageProvider} instance. */ public static void setInstance(StorageProvider instance) { if (instance == null) { throw new IllegalArgumentException(); } DefaultStorageProvider.instance = instance; } private static void initialize() { String clazz = System.getProperty(DEFAULT_STORAGE_PROVIDER_PROPERTY); try { if (clazz != null) { instance = (StorageProvider) Class.forName(clazz).newInstance(); } } catch (Exception e) { } if (instance == null) { StorageProvider backend = new TempFileStorageProvider(); instance = new ThresholdStorageProvider(backend, 1024); } } // for unit tests only static void reset() { instance = null; initialize(); } } ././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootrootapache-mime4j-project-0.7.2/storage/src/main/java/org/apache/james/mime4j/storage/StorageOutputStream.javaapache-mime4j-project-0.7.2/storage/src/main/java/org/apache/james/mime4j/storage/StorageOutputStrea0000644000000000000000000001413511702050530032072 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.storage; import java.io.IOException; import java.io.OutputStream; /** * This class implements an output stream that can be used to create a * {@link Storage} object. An instance of this class is obtained by calling * {@link StorageProvider#createStorageOutputStream()}. The user can then write * data to this instance and invoke {@link #toStorage()} to retrieve a * {@link Storage} object that contains the data that has been written. *

* Note that the StorageOutputStream does not have to be closed * explicitly because {@link #toStorage()} invokes {@link #close()} if * necessary. Also note that {@link #toStorage()} may be invoked only once. One * StorageOutputStream can create only one Storage * instance. */ public abstract class StorageOutputStream extends OutputStream { private byte[] singleByte; private boolean closed; private boolean usedUp; /** * Sole constructor. */ protected StorageOutputStream() { } /** * Closes this output stream if it has not already been closed and returns a * {@link Storage} object which contains the bytes that have been written to * this output stream. *

* Note that this method may not be invoked a second time. This is because * for some implementations it is not possible to create another * Storage object that can be read from and deleted * independently (e.g. if the implementation writes to a file). * * @return a Storage object as described above. * @throws IOException * if an I/O error occurs. * @throws IllegalStateException * if this method has already been called. */ public final Storage toStorage() throws IOException { if (usedUp) throw new IllegalStateException( "toStorage may be invoked only once"); if (!closed) close(); usedUp = true; return toStorage0(); } @Override public final void write(int b) throws IOException { if (closed) throw new IOException("StorageOutputStream has been closed"); if (singleByte == null) singleByte = new byte[1]; singleByte[0] = (byte) b; write0(singleByte, 0, 1); } @Override public final void write(byte[] buffer) throws IOException { if (closed) throw new IOException("StorageOutputStream has been closed"); if (buffer == null) throw new NullPointerException(); if (buffer.length == 0) return; write0(buffer, 0, buffer.length); } @Override public final void write(byte[] buffer, int offset, int length) throws IOException { if (closed) throw new IOException("StorageOutputStream has been closed"); if (buffer == null) throw new NullPointerException(); if (offset < 0 || length < 0 || offset + length > buffer.length) throw new IndexOutOfBoundsException(); if (length == 0) return; write0(buffer, offset, length); } /** * Closes this output stream. Subclasses that override this method have to * invoke super.close(). *

* This implementation never throws an {@link IOException} but a subclass * might. * * @throws IOException * if an I/O error occurs. */ @Override public void close() throws IOException { closed = true; } /** * Has to implemented by a concrete subclass to write bytes from the given * byte array to this StorageOutputStream. This method gets * called by {@link #write(int)}, {@link #write(byte[])} and * {@link #write(byte[], int, int)}. All the required preconditions have * already been checked by these methods, including the check if the output * stream has already been closed. * * @param buffer * buffer containing bytes to write. * @param offset * start offset in the buffer. * @param length * number of bytes to write. * @throws IOException * if an I/O error occurs. */ protected abstract void write0(byte[] buffer, int offset, int length) throws IOException; /** * Has to be implemented by a concrete subclass to create a {@link Storage} * object from the bytes that have been written to this * StorageOutputStream. This method gets called by * {@link #toStorage()} after the preconditions have been checked. The * implementation can also be sure that this methods gets invoked only once. * * @return a Storage object as described above. * @throws IOException * if an I/O error occurs. */ protected abstract Storage toStorage0() throws IOException; } ././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/storage/src/main/java/org/apache/james/mime4j/storage/MemoryStorageProvider.javaapache-mime4j-project-0.7.2/storage/src/main/java/org/apache/james/mime4j/storage/MemoryStorageProvi0000644000000000000000000000565211702050530032067 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.storage; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import org.apache.james.mime4j.util.ByteArrayBuffer; /** * A {@link StorageProvider} that stores the data entirely in memory. *

* Example usage: * *

 * StorageProvider provider = new MemoryStorageProvider();
 * DefaultStorageProvider.setInstance(provider);
 * 
*/ public class MemoryStorageProvider extends AbstractStorageProvider { /** * Creates a new MemoryStorageProvider. */ public MemoryStorageProvider() { } public StorageOutputStream createStorageOutputStream() { return new MemoryStorageOutputStream(); } private static final class MemoryStorageOutputStream extends StorageOutputStream { ByteArrayBuffer bab = new ByteArrayBuffer(1024); @Override protected void write0(byte[] buffer, int offset, int length) throws IOException { bab.append(buffer, offset, length); } @Override protected Storage toStorage0() throws IOException { return new MemoryStorage(bab.buffer(), bab.length()); } } static final class MemoryStorage implements Storage { private byte[] data; private final int count; public MemoryStorage(byte[] data, int count) { this.data = data; this.count = count; } public InputStream getInputStream() throws IOException { if (data == null) throw new IllegalStateException("storage has been deleted"); return new ByteArrayInputStream(data, 0, count); } public void delete() { data = null; } } } apache-mime4j-project-0.7.2/storage/src/main/java/org/apache/james/mime4j/storage/Storage.java0000644000000000000000000000452311702050530030572 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.storage; import java.io.IOException; import java.io.InputStream; /** * Can be used to read data that has been stored by a {@link StorageProvider}. */ public interface Storage { /** * Returns an InputStream that can be used to read the stored * data. The input stream should be closed by the caller when it is no * longer needed. *

* Note: The stream should NOT be wrapped in a * BufferedInputStream by the caller. If the implementing * Storage creates a stream which would benefit from being * buffered it is the Storage's responsibility to wrap it. * * @return an InputStream for reading the stored data. * @throws IOException * if an I/O error occurs. * @throws IllegalStateException * if this Storage instance has been deleted. */ InputStream getInputStream() throws IOException; /** * Deletes the data held by this Storage as soon as possible. * Deleting an already deleted Storage has no effect. */ void delete(); } ././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/storage/src/main/java/org/apache/james/mime4j/storage/CipherStorageProvider.javaapache-mime4j-project-0.7.2/storage/src/main/java/org/apache/james/mime4j/storage/CipherStorageProvi0000644000000000000000000001446311702050530032031 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.storage; import java.io.IOException; import java.io.InputStream; import java.security.GeneralSecurityException; import java.security.NoSuchAlgorithmException; import javax.crypto.Cipher; import javax.crypto.CipherInputStream; import javax.crypto.CipherOutputStream; import javax.crypto.KeyGenerator; import javax.crypto.spec.SecretKeySpec; /** * A {@link StorageProvider} that transparently scrambles and unscrambles the * data stored by another StorageProvider. * *

* Example usage: * *

 * StorageProvider mistrusted = new TempFileStorageProvider();
 * StorageProvider enciphered = new CipherStorageProvider(mistrusted);
 * StorageProvider provider = new ThresholdStorageProvider(enciphered);
 * DefaultStorageProvider.setInstance(provider);
 * 
*/ public class CipherStorageProvider extends AbstractStorageProvider { private final StorageProvider backend; private final String algorithm; private final KeyGenerator keygen; /** * Creates a new CipherStorageProvider for the given back-end * using the Blowfish cipher algorithm. * * @param backend * back-end storage strategy to encrypt. */ public CipherStorageProvider(StorageProvider backend) { this(backend, "Blowfish"); } /** * Creates a new CipherStorageProvider for the given back-end * and cipher algorithm. * * @param backend * back-end storage strategy to encrypt. * @param algorithm * the name of the symmetric block cipher algorithm such as * "Blowfish", "AES" or "RC2". */ public CipherStorageProvider(StorageProvider backend, String algorithm) { if (backend == null) throw new IllegalArgumentException(); try { this.backend = backend; this.algorithm = algorithm; this.keygen = KeyGenerator.getInstance(algorithm); } catch (NoSuchAlgorithmException e) { throw new IllegalArgumentException(e); } } public StorageOutputStream createStorageOutputStream() throws IOException { SecretKeySpec skeySpec = getSecretKeySpec(); return new CipherStorageOutputStream(backend .createStorageOutputStream(), algorithm, skeySpec); } private SecretKeySpec getSecretKeySpec() { byte[] raw = keygen.generateKey().getEncoded(); return new SecretKeySpec(raw, algorithm); } private static final class CipherStorageOutputStream extends StorageOutputStream { private final StorageOutputStream storageOut; private final String algorithm; private final SecretKeySpec skeySpec; private final CipherOutputStream cipherOut; public CipherStorageOutputStream(StorageOutputStream out, String algorithm, SecretKeySpec skeySpec) throws IOException { try { this.storageOut = out; this.algorithm = algorithm; this.skeySpec = skeySpec; Cipher cipher = Cipher.getInstance(algorithm); cipher.init(Cipher.ENCRYPT_MODE, skeySpec); this.cipherOut = new CipherOutputStream(out, cipher); } catch (GeneralSecurityException e) { throw (IOException) new IOException().initCause(e); } } @Override public void close() throws IOException { super.close(); cipherOut.close(); } @Override protected void write0(byte[] buffer, int offset, int length) throws IOException { cipherOut.write(buffer, offset, length); } @Override protected Storage toStorage0() throws IOException { // cipherOut has already been closed because toStorage calls close Storage encrypted = storageOut.toStorage(); return new CipherStorage(encrypted, algorithm, skeySpec); } } private static final class CipherStorage implements Storage { private Storage encrypted; private final String algorithm; private final SecretKeySpec skeySpec; public CipherStorage(Storage encrypted, String algorithm, SecretKeySpec skeySpec) { this.encrypted = encrypted; this.algorithm = algorithm; this.skeySpec = skeySpec; } public void delete() { if (encrypted != null) { encrypted.delete(); encrypted = null; } } public InputStream getInputStream() throws IOException { if (encrypted == null) throw new IllegalStateException("storage has been deleted"); try { Cipher cipher = Cipher.getInstance(algorithm); cipher.init(Cipher.DECRYPT_MODE, skeySpec); InputStream in = encrypted.getInputStream(); return new CipherInputStream(in, cipher); } catch (GeneralSecurityException e) { throw (IOException) new IOException().initCause(e); } } } } ././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootapache-mime4j-project-0.7.2/storage/src/main/java/org/apache/james/mime4j/storage/StorageBinaryBody.javaapache-mime4j-project-0.7.2/storage/src/main/java/org/apache/james/mime4j/storage/StorageBinaryBody.0000644000000000000000000000473711702050530031722 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.storage; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import org.apache.james.mime4j.codec.CodecUtil; import org.apache.james.mime4j.dom.BinaryBody; /** * Binary body backed by a * {@link org.apache.james.mime4j.storage.Storage} */ class StorageBinaryBody extends BinaryBody { private MultiReferenceStorage storage; public StorageBinaryBody(final MultiReferenceStorage storage) { this.storage = storage; } @Override public InputStream getInputStream() throws IOException { return storage.getInputStream(); } @Override public void writeTo(OutputStream out) throws IOException { if (out == null) throw new IllegalArgumentException(); InputStream in = storage.getInputStream(); CodecUtil.copy(in, out); in.close(); } @Override public StorageBinaryBody copy() { storage.addReference(); return new StorageBinaryBody(storage); } /** * Deletes the Storage that holds the content of this binary body. * * @see org.apache.james.mime4j.dom.Disposable#dispose() */ @Override public void dispose() { if (storage != null) { storage.delete(); storage = null; } } } ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootapache-mime4j-project-0.7.2/storage/src/main/java/org/apache/james/mime4j/storage/StorageBodyFactory.javaapache-mime4j-project-0.7.2/storage/src/main/java/org/apache/james/mime4j/storage/StorageBodyFactory0000644000000000000000000002646611702050530032032 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.storage; import java.io.IOException; import java.io.InputStream; import java.nio.charset.Charset; import org.apache.james.mime4j.codec.DecodeMonitor; import org.apache.james.mime4j.dom.BinaryBody; import org.apache.james.mime4j.dom.Disposable; import org.apache.james.mime4j.dom.SingleBody; import org.apache.james.mime4j.dom.TextBody; import org.apache.james.mime4j.message.BodyFactory; import org.apache.james.mime4j.util.CharsetUtil; /** * Factory for creating message bodies. */ public class StorageBodyFactory implements BodyFactory { private static final Charset FALLBACK_CHARSET = CharsetUtil.DEFAULT_CHARSET; private final StorageProvider storageProvider; private final DecodeMonitor monitor; /** * Creates a new BodyFactory instance that uses the default * storage provider for creating message bodies from input streams. */ public StorageBodyFactory() { this(null, null); } /** * Creates a new BodyFactory instance that uses the given * storage provider for creating message bodies from input streams. * * @param storageProvider * a storage provider or null to use the default * one. */ public StorageBodyFactory( final StorageProvider storageProvider, final DecodeMonitor monitor) { this.storageProvider = storageProvider != null ? storageProvider : DefaultStorageProvider.getInstance(); this.monitor = monitor != null ? monitor : DecodeMonitor.SILENT; } /** * Returns the StorageProvider this BodyFactory * uses to create message bodies from input streams. * * @return a StorageProvider. */ public StorageProvider getStorageProvider() { return storageProvider; } /** * Creates a {@link BinaryBody} that holds the content of the given input * stream. * * @param is * input stream to create a message body from. * @return a binary body. * @throws IOException * if an I/O error occurs. */ public BinaryBody binaryBody(InputStream is) throws IOException { if (is == null) throw new IllegalArgumentException(); Storage storage = storageProvider.store(is); return new StorageBinaryBody(new MultiReferenceStorage(storage)); } /** * Creates a {@link BinaryBody} that holds the content of the given * {@link Storage}. *

* Note that the caller must not invoke {@link Storage#delete() delete()} on * the given Storage object after it has been passed to this * method. Instead the message body created by this method takes care of * deleting the storage when it gets disposed of (see * {@link Disposable#dispose()}). * * @param storage * storage to create a message body from. * @return a binary body. * @throws IOException * if an I/O error occurs. */ public BinaryBody binaryBody(Storage storage) throws IOException { if (storage == null) throw new IllegalArgumentException(); return new StorageBinaryBody(new MultiReferenceStorage(storage)); } /** * Creates a {@link TextBody} that holds the content of the given input * stream. *

* "us-ascii" is used to decode the byte content of the * Storage into a character stream when calling * {@link TextBody#getReader() getReader()} on the returned object. * * @param is * input stream to create a message body from. * @return a text body. * @throws IOException * if an I/O error occurs. */ public TextBody textBody(InputStream is) throws IOException { if (is == null) throw new IllegalArgumentException(); Storage storage = storageProvider.store(is); return new StorageTextBody(new MultiReferenceStorage(storage), CharsetUtil.DEFAULT_CHARSET); } /** * Creates a {@link TextBody} that holds the content of the given input * stream. *

* The charset corresponding to the given MIME charset name is used to * decode the byte content of the input stream into a character stream when * calling {@link TextBody#getReader() getReader()} on the returned object. * If the MIME charset has no corresponding Java charset or the Java charset * cannot be used for decoding then "us-ascii" is used instead. * * @param is * input stream to create a message body from. * @param mimeCharset * name of a MIME charset. * @return a text body. * @throws IOException * if an I/O error occurs. */ public TextBody textBody(InputStream is, String mimeCharset) throws IOException { if (is == null) throw new IllegalArgumentException(); if (mimeCharset == null) throw new IllegalArgumentException(); Storage storage = storageProvider.store(is); Charset charset = toJavaCharset(mimeCharset, false, monitor); return new StorageTextBody(new MultiReferenceStorage(storage), charset); } /** * Creates a {@link TextBody} that holds the content of the given * {@link Storage}. *

* "us-ascii" is used to decode the byte content of the * Storage into a character stream when calling * {@link TextBody#getReader() getReader()} on the returned object. *

* Note that the caller must not invoke {@link Storage#delete() delete()} on * the given Storage object after it has been passed to this * method. Instead the message body created by this method takes care of * deleting the storage when it gets disposed of (see * {@link Disposable#dispose()}). * * @param storage * storage to create a message body from. * @return a text body. * @throws IOException * if an I/O error occurs. */ public TextBody textBody(Storage storage) throws IOException { if (storage == null) throw new IllegalArgumentException(); return new StorageTextBody(new MultiReferenceStorage(storage), CharsetUtil.DEFAULT_CHARSET); } /** * Creates a {@link TextBody} that holds the content of the given * {@link Storage}. *

* The charset corresponding to the given MIME charset name is used to * decode the byte content of the Storage into a character * stream when calling {@link TextBody#getReader() getReader()} on the * returned object. If the MIME charset has no corresponding Java charset or * the Java charset cannot be used for decoding then "us-ascii" is * used instead. *

* Note that the caller must not invoke {@link Storage#delete() delete()} on * the given Storage object after it has been passed to this * method. Instead the message body created by this method takes care of * deleting the storage when it gets disposed of (see * {@link Disposable#dispose()}). * * @param storage * storage to create a message body from. * @param mimeCharset * name of a MIME charset. * @return a text body. * @throws IOException * if an I/O error occurs. */ public TextBody textBody(Storage storage, String mimeCharset) throws IOException { if (storage == null) throw new IllegalArgumentException(); if (mimeCharset == null) throw new IllegalArgumentException(); Charset charset = toJavaCharset(mimeCharset, false, monitor); return new StorageTextBody(new MultiReferenceStorage(storage), charset); } /** * Creates a {@link TextBody} that holds the content of the given string. *

* "us-ascii" is used to encode the characters of the string into * a byte stream when calling * {@link SingleBody#writeTo(java.io.OutputStream) writeTo(OutputStream)} on * the returned object. * * @param text * text to create a message body from. * @return a text body. */ public TextBody textBody(String text) { if (text == null) throw new IllegalArgumentException(); return new StringTextBody(text, CharsetUtil.DEFAULT_CHARSET); } /** * Creates a {@link TextBody} that holds the content of the given string. *

* The charset corresponding to the given MIME charset name is used to * encode the characters of the string into a byte stream when calling * {@link SingleBody#writeTo(java.io.OutputStream) writeTo(OutputStream)} on * the returned object. If the MIME charset has no corresponding Java * charset or the Java charset cannot be used for encoding then * "us-ascii" is used instead. * * @param text * text to create a message body from. * @param mimeCharset * name of a MIME charset. * @return a text body. */ public TextBody textBody(String text, String mimeCharset) { if (text == null) throw new IllegalArgumentException(); if (mimeCharset == null) throw new IllegalArgumentException(); Charset charset = toJavaCharset(mimeCharset, true, monitor); return new StringTextBody(text, charset); } private static Charset toJavaCharset( final String mimeCharset, boolean forEncoding, final DecodeMonitor monitor) { Charset charset = CharsetUtil.lookup(mimeCharset); if (charset == null) { if (monitor.isListening()) { monitor.warn( "MIME charset '" + mimeCharset + "' has no " + "corresponding Java charset", "Using " + FALLBACK_CHARSET + " instead."); } return FALLBACK_CHARSET; } return charset; } } ././@LongLink0000000000000000000000000000015700000000000011570 Lustar rootrootapache-mime4j-project-0.7.2/storage/src/main/java/org/apache/james/mime4j/storage/AbstractStorageProvider.javaapache-mime4j-project-0.7.2/storage/src/main/java/org/apache/james/mime4j/storage/AbstractStoragePro0000644000000000000000000000512111702050530032012 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.storage; import java.io.IOException; import java.io.InputStream; import org.apache.james.mime4j.codec.CodecUtil; /** * Abstract implementation of {@link StorageProvider} that implements * {@link StorageProvider#store(InputStream) store(InputStream)} by copying the * input stream to a {@link StorageOutputStream} obtained from * {@link StorageProvider#createStorageOutputStream() createStorageOutputStream()}. */ public abstract class AbstractStorageProvider implements StorageProvider { /** * Sole constructor. */ protected AbstractStorageProvider() { } /** * This implementation creates a {@link StorageOutputStream} by calling * {@link StorageProvider#createStorageOutputStream() createStorageOutputStream()} * and copies the content of the given input stream to that output stream. * It then calls {@link StorageOutputStream#toStorage()} on the output * stream and returns this object. * * @param in * stream containing the data to store. * @return a {@link Storage} instance that can be used to retrieve the * stored content. * @throws IOException * if an I/O error occurs. */ public final Storage store(InputStream in) throws IOException { StorageOutputStream out = createStorageOutputStream(); CodecUtil.copy(in, out); return out.toStorage(); } } ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootapache-mime4j-project-0.7.2/storage/src/main/java/org/apache/james/mime4j/storage/StorageTextBody.javaapache-mime4j-project-0.7.2/storage/src/main/java/org/apache/james/mime4j/storage/StorageTextBody.ja0000644000000000000000000000501511702050530031723 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.storage; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.nio.charset.Charset; import org.apache.james.mime4j.dom.TextBody; /** * Text body backed by a {@link org.apache.james.mime4j.storage.Storage}. */ class StorageTextBody extends TextBody { private MultiReferenceStorage storage; private Charset charset; public StorageTextBody(MultiReferenceStorage storage, Charset charset) { this.storage = storage; this.charset = charset; } @Override public String getMimeCharset() { return charset.name(); } @Override public Reader getReader() throws IOException { return new InputStreamReader(storage.getInputStream(), charset); } @Override public InputStream getInputStream() throws IOException { return storage.getInputStream(); } @Override public StorageTextBody copy() { storage.addReference(); return new StorageTextBody(storage, charset); } /** * Deletes the Storage that holds the content of this text body. * * @see org.apache.james.mime4j.dom.Disposable#dispose() */ @Override public void dispose() { if (storage != null) { storage.delete(); storage = null; } } } ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/storage/src/main/java/org/apache/james/mime4j/storage/StringTextBody.javaapache-mime4j-project-0.7.2/storage/src/main/java/org/apache/james/mime4j/storage/StringTextBody.jav0000644000000000000000000000542311702050530031756 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.storage; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.Reader; import java.io.StringReader; import java.io.Writer; import java.nio.charset.Charset; import org.apache.james.mime4j.dom.TextBody; /** * Text body backed by a String. */ class StringTextBody extends TextBody { private final String text; private final Charset charset; public StringTextBody(final String text, Charset charset) { this.text = text; this.charset = charset; } @Override public String getMimeCharset() { return charset.name(); } @Override public InputStream getInputStream() throws IOException { return new ByteArrayInputStream(text.getBytes(charset.name())); } @Override public Reader getReader() throws IOException { return new StringReader(text); } @Override public void writeTo(OutputStream out) throws IOException { if (out == null) throw new IllegalArgumentException(); Reader reader = new StringReader(text); Writer writer = new OutputStreamWriter(out, charset); char buffer[] = new char[1024]; while (true) { int nChars = reader.read(buffer); if (nChars == -1) break; writer.write(buffer, 0, nChars); } reader.close(); writer.flush(); } @Override public StringTextBody copy() { return new StringTextBody(text, charset); } } apache-mime4j-project-0.7.2/storage/src/test/0000755000000000000000000000000011702050530017471 5ustar rootrootapache-mime4j-project-0.7.2/storage/src/test/java/0000755000000000000000000000000011702050530020412 5ustar rootrootapache-mime4j-project-0.7.2/storage/src/test/java/org/0000755000000000000000000000000011702050530021201 5ustar rootrootapache-mime4j-project-0.7.2/storage/src/test/java/org/apache/0000755000000000000000000000000011702050530022422 5ustar rootrootapache-mime4j-project-0.7.2/storage/src/test/java/org/apache/james/0000755000000000000000000000000011702050530023521 5ustar rootrootapache-mime4j-project-0.7.2/storage/src/test/java/org/apache/james/mime4j/0000755000000000000000000000000011702050530024706 5ustar rootrootapache-mime4j-project-0.7.2/storage/src/test/java/org/apache/james/mime4j/storage/0000755000000000000000000000000011702050530026352 5ustar rootroot././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootapache-mime4j-project-0.7.2/storage/src/test/java/org/apache/james/mime4j/storage/SingleBodyCopyTest.javaapache-mime4j-project-0.7.2/storage/src/test/java/org/apache/james/mime4j/storage/SingleBodyCopyTest0000644000000000000000000001156711702050530032041 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.storage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import junit.framework.TestCase; import org.apache.james.mime4j.dom.SingleBody; import org.apache.james.mime4j.message.MessageImpl; import org.apache.james.mime4j.util.CharsetUtil; public class SingleBodyCopyTest extends TestCase { public void testCopyStorageBinaryBody() throws Exception { Storage storage = new MemoryStorageProvider() .store(new ByteArrayInputStream("test".getBytes())); MultiReferenceStorage multiReferenceStorage = new MultiReferenceStorage( storage); SingleBody body = new StorageBinaryBody(multiReferenceStorage); copyTest(body); } public void testCopyStorageTextBody() throws Exception { Storage storage = new MemoryStorageProvider() .store(new ByteArrayInputStream("test".getBytes())); MultiReferenceStorage multiReferenceStorage = new MultiReferenceStorage( storage); SingleBody body = new StorageTextBody(multiReferenceStorage, CharsetUtil.US_ASCII); copyTest(body); } public void testCopyStringTextBody() throws Exception { SingleBody body = new StringTextBody("test", CharsetUtil.US_ASCII); copyTest(body); } public void testDisposeStorageBinaryBody() throws Exception { Storage storage = new MemoryStorageProvider() .store(new ByteArrayInputStream("test".getBytes())); MultiReferenceStorage multiReferenceStorage = new MultiReferenceStorage( storage); SingleBody body = new StorageBinaryBody(multiReferenceStorage); disposeTest(body, storage); } public void testDisposeStorageTextBody() throws Exception { Storage storage = new MemoryStorageProvider() .store(new ByteArrayInputStream("test".getBytes())); MultiReferenceStorage multiReferenceStorage = new MultiReferenceStorage( storage); SingleBody body = new StorageTextBody(multiReferenceStorage, CharsetUtil.US_ASCII); disposeTest(body, storage); } private void copyTest(SingleBody body) throws Exception { MessageImpl parent = new MessageImpl(); parent.setBody(body); SingleBody copy = body.copy(); assertNotNull(copy); assertNotSame(body, copy); assertSame(parent, body.getParent()); assertNull(copy.getParent()); sameContentTest(body, copy); } private void sameContentTest(SingleBody expectedBody, SingleBody actualBody) throws Exception { ByteArrayOutputStream expBaos = new ByteArrayOutputStream(); expectedBody.writeTo(expBaos); byte[] expected = expBaos.toByteArray(); ByteArrayOutputStream actBaos = new ByteArrayOutputStream(); actualBody.writeTo(actBaos); byte[] actual = actBaos.toByteArray(); assertEquals(expected.length, actual.length); for (int i = 0; i < expected.length; i++) { assertEquals(expected[i], actual[i]); } } private void disposeTest(SingleBody body, Storage storage) throws Exception { assertTrue(storageIsReadable(storage)); SingleBody copy = body.copy(); assertTrue(storageIsReadable(storage)); body.dispose(); assertTrue(storageIsReadable(storage)); copy.dispose(); assertFalse(storageIsReadable(storage)); } private boolean storageIsReadable(Storage storage) throws Exception { try { storage.getInputStream().close(); return true; } catch (IllegalStateException e) { return false; } } } ././@LongLink0000000000000000000000000000016200000000000011564 Lustar rootrootapache-mime4j-project-0.7.2/storage/src/test/java/org/apache/james/mime4j/storage/DefaultStorageProviderTest.javaapache-mime4j-project-0.7.2/storage/src/test/java/org/apache/james/mime4j/storage/DefaultStorageProv0000644000000000000000000000477211702050530032067 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.storage; import junit.framework.TestCase; public class DefaultStorageProviderTest extends TestCase { @Override protected void tearDown() throws Exception { System.getProperties().remove( DefaultStorageProvider.DEFAULT_STORAGE_PROVIDER_PROPERTY); DefaultStorageProvider.reset(); } public void testDefaultInstance() throws Exception { System.getProperties().remove( DefaultStorageProvider.DEFAULT_STORAGE_PROVIDER_PROPERTY); DefaultStorageProvider.reset(); StorageProvider instance = DefaultStorageProvider.getInstance(); assertTrue(instance instanceof ThresholdStorageProvider); } public void testSetDefaultProperty() throws Exception { System.setProperty( DefaultStorageProvider.DEFAULT_STORAGE_PROVIDER_PROPERTY, MemoryStorageProvider.class.getName()); DefaultStorageProvider.reset(); StorageProvider instance = DefaultStorageProvider.getInstance(); assertTrue(instance instanceof MemoryStorageProvider); } public void testSetter() throws Exception { StorageProvider instance = new MemoryStorageProvider(); DefaultStorageProvider.setInstance(instance); assertSame(instance, DefaultStorageProvider.getInstance()); } } ././@LongLink0000000000000000000000000000016100000000000011563 Lustar rootrootapache-mime4j-project-0.7.2/storage/src/test/java/org/apache/james/mime4j/storage/MultiReferenceStorageTest.javaapache-mime4j-project-0.7.2/storage/src/test/java/org/apache/james/mime4j/storage/MultiReferenceStor0000644000000000000000000000730011702050530032056 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.storage; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import junit.framework.TestCase; public class MultiReferenceStorageTest extends TestCase { public void testForwardsGetInputStream() throws Exception { DummyStorage storage = new DummyStorage(); MultiReferenceStorage multiReferenceStorage = new MultiReferenceStorage( storage); assertEquals(ByteArrayInputStream.class, multiReferenceStorage .getInputStream().getClass()); } public void testSingleReference() throws Exception { DummyStorage storage = new DummyStorage(); MultiReferenceStorage multiReferenceStorage = new MultiReferenceStorage( storage); assertFalse(storage.deleted); multiReferenceStorage.delete(); assertTrue(storage.deleted); } public void testMultiReference() throws Exception { DummyStorage storage = new DummyStorage(); MultiReferenceStorage multiReferenceStorage = new MultiReferenceStorage( storage); multiReferenceStorage.addReference(); multiReferenceStorage.delete(); assertFalse(storage.deleted); multiReferenceStorage.delete(); assertTrue(storage.deleted); } public void testGetInputStreamOnDeleted() throws Exception { DummyStorage storage = new DummyStorage(); MultiReferenceStorage multiReferenceStorage = new MultiReferenceStorage( storage); multiReferenceStorage.delete(); try { multiReferenceStorage.getInputStream(); fail(); } catch (IllegalStateException expected) { } } public void testAddReferenceOnDeleted() throws Exception { DummyStorage storage = new DummyStorage(); MultiReferenceStorage multiReferenceStorage = new MultiReferenceStorage( storage); multiReferenceStorage.delete(); try { multiReferenceStorage.addReference(); fail(); } catch (IllegalStateException expected) { } } private static final class DummyStorage implements Storage { public boolean deleted = false; public InputStream getInputStream() throws IOException { if (deleted) throw new IllegalStateException("deleted"); return new ByteArrayInputStream("dummy".getBytes()); } public void delete() { deleted = true; } } } ././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootrootapache-mime4j-project-0.7.2/storage/src/test/java/org/apache/james/mime4j/storage/StorageProviderTest.javaapache-mime4j-project-0.7.2/storage/src/test/java/org/apache/james/mime4j/storage/StorageProviderTes0000644000000000000000000001214611702050530032074 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.storage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import org.apache.james.mime4j.codec.CodecUtil; import junit.framework.TestCase; public class StorageProviderTest extends TestCase { public void testMemoryStorageProvider() throws Exception { StorageProvider provider = new MemoryStorageProvider(); testReadWrite(provider, 0); testReadWrite(provider, 1); testReadWrite(provider, 1024); testReadWrite(provider, 20000); testDelete(provider); } public void testTempFileStorageProvider() throws Exception { StorageProvider provider = new TempFileStorageProvider(); testReadWrite(provider, 0); testReadWrite(provider, 1); testReadWrite(provider, 1024); testReadWrite(provider, 20000); testDelete(provider); } public void testThresholdStorageProvider() throws Exception { final int threshold = 5000; StorageProvider backend = new TempFileStorageProvider(); StorageProvider provider = new ThresholdStorageProvider(backend, threshold); testReadWrite(provider, 0); testReadWrite(provider, 1); testReadWrite(provider, threshold - 1); testReadWrite(provider, threshold); testReadWrite(provider, threshold + 1); testReadWrite(provider, 2 * threshold); testReadWrite(provider, 10 * threshold); testDelete(provider); } public void testCipherStorageProvider() throws Exception { StorageProvider backend = new TempFileStorageProvider(); StorageProvider provider = new CipherStorageProvider(backend); testReadWrite(provider, 0); testReadWrite(provider, 1); testReadWrite(provider, 1024); testReadWrite(provider, 20000); testDelete(provider); } private void testReadWrite(StorageProvider provider, int size) throws IOException { testStore(provider, size); testCreateStorageOutputStream(provider, size); } private void testStore(StorageProvider provider, int size) throws IOException { byte[] data = createData(size); assertEquals(size, data.length); Storage storage = provider.store(new ByteArrayInputStream(data)); ByteArrayOutputStream baos = new ByteArrayOutputStream(); CodecUtil.copy(storage.getInputStream(), baos); verifyData(data, baos.toByteArray()); } private void testCreateStorageOutputStream(StorageProvider provider, int size) throws IOException { byte[] data = createData(size); assertEquals(size, data.length); StorageOutputStream out = provider.createStorageOutputStream(); CodecUtil.copy(new ByteArrayInputStream(data), out); Storage storage = out.toStorage(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); CodecUtil.copy(storage.getInputStream(), baos); verifyData(data, baos.toByteArray()); } private void verifyData(byte[] expected, byte[] actual) { assertEquals(expected.length, actual.length); for (int i = 0; i < expected.length; i++) { assertEquals(expected[i], actual[i]); } } private byte[] createData(int size) { byte[] data = new byte[size]; for (int i = 0; i < size; i++) { data[i] = (byte) i; } return data; } private void testDelete(StorageProvider provider) throws IOException { Storage storage = provider.store(new ByteArrayInputStream( createData(512))); storage.delete(); // getInputStream has to throw an IllegalStateException try { storage.getInputStream(); fail(); } catch (IllegalStateException expected) { } // invoking delete a second time should not have any effect storage.delete(); } } apache-mime4j-project-0.7.2/storage/src/reporting-site/0000755000000000000000000000000011702050530021465 5ustar rootrootapache-mime4j-project-0.7.2/storage/src/reporting-site/site.xml0000644000000000000000000000175611702050530023164 0ustar rootroot

apache-mime4j-project-0.7.2/storage/pom.xml0000644000000000000000000000465511702050530017252 0ustar rootroot 4.0.0 apache-mime4j-project org.apache.james 0.7.2 ../pom.xml apache-mime4j-storage Apache JAMES Mime4j (Storage) Java MIME Document Object Model Storage org.apache.james apache-mime4j-dom ${project.version} junit junit jar test true org.apache.maven.plugins maven-jar-plugin test-jar apache-mime4j-project-0.7.2/src/0000755000000000000000000000000011702050530015046 5ustar rootrootapache-mime4j-project-0.7.2/src/reporting-site/0000755000000000000000000000000011702050530020021 5ustar rootrootapache-mime4j-project-0.7.2/src/reporting-site/site.xml0000644000000000000000000000227411702050530021514 0ustar rootroot JAMES Mime4J images/james-mime4j-logo.gif http://james.apache.org/ james-mime4j-logo.gif apache-mime4j-project-0.7.2/src/site/0000755000000000000000000000000011702050530016012 5ustar rootrootapache-mime4j-project-0.7.2/src/site/site.xml0000644000000000000000000000350011702050530017476 0ustar rootroot JAMES Mime4J images/logos/james-mime4j-logo.gif http://james.apache.org/ james-mime4j-logo.gif apache-mime4j-project-0.7.2/src/site/apt/0000755000000000000000000000000011702050530016576 5ustar rootrootapache-mime4j-project-0.7.2/src/site/apt/usage.apt0000644000000000000000000001510211702050530020407 0ustar rootroot ~~ Licensed to the Apache Software Foundation (ASF) under one ~~ or more contributor license agreements. See the NOTICE file ~~ distributed with this work for additional information ~~ regarding copyright ownership. The ASF licenses this file ~~ to you under the Apache License, Version 2.0 (the ~~ "License"); you may not use this file except in compliance ~~ with the License. You may obtain a copy of the License at ~~ ~~ http://www.apache.org/licenses/LICENSE-2.0 ~~ ~~ Unless required by applicable law or agreed to in writing, ~~ software distributed under the License is distributed on an ~~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY ~~ KIND, either express or implied. See the License for the ~~ specific language governing permissions and limitations ~~ under the License. ------------- Usage ------------- {Usage} Mime4j provides two different API's: An event based API by using the {{{./apidocs/org/apache/james/mime4j/parser/MimeStreamParser.html} MimeStreamParser}}. Alternatively, you may use the iterative API, which is available through the {{{./apidocs/org/apache/james/mime4j/parser/MimeTokenStream.html} MimeTokenStream}}. In terms of speed, you should not note any differences. * {{{Token_Streams}Token Streams}} * {{{Sample_Token_Stream}Sample Token Stream}} * {{{Event_Handlers}Event Handlers}} * {{{Sample_Event_Stream}Sample Event Stream}} {Token Streams} The iterative approach is using the class {{{./apidocs/org/apache/james/mime4j/parser/MimeTokenStream.html} MimeTokenStream}}. Here's an example, how you could use the token stream: -------------------------------------------------------------------- MimeTokenStream stream = new MimeTokenStream(); stream.parse(new FileInputStream("mime.msg")); for (EntityState state = stream.getState(); state != EntityState.T_END_OF_STREAM; state = stream.next()) { switch (state) { case T_BODY: System.out.println("Body detected, contents = " + stream.getInputStream() + ", header data = " + stream.getBodyDescriptor()); break; case T_FIELD: System.out.println("Header field detected: " + stream.getField()); break; case T_START_MULTIPART: System.out.println("Multipart message detexted," + " header data = " + stream.getBodyDescriptor()); ... } } -------------------------------------------------------------------- The token stream provides a set of tokens. Tokens are identified by a state. Most states are simply event indicators, with no additional data available. However, there are some states, which provide additional data. For example, the state <<>>, which indicates that an actual body is available, If you note this state, then you may ask for the bodies contents, which are provided through the <<>> method, or you might ask for the header data by invoking <<>>. {Sample Token Stream} The following sample should give you a rough idea of the order, in which you'll receive tokens: -------------------------------------------------------------------- T_START_MESSAGE T_START_HEADER T_FIELD T_FIELD ... T_END_HEADER T_START_MULTIPART T_PREAMBLE T_START_BODYPART T_START_HEADER T_FIELD T_FIELD ... T_END_HEADER T_BODY T_END_BODYPART T_START_BODYPART T_START_HEADER T_FIELD T_FIELD ... T_END_HEADER T_BODY T_END_BODYPART T_EPILOGUE T_END_MULTIPART T_END_MESSAGE -------------------------------------------------------------------- The example shows a multipart message with two parts. {Event Handlers} The event based API requires, that you provide an event handler, which receives events. The event handler is an object, which implements the {{{./apidocs/org/apache/james/mime4j/parser/ContentHandler.html} ContentHandler}} interface. Here's an example, how you could implement an event handler: -------------------------------------------------------------------- public class MyContentHandler extends AbstractContentHandler { public void body(BodyDescriptor bd, InputStream is) throws MimeException, IOException { System.out.println("Body detected, contents = " + is + ", header data = " + bd); } public void field(String fieldData) throws MimeException { System.out.println("Header field detected: " + fieldData); } public void startMultipart(BodyDescriptor bd) throws MimeException { System.out.println("Multipart message detexted, header data = " + bd); } ... } -------------------------------------------------------------------- A little bit of additional code allows us to create an example, which is functionally equivalent to the example from the section on {{{Token_Streams}Token Streams}}: -------------------------------------------------------------------- ContentHandler handler = new MyContentHandler(); MimeStreamParser parser = new MimeStreamParser(); parser.setContentHandler(handler); parser.parse(new FileInputStream("mime.msg")); -------------------------------------------------------------------- {Sample Event Stream} Like above for tokens, we provide an additional example, which demonstrates the typical order of events that you have to expect: -------------------------------------------------------------------- startMessage() startHeader() field(...) field(...) ... endHeader() startMultipart() preamble(...) startBodyPart() startHeader() field(...) field(...) ... endHeader() body() endBodyPart() startBodyPart() startHeader() field(...) field(...) ... endHeader() body() endBodyPart() epilogue(...) endMultipart() endMessage() -------------------------------------------------------------------- apache-mime4j-project-0.7.2/src/site/apt/status.apt0000644000000000000000000000471711702050530020640 0ustar rootroot ~~ Licensed to the Apache Software Foundation (ASF) under one ~~ or more contributor license agreements. See the NOTICE file ~~ distributed with this work for additional information ~~ regarding copyright ownership. The ASF licenses this file ~~ to you under the Apache License, Version 2.0 (the ~~ "License"); you may not use this file except in compliance ~~ with the License. You may obtain a copy of the License at ~~ ~~ http://www.apache.org/licenses/LICENSE-2.0 ~~ ~~ Unless required by applicable law or agreed to in writing, ~~ software distributed under the License is distributed on an ~~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY ~~ KIND, either express or implied. See the License for the ~~ specific language governing permissions and limitations ~~ under the License. ------------- Status ------------- {Status} The 0.4 release brought a number of significant improvements in terms of supported capabilities, flexibility and performance. The 0.5 release addressed a number of important issues discovered since the 0.4 release. In particular it improved Mime4j ability to deal with malformed data streams including those intentionally crafted to cause excessive CPU and memory utilization that can lead to DoS conditions. The 0.6 release brought another round of API enhancements and performance optimizations. As of this release Mime4j requires a Java 1.5 compatible runtime. The 0.7 release brings another round of API enhancements, bug fixes and performance optimizations. A major effort has been put in code reorganization, separating parsing code from DOM manipulation code. Mime4J has been restructured into three separate modules: 'core', 'dom' and 'storage'. The 'core' package provides an event-driven SAX style parser that relies on a callback mechanism to report parsing events such as the start of an entity header the start of a body, etc. The 'dom' package contains base/abstract classes and interfaces for MIME-DOM manipulation aiming to provide the base for a full featured traversable DOM. Per default the Mime4J DOM builder stores content of individual body parts in memory. The 'storage' package provides support for more complex storage backends such on-disk storage systems, overflow on max limit, or encrypted storage through JSSE API. The next release will be version 0.8. As of this release Mime4j requires a Java 1.6 compatible runtime. apache-mime4j-project-0.7.2/src/site/xdoc/0000755000000000000000000000000011702050530016747 5ustar rootrootapache-mime4j-project-0.7.2/src/site/xdoc/index.xml0000644000000000000000000000775311702050530020614 0ustar rootroot Mime4J

Apache James Mime4J is developed by the Apache James team but now has a dedicated mailing list.

Apache James Mime4J provides a parser, MimeStreamParser , for e-mail message streams in plain rfc822 and MIME format. The parser uses a callback mechanism to report parsing events such as the start of an entity header, the start of a body, etc. If you are familiar with the SAX XML parser interface you should have no problem getting started with mime4j.

The parser only deals with the structure of the message stream. It won't do any decoding of base64 or quoted-printable encoded header fields and bodies. This is intentional - the parser should only provide the most basic functionality needed to build more complex parsers. However, mime4j does include facilities to decode bodies and fields and the Message class described below handles decoding of fields and bodies transparently.

The parser has been designed to be extremely tolerant against messages violating the standards. It has been tested using a large corpus (>5000) of e-mail messages. As a benchmark the widely used perl MIME::Tools parser has been used. mime4j and MIME:Tools rarely differ (<25 in those 5000). When they do (which only occurs for illegally formatted spam messages) we think mime4j does a better job.

mime4j can also be used to build a tree representation of an e-mail message using the Message class. Using this facility mime4j automatically handles the decoding of fields and bodies and uses temporary files for large attachments. This representation is similar to the representation constructed by the JavaMail API:s but is more tolerant to messages violating the standards.

apache-mime4j-project-0.7.2/src/site/xdoc/start/0000755000000000000000000000000011702050530020104 5ustar rootrootapache-mime4j-project-0.7.2/src/site/xdoc/start/index.xml0000644000000000000000000000503211702050530021735 0ustar rootroot Getting Started with mime4j
Document Description
Download Before you can start using mime4j, you'll have to download the distribution to your system (unless you plan on building the project from source). This document provides links to the various distributions available.
Building mime4j Describes how to build mime4j from the sources.
apache-mime4j-project-0.7.2/src/site/xdoc/start/download.xml0000644000000000000000000000357611702050530022450 0ustar rootroot Downloading mime4j

Go to the download pages and download the most recent release in your preferred format, either james-mime4j-x.y.tar.gz or james-mime4j-x.y.zip. Extracting the archive will create the directory james-mime4j-x.y/ which contains the mime4j jar file and the API docs.

apache-mime4j-project-0.7.2/src/site/xdoc/start/build.xml0000644000000000000000000001242411702050530021730 0ustar rootroot Building mime4j

Go to the download pages and download the most recent release in your preferred format, either james-mime4j-x.y-src.tar.gz or james-mime4j-x.y-src.zip. Extracting the archived sources will create the directory james-mime4j-x.y/.

Issue the following commands in a shell:

svn checkout http://svn.apache.org/repos/asf/james/mime4j/trunk james-mime4j

You will need to download and install Maven before building the sources. The build has been tested with version 2.0 of Maven so use this or a later version if possible.

One of the main differences between Maven and plain ant is that Maven manages external dependencies for your projects and (at least in theory) you should no longer have to store third-party jar files in your source code tree. It maintains a local repository of versioned libraries and shares them between your Maven projects. If it can't find the necessary files there it will attempt to download them from the main Maven repository at www.ibiblio.org/maven. So to use the Maven build, you need to have a network connection available for the inital download of the project dependencies.

Once Maven has been installed, building the project should be as simple as typing

cd james-mime4j-x.y/ (cd james-mime4j/ if sources come from Subversion)
mvn package
from the command line. Maven will automatically run all test cases for you and create the jar file in the target directory.

To install the jar into your local Maven repository run

mvn install

To generate an Eclipse project from the sources run

mvn eclipse:eclipse

NOTE! Mime4j uses JavaCC to generate parsers for header fields. If you're using an old version of maven eclipse pluing mvn eclipse:eclipse could have problems generating proper source folders for the JavaCC generated code. After running mvn eclipse:eclipse you must manually add target/generated-sources/javacc and target/generated-sources/jjtree as source folders under Project -> Properties in Eclipse.

For more information on using Maven, have a look at the Maven web site.

apache-mime4j-project-0.7.2/src/site/xdoc/samples.xml0000644000000000000000000001120111702050530021130 0ustar rootroot Samples

The Mime4j distribution includes samples which demonstrate how the library could be used. This section gives you a short review of those samples. For more information you should download the distribution and study the sample sources. The samples are in the examples/ sub-directory.

Sample Description
org.apache.james.mime4j.samples.tree.MessageTree Displays a tree of the contents of a Mime4j Message object in a Swing GUI. To try it out run
java org.apache.james.mime4j.samples.tree.MessageTree path/to/message.msg
The output is very useful if you want the study the structure of MIME messages.
org.apache.james.mime4j.samples.transform.TransformMessage Illustrate how to transform a message into another message without modifying the original.
org.apache.james.mime4j.samples.dom.TextPlainMessage Illustrate the use of Mime4j DOM API. This example generates a message very similar to the one from RFC 5322 Appendix A.1.1.
org.apache.james.mime4j.samples.dom.MultipartMessage Illustrate the use of Mime4j DOM API. This example creates a multipart/mixed message that consists of a text/plain and an image/png part. The image is created on the fly; a similar technique can be used to create PDF or XML attachments, for example.
apache-mime4j-project-0.7.2/src/site/resources/0000755000000000000000000000000011702050530020024 5ustar rootrootapache-mime4j-project-0.7.2/src/site/resources/images/0000755000000000000000000000000011702050530021271 5ustar rootrootapache-mime4j-project-0.7.2/src/site/resources/images/james-mime4j-logo.gif0000644000000000000000000001637211702050530025211 0ustar rootrootGIF89aMdÕÖÕÓËβ¯°åš™§ceþüþtssÓ¹BlääãxÄQQQý÷èôÿþ‰ƒ…þþñúÌË}þþúÞ…öÜ¥#Ðnhþ÷Éúÿÿÿùþµˆ„þêæ~`vÿôýìþüÿôñÑ!:>7<}OQÿìôé´µÿù÷2wõþòùÿù£ƒ úúùììëýÜßv65ÕM<Ŧ§íüꦢ¢¤BBgQijdeÜÛÛöúýôõôªªª™“•¸¶·×æèÐÉÈÃÃÂÿÿÿ!ù,MdÿÀŸpH,ȤrÉl:ŸÐ¨tJ­Z¯Ø¬vËíz¿à°xL.›Ïè´zÍn»ßð¸|n–H …Ë…ñx| ?6B }?x%t“”•–_v18( x‡v†ˆ}’%‘—¯°±²G' ))zˆ?v¡('¿«(…³ËÌÍoxЏº5' x’Á¡'ŪÉÊÎâãä^((%?º-º%'6}؉Á (÷åýþÿO`$û@AW®ÀÀ ©ž¨{wò5øA  Å‹%4€qÁ`. . t(¡âÁ Uù(>JI1Æ—0™hÕ £®@.€Ðè¡ÿ )YiœØ2¦Ñ£k$¨ LHÅBväóPÐà@°ãD‰ Œòi‹$Ò³hÃ,-´T…²·-¥68±aZŠ@L€›Š lˆ½#êǹ´ˆg l)E§N• 4€€…3L‰<Ü9¦ QEŨS7Q òã·ªJLf0bÀæÌ8Ë @"4+McœVM¼øÖ*Ü:†û£Ï±cX¡@ ²OØÀ‡A‡€öEÂc¼|ñ¥7~¬}í´óç @Àºílèóñä™'`j¬À é¹ÅžFƒ@² ¼}÷eg04àÁ1’H2ÿà‡‰)uƒ 8€C7(øÖ!„ °]}&TØÙ „Æ!$ öˆÖRä°@Ðà€|°H>ŽØ!O.Ѐ 5ðØ9'bs>†éL*Ô@ÃE„üpC> Ø™yr‚FÇLÍT£!¨»à "pÝóÏûÊší{Í¥|pÀf…%!ˆlÕp§AŠ#ð`€ðl‚ÇûŠð3 f ¸à« °|¥ <ðæ^Æ-9d†²Äo=€Í,0+Þ °™kÐÙ¸ˆ§}.ÇD<ùë]DND!Þð ÿy>„à±ßysÀƒ"¼ÐÙÕýª° øÉžì°7Ï„å´ñð/  vhkö 0  †3m‚¸j“p޽íüúN\-=䀱`@ï;WPÁ xïË/vÒCËœæ Ø@=¥bŸ÷I/ò«<6ƒùáNw @ïb0‚èDIeÖ©€ÂΕ€Ö‚y Tà Tƒ¬ E(ìÐô$ˆ7ÌoØ»ÎÇö· Ô ø ЬΠ‰)(”Xx7MA9(@b à@KtáR¼ä˜Æ¬èÝÏ0ÜO_½£(`:)…p I> Ø’D$ÿ£u¨ÂP5øÀ9ˆ‚(쀂à &ª¢¨HÅ$à…myÌcÜRÛñm3X€ý|6¿íÎTa- LÄ(  •ƒ?þQ=€,°¸Ò´ŒÂ‘+æ`ŠW &b@E 9 ‚ŠnPÉN‚g¹ D` ä”TR\gÀ€v=§‘ ªüèJ€h·\*pËH-v襈é€) `ž8Àçy2!°%•ãþ pÁŸñN ÁfÓ:c BÇ'C’"rþQÀ-Í™„ÜÒ8ä/ȃààŠ‹t@=ﳊÿŽLO`ô­Yå “84£þvh'PöL›ç¥4Š~H·Ì¥€ôøG&°Ó•=€‚—B± ì Át©JM4O,Ÿ-íÞ„‚l ¼»)í‡Éù!txgK\Iðè5Uä䨀zÐN&À•!ˆ‚+þò¹  :ðªWy7bžÔ«VŒ¬xP’\@w#ÞÐy¿ŸÑ€Ó!žÈP  ey¼V Î=ÕŒNè`)ØF#1[Ê LšÕCÚÐDùD©"óÉ'ŸÀ¦˜ä¡}ö±„ª O 3— 0RÔ."…Fù«+i6Bú@ÁVa¬`±‰MÿéÝrÜ`VñŠŽdΞYAÎí³šr£Ц¸¬¸`%H†+è‘@ìþã–ƒw±¡V| =‚È@ IE—Æ‘jªbK¿JÅ+g]ólÞ–»¿kŠV®ÒõWYX”r¬ˆ+nŒÎ +àAŒ•šÛبR€1…Vº’‰ þ"°1Œà‘XJ ;Ì÷.ò^ˆÁ ¬èUN(²Ö£/;€?!ŠO\NÀù ( X(²ŠDXA?jF´–=hÔGiU¿*òoÆèäÌTWrìÎCÈókÿÈg+äù£DòTpK>:!Ђu“+)Ô€&€ÈÀ ÿ°ªH—¾×†wƒoK‡É 0*¹?Óä92ÑVÉ\ eDQÅù tþÑBXKtH‹ºÒB:«eÃBÓ` …ª|í`ÿ@Ø{4QŒýGdÿ@Ù¹3Òœ]ùl)Ôw p¤ `dx; ¶t%—@mk?ÁL 6€€ @ø[NXƒhøžW䄽ŒTå-»ôDð›ÇΤÉÎÖ`C”«à§|8õþA+i@ä"Ä»œ?@jæ î?& ÑþcŸ‰ò‘—œ'ÿ£9UÎrj¿Ü FžùxàJ{?!æ{„BÈ¡€ïk ’ˆz œáAxo…­HÿE{qÀDTŒ,^@ß{q¶Ó1Xu¨MÎãpà$ê»y!5€Ê}„vëÕHºèŽË$àý–zç»üþ½ûàæE°èß›`lÈ3aé÷."Z÷ô;-nжŒÚÂ>é"íÕØ+ºô8Ù )hF$uÙ”..0 š€Á—ßó_ø#~ÚÀ§wÞ‡/oÊÿÉGàkóPÄGóísç7ЂD@#x®T”¾@v˜'.ëë9O®{î™#v”™¬m^ f¬h[¯ÉÝ„|ÔòFp®di€wK‚÷Ô¦xIà·€E €D€I`dÿ“WH'ÊçJé¡tE7»d’p/Ð"çpe‘‚ãgE®{,µ~ZVEd'P™ä`6k÷SÒÅ{÷ ¿ Ràˆ`1âg¢pÀ´¡FØâ4GN€}J@mÇ…hƒf€È÷kWØ€\èJ^X[J@i·´K†H××R s’ %ðÖ€ÉÀ%Åð ‚ 5c‹õÖ~6ôuªç ÄôK9Õp¥9°?42@`„€‡Ç0y¨!ÔçPUeE¡ ¨„3(K"3XmNsXHõJƆE€…ÿI`‹L‹>À]GðT1ÐȘŒÊ¸DEŒI …Sà‹Lp6%ÐAP£ °8Š`4°Nö*°Sæe†¨;5À쥎N#0jšäðN¶#ð@ ,p ßQCAyø_ñ€ãõ'Œ!wD„%°ÐA# މJÐ|bظ…K{·‹ÒÖ‹tŒd’ü‡9Gg.i}K }R: -²RaH‹P ù]@$°wP]xÀ.M¨×Jùu< TðX/0íÈ5°}±/@"ÐÖ°00/”-ÀÿQÉ0–šÐ„t‡ÐyX•¸C/°Ç€‚Ñ`Р•"Ði =ðÚ iC G@t®t‹EðZ$)s9itJÀ˜ä˜D™‘Ùjé×™žé™LÀT ‰“&Ù‘;¹ŠüØ-uP£ ~"úÐà} ::@ýÖÜ´.¥#À› ég) ðy 7,°$К\¹9Þ×$ð'‚Ü€6`3)·IX%Q7 QQV@žÀ.E­u܃J‘:Ép’³XX’4w’o˜’³è€Ä}[ ]’™reŸ”9-‘ ¿Àšÿ®Ù%‚­¨ý&$3Ð}· O©7À› $€-I Þçoy›,ÀᨖŸÇ0¡¡'3BàÀ•cÙL(® àñMèÑ1òù6†¨ Ù'çŒ×Æ‹ÿY¥JŸ˜9YjpK_ðZ/Wš :‰@šÐ}ß ¡ ¥QÙø Ðu0œ6`/*°Îq‘pZ5À_!5þÖ,à'ß‘ ~28#€¡- ”ŽÊ P/Jâ' *0.1 ZÞH&0Ø"'è¥I¦M@|ïl\š˜ÿú¥ª¸j‡—;^Ðnŧ (7‹ Úmšðpúšþ!¶Ÿ"° J¡oÌä¢ÐPH@Þ§€¤—u/ú `˜`a„0¢ðªÊ#špvª-}‡ðŸ'È#à}:ðk‘‘üÊ&ñ¦M`«L€½º¥þÉ«´Š»K«ŠYlD ¦Ê*HÀPŸ­¨`‚}Q‡1à~"…0@/ `ñ„Zœ@RÑ ®ý&xðÄ`4z¢ûP‚êšÜQ‘ò8‹ZBã!³'J‘p9ùÕE¥÷i¥—鑨Ÿ Ú¥]ë«ÿWŠ’[0¹9Çc ›…»Ø­Þ54´4ªÇ 7 ¬HŸ÷ìò> ° á–ç0µé}@û°£^AŸ·LÈ08 Õ©”  ” ÛšþÀã¶)7 5Ù™Î*wG°±hø«I “?§«;xq{«¶[–én\€t ø¶Ï¸»I@Rb·ß‡ ¡’ð€Á yx‘Båd°®`Q¡º…  /ðy:§y   'à§xÚ6£g§2 ¿”ò;¿p¿÷Ë4á0°¨¾ù¾`¯¶¢k\»¬¼K»H`™£i»ª»{Àÿg» \Æš«W`l^h¼H »´PËk²ˆ€,0ª˜ŸJŠ--ê}ý#7+ß‹JC¥Ž‹­xÀ$ IžÀ®p€Tœl|XÜTD@|«aì¨Á±‹¼KÀå:&;@Ñ‚°©R—Ð ð˹®qÄ)Ü% ¶ÄýƒFøB0œ,|²eu/`›,p@…r"(¡ nñ1°²/ª&‘ØÐ.SÌÆD`Å0׆ œ»hÊUüÅZì†?`lr˜Z¨>Ȫsÿ +X˜ lj‹ ä‰0£ŽÚ–@ƒ‹¾‡kÜ ‰@Ã;Ü:‰ÜÔp·Ž\V4PP‚Ö Wó y‘°¨þ&lRW…QŸ!Û°°ü€´{|§Y¶µZÏD ’úÙÊ®ìùiÁ¹ŒÆ»ìÞ•´¿|·D eÅpJ°~b„eõÃ,üÜë} Åà †<Š Éà=wë–ƒôŸ'âçt°¸©à ép@&ú¢ß·Ãà ˆéÀúl±ü<{¬¸;¶ÔüµÏ“TdkжlhHð¶gÔœ ýÆ Ý¼A;  ®UË 0p ÿSh4¢Û?v@¨'*Þ yŒ»®r‘øWÒ‘€Ä‘ŸG&átÓC Ø ׸Î:ýo€©PÀÔ7ÔCÐÀøL¶W]g¦‘=±ÆVÙO¼ZJš·Tã&hùÌÙC´Ã¼Þ ¶É=ÞÈ T· úAk¢2 †@ÔlÛ¨D ñu pÓÌÌÍß•o>Ídwõ€¡~Zµ"íØôÁKpK¤}Ô[<™ÝJ Ýc\iYÀT?W&=Eò’øÆ¬<¡Ï­OX4&Š™(ðdÁ¼wÖ0ŒZòü½m‡¬—«@µ- §ÿAÍà„(à0#¥öP]ÿQT’À*@.Z¨Õ]ÊïmÙ-¯•«“Ô¦-—í'>ÞR}©Þ¯²hì}Qî­ÔIP¨¡ÑJ„‡à °Òè;‡ùÌk۪нŠÓƒ.à þ<`›<­P´Í»dÃ@€ñä©4§â™›Óš ÖÍ-ÞLE™)nÕ]â?ÐæxöQ?½N7žçÛ•ã+>(’ ߪ}Úzí} yâ–„þ ฽"ò嫸y€ºþF"ã{·s ¸£ò†À#‹Î#Í‘„µa›úiîµÿ¬tg Ð:Nâà¯Þ£ÿÅŸVÀZ¼Þë¾>jµB¬µÁ=;ºF óÍÐàuTû}‹íÆûÀÖÉ^ÍdÂä2@ß+( éAé `›@Ó¼× ¹„è n<²ÿq´<Îfþ¤+p£é°êJ°æ¡¶°ÎÊ]ümrÎT¨…Ÿýjìݺôç©MßI¼ÄxëÆÿÁÖH§/@¸íè^Ÿ’N„) ÙË醖ޭDÃdLØ é.î‹  ¦L¬­ðûnï³x»o.ë}ópërE0¬#Y_Úºtì´Ãš ]]u`ºß5=Ï€!‡‹ítÄ’ŽÑŽå/Jl-É7 J"ßÿ$e…ßU„üKµ]àÇ;âD`óI`l«ŒÔpÞnp¯¶fÊó :ÏLgð¿èÕEÍ|­áòœä¡Ð½F› QoàÍœ Ã0Ðð¢Æ©kÀ¹þö ÿq%öä¡ cß6T­¸ñiOïW,çdŒh3ÿòªŸN&wK=OÙ?ßãÓ¾ÚzŠžWGSÉ'­`v‹‡\‡{Bþ1 `ÈqBe1ÊçIÇ: ùÖÞ—ÙéÑ¿Ð@ÏáÓ‘p0à›ˆúHP÷GsB×úÅÎþFàþE€É÷-$µ¯âï˜Jò+|Z‘ˆ¦øÃØ-Dq±y„ÿ™L¡€Â •¯ß– ”¹Âßú7˜F^‰„KLÿÊJ€ä†Á4d”N<< :´ ~<T  ´2:ž 2lü”4ÔØFI|N HUÙjNOVWu\}bFWh{TMQcU[]a}Gg]mI{r‡wu—U‹Oœy}RG‹üæŒ:’–JÖ:5¨"F$NPPNˆÀâ $¦ÎÐH1ÜÂäJ¸¶×tæC G(‰ cC?~4ðƒ¨Ã‹#^¼QBŠ8Îqˆá VHµŒš5g h s–ÌÕ‚[ÊJ¹r¹ f°k?hž²©Ê­?ÔúIŒ–4–:—²Qÿ9¤ÈoLÂa(±!Д ¥cLt2X°Wu©}púýk²æ-:1È&Gá$–±!‰ / «àˆâü*~ذ!A TØøÙò'°W?{º:º—«f£8_óìC&OZ>FçÈ€„7Î⤞…ø¸c”·È@ÂkB“ N:‰„T¸d>òh ä눈…>x 8è†>ø€n(¡;ÈÔ,ƒÍ|éÁŸBt% qB-O ?ã“–?cq€–c~116ÜtãÍ— ¯N¸nˆ[2#©Á½“, xA?ïœhÀ:$ÊÊ PèŽ 1ØÑÆÉ Ú‹’È úÆb"D%•ZÐ`„dà)N’!TH@ƒZx ™±·A‡Y­µepx Å*ôáÂ5(õEܥʥåÜU0q6zH`…ÿt0…†™rEÒXÚuæÅªÊÂ*œ5ðà ¡¼“Dp€‡°À‚Tp¤ÚˆH;?^…dQaõ"¸[?øx€`áñ!­XˆXŠ5`ᆘmv,8JŠˆO>¼Á³E=7¼&)Z¬IwÝ ¦wO¡^€>_ó†yþ!RwsÑ .20$ŠOÛbA6¹¡vXáΰ¥åm¼©ü†x€Äkl˜›‡4£²‰M7åÛñÇ!ü§x@n“<*jrÀ­V·Õ~ƒ¶€,jH}îXo]õ×a]öH€ÚQŸ]wÙ[_a…vußk~÷âÿoŸÛøå‡'~yÚõ]õçaGwêc·^yìgo^úà÷…žøâc¿]WpXCuó}ÉÀŸ$:a«)Z€¡ª5 X@ÿýùïßÿÿ@€4à˜@. tà h jð€]ûÛ‰*: 'L¦&± }4U€€„%4á Q˜B®…-tá IHΆ5¤¡ m˜Cî‡%Äá ;G5Ñ௄AŒÅÚ1‡mèèƒv(¡©QØ€ ‘+d±7€ÑaAТ޾¸Š0ªâŠF0£ã¸·1âÊX n;bˆpƒlÅ=,àÿ™„àÇ×7/„œˆaÀÀn&°X0Œsë6,&!™ ŠìiÜØ§%Xóá#Á?4DÂÄ À,GL˜Mbëp²8æ ÇÿŸkj*ˆÞ‹J HУŸ–$¨a‚`Î,÷'0‡‹± B«%Òª-Q@Ÿ‡²X÷g6òF0coZ ôk:#1\ZA@Vs3Í“81¢;,”°ÓŽÏ à˜qƒŠX°h¸#´è7ˆ@²ßÙx0­ÀZÓ¤M0`Lü*LãË ûšS,º BìXqªg¼„q”FácF,§{ˆwšZ¶Ú>nsœÆ£ƒ FöÑ ÄûÄïc•©5²€tê¬cÙHð€ÌèÖ 2ø€Ã GÀxЂ ±ý`‚…-ÿá/´Ðz> ÀQç‘Ôƒz'v 90`‚ ‚ËŒÙWÜc1õ™Né„ÓÐUO>±Ñ åýpZ88e¢“´×B’E¨@‰ž˜"I,þ4ÂÈ€B ¡}6"I.l`ß›øéç’54‘:ê(‘D"À *äÂØÐ»´€Ä Q’$I- ±Ô»úÑB”MÝ`–+´@oN5¥@TrD2$€ƒx 3Œ’_ö` 7øVX¦H4àAÇãÙpƒ£Ñ&#» 8*Ä™ Œ‹ 08«ccÇ9öÜLaåY XÀù@¶€/ ‚e2ôÀä¹Ý¡¤®“ƒ‰/&lÙà 2x=µP| ç5¥¶$Éîx$Ž÷àÌ0˜Sw·q¬ÜP3z×8p„ v«mswaŠñB7èrB7#Ð BCŽYuì—öº™£œØgÜC0=¤µÌ…EàžðFW˜+w3Xýu´[ÿH<Œ@Ë- ×B)öA⯯i8Ü*<Ä5Ûh¶Ú7|øÃ gmö•{×¶%—R@ƒjpøMŠaÁ5Œ0  à€*<@¹0Xåˆ,‰ËÂÁÎ÷=[ŽL ÆL†Dt(^!’ì`uTˆu Ù1ê7ˆEZà7âýÀ°°—ø¡"Øá4$ºÁ»&†ôŠ]ôñKPà‰hxDÁšú¡€w%`âÁ¬T4˜ø¦63™$5¸o(€Åˆð4/¼€*°E Þ? 8„Z“YHL°¿ ì°]€þˆÏ àt Ò9¼ `|ÿÑ+:Ú0 €d4@©`‚ès± 2‚ðÀ Lh(Š2($Ø…ÄÍHjD6dñjc|gLQ‘Ɔ h@z5`a?ò5ÖæåáÁ <Ð!bΉØb(k3%;ØðJüÁìF’ìn ùxN@ƒ8 ^†4'¢•8-¸—Ölà¦ýÝG+ÏŠI:"cÇaÔ„H“±ÖØ!™c  @ ªH„4­ž÷´Ã >tiÌKD#ò€4àµôò\kÂA J¶%a.Êà`X)ÌíùàGÈņh"h@•µ‚ lFÑ!H´CAƒ¬à6ÿ x€4‡‘ÊÅ©Ø@_/Èõ)yµE“ûÚ¬!j*Òª„šç(á%VõY˜Ü"פ‡{ž„Kª†@¾  1ÍÉø¨~Yùfb±éX.í´Mi\c³db<‹1  Ö7ßX H—h,à Tà;ð­j1Üî)Ãj—ê9[’(@+IÀd€¾7Á*JÀ­ŽÐ`"f]zgâJ§‡JŽ­JpR°²lÐKÙ—ÿ@ijÒ]6)‚‡€Xñ·¸6'í€E% :ØY¹ß×tü¬g× ¼mÚÆ[cÉ+Gk´£ i!C„6“0òÄ£·Múw’±ºônc%//¯zµèIi`!•½Žz™¤C8m€i„XûÌ<Èw¾Pë6èßuD`Xˆ­rÌɉ½ŠIŒ,>Ç*Ë tŒá¨SĽ=æqÆ{¼ƒ‡V ÌãäfHrÞz§¿27öÚò¦„[½òJP¯b–[@Aa6š±àžû%ˆê×è-„üKpŒ@E :Àƒ¨`;A¥;Ýž3b™ˆèüsÿÝ…è€âÅæÂ›[Ú g|B€´5>íi÷8žÈÁÐäîpíp,Rr\ÓãõU´¼¡ j ’NëÖ¢ÞÂ8X#$ÕB5Ö²FšƒM@œ¥Ñ´Ü€ h@ǧÍá<Ò”°`¼ e*“‡üôøaq9ÞllºMÝ…x»ð2 øžÉØ1£M ÐÓ Øk0z 4”QÞ%ÞTtr9Àl$ÑýÚæ:s€šXm¶Œ•ÏaÞý»Ýpmרü#Ђ”X`‹‡À/ÀcüBŒЮŢÿåÈNsV?°1Áÿ3coô,€)о‡¾7ÿØ@öN wDW"ÂIH§dÓ+ P>/j€ãiavx?Ð2p/q#Df\ðF<Ђ:+­õ GÑP4°0<†Å€EÈÓ¢§÷Zç••A"Ô"-”T;Æv<–Ѐ)Ðà{>æ4’&Ž—¯Àwê¡d30~q[f¡5>p#ð5”&WÐ@T3‚¨2PqåRÿ’&Ì燊´g‚ØFу<ð\4@ ð°-€„ S:!pÀ@ ˆ–Ѝ·ZAGotNs€…n§qÔ–ê÷Pû´OÿÇ÷*½˜O™f<Ð  ¿ø   Á˜OGP àÐÒóŒX‚IP›RœpJvá0ŽL9 C;à‰ÙR B-Åà^°„¸†k£ÃBrRlçhÒæc\¸¿ØÃ)ö„fú¦% Ï¥OW°ðÀ-{ò\(_¤vþ†zz‚hî…ŠÍ–hFs48A‹mçh0€ Õ‘y2YЃ= p‰ŸÇ44À À "‘í†0„mÑõ ©£4CŒFðTž( )éc&`ð'9ðÉ19“fI“ÿû”ºî7Žº¡ qŽ:à+°"-Éà‰&PkO˜±ŽÈ  ë¸ (ž7(— 9ù¹Átí¡ZjÀ†g9™Xà4•aÉtŽIŽ–$@' :¤©+($ €“:šà € é––¨™º1Zx0H®}”Ù›*¥6y‰—¸šú›±i“ÈɃøp:ÀM#=göŒ¾© /ÐBQ>T0KüÒ»xsqOö´ JÓ’W÷VF‡W(« 3 a§Ö:—5> /ºs Àwæ/ E=PŸJÐÞ8IxמPÿ¼e\$ñjNÀp3F$“Zg©7H}­€A#‚ Ià>@ &[3Ú p_¤A2ÜÜA à+  "Võ¡D¤m¼I'e¢Hp}ý°¢C`tauîé:d/ÐM§ 4 ÒxŒmO­Ö.ô†¡$q¢5ZÒ@žáé=½HZG¡ÆX*OŒC@žvPmÚŸF j…곟àP`ÆØ* â‹øÔ\¯žŠ€*TšÅØiQ¤p寨‚ZOµ“¤iÊ`BI©î™©@÷tN¥¦‚v0¥„#<` `f€b 5gi‚ÿ)ˆt.ÿ¡Qñ–&êQCpxlx˜!Ð$´+X8Ī6ÅüÕñ†Ì\CÚ$'-Í›¼%°0ód¶#ÑZ¿,,2ÈöÂVá<@}ÐIB«JÇwÝm*ÿéн¢ÔñìÉEjÈ »¸RsÕ½%]-j›\:[É͹b}Ë›¦Ë™ØM§Ú58 WÕ ~püÑ2"8!U¼Û~àH–Ò½ô’¢-0¹T¶•eqÀ ° /«eªÓŽ]%ù›TƒÉU;k›4Ü.€ ð½ÝÔDà_"ÚÍ›B«4PüŒL s>F‹tz]Bœâ[Û!·ÐBPÖÿ¿2jÛ†Baƒ­ÛwøÊX/=0×R£ ºaHv}Å`F«}ÍÜ(Ø ¢Œƒ€mÅ„¬7¤DÍ\' ®7ЈëÛ|Q5÷V?`ÔYõ.»Ôò\)±2£5"äwÚßH ¼ ã7 tL~6£àc=Û 22Í´RFÑ`·#.¯ÚCãÑ«¤LÄC4ú5Câ€×ÜZ`È ³8°y ÄpÛßín"Å»A4s½…4·@Mg›5 £6Ì7æö""œx˜dfOnÕJàÁc#»º¤$;E5¢ààGÖõlfþ;Ì”t7ѯf#µ%DZP8ÿê¡x,Ë]ç|Ì.…Ãw-`Ð)¬á Ç»‹¶Õ¢qPÛ¸í9и PíŒ~0­qJí?nº”¦¬»‰ƒ€í2@.HPÃÞ«˜níÉ®#ìTÓ¸Ê3äøÞåSæ®yxØî[¡«â1{+#Àw8p5`0†±P{&Q îÞ¾<‹t_€ »UiQi±¥w™YЃcY,¿%ßlÑGál øÐòå¹ó<ßóõ¢mPóG€ò>¿5ù¤gô‹0áŠj_yÊ#Ocr—,³E¿P ЬÀ`ÚpšfÿÑm¬õ4É0•{õŒ>óÞ Ùõ|p à(`[vÁ²yôºôF++p¸2Û _+ ¡ú=Úlåp`²ý\›Áêç(ñ°¦9–¦Á®5 ,qjŸ0rõ PŒ> ¦jÚªÿöJà#· P/p h<&Òž2ä uc!8`¡&¾077`7ñKê.ë«VÐF`!ÍG®ŸÍ(€°[íB¸`Â{_ ÐW‚c0c™­£êW%ÁA7€Ù:27@t«±AxèQ…áþ½"}‰–Âø‘I$ ×JÌJC$¡ÿ–Ä­Õ‚*š\6ŸÑióÇû/eÂf(¢ÊÁlp¼yÀFÊ Ê nä’JLpndZ¤JP"”Pn~2^èÔ~^J~Jnd”j¾~þ”^ŒîPæŒ È4fêxpú’œŽà,ÔpLŽœ°Ž fF,Ü Nqò’PZžMÃÅïjçê”,†“pCÄGÌnÔ“ W<j”JÒàÆ (ð¸Áì‚ P,hЇ ltb¤€W PŒœ(ˆ ïÔAe+ɉ2<$ˆÀ ©~ P€ ‰MpG8)±MI€vã&=sMN£EH&aÿÇ ¼Gþ… फ8eZxh¡A†Œ‰IVE|ÑâÍ,œZ:p#[š 8ÐÒ*É9GbîÃᡃ·¼P@uಒî~˜áï OÏÀvD'Oh8ê&yyäÑ$&è*U½šéF8‘ÜÐ(u1«‘ÌF"L@·HZð3"Âp$ñ  Ò0Gö`cÐJ®ºQÆ,+%4”D¬² Æ7ûˆ*‰/f«¨n½nf·# Žþ‘+‰ÍjÝРHìû!¸ÕL !#^SBá™<’²ž‹h'0ªÃ›Ÿ~P¨@$)DæÊ0á‹uë)‚ðÿVF¹fY…fhq…Zøä†”¸!Ll¹ÒÓ ¶Ò£‰búï„p9È~ÐLJÒªÒ´#Ä1Á1Íh€!Fˆ®¸Z‡ûà9€­-9Ëî‡` š¸Ìxa 0á*0^!•Ïä(a:W éˆätÀ„\Á’BC¢˜jÔ±Pè´)ô· Dy’Ë#LÖ^Lñ> QôˆO¢#SØaSœÁ×pH­(Ò#ÖY3(ïÙiW[sœA‚B;©ívµ€Ž¥hÕÈxõÖÜðÌÜuû”A<€í>:Ù­×Þ{ñÍWß} ùí×ßî7;apache-mime4j-project-0.7.2/core/0000755000000000000000000000000011702050540015210 5ustar rootrootapache-mime4j-project-0.7.2/core/src/0000755000000000000000000000000011702050540015777 5ustar rootrootapache-mime4j-project-0.7.2/core/src/main/0000755000000000000000000000000011702050540016723 5ustar rootrootapache-mime4j-project-0.7.2/core/src/main/javadoc/0000755000000000000000000000000011702050540020332 5ustar rootrootapache-mime4j-project-0.7.2/core/src/main/javadoc/overview.html0000644000000000000000000000421311702050540023066 0ustar rootroot API Overview

Mime4j Core provides a parser, MimeStreamParser, for message streams in plain rfc822 and MIME format.

The parser uses a callback mechanism to report parsing events such as the start of an entity header the start of a body, etc. If you are familiar with the SAX XML parser interface you should have no problem getting started with mime4j.

The parser only deals with the structure of the message stream. It won't do any decoding of base64 or quoted-printable encoded header fields and bodies. This is intentional - the parser should only provide the most basic functionality needed to build more complex parsers. However, mime4j does include facilities to decode bodies and fields.

The parser has been designed to be tolerant against messages violating the standards. It has been tested using a large corpus (>5000) of e-mail messages. As a benchmark the widely used perl MIME::Tools parser has been used. mime4j and MIME:Tools rarely differ (<25 in those 5000). When they do (which only occurs for illegally formatted spam messages) we think mime4j does a better job.

apache-mime4j-project-0.7.2/core/src/main/java/0000755000000000000000000000000011702050536017651 5ustar rootrootapache-mime4j-project-0.7.2/core/src/main/java/org/0000755000000000000000000000000011702050536020440 5ustar rootrootapache-mime4j-project-0.7.2/core/src/main/java/org/apache/0000755000000000000000000000000011702050536021661 5ustar rootrootapache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/0000755000000000000000000000000011702050536022760 5ustar rootrootapache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/0000755000000000000000000000000011702050540024140 5ustar rootrootapache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/parser/0000755000000000000000000000000011702050540025434 5ustar rootroot././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootapache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/parser/AbstractContentHandler.javaapache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/parser/AbstractContentHandler0000644000000000000000000000507411702050540031761 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.parser; import org.apache.james.mime4j.MimeException; import org.apache.james.mime4j.stream.BodyDescriptor; import org.apache.james.mime4j.stream.Field; import java.io.IOException; import java.io.InputStream; /** * Abstract base class for custom {@link ContentHandler} implementations. Methods of this class * take no action and are expected to be selectively overridden by super-classes. */ public abstract class AbstractContentHandler implements ContentHandler { public void endMultipart() throws MimeException { } public void startMultipart(BodyDescriptor bd) throws MimeException { } public void body(BodyDescriptor bd, InputStream is) throws MimeException, IOException { } public void endBodyPart() throws MimeException { } public void endHeader() throws MimeException { } public void endMessage() throws MimeException { } public void epilogue(InputStream is) throws MimeException, IOException { } public void field(Field field) throws MimeException { } public void preamble(InputStream is) throws MimeException, IOException { } public void startBodyPart() throws MimeException { } public void startHeader() throws MimeException { } public void startMessage() throws MimeException { } public void raw(InputStream is) throws MimeException, IOException { } } apache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/parser/ContentHandler.java0000644000000000000000000001610311702050540031210 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.parser; import org.apache.james.mime4j.MimeException; import org.apache.james.mime4j.stream.BodyDescriptor; import org.apache.james.mime4j.stream.Field; import java.io.IOException; import java.io.InputStream; /** *

* Receives notifications of the content of a plain RFC822 or MIME message. * Implement this interface and register an instance of that implementation * with a MimeStreamParser instance using its * {@link org.apache.james.mime4j.parser.MimeStreamParser#setContentHandler(ContentHandler)} * method. The parser uses the ContentHandler instance to report * basic message-related events like the start and end of the body of a * part in a multipart MIME entity. *

*

* Throwing an exception from an event method will terminate the message * processing, i.e. no new events will be generated for that message. *

* Events will be generated in the order the corresponding elements occur in * the message stream parsed by the parser. E.g.: *

 *      startMessage()
 *          startHeader()
 *              field(...)
 *              field(...)
 *              ...
 *          endHeader()
 *          startMultipart()
 *              preamble(...)
 *              startBodyPart()
 *                  startHeader()
 *                      field(...)
 *                      field(...)
 *                      ...
 *                  endHeader()
 *                  body()
 *              endBodyPart()
 *              startBodyPart()
 *                  startHeader()
 *                      field(...)
 *                      field(...)
 *                      ...
 *                  endHeader()
 *                  body()
 *              endBodyPart()
 *              epilogue(...)
 *          endMultipart()
 *      endMessage()
 * 
* The above shows an example of a MIME message consisting of a multipart * body containing two body parts. *

*

* See MIME RFCs 2045-2049 for more information on the structure of MIME * messages and RFC 822 and 2822 for the general structure of Internet mail * messages. *

*/ public interface ContentHandler { /** * Called when a new message starts (a top level message or an embedded * rfc822 message). * * @throws MimeException on processing errors */ void startMessage() throws MimeException; /** * Called when a message ends. * * @throws MimeException on processing errors */ void endMessage() throws MimeException; /** * Called when a new body part starts inside a * multipart/* entity. * * @throws MimeException on processing errors */ void startBodyPart() throws MimeException; /** * Called when a body part ends. * * @throws MimeException on processing errors */ void endBodyPart() throws MimeException; /** * Called when a header (of a message or body part) is about to be parsed. * * @throws MimeException on processing errors */ void startHeader() throws MimeException; /** * Called for each field of a header. * * @param rawField the MIME field. * @throws MimeException on processing errors */ void field(Field rawField) throws MimeException; /** * Called when there are no more header fields in a message or body part. * * @throws MimeException on processing errors */ void endHeader() throws MimeException; /** * Called for the preamble (whatever comes before the first body part) * of a multipart/* entity. * * @param is used to get the contents of the preamble. * @throws MimeException on processing errors * @throws IOException should be thrown on I/O errors. */ void preamble(InputStream is) throws MimeException, IOException; /** * Called for the epilogue (whatever comes after the final body part) * of a multipart/* entity. * * @param is used to get the contents of the epilogue. * @throws MimeException on processing errors * @throws IOException should be thrown on I/O errors. */ void epilogue(InputStream is) throws MimeException, IOException; /** * Called when the body of a multipart entity is about to be parsed. * * @param bd encapsulates the values (either read from the * message stream or, if not present, determined implictly * as described in the * MIME rfc:s) of the Content-Type and * Content-Transfer-Encoding header fields. * @throws MimeException on processing errors */ void startMultipart(BodyDescriptor bd) throws MimeException; /** * Called when the body of an entity has been parsed. * * @throws MimeException on processing errors */ void endMultipart() throws MimeException; /** * Called when the body of a discrete (non-multipart) entity is about to * be parsed. * * @param bd see {@link #startMultipart(BodyDescriptor)} * @param is the contents of the body. NOTE: this is the raw body contents * - it will not be decoded if encoded. The bd * parameter should be used to determine how the stream data * should be decoded. * @throws MimeException on processing errors * @throws IOException should be thrown on I/O errors. */ void body(BodyDescriptor bd, InputStream is) throws MimeException, IOException; /** * Called when a new entity (message or body part) starts and the * parser is in raw mode. * * @param is the raw contents of the entity. * @throws MimeException on processing errors * @throws IOException should be thrown on I/O errors. * @see org.apache.james.mime4j.parser.MimeStreamParser#setRaw() */ void raw(InputStream is) throws MimeException, IOException; } apache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/parser/MimeStreamParser.java0000644000000000000000000002133611702050540031524 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.parser; import java.io.IOException; import java.io.InputStream; import org.apache.james.mime4j.MimeException; import org.apache.james.mime4j.codec.DecodeMonitor; import org.apache.james.mime4j.stream.BodyDescriptor; import org.apache.james.mime4j.stream.BodyDescriptorBuilder; import org.apache.james.mime4j.stream.EntityState; import org.apache.james.mime4j.stream.Field; import org.apache.james.mime4j.stream.MimeConfig; import org.apache.james.mime4j.stream.MimeTokenStream; import org.apache.james.mime4j.stream.RecursionMode; /** *

* Parses MIME (or RFC822) message streams of bytes or characters and reports * parsing events to a {@link ContentHandler} instance. *

*

* Typical usage:
*

 *      ContentHandler handler = new MyHandler();
 *      MimeConfig config = new MimeConfig();
 *      MimeStreamParser parser = new MimeStreamParser(config);
 *      parser.setContentHandler(handler);
 *      InputStream instream = new FileInputStream("mime.msg");
 *      try {
 *          parser.parse(instream);
 *      } finally {
 *          instream.close();
 *      }
 * 
*/ public class MimeStreamParser { private ContentHandler handler = null; private boolean contentDecoding; private final MimeTokenStream mimeTokenStream; public MimeStreamParser(MimeTokenStream tokenStream) { super(); this.mimeTokenStream = tokenStream; this.contentDecoding = false; } public MimeStreamParser( final MimeConfig config, final DecodeMonitor monitor, final BodyDescriptorBuilder bodyDescBuilder) { this(new MimeTokenStream(config != null ? config.clone() : new MimeConfig(), monitor, bodyDescBuilder)); } public MimeStreamParser(final MimeConfig config) { this(config, null, null); } public MimeStreamParser() { this(new MimeTokenStream(new MimeConfig(), null, null)); } /** * Determines whether this parser automatically decodes body content * based on the on the MIME fields with the standard defaults. */ public boolean isContentDecoding() { return contentDecoding; } /** * Defines whether parser should automatically decode body content * based on the on the MIME fields with the standard defaults. */ public void setContentDecoding(boolean b) { this.contentDecoding = b; } /** * Parses a stream of bytes containing a MIME message. Please note that if the * {@link MimeConfig} associated with the mime stream returns a not null Content-Type * value from its {@link MimeConfig#getHeadlessParsing()} method, the message is * assumed to have no head section and the headless parsing mode will be used. * * @param instream the stream to parse. * @throws MimeException if the message can not be processed * @throws IOException on I/O errors. */ public void parse(InputStream instream) throws MimeException, IOException { MimeConfig config = mimeTokenStream.getConfig(); if (config.getHeadlessParsing() != null) { Field contentType = mimeTokenStream.parseHeadless( instream, config.getHeadlessParsing()); handler.startMessage(); handler.startHeader(); handler.field(contentType); handler.endHeader(); } else { mimeTokenStream.parse(instream); } OUTER: for (;;) { EntityState state = mimeTokenStream.getState(); switch (state) { case T_BODY: BodyDescriptor desc = mimeTokenStream.getBodyDescriptor(); InputStream bodyContent; if (contentDecoding) { bodyContent = mimeTokenStream.getDecodedInputStream(); } else { bodyContent = mimeTokenStream.getInputStream(); } handler.body(desc, bodyContent); break; case T_END_BODYPART: handler.endBodyPart(); break; case T_END_HEADER: handler.endHeader(); break; case T_END_MESSAGE: handler.endMessage(); break; case T_END_MULTIPART: handler.endMultipart(); break; case T_END_OF_STREAM: break OUTER; case T_EPILOGUE: handler.epilogue(mimeTokenStream.getInputStream()); break; case T_FIELD: handler.field(mimeTokenStream.getField()); break; case T_PREAMBLE: handler.preamble(mimeTokenStream.getInputStream()); break; case T_RAW_ENTITY: handler.raw(mimeTokenStream.getInputStream()); break; case T_START_BODYPART: handler.startBodyPart(); break; case T_START_HEADER: handler.startHeader(); break; case T_START_MESSAGE: handler.startMessage(); break; case T_START_MULTIPART: handler.startMultipart(mimeTokenStream.getBodyDescriptor()); break; default: throw new IllegalStateException("Invalid state: " + state); } state = mimeTokenStream.next(); } } /** * Determines if this parser is currently in raw mode. * * @return true if in raw mode, false * otherwise. * @see #setRaw() */ public boolean isRaw() { return mimeTokenStream.isRaw(); } /** * Enables raw mode. In raw mode all future entities (messages * or body parts) in the stream will be reported to the * {@link ContentHandler#raw(InputStream)} handler method only. * The stream will contain the entire unparsed entity contents * including header fields and whatever is in the body. */ public void setRaw() { mimeTokenStream.setRecursionMode(RecursionMode.M_RAW); } /** * Enables flat mode. In flat mode rfc822 parts are not recursively * parsed and multipart content is handled as a single "simple" stream. */ public void setFlat() { mimeTokenStream.setRecursionMode(RecursionMode.M_FLAT); } /** * Enables recursive mode. In this mode rfc822 parts are recursively * parsed. */ public void setRecurse() { mimeTokenStream.setRecursionMode(RecursionMode.M_RECURSE); } /** * Finishes the parsing and stops reading lines. * NOTE: No more lines will be parsed but the parser * will still call * {@link ContentHandler#endMultipart()}, * {@link ContentHandler#endBodyPart()}, * {@link ContentHandler#endMessage()}, etc to match previous calls * to * {@link ContentHandler#startMultipart(BodyDescriptor)}, * {@link ContentHandler#startBodyPart()}, * {@link ContentHandler#startMessage()}, etc. */ public void stop() { mimeTokenStream.stop(); } /** * Sets the ContentHandler to use when reporting * parsing events. * * @param h the ContentHandler. */ public void setContentHandler(ContentHandler h) { this.handler = h; } } apache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/MimeIOException.java0000644000000000000000000000433511702050540030006 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j; import java.io.IOException; /** * A wrapper class based on {@link IOException} for MIME protocol exceptions. *

* This exception is used to signal a MimeException in methods * that only permit IOException to be thrown. *

* The cause of a MimeIOException is always a * MimeException therefore. */ public class MimeIOException extends IOException { private static final long serialVersionUID = 5393613459533735409L; /** * Constructs an IO exception based on {@link MimeException}. * * @param cause the cause. */ public MimeIOException(MimeException cause) { super(cause == null ? null : cause.getMessage()); initCause(cause); } /** * Returns the MimeException that caused this * MimeIOException. * * @return the cause of this MimeIOException. */ @Override public MimeException getCause() { return (MimeException) super.getCause(); } } apache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/MimeException.java0000644000000000000000000000466011702050540027557 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j; /** * MIME processing exception. *

* A MimeException may be thrown by a {@link org.apache.james.mime4j.parser.ContentHandler} to * indicate that it has failed to process a message event and that no further * events should be generated. *

* MimeException also gets thrown by the parser to indicate MIME * protocol errors, e.g. if a message boundary is too long or a header field * cannot be parsed. */ public class MimeException extends Exception { private static final long serialVersionUID = 8352821278714188542L; /** * Constructs a new MIME exception with the specified detail message. * * @param message detail message */ public MimeException(String message) { super(message); } /** * Constructs a MIME exception with the specified cause. * * @param cause cause of the exception */ public MimeException(Throwable cause) { super(cause); } /** * Constructs a MIME exception with the specified detail message and cause. * * @param message detail message * @param cause cause of the exception */ public MimeException(String message, Throwable cause) { super(message, cause); } } apache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/util/0000755000000000000000000000000011702050540025115 5ustar rootrootapache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/util/ByteSequence.java0000644000000000000000000000417311702050540030361 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.util; /** * An immutable sequence of bytes. */ public interface ByteSequence { /** * An empty byte sequence. */ ByteSequence EMPTY = new EmptyByteSequence(); /** * Returns the length of this byte sequence. * * @return the number of bytes in this sequence. */ int length(); /** * Returns the byte value at the specified index. * * @param index * the index of the byte value to be returned. * @return the corresponding byte value * @throws IndexOutOfBoundsException * if index < 0 || index >= length(). */ byte byteAt(int index); /** * Copies the contents of this byte sequence into a newly allocated byte * array and returns that array. * * @return a byte array holding a copy of this byte sequence. */ byte[] toByteArray(); } apache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/util/ContentUtil.java0000644000000000000000000001317411702050540030236 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.util; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.charset.Charset; /** * Utility methods for converting textual content of a message. */ public class ContentUtil { private ContentUtil() { } /** * Encodes the specified string into an immutable sequence of bytes using * the US-ASCII charset. * * @param string * string to encode. * @return encoded string as an immutable sequence of bytes. */ public static ByteSequence encode(String string) { if (string == null) { return null; } ByteArrayBuffer buf = new ByteArrayBuffer(string.length()); for (int i = 0; i < string.length(); i++) { buf.append((byte) string.charAt(i)); } return buf; } /** * Encodes the specified string into an immutable sequence of bytes using * the specified charset. * * @param charset * Java charset to be used for the conversion. * @param string * string to encode. * @return encoded string as an immutable sequence of bytes. */ public static ByteSequence encode(Charset charset, String string) { if (string == null) { return null; } if (charset == null) { charset = Charset.defaultCharset(); } ByteBuffer encoded = charset.encode(CharBuffer.wrap(string)); ByteArrayBuffer buf = new ByteArrayBuffer(encoded.remaining()); buf.append(encoded.array(), encoded.position(), encoded.remaining()); return buf; } /** * Decodes the specified sequence of bytes into a string using the US-ASCII * charset. * * @param byteSequence * sequence of bytes to decode. * @return decoded string. */ public static String decode(ByteSequence byteSequence) { if (byteSequence == null) { return null; } return decode(byteSequence, 0, byteSequence.length()); } /** * Decodes the specified sequence of bytes into a string using the specified * charset. * * @param charset * Java charset to be used for the conversion. * @param byteSequence * sequence of bytes to decode. * @return decoded string. */ public static String decode(Charset charset, ByteSequence byteSequence) { return decode(charset, byteSequence, 0, byteSequence.length()); } /** * Decodes a sub-sequence of the specified sequence of bytes into a string * using the US-ASCII charset. * * @param byteSequence * sequence of bytes to decode. * @param offset * offset into the byte sequence. * @param length * number of bytes. * @return decoded string. */ public static String decode(ByteSequence byteSequence, int offset, int length) { if (byteSequence == null) { return null; } StringBuilder buf = new StringBuilder(length); for (int i = offset; i < offset + length; i++) { buf.append((char) (byteSequence.byteAt(i) & 0xff)); } return buf.toString(); } /** * Decodes a sub-sequence of the specified sequence of bytes into a string * using the specified charset. * * @param charset * Java charset to be used for the conversion. * @param byteSequence * sequence of bytes to decode. * @param offset * offset into the byte sequence. * @param length * number of bytes. * @return decoded string. */ public static String decode(Charset charset, ByteSequence byteSequence, int offset, int length) { if (byteSequence == null) { return null; } if (charset == null) { charset = Charset.defaultCharset(); } if (byteSequence instanceof ByteArrayBuffer) { ByteArrayBuffer bab = (ByteArrayBuffer) byteSequence; return decode(charset, bab.buffer(), offset, length); } else { byte[] bytes = byteSequence.toByteArray(); return decode(charset, bytes, offset, length); } } private static String decode(Charset charset, byte[] buffer, int offset, int length) { return charset.decode(ByteBuffer.wrap(buffer, offset, length)) .toString(); } } apache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/util/EmptyByteSequence.java0000644000000000000000000000301311702050540031370 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.util; final class EmptyByteSequence implements ByteSequence { private static final byte[] EMPTY_BYTES = {}; public int length() { return 0; } public byte byteAt(int index) { throw new IndexOutOfBoundsException(); } public byte[] toByteArray() { return EMPTY_BYTES; } } apache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/util/ByteArrayBuffer.java0000644000000000000000000001216311702050540031017 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.util; /** * A resizable byte array. */ public final class ByteArrayBuffer implements ByteSequence { private byte[] buffer; private int len; public ByteArrayBuffer(int capacity) { super(); if (capacity < 0) { throw new IllegalArgumentException("Buffer capacity may not be negative"); } this.buffer = new byte[capacity]; } public ByteArrayBuffer(byte[] bytes, boolean dontCopy) { this(bytes, bytes.length, dontCopy); } public ByteArrayBuffer(byte[] bytes, int len, boolean dontCopy) { if (bytes == null) throw new IllegalArgumentException(); if (len < 0 || len > bytes.length) throw new IllegalArgumentException(); if (dontCopy) { this.buffer = bytes; } else { this.buffer = new byte[len]; System.arraycopy(bytes, 0, this.buffer, 0, len); } this.len = len; } private void expand(int newlen) { byte newbuffer[] = new byte[Math.max(this.buffer.length << 1, newlen)]; System.arraycopy(this.buffer, 0, newbuffer, 0, this.len); this.buffer = newbuffer; } public void append(final byte[] b, int off, int len) { if (b == null) { return; } if ((off < 0) || (off > b.length) || (len < 0) || ((off + len) < 0) || ((off + len) > b.length)) { throw new IndexOutOfBoundsException(); } if (len == 0) { return; } int newlen = this.len + len; if (newlen > this.buffer.length) { expand(newlen); } System.arraycopy(b, off, this.buffer, this.len, len); this.len = newlen; } public void append(int b) { int newlen = this.len + 1; if (newlen > this.buffer.length) { expand(newlen); } this.buffer[this.len] = (byte)b; this.len = newlen; } public void clear() { this.len = 0; } public byte[] toByteArray() { byte[] b = new byte[this.len]; if (this.len > 0) { System.arraycopy(this.buffer, 0, b, 0, this.len); } return b; } public byte byteAt(int i) { if (i < 0 || i >= this.len) throw new IndexOutOfBoundsException(); return this.buffer[i]; } public int capacity() { return this.buffer.length; } public int length() { return this.len; } public byte[] buffer() { return this.buffer; } public int indexOf(byte b) { return indexOf(b, 0, this.len); } public int indexOf(byte b, int beginIndex, int endIndex) { if (beginIndex < 0) { beginIndex = 0; } if (endIndex > this.len) { endIndex = this.len; } if (beginIndex > endIndex) { return -1; } for (int i = beginIndex; i < endIndex; i++) { if (this.buffer[i] == b) { return i; } } return -1; } public void setLength(int len) { if (len < 0 || len > this.buffer.length) { throw new IndexOutOfBoundsException(); } this.len = len; } public void remove(int off, int len) { if ((off < 0) || (off > this.len) || (len < 0) || ((off + len) < 0) || ((off + len) > this.len)) { throw new IndexOutOfBoundsException(); } if (len == 0) { return; } int remaining = this.len - off - len; if (remaining > 0) { System.arraycopy(this.buffer, off + len, this.buffer, off, remaining); } this.len -= len; } public boolean isEmpty() { return this.len == 0; } public boolean isFull() { return this.len == this.buffer.length; } @Override public String toString() { return new String(toByteArray()); } } apache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/util/LangUtils.java0000644000000000000000000000533511702050540027670 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.util; /** * A set of utility methods to help produce consistent * {@link Object#equals equals} and {@link Object#hashCode hashCode} methods. */ public final class LangUtils { public static final int HASH_SEED = 17; public static final int HASH_OFFSET = 37; /** Disabled default constructor. */ private LangUtils() { } public static int hashCode(final int seed, final int hashcode) { return seed * HASH_OFFSET + hashcode; } public static int hashCode(final int seed, final boolean b) { return hashCode(seed, b ? 1 : 0); } public static int hashCode(final int seed, final Object obj) { return hashCode(seed, obj != null ? obj.hashCode() : 0); } /** * Check if two objects are equal. * * @param obj1 first object to compare, may be {@code null} * @param obj2 second object to compare, may be {@code null} * @return {@code true} if the objects are equal or both null */ public static boolean equals(final Object obj1, final Object obj2) { return obj1 == null ? obj2 == null : obj1.equals(obj2); } /** * Check if two strings are equal, ignoring case considerations. * * @param s1 first string to compare, may be {@code null} * @param s2 second string to compare, may be {@code null} * @return {@code true} if the objects are equal or both null */ public static boolean equalsIgnoreCase(final String s1, final String s2) { return s1 == null ? s2 == null : s1.equalsIgnoreCase(s2); } } apache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/util/MimeUtil.java0000644000000000000000000002505411702050540027513 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.util; import java.text.DateFormat; import java.text.FieldPosition; import java.text.SimpleDateFormat; import java.util.Date; import java.util.GregorianCalendar; import java.util.Locale; import java.util.Random; import java.util.TimeZone; /** * A utility class, which provides some MIME related application logic. */ public final class MimeUtil { /** * The quoted-printable encoding. */ public static final String ENC_QUOTED_PRINTABLE = "quoted-printable"; /** * The binary encoding. */ public static final String ENC_BINARY = "binary"; /** * The base64 encoding. */ public static final String ENC_BASE64 = "base64"; /** * The 8bit encoding. */ public static final String ENC_8BIT = "8bit"; /** * The 7bit encoding. */ public static final String ENC_7BIT = "7bit"; // used to create unique ids private static final Random random = new Random(); // used to create unique ids private static int counter = 0; private MimeUtil() { // this is an utility class to be used statically. // this constructor protect from instantiation. } /** * Returns, whether the given two MIME types are identical. */ public static boolean isSameMimeType(String pType1, String pType2) { return pType1 != null && pType2 != null && pType1.equalsIgnoreCase(pType2); } /** * Returns true, if the given MIME type is that of a message. */ public static boolean isMessage(String pMimeType) { return pMimeType != null && pMimeType.equalsIgnoreCase("message/rfc822"); } /** * Return true, if the given MIME type indicates a multipart entity. */ public static boolean isMultipart(String pMimeType) { return pMimeType != null && pMimeType.toLowerCase().startsWith("multipart/"); } /** * Returns, whether the given transfer-encoding is "base64". */ public static boolean isBase64Encoding(String pTransferEncoding) { return ENC_BASE64.equalsIgnoreCase(pTransferEncoding); } /** * Returns, whether the given transfer-encoding is "quoted-printable". */ public static boolean isQuotedPrintableEncoded(String pTransferEncoding) { return ENC_QUOTED_PRINTABLE.equalsIgnoreCase(pTransferEncoding); } /** * Creates a new unique message boundary string that can be used as boundary * parameter for the Content-Type header field of a message. * * @return a new unique message boundary string. */ /* TODO - From rfc2045: * Since the hyphen character ("-") may be represented as itself in the * Quoted-Printable encoding, care must be taken, when encapsulating a * quoted-printable encoded body inside one or more multipart entities, * to ensure that the boundary delimiter does not appear anywhere in the * encoded body. (A good strategy is to choose a boundary that includes * a character sequence such as "=_" which can never appear in a * quoted-printable body. See the definition of multipart messages in * RFC 2046.) */ public static String createUniqueBoundary() { StringBuilder sb = new StringBuilder(); sb.append("-=Part."); sb.append(Integer.toHexString(nextCounterValue())); sb.append('.'); sb.append(Long.toHexString(random.nextLong())); sb.append('.'); sb.append(Long.toHexString(System.currentTimeMillis())); sb.append('.'); sb.append(Long.toHexString(random.nextLong())); sb.append("=-"); return sb.toString(); } /** * Creates a new unique message identifier that can be used in message * header field such as Message-ID or In-Reply-To. If the given host name is * not null it will be used as suffix for the message ID * (following an at sign). * * The resulting string is enclosed in angle brackets (< and >); * * @param hostName host name to be included in the message ID or * null if no host name should be included. * @return a new unique message identifier. */ public static String createUniqueMessageId(String hostName) { StringBuilder sb = new StringBuilder("'); return sb.toString(); } /** * Formats the specified date into a RFC 822 date-time string. * * @param date * date to be formatted into a string. * @param zone * the time zone to use or null to use the default * time zone. * @return the formatted time string. */ public static String formatDate(Date date, TimeZone zone) { DateFormat df = RFC822_DATE_FORMAT.get(); if (zone == null) { df.setTimeZone(TimeZone.getDefault()); } else { df.setTimeZone(zone); } return df.format(date); } /** * Splits the specified string into a multiple-line representation with * lines no longer than 76 characters (because the line might contain * encoded words; see RFC * 2047 section 2). If the string contains non-whitespace sequences * longer than 76 characters a line break is inserted at the whitespace * character following the sequence resulting in a line longer than 76 * characters. * * @param s * string to split. * @param usedCharacters * number of characters already used up. Usually the number of * characters for header field name plus colon and one space. * @return a multiple-line representation of the given string. */ public static String fold(String s, int usedCharacters) { final int maxCharacters = 76; final int length = s.length(); if (usedCharacters + length <= maxCharacters) return s; StringBuilder sb = new StringBuilder(); int lastLineBreak = -usedCharacters; int wspIdx = indexOfWsp(s, 0); while (true) { if (wspIdx == length) { sb.append(s.substring(Math.max(0, lastLineBreak))); return sb.toString(); } int nextWspIdx = indexOfWsp(s, wspIdx + 1); if (nextWspIdx - lastLineBreak > maxCharacters) { sb.append(s.substring(Math.max(0, lastLineBreak), wspIdx)); sb.append("\r\n"); lastLineBreak = wspIdx; } wspIdx = nextWspIdx; } } /** * Unfold a multiple-line representation into a single line. * * @param s * string to unfold. * @return unfolded string. */ public static String unfold(String s) { final int length = s.length(); for (int idx = 0; idx < length; idx++) { char c = s.charAt(idx); if (c == '\r' || c == '\n') { return unfold0(s, idx); } } return s; } private static String unfold0(String s, int crlfIdx) { final int length = s.length(); StringBuilder sb = new StringBuilder(length); if (crlfIdx > 0) { sb.append(s.substring(0, crlfIdx)); } for (int idx = crlfIdx + 1; idx < length; idx++) { char c = s.charAt(idx); if (c != '\r' && c != '\n') { sb.append(c); } } return sb.toString(); } private static int indexOfWsp(String s, int fromIndex) { final int len = s.length(); for (int index = fromIndex; index < len; index++) { char c = s.charAt(index); if (c == ' ' || c == '\t') return index; } return len; } private static synchronized int nextCounterValue() { return counter++; } private static final ThreadLocal RFC822_DATE_FORMAT = new ThreadLocal() { @Override protected DateFormat initialValue() { return new Rfc822DateFormat(); } }; private static final class Rfc822DateFormat extends SimpleDateFormat { private static final long serialVersionUID = 1L; public Rfc822DateFormat() { super("EEE, d MMM yyyy HH:mm:ss ", Locale.US); } @Override public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition pos) { StringBuffer sb = super.format(date, toAppendTo, pos); int zoneMillis = calendar.get(GregorianCalendar.ZONE_OFFSET); int dstMillis = calendar.get(GregorianCalendar.DST_OFFSET); int minutes = (zoneMillis + dstMillis) / 1000 / 60; if (minutes < 0) { sb.append('-'); minutes = -minutes; } else { sb.append('+'); } sb.append(String.format("%02d%02d", minutes / 60, minutes % 60)); return sb; } } } apache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/util/CharsetUtil.java0000644000000000000000000001206511702050540030213 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.util; import java.nio.charset.Charset; import java.nio.charset.IllegalCharsetNameException; import java.nio.charset.UnsupportedCharsetException; /** * Utility class for working with character sets. */ public class CharsetUtil { /** carriage return - line feed sequence */ public static final String CRLF = "\r\n"; /** US-ASCII CR, carriage return (13) */ public static final int CR = '\r'; /** US-ASCII LF, line feed (10) */ public static final int LF = '\n'; /** US-ASCII SP, space (32) */ public static final int SP = ' '; /** US-ASCII HT, horizontal-tab (9) */ public static final int HT = '\t'; public static final Charset US_ASCII = Charset.forName("US-ASCII"); public static final Charset ISO_8859_1 = Charset.forName("ISO-8859-1"); public static final Charset UTF_8 = Charset.forName("UTF-8"); public static final Charset DEFAULT_CHARSET = US_ASCII; /** * Returns true if the specified character falls into the US * ASCII character set (Unicode range 0000 to 007f). * * @param ch * character to test. * @return true if the specified character falls into the US * ASCII character set, false otherwise. */ public static boolean isASCII(char ch) { return (0xFF80 & ch) == 0; } /** * Returns true if the specified string consists entirely of * US ASCII characters. * * @param s * string to test. * @return true if the specified string consists entirely of * US ASCII characters, false otherwise. */ public static boolean isASCII(final String s) { if (s == null) { throw new IllegalArgumentException("String may not be null"); } final int len = s.length(); for (int i = 0; i < len; i++) { if (!isASCII(s.charAt(i))) { return false; } } return true; } /** * Returns true if the specified character is a whitespace * character (CR, LF, SP or HT). * * @param ch * character to test. * @return true if the specified character is a whitespace * character, false otherwise. */ public static boolean isWhitespace(char ch) { return ch == SP || ch == HT || ch == CR || ch == LF; } /** * Returns true if the specified string consists entirely of * whitespace characters. * * @param s * string to test. * @return true if the specified string consists entirely of * whitespace characters, false otherwise. */ public static boolean isWhitespace(final String s) { if (s == null) { throw new IllegalArgumentException("String may not be null"); } final int len = s.length(); for (int i = 0; i < len; i++) { if (!isWhitespace(s.charAt(i))) { return false; } } return true; } /** * Returns a {@link Charset} instance if character set with the given name * is recognized and supported by Java runtime. Returns null * otherwise. *

* This method is a wrapper around {@link Charset#forName(String)} method * that catches {@link IllegalCharsetNameException} and * {@link UnsupportedCharsetException} and returns null. */ public static Charset lookup(final String name) { if (name == null) { return null; } try { return Charset.forName(name); } catch (IllegalCharsetNameException ex) { return null; } catch (UnsupportedCharsetException ex) { return null; } } } apache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/codec/0000755000000000000000000000000011702050540025215 5ustar rootroot././@LongLink0000000000000000000000000000015600000000000011567 Lustar rootrootapache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/codec/QuotedPrintableOutputStream.javaapache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/codec/QuotedPrintableOutputSt0000644000000000000000000001636011702050540032000 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.codec; import java.io.FilterOutputStream; import java.io.IOException; import java.io.OutputStream; /** * Performs Quoted-Printable encoding on an underlying stream. * * Encodes every "required" char plus the dot ".". We encode the dot * by default because this is a workaround for some "filter"/"antivirus" * "old mua" having issues with dots at the beginning or the end of a * qp encode line (maybe a bad dot-destuffing algo). */ public class QuotedPrintableOutputStream extends FilterOutputStream { private static final int DEFAULT_BUFFER_SIZE = 1024 * 3; private static final byte TB = 0x09; private static final byte SP = 0x20; private static final byte EQ = 0x3D; private static final byte DOT = 0x2E; private static final byte CR = 0x0D; private static final byte LF = 0x0A; private static final byte QUOTED_PRINTABLE_LAST_PLAIN = 0x7E; private static final int QUOTED_PRINTABLE_MAX_LINE_LENGTH = 76; private static final int QUOTED_PRINTABLE_OCTETS_PER_ESCAPE = 3; private static final byte[] HEX_DIGITS = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; private final byte[] outBuffer; private final boolean binary; private boolean pendingSpace; private boolean pendingTab; private boolean pendingCR; private int nextSoftBreak; private int outputIndex; private boolean closed = false; private byte[] singleByte = new byte[1]; public QuotedPrintableOutputStream(int bufsize, OutputStream out, boolean binary) { super(out); this.outBuffer = new byte[bufsize]; this.binary = binary; this.pendingSpace = false; this.pendingTab = false; this.pendingCR = false; this.outputIndex = 0; this.nextSoftBreak = QUOTED_PRINTABLE_MAX_LINE_LENGTH + 1; } public QuotedPrintableOutputStream(OutputStream out, boolean binary) { this(DEFAULT_BUFFER_SIZE, out, binary); } private void encodeChunk(byte[] buffer, int off, int len) throws IOException { for (int inputIndex = off; inputIndex < len + off; inputIndex++) { encode(buffer[inputIndex]); } } private void completeEncoding() throws IOException { writePending(); flushOutput(); } private void writePending() throws IOException { if (pendingSpace) { plain(SP); } else if (pendingTab) { plain(TB); } else if (pendingCR) { plain(CR); } clearPending(); } private void clearPending() throws IOException { pendingSpace = false; pendingTab = false; pendingCR = false; } private void encode(byte next) throws IOException { if (next == LF) { if (binary) { writePending(); escape(next); } else { if (pendingCR) { // Expect either space or tab pending // but not both if (pendingSpace) { escape(SP); } else if (pendingTab) { escape(TB); } lineBreak(); clearPending(); } else { writePending(); plain(next); } } } else if (next == CR) { if (binary) { escape(next); } else { pendingCR = true; } } else { writePending(); if (next == SP) { if (binary) { escape(next); } else { pendingSpace = true; } } else if (next == TB) { if (binary) { escape(next); } else { pendingTab = true; } } else if (next < SP) { escape(next); } else if (next > QUOTED_PRINTABLE_LAST_PLAIN) { escape(next); } else if (next == EQ || next == DOT) { escape(next); } else { plain(next); } } } private void plain(byte next) throws IOException { if (--nextSoftBreak <= 1) { softBreak(); } write(next); } private void escape(byte next) throws IOException { if (--nextSoftBreak <= QUOTED_PRINTABLE_OCTETS_PER_ESCAPE) { softBreak(); } int nextUnsigned = next & 0xff; write(EQ); --nextSoftBreak; write(HEX_DIGITS[nextUnsigned >> 4]); --nextSoftBreak; write(HEX_DIGITS[nextUnsigned % 0x10]); } private void write(byte next) throws IOException { outBuffer[outputIndex++] = next; if (outputIndex >= outBuffer.length) { flushOutput(); } } private void softBreak() throws IOException { write(EQ); lineBreak(); } private void lineBreak() throws IOException { write(CR); write(LF); nextSoftBreak = QUOTED_PRINTABLE_MAX_LINE_LENGTH; } void flushOutput() throws IOException { if (outputIndex < outBuffer.length) { out.write(outBuffer, 0, outputIndex); } else { out.write(outBuffer); } outputIndex = 0; } @Override public void close() throws IOException { if (closed) return; try { completeEncoding(); // do not close the wrapped stream } finally { closed = true; } } @Override public void flush() throws IOException { flushOutput(); } @Override public void write(int b) throws IOException { singleByte[0] = (byte) b; this.write(singleByte, 0, 1); } @Override public void write(byte[] b, int off, int len) throws IOException { if (closed) { throw new IOException("Stream has been closed"); } encodeChunk(b, off, len); } } apache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/codec/CodecUtil.java0000644000000000000000000000756411702050540027747 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.codec; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; /** * Utility methods related to codecs. */ public class CodecUtil { static final int DEFAULT_ENCODING_BUFFER_SIZE = 1024; /** * Copies the contents of one stream to the other. * @param in not null * @param out not null * @throws IOException */ public static void copy(final InputStream in, final OutputStream out) throws IOException { final byte[] buffer = new byte[DEFAULT_ENCODING_BUFFER_SIZE]; int inputLength; while (-1 != (inputLength = in.read(buffer))) { out.write(buffer, 0, inputLength); } } /** * Encodes the given stream using Quoted-Printable. * This assumes that stream is binary and therefore escapes * all line endings. * @param in not null * @param out not null * @throws IOException */ public static void encodeQuotedPrintableBinary(final InputStream in, final OutputStream out) throws IOException { QuotedPrintableOutputStream qpOut = new QuotedPrintableOutputStream(out, true); copy(in, qpOut); qpOut.close(); } /** * Encodes the given stream using Quoted-Printable. * This assumes that stream is text and therefore does not escape * all line endings. * @param in not null * @param out not null * @throws IOException */ public static void encodeQuotedPrintable(final InputStream in, final OutputStream out) throws IOException { QuotedPrintableOutputStream qpOut = new QuotedPrintableOutputStream(out, false); copy(in, qpOut); qpOut.close(); } /** * Encodes the given stream using base64. * * @param in not null * @param out not null * @throws IOException if an I/O error occurs */ public static void encodeBase64(final InputStream in, final OutputStream out) throws IOException { Base64OutputStream b64Out = new Base64OutputStream(out); copy(in, b64Out); b64Out.close(); } /** * Wraps the given stream in a Quoted-Printable encoder. * @param out not null * @return encoding outputstream * @throws IOException */ public static OutputStream wrapQuotedPrintable(final OutputStream out, boolean binary) throws IOException { return new QuotedPrintableOutputStream(out, binary); } /** * Wraps the given stream in a Base64 encoder. * @param out not null * @return encoding outputstream * @throws IOException */ public static OutputStream wrapBase64(final OutputStream out) throws IOException { return new Base64OutputStream(out); } } apache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/codec/Base64OutputStream.java0000644000000000000000000002502111702050540031501 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.codec; import java.io.FilterOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.HashSet; import java.util.Set; /** * This class implements section 6.8. Base64 Content-Transfer-Encoding * from RFC 2045 Multipurpose Internet Mail Extensions (MIME) Part One: * Format of Internet Message Bodies by Freed and Borenstein. *

* Code is based on Base64 and Base64OutputStream code from Commons-Codec 1.4. * * @see RFC 2045 */ public class Base64OutputStream extends FilterOutputStream { // Default line length per RFC 2045 section 6.8. private static final int DEFAULT_LINE_LENGTH = 76; // CRLF line separator per RFC 2045 section 2.1. private static final byte[] CRLF_SEPARATOR = { '\r', '\n' }; // This array is a lookup table that translates 6-bit positive integer index // values into their "Base64 Alphabet" equivalents as specified in Table 1 // of RFC 2045. static final byte[] BASE64_TABLE = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' }; // Byte used to pad output. private static final byte BASE64_PAD = '='; // This set contains all base64 characters including the pad character. Used // solely to check if a line separator contains any of these characters. private static final Set BASE64_CHARS = new HashSet(); static { for (byte b : BASE64_TABLE) { BASE64_CHARS.add(b); } BASE64_CHARS.add(BASE64_PAD); } // Mask used to extract 6 bits private static final int MASK_6BITS = 0x3f; private static final int ENCODED_BUFFER_SIZE = 2048; private final byte[] singleByte = new byte[1]; private final int lineLength; private final byte[] lineSeparator; private boolean closed = false; private final byte[] encoded; private int position = 0; private int data = 0; private int modulus = 0; private int linePosition = 0; /** * Creates a Base64OutputStream that writes the encoded data * to the given output stream using the default line length (76) and line * separator (CRLF). * * @param out * underlying output stream. */ public Base64OutputStream(OutputStream out) { this(out, DEFAULT_LINE_LENGTH, CRLF_SEPARATOR); } /** * Creates a Base64OutputStream that writes the encoded data * to the given output stream using the given line length and the default * line separator (CRLF). *

* The given line length will be rounded up to the nearest multiple of 4. If * the line length is zero then the output will not be split into lines. * * @param out * underlying output stream. * @param lineLength * desired line length. */ public Base64OutputStream(OutputStream out, int lineLength) { this(out, lineLength, CRLF_SEPARATOR); } /** * Creates a Base64OutputStream that writes the encoded data * to the given output stream using the given line length and line * separator. *

* The given line length will be rounded up to the nearest multiple of 4. If * the line length is zero then the output will not be split into lines and * the line separator is ignored. *

* The line separator must not include characters from the BASE64 alphabet * (including the padding character =). * * @param out * underlying output stream. * @param lineLength * desired line length. * @param lineSeparator * line separator to use. */ public Base64OutputStream(OutputStream out, int lineLength, byte[] lineSeparator) { super(out); if (out == null) throw new IllegalArgumentException(); if (lineLength < 0) throw new IllegalArgumentException(); checkLineSeparator(lineSeparator); this.lineLength = lineLength; this.lineSeparator = new byte[lineSeparator.length]; System.arraycopy(lineSeparator, 0, this.lineSeparator, 0, lineSeparator.length); this.encoded = new byte[ENCODED_BUFFER_SIZE]; } @Override public final void write(final int b) throws IOException { if (closed) throw new IOException("Base64OutputStream has been closed"); singleByte[0] = (byte) b; write0(singleByte, 0, 1); } @Override public final void write(final byte[] buffer) throws IOException { if (closed) throw new IOException("Base64OutputStream has been closed"); if (buffer == null) throw new NullPointerException(); if (buffer.length == 0) return; write0(buffer, 0, buffer.length); } @Override public final void write(final byte[] buffer, final int offset, final int length) throws IOException { if (closed) throw new IOException("Base64OutputStream has been closed"); if (buffer == null) throw new NullPointerException(); if (offset < 0 || length < 0 || offset + length > buffer.length) throw new IndexOutOfBoundsException(); if (length == 0) return; write0(buffer, offset, offset + length); } @Override public void flush() throws IOException { if (closed) throw new IOException("Base64OutputStream has been closed"); flush0(); } @Override public void close() throws IOException { if (closed) return; closed = true; close0(); } private void write0(final byte[] buffer, final int from, final int to) throws IOException { for (int i = from; i < to; i++) { data = (data << 8) | (buffer[i] & 0xff); if (++modulus == 3) { modulus = 0; // write line separator if necessary if (lineLength > 0 && linePosition >= lineLength) { // writeLineSeparator() inlined for performance reasons linePosition = 0; if (encoded.length - position < lineSeparator.length) flush0(); for (byte ls : lineSeparator) encoded[position++] = ls; } // encode data into 4 bytes if (encoded.length - position < 4) flush0(); encoded[position++] = BASE64_TABLE[(data >> 18) & MASK_6BITS]; encoded[position++] = BASE64_TABLE[(data >> 12) & MASK_6BITS]; encoded[position++] = BASE64_TABLE[(data >> 6) & MASK_6BITS]; encoded[position++] = BASE64_TABLE[data & MASK_6BITS]; linePosition += 4; } } } private void flush0() throws IOException { if (position > 0) { out.write(encoded, 0, position); position = 0; } } private void close0() throws IOException { if (modulus != 0) writePad(); // write line separator at the end of the encoded data if (lineLength > 0 && linePosition > 0) { writeLineSeparator(); } flush0(); } private void writePad() throws IOException { // write line separator if necessary if (lineLength > 0 && linePosition >= lineLength) { writeLineSeparator(); } // encode data into 4 bytes if (encoded.length - position < 4) flush0(); if (modulus == 1) { encoded[position++] = BASE64_TABLE[(data >> 2) & MASK_6BITS]; encoded[position++] = BASE64_TABLE[(data << 4) & MASK_6BITS]; encoded[position++] = BASE64_PAD; encoded[position++] = BASE64_PAD; } else { assert modulus == 2; encoded[position++] = BASE64_TABLE[(data >> 10) & MASK_6BITS]; encoded[position++] = BASE64_TABLE[(data >> 4) & MASK_6BITS]; encoded[position++] = BASE64_TABLE[(data << 2) & MASK_6BITS]; encoded[position++] = BASE64_PAD; } linePosition += 4; } private void writeLineSeparator() throws IOException { linePosition = 0; if (encoded.length - position < lineSeparator.length) flush0(); for (byte ls : lineSeparator) encoded[position++] = ls; } private void checkLineSeparator(byte[] lineSeparator) { if (lineSeparator.length > ENCODED_BUFFER_SIZE) throw new IllegalArgumentException("line separator length exceeds " + ENCODED_BUFFER_SIZE); for (byte b : lineSeparator) { if (BASE64_CHARS.contains(b)) { throw new IllegalArgumentException( "line separator must not contain base64 character '" + (char) (b & 0xff) + "'"); } } } } apache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/codec/Base64InputStream.java0000644000000000000000000002223411702050540031303 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.codec; import java.io.IOException; import java.io.InputStream; import org.apache.james.mime4j.util.ByteArrayBuffer; /** * Performs Base-64 decoding on an underlying stream. */ public class Base64InputStream extends InputStream { private static final int ENCODED_BUFFER_SIZE = 1536; private static final int[] BASE64_DECODE = new int[256]; static { for (int i = 0; i < 256; i++) BASE64_DECODE[i] = -1; for (int i = 0; i < Base64OutputStream.BASE64_TABLE.length; i++) BASE64_DECODE[Base64OutputStream.BASE64_TABLE[i] & 0xff] = i; } private static final byte BASE64_PAD = '='; private static final int EOF = -1; private final byte[] singleByte = new byte[1]; private final InputStream in; private final byte[] encoded; private final ByteArrayBuffer decodedBuf; private int position = 0; // current index into encoded buffer private int size = 0; // current size of encoded buffer private boolean closed = false; private boolean eof; // end of file or pad character reached private final DecodeMonitor monitor; public Base64InputStream(InputStream in, DecodeMonitor monitor) { this(ENCODED_BUFFER_SIZE, in, monitor); } protected Base64InputStream(int bufsize, InputStream in, DecodeMonitor monitor) { if (in == null) throw new IllegalArgumentException(); this.encoded = new byte[bufsize]; this.decodedBuf = new ByteArrayBuffer(512); this.in = in; this.monitor = monitor; } public Base64InputStream(InputStream in) { this(in, false); } public Base64InputStream(InputStream in, boolean strict) { this(ENCODED_BUFFER_SIZE, in, strict ? DecodeMonitor.STRICT : DecodeMonitor.SILENT); } @Override public int read() throws IOException { if (closed) throw new IOException("Stream has been closed"); while (true) { int bytes = read0(singleByte, 0, 1); if (bytes == EOF) return EOF; if (bytes == 1) return singleByte[0] & 0xff; } } @Override public int read(byte[] buffer) throws IOException { if (closed) throw new IOException("Stream has been closed"); if (buffer == null) throw new NullPointerException(); if (buffer.length == 0) return 0; return read0(buffer, 0, buffer.length); } @Override public int read(byte[] buffer, int offset, int length) throws IOException { if (closed) throw new IOException("Stream has been closed"); if (buffer == null) throw new NullPointerException(); if (offset < 0 || length < 0 || offset + length > buffer.length) throw new IndexOutOfBoundsException(); if (length == 0) return 0; return read0(buffer, offset, length); } @Override public void close() throws IOException { if (closed) return; closed = true; } private int read0(final byte[] buffer, final int off, final int len) throws IOException { int from = off; int to = off + len; int index = off; // check if a previous invocation left decoded content if (decodedBuf.length() > 0) { int chunk = Math.min(decodedBuf.length(), len); System.arraycopy(decodedBuf.buffer(), 0, buffer, index, chunk); decodedBuf.remove(0, chunk); index += chunk; } // eof or pad reached? if (eof) return index == from ? EOF : index - from; // decode into given buffer int data = 0; // holds decoded data; up to four sextets int sextets = 0; // number of sextets while (index < to) { // make sure buffer not empty while (position == size) { int n = in.read(encoded, 0, encoded.length); if (n == EOF) { eof = true; if (sextets != 0) { // error in encoded data handleUnexpectedEof(sextets); } return index == from ? EOF : index - from; } else if (n > 0) { position = 0; size = n; } else { assert n == 0; } } // decode buffer while (position < size && index < to) { int value = encoded[position++] & 0xff; if (value == BASE64_PAD) { index = decodePad(data, sextets, buffer, index, to); return index - from; } int decoded = BASE64_DECODE[value]; if (decoded < 0) { // -1: not a base64 char if (value != 0x0D && value != 0x0A && value != 0x20) { if (monitor.warn("Unexpected base64 byte: "+(byte) value, "ignoring.")) throw new IOException("Unexpected base64 byte"); } continue; } data = (data << 6) | decoded; sextets++; if (sextets == 4) { sextets = 0; byte b1 = (byte) (data >>> 16); byte b2 = (byte) (data >>> 8); byte b3 = (byte) data; if (index < to - 2) { buffer[index++] = b1; buffer[index++] = b2; buffer[index++] = b3; } else { if (index < to - 1) { buffer[index++] = b1; buffer[index++] = b2; decodedBuf.append(b3); } else if (index < to) { buffer[index++] = b1; decodedBuf.append(b2); decodedBuf.append(b3); } else { decodedBuf.append(b1); decodedBuf.append(b2); decodedBuf.append(b3); } assert index == to; return to - from; } } } } assert sextets == 0; assert index == to; return to - from; } private int decodePad(int data, int sextets, final byte[] buffer, int index, final int end) throws IOException { eof = true; if (sextets == 2) { // one byte encoded as "XY==" byte b = (byte) (data >>> 4); if (index < end) { buffer[index++] = b; } else { decodedBuf.append(b); } } else if (sextets == 3) { // two bytes encoded as "XYZ=" byte b1 = (byte) (data >>> 10); byte b2 = (byte) ((data >>> 2) & 0xFF); if (index < end - 1) { buffer[index++] = b1; buffer[index++] = b2; } else if (index < end) { buffer[index++] = b1; decodedBuf.append(b2); } else { decodedBuf.append(b1); decodedBuf.append(b2); } } else { // error in encoded data handleUnexpecedPad(sextets); } return index; } private void handleUnexpectedEof(int sextets) throws IOException { if (monitor.warn("Unexpected end of BASE64 stream", "dropping " + sextets + " sextet(s)")) throw new IOException("Unexpected end of BASE64 stream"); } private void handleUnexpecedPad(int sextets) throws IOException { if (monitor.warn("Unexpected padding character", "dropping " + sextets + " sextet(s)")) throw new IOException("Unexpected padding character"); } } ././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/codec/QuotedPrintableInputStream.javaapache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/codec/QuotedPrintableInputStr0000644000000000000000000002543311702050540031762 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.codec; import java.io.IOException; import java.io.InputStream; import org.apache.james.mime4j.util.ByteArrayBuffer; /** * Performs Quoted-Printable decoding on an underlying stream. */ public class QuotedPrintableInputStream extends InputStream { private static final int DEFAULT_BUFFER_SIZE = 1024 * 2; private static final byte EQ = 0x3D; private static final byte CR = 0x0D; private static final byte LF = 0x0A; private final byte[] singleByte = new byte[1]; private final InputStream in; private final ByteArrayBuffer decodedBuf; private final ByteArrayBuffer blanks; private final byte[] encoded; private int pos = 0; // current index into encoded buffer private int limit = 0; // current size of encoded buffer private boolean closed; private final DecodeMonitor monitor; public QuotedPrintableInputStream(final InputStream in, DecodeMonitor monitor) { this(DEFAULT_BUFFER_SIZE, in, monitor); } protected QuotedPrintableInputStream(final int bufsize, final InputStream in, DecodeMonitor monitor) { super(); this.in = in; this.encoded = new byte[bufsize]; this.decodedBuf = new ByteArrayBuffer(512); this.blanks = new ByteArrayBuffer(512); this.closed = false; this.monitor = monitor; } protected QuotedPrintableInputStream(final int bufsize, final InputStream in, boolean strict) { this(bufsize, in, strict ? DecodeMonitor.STRICT : DecodeMonitor.SILENT); } public QuotedPrintableInputStream(final InputStream in, boolean strict) { this(DEFAULT_BUFFER_SIZE, in, strict); } public QuotedPrintableInputStream(final InputStream in) { this(in, false); } /** * Terminates Quoted-Printable coded content. This method does NOT close * the underlying input stream. * * @throws IOException on I/O errors. */ @Override public void close() throws IOException { closed = true; } private int fillBuffer() throws IOException { // Compact buffer if needed if (pos < limit) { System.arraycopy(encoded, pos, encoded, 0, limit - pos); limit -= pos; pos = 0; } else { limit = 0; pos = 0; } int capacity = encoded.length - limit; if (capacity > 0) { int bytesRead = in.read(encoded, limit, capacity); if (bytesRead > 0) { limit += bytesRead; } return bytesRead; } else { return 0; } } private int getnext() { if (pos < limit) { byte b = encoded[pos]; pos++; return b & 0xFF; } else { return -1; } } private int peek(int i) { if (pos + i < limit) { return encoded[pos + i] & 0xFF; } else { return -1; } } private int transfer( final int b, final byte[] buffer, final int from, final int to, boolean keepblanks) throws IOException { int index = from; if (keepblanks && blanks.length() > 0) { int chunk = Math.min(blanks.length(), to - index); System.arraycopy(blanks.buffer(), 0, buffer, index, chunk); index += chunk; int remaining = blanks.length() - chunk; if (remaining > 0) { decodedBuf.append(blanks.buffer(), chunk, remaining); } blanks.clear(); } else if (blanks.length() > 0 && !keepblanks) { StringBuilder sb = new StringBuilder(blanks.length() * 3); for (int i = 0; i < blanks.length(); i++) sb.append(" "+blanks.byteAt(i)); if (monitor.warn("ignored blanks", sb.toString())) throw new IOException("ignored blanks"); } if (b != -1) { if (index < to) { buffer[index++] = (byte) b; } else { decodedBuf.append(b); } } return index; } private int read0(final byte[] buffer, final int off, final int len) throws IOException { boolean eof = false; int from = off; int to = off + len; int index = off; // check if a previous invocation left decoded content if (decodedBuf.length() > 0) { int chunk = Math.min(decodedBuf.length(), to - index); System.arraycopy(decodedBuf.buffer(), 0, buffer, index, chunk); decodedBuf.remove(0, chunk); index += chunk; } while (index < to) { if (limit - pos < 3) { int bytesRead = fillBuffer(); eof = bytesRead == -1; } // end of stream? if (limit - pos == 0 && eof) { return index == from ? -1 : index - from; } boolean lastWasCR = false; while (pos < limit && index < to) { int b = encoded[pos++] & 0xFF; if (lastWasCR && b != LF) { if (monitor.warn("Found CR without LF", "Leaving it as is")) throw new IOException("Found CR without LF"); index = transfer(CR, buffer, index, to, false); } else if (!lastWasCR && b == LF) { if (monitor.warn("Found LF without CR", "Translating to CRLF")) throw new IOException("Found LF without CR"); } if (b == CR) { lastWasCR = true; continue; } else { lastWasCR = false; } if (b == LF) { // at end of line if (blanks.length() == 0) { index = transfer(CR, buffer, index, to, false); index = transfer(LF, buffer, index, to, false); } else { if (blanks.byteAt(0) != EQ) { // hard line break index = transfer(CR, buffer, index, to, false); index = transfer(LF, buffer, index, to, false); } } blanks.clear(); } else if (b == EQ) { if (limit - pos < 2 && !eof) { // not enough buffered data pos--; break; } // found special char '=' int b2 = getnext(); if (b2 == EQ) { index = transfer(b2, buffer, index, to, true); // deal with '==\r\n' brokenness int bb1 = peek(0); int bb2 = peek(1); if (bb1 == LF || (bb1 == CR && bb2 == LF)) { monitor.warn("Unexpected ==EOL encountered", "== 0x"+bb1+" 0x"+bb2); blanks.append(b2); } else { monitor.warn("Unexpected == encountered", "=="); } } else if (Character.isWhitespace((char) b2)) { // soft line break index = transfer(-1, buffer, index, to, true); if (b2 != LF) { blanks.append(b); blanks.append(b2); } } else { int b3 = getnext(); int upper = convert(b2); int lower = convert(b3); if (upper < 0 || lower < 0) { monitor.warn("Malformed encoded value encountered", "leaving "+((char) EQ)+((char) b2)+((char) b3)+" as is"); // TODO see MIME4J-160 index = transfer(EQ, buffer, index, to, true); index = transfer(b2, buffer, index, to, false); index = transfer(b3, buffer, index, to, false); } else { index = transfer((upper << 4) | lower, buffer, index, to, true); } } } else if (Character.isWhitespace(b)) { blanks.append(b); } else { index = transfer((int) b & 0xFF, buffer, index, to, true); } } } return to - from; } /** * Converts '0' => 0, 'A' => 10, etc. * @param c ASCII character value. * @return Numeric value of hexadecimal character. */ private int convert(int c) { if (c >= '0' && c <= '9') { return (c - '0'); } else if (c >= 'A' && c <= 'F') { return (0xA + (c - 'A')); } else if (c >= 'a' && c <= 'f') { return (0xA + (c - 'a')); } else { return -1; } } @Override public int read() throws IOException { if (closed) { throw new IOException("Stream has been closed"); } for (;;) { int bytes = read(singleByte, 0, 1); if (bytes == -1) { return -1; } if (bytes == 1) { return singleByte[0] & 0xff; } } } @Override public int read(byte[] b, int off, int len) throws IOException { if (closed) { throw new IOException("Stream has been closed"); } return read0(b, off, len); } } apache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/codec/DecodeMonitor.java0000644000000000000000000000420511702050540030614 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.codec; /** * This class is used to drive how decoder/parser should deal with malformed * and unexpected data. * * 2 basic implementations are provided: *

    *
  • {@link #STRICT} return "true" on any occurrence
  • *
  • {@link #SILENT} ignores any problem
  • *
*/ public class DecodeMonitor { /** * The STRICT monitor throws an exception on every event. */ public static final DecodeMonitor STRICT = new DecodeMonitor() { @Override public boolean warn(String error, String dropDesc) { return true; } @Override public boolean isListening() { return true; } }; /** * The SILENT monitor ignore requests. */ public static final DecodeMonitor SILENT = new DecodeMonitor(); public boolean warn(String error, String dropDesc) { return false; } public boolean isListening() { return false; } } apache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/codec/EncoderUtil.java0000644000000000000000000005255011702050540030304 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.codec; import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.util.BitSet; import java.util.Locale; import org.apache.james.mime4j.util.CharsetUtil; /** * Static methods for encoding header field values. This includes encoded-words * as defined in RFC 2047 * or display-names of an e-mail address, for example. */ public class EncoderUtil { private static final byte[] BASE64_TABLE = Base64OutputStream.BASE64_TABLE; private static final char BASE64_PAD = '='; private static final BitSet Q_REGULAR_CHARS = initChars("=_?"); private static final BitSet Q_RESTRICTED_CHARS = initChars("=_?\"#$%&'(),.:;<>@[\\]^`{|}~"); private static final int MAX_USED_CHARACTERS = 50; private static final String ENC_WORD_PREFIX = "=?"; private static final String ENC_WORD_SUFFIX = "?="; private static final int ENCODED_WORD_MAX_LENGTH = 75; // RFC 2047 private static final BitSet TOKEN_CHARS = initChars("()<>@,;:\\\"/[]?="); private static final BitSet ATEXT_CHARS = initChars("()<>@.,;:\\\"[]"); private static BitSet initChars(String specials) { BitSet bs = new BitSet(128); for (char ch = 33; ch < 127; ch++) { if (specials.indexOf(ch) == -1) { bs.set(ch); } } return bs; } /** * Selects one of the two encodings specified in RFC 2047. */ public enum Encoding { /** The B encoding (identical to base64 defined in RFC 2045). */ B, /** The Q encoding (similar to quoted-printable defined in RFC 2045). */ Q } /** * Indicates the intended usage of an encoded word. */ public enum Usage { /** * Encoded word is used to replace a 'text' token in any Subject or * Comments header field. */ TEXT_TOKEN, /** * Encoded word is used to replace a 'word' entity within a 'phrase', * for example, one that precedes an address in a From, To, or Cc * header. */ WORD_ENTITY } private EncoderUtil() { } /** * Encodes the display-name portion of an address. See RFC 5322 section 3.4 * and RFC 2047 section * 5.3. The specified string should not be folded. * * @param displayName * display-name to encode. * @return encoded display-name. */ public static String encodeAddressDisplayName(String displayName) { // display-name = phrase // phrase = 1*( encoded-word / word ) // word = atom / quoted-string // atom = [CFWS] 1*atext [CFWS] // CFWS = comment or folding white space if (isAtomPhrase(displayName)) { return displayName; } else if (hasToBeEncoded(displayName, 0)) { return encodeEncodedWord(displayName, Usage.WORD_ENTITY); } else { return quote(displayName); } } /** * Encodes the local part of an address specification as described in RFC * 5322 section 3.4.1. Leading and trailing CFWS should have been removed * before calling this method. The specified string should not contain any * illegal (control or non-ASCII) characters. * * @param localPart * the local part to encode * @return the encoded local part. */ public static String encodeAddressLocalPart(String localPart) { // local-part = dot-atom / quoted-string // dot-atom = [CFWS] dot-atom-text [CFWS] // CFWS = comment or folding white space if (isDotAtomText(localPart)) { return localPart; } else { return quote(localPart); } } /** * Encodes the specified strings into a header parameter as described in RFC * 2045 section 5.1 and RFC 2183 section 2. The specified strings should not * contain any illegal (control or non-ASCII) characters. * * @param name * parameter name. * @param value * parameter value. * @return encoded result. */ public static String encodeHeaderParameter(String name, String value) { name = name.toLowerCase(Locale.US); // value := token / quoted-string if (isToken(value)) { return name + "=" + value; } else { return name + "=" + quote(value); } } /** * Shortcut method that encodes the specified text into an encoded-word if * the text has to be encoded. * * @param text * text to encode. * @param usage * whether the encoded-word is to be used to replace a text token * or a word entity (see RFC 822). * @param usedCharacters * number of characters already used up (0 <= usedCharacters <= 50). * @return the specified text if encoding is not necessary or an encoded * word or a sequence of encoded words otherwise. */ public static String encodeIfNecessary(String text, Usage usage, int usedCharacters) { if (hasToBeEncoded(text, usedCharacters)) return encodeEncodedWord(text, usage, usedCharacters); else return text; } /** * Determines if the specified string has to encoded into an encoded-word. * Returns true if the text contains characters that don't * fall into the printable ASCII character set or if the text contains a * 'word' (sequence of non-whitespace characters) longer than 77 characters * (including characters already used up in the line). * * @param text * text to analyze. * @param usedCharacters * number of characters already used up (0 <= usedCharacters <= 50). * @return true if the specified text has to be encoded into * an encoded-word, false otherwise. */ public static boolean hasToBeEncoded(String text, int usedCharacters) { if (text == null) throw new IllegalArgumentException(); if (usedCharacters < 0 || usedCharacters > MAX_USED_CHARACTERS) throw new IllegalArgumentException(); int nonWhiteSpaceCount = usedCharacters; for (int idx = 0; idx < text.length(); idx++) { char ch = text.charAt(idx); if (ch == '\t' || ch == ' ') { nonWhiteSpaceCount = 0; } else { nonWhiteSpaceCount++; if (nonWhiteSpaceCount > 77) { // Line cannot be folded into multiple lines with no more // than 78 characters each. Encoding as encoded-words makes // that possible. One character has to be reserved for // folding white space; that leaves 77 characters. return true; } if (ch < 32 || ch >= 127) { // non-printable ascii character has to be encoded return true; } } } return false; } /** * Encodes the specified text into an encoded word or a sequence of encoded * words separated by space. The text is separated into a sequence of * encoded words if it does not fit in a single one. *

* The charset to encode the specified text into a byte array and the * encoding to use for the encoded-word are detected automatically. *

* This method assumes that zero characters have already been used up in the * current line. * * @param text * text to encode. * @param usage * whether the encoded-word is to be used to replace a text token * or a word entity (see RFC 822). * @return the encoded word (or sequence of encoded words if the given text * does not fit in a single encoded word). * @see #hasToBeEncoded(String, int) */ public static String encodeEncodedWord(String text, Usage usage) { return encodeEncodedWord(text, usage, 0, null, null); } /** * Encodes the specified text into an encoded word or a sequence of encoded * words separated by space. The text is separated into a sequence of * encoded words if it does not fit in a single one. *

* The charset to encode the specified text into a byte array and the * encoding to use for the encoded-word are detected automatically. * * @param text * text to encode. * @param usage * whether the encoded-word is to be used to replace a text token * or a word entity (see RFC 822). * @param usedCharacters * number of characters already used up (0 <= usedCharacters <= 50). * @return the encoded word (or sequence of encoded words if the given text * does not fit in a single encoded word). * @see #hasToBeEncoded(String, int) */ public static String encodeEncodedWord(String text, Usage usage, int usedCharacters) { return encodeEncodedWord(text, usage, usedCharacters, null, null); } /** * Encodes the specified text into an encoded word or a sequence of encoded * words separated by space. The text is separated into a sequence of * encoded words if it does not fit in a single one. * * @param text * text to encode. * @param usage * whether the encoded-word is to be used to replace a text token * or a word entity (see RFC 822). * @param usedCharacters * number of characters already used up (0 <= usedCharacters <= 50). * @param charset * the Java charset that should be used to encode the specified * string into a byte array. A suitable charset is detected * automatically if this parameter is null. * @param encoding * the encoding to use for the encoded-word (either B or Q). A * suitable encoding is automatically chosen if this parameter is * null. * @return the encoded word (or sequence of encoded words if the given text * does not fit in a single encoded word). * @see #hasToBeEncoded(String, int) */ public static String encodeEncodedWord(String text, Usage usage, int usedCharacters, Charset charset, Encoding encoding) { if (text == null) throw new IllegalArgumentException(); if (usedCharacters < 0 || usedCharacters > MAX_USED_CHARACTERS) throw new IllegalArgumentException(); if (charset == null) charset = determineCharset(text); byte[] bytes = encode(text, charset); if (encoding == null) encoding = determineEncoding(bytes, usage); if (encoding == Encoding.B) { String prefix = ENC_WORD_PREFIX + charset.name() + "?B?"; return encodeB(prefix, text, usedCharacters, charset, bytes); } else { String prefix = ENC_WORD_PREFIX + charset.name() + "?Q?"; return encodeQ(prefix, text, usage, usedCharacters, charset, bytes); } } /** * Encodes the specified byte array using the B encoding defined in RFC * 2047. * * @param bytes * byte array to encode. * @return encoded string. */ public static String encodeB(byte[] bytes) { StringBuilder sb = new StringBuilder(); int idx = 0; final int end = bytes.length; for (; idx < end - 2; idx += 3) { int data = (bytes[idx] & 0xff) << 16 | (bytes[idx + 1] & 0xff) << 8 | bytes[idx + 2] & 0xff; sb.append((char) BASE64_TABLE[data >> 18 & 0x3f]); sb.append((char) BASE64_TABLE[data >> 12 & 0x3f]); sb.append((char) BASE64_TABLE[data >> 6 & 0x3f]); sb.append((char) BASE64_TABLE[data & 0x3f]); } if (idx == end - 2) { int data = (bytes[idx] & 0xff) << 16 | (bytes[idx + 1] & 0xff) << 8; sb.append((char) BASE64_TABLE[data >> 18 & 0x3f]); sb.append((char) BASE64_TABLE[data >> 12 & 0x3f]); sb.append((char) BASE64_TABLE[data >> 6 & 0x3f]); sb.append(BASE64_PAD); } else if (idx == end - 1) { int data = (bytes[idx] & 0xff) << 16; sb.append((char) BASE64_TABLE[data >> 18 & 0x3f]); sb.append((char) BASE64_TABLE[data >> 12 & 0x3f]); sb.append(BASE64_PAD); sb.append(BASE64_PAD); } return sb.toString(); } /** * Encodes the specified byte array using the Q encoding defined in RFC * 2047. * * @param bytes * byte array to encode. * @param usage * whether the encoded-word is to be used to replace a text token * or a word entity (see RFC 822). * @return encoded string. */ public static String encodeQ(byte[] bytes, Usage usage) { BitSet qChars = usage == Usage.TEXT_TOKEN ? Q_REGULAR_CHARS : Q_RESTRICTED_CHARS; StringBuilder sb = new StringBuilder(); final int end = bytes.length; for (int idx = 0; idx < end; idx++) { int v = bytes[idx] & 0xff; if (v == 32) { sb.append('_'); } else if (!qChars.get(v)) { sb.append('='); sb.append(hexDigit(v >>> 4)); sb.append(hexDigit(v & 0xf)); } else { sb.append((char) v); } } return sb.toString(); } /** * Tests whether the specified string is a token as defined in RFC 2045 * section 5.1. * * @param str * string to test. * @return true if the specified string is a RFC 2045 token, * false otherwise. */ public static boolean isToken(String str) { // token := 1* // tspecials := "(" / ")" / "<" / ">" / "@" / "," / ";" / ":" / "\" / // <"> / "/" / "[" / "]" / "?" / "=" // CTL := 0.- 31., 127. final int length = str.length(); if (length == 0) return false; for (int idx = 0; idx < length; idx++) { char ch = str.charAt(idx); if (!TOKEN_CHARS.get(ch)) return false; } return true; } private static boolean isAtomPhrase(String str) { // atom = [CFWS] 1*atext [CFWS] boolean containsAText = false; final int length = str.length(); for (int idx = 0; idx < length; idx++) { char ch = str.charAt(idx); if (ATEXT_CHARS.get(ch)) { containsAText = true; } else if (!CharsetUtil.isWhitespace(ch)) { return false; } } return containsAText; } // RFC 5322 section 3.2.3 private static boolean isDotAtomText(String str) { // dot-atom-text = 1*atext *("." 1*atext) // atext = ALPHA / DIGIT / "!" / "#" / "$" / "%" / "&" / "'" / "*" / // "+" / "-" / "/" / "=" / "?" / "^" / "_" / "`" / "{" / "|" / "}" / "~" char prev = '.'; final int length = str.length(); if (length == 0) return false; for (int idx = 0; idx < length; idx++) { char ch = str.charAt(idx); if (ch == '.') { if (prev == '.' || idx == length - 1) return false; } else { if (!ATEXT_CHARS.get(ch)) return false; } prev = ch; } return true; } // RFC 5322 section 3.2.4 private static String quote(String str) { // quoted-string = [CFWS] DQUOTE *([FWS] qcontent) [FWS] DQUOTE [CFWS] // qcontent = qtext / quoted-pair // qtext = %d33 / %d35-91 / %d93-126 // quoted-pair = ("\" (VCHAR / WSP)) // VCHAR = %x21-7E // DQUOTE = %x22 String escaped = str.replaceAll("[\\\\\"]", "\\\\$0"); return "\"" + escaped + "\""; } private static String encodeB(String prefix, String text, int usedCharacters, Charset charset, byte[] bytes) { int encodedLength = bEncodedLength(bytes); int totalLength = prefix.length() + encodedLength + ENC_WORD_SUFFIX.length(); if (totalLength <= ENCODED_WORD_MAX_LENGTH - usedCharacters) { return prefix + encodeB(bytes) + ENC_WORD_SUFFIX; } else { String part1 = text.substring(0, text.length() / 2); byte[] bytes1 = encode(part1, charset); String word1 = encodeB(prefix, part1, usedCharacters, charset, bytes1); String part2 = text.substring(text.length() / 2); byte[] bytes2 = encode(part2, charset); String word2 = encodeB(prefix, part2, 0, charset, bytes2); return word1 + " " + word2; } } private static int bEncodedLength(byte[] bytes) { return (bytes.length + 2) / 3 * 4; } private static String encodeQ(String prefix, String text, Usage usage, int usedCharacters, Charset charset, byte[] bytes) { int encodedLength = qEncodedLength(bytes, usage); int totalLength = prefix.length() + encodedLength + ENC_WORD_SUFFIX.length(); if (totalLength <= ENCODED_WORD_MAX_LENGTH - usedCharacters) { return prefix + encodeQ(bytes, usage) + ENC_WORD_SUFFIX; } else { String part1 = text.substring(0, text.length() / 2); byte[] bytes1 = encode(part1, charset); String word1 = encodeQ(prefix, part1, usage, usedCharacters, charset, bytes1); String part2 = text.substring(text.length() / 2); byte[] bytes2 = encode(part2, charset); String word2 = encodeQ(prefix, part2, usage, 0, charset, bytes2); return word1 + " " + word2; } } private static int qEncodedLength(byte[] bytes, Usage usage) { BitSet qChars = usage == Usage.TEXT_TOKEN ? Q_REGULAR_CHARS : Q_RESTRICTED_CHARS; int count = 0; for (int idx = 0; idx < bytes.length; idx++) { int v = bytes[idx] & 0xff; if (v == 32) { count++; } else if (!qChars.get(v)) { count += 3; } else { count++; } } return count; } private static byte[] encode(String text, Charset charset) { ByteBuffer buffer = charset.encode(text); byte[] bytes = new byte[buffer.limit()]; buffer.get(bytes); return bytes; } private static Charset determineCharset(String text) { // it is an important property of iso-8859-1 that it directly maps // unicode code points 0000 to 00ff to byte values 00 to ff. boolean ascii = true; final int len = text.length(); for (int index = 0; index < len; index++) { char ch = text.charAt(index); if (ch > 0xff) { return CharsetUtil.UTF_8; } if (ch > 0x7f) { ascii = false; } } return ascii ? CharsetUtil.US_ASCII : CharsetUtil.ISO_8859_1; } private static Encoding determineEncoding(byte[] bytes, Usage usage) { if (bytes.length == 0) return Encoding.Q; BitSet qChars = usage == Usage.TEXT_TOKEN ? Q_REGULAR_CHARS : Q_RESTRICTED_CHARS; int qEncoded = 0; for (int i = 0; i < bytes.length; i++) { int v = bytes[i] & 0xff; if (v != 32 && !qChars.get(v)) { qEncoded++; } } int percentage = qEncoded * 100 / bytes.length; return percentage > 30 ? Encoding.B : Encoding.Q; } private static char hexDigit(int i) { return i < 10 ? (char) (i + '0') : (char) (i - 10 + 'A'); } } apache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/codec/DecoderUtil.java0000644000000000000000000002315111702050540030265 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.codec; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.nio.charset.Charset; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.james.mime4j.util.CharsetUtil; /** * Static methods for decoding strings, byte arrays and encoded words. */ public class DecoderUtil { private static final Pattern PATTERN_ENCODED_WORD = Pattern.compile( "(.*?)=\\?(.+?)\\?(\\w)\\?(.+?)\\?=", Pattern.DOTALL); /** * Decodes a string containing quoted-printable encoded data. * * @param s the string to decode. * @return the decoded bytes. */ private static byte[] decodeQuotedPrintable(String s, DecodeMonitor monitor) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); try { byte[] bytes = s.getBytes("US-ASCII"); QuotedPrintableInputStream is = new QuotedPrintableInputStream( new ByteArrayInputStream(bytes), monitor); int b = 0; while ((b = is.read()) != -1) { baos.write(b); } } catch (IOException e) { // This should never happen! throw new IllegalStateException(e); } return baos.toByteArray(); } /** * Decodes a string containing base64 encoded data. * * @param s the string to decode. * @param monitor * @return the decoded bytes. */ private static byte[] decodeBase64(String s, DecodeMonitor monitor) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); try { byte[] bytes = s.getBytes("US-ASCII"); Base64InputStream is = new Base64InputStream( new ByteArrayInputStream(bytes), monitor); int b = 0; while ((b = is.read()) != -1) { baos.write(b); } } catch (IOException e) { // This should never happen! throw new IllegalStateException(e); } return baos.toByteArray(); } /** * Decodes an encoded text encoded with the 'B' encoding (described in * RFC 2047) found in a header field body. * * @param encodedText the encoded text to decode. * @param charset the Java charset to use. * @param monitor * @return the decoded string. * @throws UnsupportedEncodingException if the given Java charset isn't * supported. */ static String decodeB(String encodedText, String charset, DecodeMonitor monitor) throws UnsupportedEncodingException { byte[] decodedBytes = decodeBase64(encodedText, monitor); return new String(decodedBytes, charset); } /** * Decodes an encoded text encoded with the 'Q' encoding (described in * RFC 2047) found in a header field body. * * @param encodedText the encoded text to decode. * @param charset the Java charset to use. * @return the decoded string. * @throws UnsupportedEncodingException if the given Java charset isn't * supported. */ static String decodeQ(String encodedText, String charset, DecodeMonitor monitor) throws UnsupportedEncodingException { encodedText = replaceUnderscores(encodedText); byte[] decodedBytes = decodeQuotedPrintable(encodedText, monitor); return new String(decodedBytes, charset); } static String decodeEncodedWords(String body) { return decodeEncodedWords(body, DecodeMonitor.SILENT); } /** * Decodes a string containing encoded words as defined by RFC 2047. Encoded * words have the form =?charset?enc?encoded-text?= where enc is either 'Q' * or 'q' for quoted-printable and 'B' or 'b' for base64. * * @param body the string to decode * @param monitor the DecodeMonitor to be used. * @return the decoded string. * @throws IllegalArgumentException only if the DecodeMonitor strategy throws it (Strict parsing) */ public static String decodeEncodedWords(String body, DecodeMonitor monitor) throws IllegalArgumentException { int tailIndex = 0; boolean lastMatchValid = false; StringBuilder sb = new StringBuilder(); for (Matcher matcher = PATTERN_ENCODED_WORD.matcher(body); matcher.find();) { String separator = matcher.group(1); String mimeCharset = matcher.group(2); String encoding = matcher.group(3); String encodedText = matcher.group(4); String decoded = null; decoded = tryDecodeEncodedWord(mimeCharset, encoding, encodedText, monitor); if (decoded == null) { sb.append(matcher.group(0)); } else { if (!lastMatchValid || !CharsetUtil.isWhitespace(separator)) { sb.append(separator); } sb.append(decoded); } tailIndex = matcher.end(); lastMatchValid = decoded != null; } if (tailIndex == 0) { return body; } else { sb.append(body.substring(tailIndex)); return sb.toString(); } } // return null on error private static String tryDecodeEncodedWord(final String mimeCharset, final String encoding, final String encodedText, final DecodeMonitor monitor) { Charset charset = CharsetUtil.lookup(mimeCharset); if (charset == null) { monitor(monitor, mimeCharset, encoding, encodedText, "leaving word encoded", "Mime charser '", mimeCharset, "' doesn't have a corresponding Java charset"); return null; } if (encodedText.length() == 0) { monitor(monitor, mimeCharset, encoding, encodedText, "leaving word encoded", "Missing encoded text in encoded word"); return null; } try { if (encoding.equalsIgnoreCase("Q")) { return DecoderUtil.decodeQ(encodedText, charset.name(), monitor); } else if (encoding.equalsIgnoreCase("B")) { return DecoderUtil.decodeB(encodedText, charset.name(), monitor); } else { monitor(monitor, mimeCharset, encoding, encodedText, "leaving word encoded", "Warning: Unknown encoding in encoded word"); return null; } } catch (UnsupportedEncodingException e) { // should not happen because of isDecodingSupported check above monitor(monitor, mimeCharset, encoding, encodedText, "leaving word encoded", "Unsupported encoding (", e.getMessage(), ") in encoded word"); return null; } catch (RuntimeException e) { monitor(monitor, mimeCharset, encoding, encodedText, "leaving word encoded", "Could not decode (", e.getMessage(), ") encoded word"); return null; } } private static void monitor(DecodeMonitor monitor, String mimeCharset, String encoding, String encodedText, String dropDesc, String... strings) throws IllegalArgumentException { if (monitor.isListening()) { String encodedWord = recombine(mimeCharset, encoding, encodedText); StringBuilder text = new StringBuilder(); for (String str : strings) { text.append(str); } text.append(" ("); text.append(encodedWord); text.append(")"); String exceptionDesc = text.toString(); if (monitor.warn(exceptionDesc, dropDesc)) throw new IllegalArgumentException(text.toString()); } } private static String recombine(final String mimeCharset, final String encoding, final String encodedText) { return "=?" + mimeCharset + "?" + encoding + "?" + encodedText + "?="; } // Replace _ with =20 private static String replaceUnderscores(String str) { // probably faster than String#replace(CharSequence, CharSequence) StringBuilder sb = new StringBuilder(128); for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); if (c == '_') { sb.append("=20"); } else { sb.append(c); } } return sb.toString(); } } apache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/io/0000755000000000000000000000000011702050536024554 5ustar rootroot././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootapache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/io/EOLConvertingInputStream.javaapache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/io/EOLConvertingInputStream.j0000644000000000000000000000703611702050536031607 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.io; import java.io.IOException; import java.io.InputStream; import java.io.PushbackInputStream; /** * InputStream which converts \r * bytes not followed by \n and \n not * preceded by \r to \r\n. */ public class EOLConvertingInputStream extends InputStream { /** Converts single '\r' to '\r\n' */ public static final int CONVERT_CR = 1; /** Converts single '\n' to '\r\n' */ public static final int CONVERT_LF = 2; /** Converts single '\r' and '\n' to '\r\n' */ public static final int CONVERT_BOTH = 3; private PushbackInputStream in = null; private int previous = 0; private int flags = CONVERT_BOTH; /** * Creates a new EOLConvertingInputStream * instance converting bytes in the given InputStream. * The flag CONVERT_BOTH is the default. * * @param in the InputStream to read from. */ public EOLConvertingInputStream(InputStream in) { this(in, CONVERT_BOTH); } /** * Creates a new EOLConvertingInputStream * instance converting bytes in the given InputStream. * * @param in the InputStream to read from. * @param flags one of CONVERT_CR, CONVERT_LF or * CONVERT_BOTH. */ public EOLConvertingInputStream(InputStream in, int flags) { super(); this.in = new PushbackInputStream(in, 2); this.flags = flags; } /** * Closes the underlying stream. * * @throws IOException on I/O errors. */ @Override public void close() throws IOException { in.close(); } /** * @see java.io.InputStream#read() */ @Override public int read() throws IOException { int b = in.read(); if (b == -1) { return -1; } if ((flags & CONVERT_CR) != 0 && b == '\r') { int c = in.read(); if (c != -1) { in.unread(c); } if (c != '\n') { in.unread('\n'); } } else if ((flags & CONVERT_LF) != 0 && b == '\n' && previous != '\r') { b = '\r'; in.unread('\n'); } previous = b; return b; } } apache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/io/MaxLineLimitException.java0000644000000000000000000000304511702050536031634 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.io; import java.io.IOException; /** * Signals an I/O error due to a line exceeding the limit on the maximum line * length. */ public class MaxLineLimitException extends IOException { private static final long serialVersionUID = 1855987166990764426L; public MaxLineLimitException(final String message) { super(message); } } apache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/io/LineNumberInputStream.java0000644000000000000000000000444011702050536031655 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.io; import java.io.FilterInputStream; import java.io.IOException; import java.io.InputStream; /** * InputStream used by the parser to wrap the original user * supplied stream. This stream keeps track of the current line number. */ public class LineNumberInputStream extends FilterInputStream implements LineNumberSource { private int lineNumber = 1; /** * Creates a new LineNumberInputStream. * * @param is * the stream to read from. */ public LineNumberInputStream(InputStream is) { super(is); } public int getLineNumber() { return lineNumber; } @Override public int read() throws IOException { int b = in.read(); if (b == '\n') { lineNumber++; } return b; } @Override public int read(byte[] b, int off, int len) throws IOException { int n = in.read(b, off, len); for (int i = off; i < off + n; i++) { if (b[i] == '\n') { lineNumber++; } } return n; } } apache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/io/PositionInputStream.java0000644000000000000000000000513711702050536031425 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.io; import java.io.FilterInputStream; import java.io.InputStream; import java.io.IOException; public class PositionInputStream extends FilterInputStream { protected long position = 0; private long markedPosition = 0; public PositionInputStream(InputStream inputStream) { super(inputStream); } public long getPosition() { return position; } @Override public int available() throws IOException { return in.available(); } @Override public int read() throws IOException { int b = in.read(); if (b != -1) position++; return b; } @Override public void close() throws IOException { in.close(); } @Override public void reset() throws IOException { in.reset(); position = markedPosition; } @Override public boolean markSupported() { return in.markSupported(); } @Override public void mark(int readlimit) { in.mark(readlimit); markedPosition = position; } @Override public long skip(long n) throws IOException { final long c = in.skip(n); if (c > 0) position += c; return c; } @Override public int read(byte b[], int off, int len) throws IOException { final int c = in.read(b, off, len); if (c > 0) position += c; return c; } } ././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/io/BufferedLineReaderInputStream.javaapache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/io/BufferedLineReaderInputStr0000644000000000000000000002632011702050536031670 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.io; import org.apache.james.mime4j.util.ByteArrayBuffer; import java.io.IOException; import java.io.InputStream; /** * Input buffer that can be used to search for patterns using Quick Search * algorithm in data read from an {@link InputStream}. */ public class BufferedLineReaderInputStream extends LineReaderInputStream { private boolean truncated; boolean tempBuffer = false; private byte[] origBuffer; private int origBufpos; private int origBuflen; private byte[] buffer; private int bufpos; private int buflen; private final int maxLineLen; public BufferedLineReaderInputStream( final InputStream instream, int buffersize, int maxLineLen) { super(instream); if (instream == null) { throw new IllegalArgumentException("Input stream may not be null"); } if (buffersize <= 0) { throw new IllegalArgumentException("Buffer size may not be negative or zero"); } this.buffer = new byte[buffersize]; this.bufpos = 0; this.buflen = 0; this.maxLineLen = maxLineLen; this.truncated = false; } public BufferedLineReaderInputStream( final InputStream instream, int buffersize) { this(instream, buffersize, -1); } private void expand(int newlen) { byte newbuffer[] = new byte[newlen]; int len = bufferLen(); if (len > 0) { System.arraycopy(this.buffer, this.bufpos, newbuffer, this.bufpos, len); } this.buffer = newbuffer; } public void ensureCapacity(int len) { if (len > this.buffer.length) { expand(len); } } public int fillBuffer() throws IOException { if (tempBuffer) { // we was on tempBuffer. // check that we completed the tempBuffer if (bufpos != buflen) throw new IllegalStateException("unread only works when a buffer is fully read before the next refill is asked!"); // restore the original buffer buffer = origBuffer; buflen = origBuflen; bufpos = origBufpos; tempBuffer = false; // return that we just read bufferLen data. return bufferLen(); } // compact the buffer if necessary if (this.bufpos > 0) { // could swtich to (this.buffer.length / 2) but needs a 4*boundary capacity, then (instead of 2). int len = bufferLen(); if (len > 0) { System.arraycopy(this.buffer, this.bufpos, this.buffer, 0, len); } this.bufpos = 0; this.buflen = len; } int l; int off = this.buflen; int len = this.buffer.length - off; l = in.read(this.buffer, off, len); if (l == -1) { return -1; } else { this.buflen = off + l; return l; } } private int bufferLen() { return this.buflen - this.bufpos; } public boolean hasBufferedData() { return bufferLen() > 0; } public void truncate() { clear(); this.truncated = true; } protected boolean readAllowed() { return !this.truncated; } @Override public int read() throws IOException { if (!readAllowed()) return -1; int noRead = 0; while (!hasBufferedData()) { noRead = fillBuffer(); if (noRead == -1) { return -1; } } return this.buffer[this.bufpos++] & 0xff; } @Override public int read(final byte[] b, int off, int len) throws IOException { if (!readAllowed()) return -1; if (b == null) { return 0; } int noRead = 0; while (!hasBufferedData()) { noRead = fillBuffer(); if (noRead == -1) { return -1; } } int chunk = bufferLen(); if (chunk > len) { chunk = len; } System.arraycopy(this.buffer, this.bufpos, b, off, chunk); this.bufpos += chunk; return chunk; } @Override public int read(final byte[] b) throws IOException { if (!readAllowed()) return -1; if (b == null) { return 0; } return read(b, 0, b.length); } @Override public boolean markSupported() { return false; } @Override public int readLine(final ByteArrayBuffer dst) throws MaxLineLimitException, IOException { if (dst == null) { throw new IllegalArgumentException("Buffer may not be null"); } if (!readAllowed()) return -1; int total = 0; boolean found = false; int bytesRead = 0; while (!found) { if (!hasBufferedData()) { bytesRead = fillBuffer(); if (bytesRead == -1) { break; } } int i = indexOf((byte)'\n'); int chunk; if (i != -1) { found = true; chunk = i + 1 - pos(); } else { chunk = length(); } if (chunk > 0) { dst.append(buf(), pos(), chunk); skip(chunk); total += chunk; } if (this.maxLineLen > 0 && dst.length() >= this.maxLineLen) { throw new MaxLineLimitException("Maximum line length limit exceeded"); } } if (total == 0 && bytesRead == -1) { return -1; } else { return total; } } /** * Implements quick search algorithm as published by *

* SUNDAY D.M., 1990, * A very fast substring search algorithm, * Communications of the ACM . 33(8):132-142. *

*/ public int indexOf(final byte[] pattern, int off, int len) { if (pattern == null) { throw new IllegalArgumentException("Pattern may not be null"); } if (off < this.bufpos || len < 0 || off + len > this.buflen) { throw new IndexOutOfBoundsException("looking for "+off+"("+len+")"+" in "+bufpos+"/"+buflen); } if (len < pattern.length) { return -1; } int[] shiftTable = new int[256]; for (int i = 0; i < shiftTable.length; i++) { shiftTable[i] = pattern.length + 1; } for (int i = 0; i < pattern.length; i++) { int x = pattern[i] & 0xff; shiftTable[x] = pattern.length - i; } int j = 0; while (j <= len - pattern.length) { int cur = off + j; boolean match = true; for (int i = 0; i < pattern.length; i++) { if (this.buffer[cur + i] != pattern[i]) { match = false; break; } } if (match) { return cur; } int pos = cur + pattern.length; if (pos >= this.buffer.length) { break; } int x = this.buffer[pos] & 0xff; j += shiftTable[x]; } return -1; } /** * Implements quick search algorithm as published by *

* SUNDAY D.M., 1990, * A very fast substring search algorithm, * Communications of the ACM . 33(8):132-142. *

*/ public int indexOf(final byte[] pattern) { return indexOf(pattern, this.bufpos, this.buflen - this.bufpos); } public int indexOf(byte b, int off, int len) { if (off < this.bufpos || len < 0 || off + len > this.buflen) { throw new IndexOutOfBoundsException(); } for (int i = off; i < off + len; i++) { if (this.buffer[i] == b) { return i; } } return -1; } public int indexOf(byte b) { return indexOf(b, this.bufpos, bufferLen()); } public int byteAt(int pos) { if (pos < this.bufpos || pos > this.buflen) { throw new IndexOutOfBoundsException("looking for "+pos+" in "+bufpos+"/"+buflen); } return this.buffer[pos] & 0xff; } protected byte[] buf() { return this.buffer; } protected int pos() { return this.bufpos; } protected int limit() { return this.buflen; } protected int length() { return bufferLen(); } public int capacity() { return this.buffer.length; } protected int skip(int n) { int chunk = Math.min(n, bufferLen()); this.bufpos += chunk; return chunk; } private void clear() { this.bufpos = 0; this.buflen = 0; } @Override public String toString() { StringBuilder buffer = new StringBuilder(); buffer.append("[pos: "); buffer.append(this.bufpos); buffer.append("]"); buffer.append("[limit: "); buffer.append(this.buflen); buffer.append("]"); buffer.append("["); for (int i = this.bufpos; i < this.buflen; i++) { buffer.append((char) this.buffer[i]); } buffer.append("]"); if (tempBuffer) { buffer.append("-ORIG[pos: "); buffer.append(this.origBufpos); buffer.append("]"); buffer.append("[limit: "); buffer.append(this.origBuflen); buffer.append("]"); buffer.append("["); for (int i = this.origBufpos; i < this.origBuflen; i++) { buffer.append((char) this.origBuffer[i]); } buffer.append("]"); } return buffer.toString(); } @Override public boolean unread(ByteArrayBuffer buf) { if (tempBuffer) return false; origBuffer = buffer; origBuflen = buflen; origBufpos = bufpos; bufpos = 0; buflen = buf.length(); buffer = buf.buffer(); tempBuffer = true; return true; } } ././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootapache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/io/LineReaderInputStreamAdaptor.javaapache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/io/LineReaderInputStreamAdapt0000644000000000000000000001054711702050536031666 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.io; import org.apache.james.mime4j.util.ByteArrayBuffer; import java.io.IOException; import java.io.InputStream; /** * InputStream used by the MIME parser to detect whether the * underlying data stream was used (read from) and whether the end of the * stream was reached. */ public class LineReaderInputStreamAdaptor extends LineReaderInputStream { private final LineReaderInputStream bis; private final int maxLineLen; private boolean used = false; private boolean eof = false; public LineReaderInputStreamAdaptor( final InputStream is, int maxLineLen) { super(is); if (is instanceof LineReaderInputStream) { this.bis = (LineReaderInputStream) is; } else { this.bis = null; } this.maxLineLen = maxLineLen; } public LineReaderInputStreamAdaptor( final InputStream is) { this(is, -1); } @Override public int read() throws IOException { int i = in.read(); this.eof = i == -1; this.used = true; return i; } @Override public int read(byte[] b, int off, int len) throws IOException { int i = in.read(b, off, len); this.eof = i == -1; this.used = true; return i; } @Override public int readLine(final ByteArrayBuffer dst) throws MaxLineLimitException, IOException { int i; if (this.bis != null) { i = this.bis.readLine(dst); } else { i = doReadLine(dst); } this.eof = i == -1; this.used = true; return i; } private int doReadLine(final ByteArrayBuffer dst) throws MaxLineLimitException, IOException { int total = 0; int ch; while ((ch = in.read()) != -1) { dst.append(ch); total++; if (this.maxLineLen > 0 && dst.length() >= this.maxLineLen) { throw new MaxLineLimitException("Maximum line length limit exceeded"); } if (ch == '\n') { break; } } if (total == 0 && ch == -1) { return -1; } else { return total; } } public boolean eof() { return this.eof; } public boolean isUsed() { return this.used; } @Override public String toString() { return "[LineReaderInputStreamAdaptor: " + bis + "]"; } @Override public boolean unread(ByteArrayBuffer buf) { if (bis != null) { return bis.unread(buf); } else { return false; } } @Override public long skip(long count) throws IOException { if (count <= 0) { return 0; // So specified by InputStream.skip(long). } final int bufferSize = count > 8192 ? 8192 : (int) count; final byte[] buffer = new byte[bufferSize]; long result = 0; while (count > 0) { int res = read(buffer); if (res == -1) { break; } result += res; count -= res; } return result; } } ././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/io/MaxHeaderLengthLimitException.javaapache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/io/MaxHeaderLengthLimitExcept0000644000000000000000000000310311702050536031644 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.io; import org.apache.james.mime4j.MimeException; /** * Signals a I/O error due to the total header length exceeding the maximum limit. */ public class MaxHeaderLengthLimitException extends MimeException { private static final long serialVersionUID = 8924290744274769913L; public MaxHeaderLengthLimitException(final String message) { super(message); } } ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootapache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/io/MimeBoundaryInputStream.javaapache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/io/MimeBoundaryInputStream.ja0000644000000000000000000002531011702050536031660 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.io; import org.apache.james.mime4j.MimeException; import org.apache.james.mime4j.MimeIOException; import org.apache.james.mime4j.util.ByteArrayBuffer; import org.apache.james.mime4j.util.CharsetUtil; import java.io.IOException; /** * Stream that constrains itself to a single MIME body part. * After the stream ends (i.e. read() returns -1) {@link #isLastPart()} * can be used to determine if a final boundary has been seen or not. */ public class MimeBoundaryInputStream extends LineReaderInputStream { private final byte[] boundary; private final boolean strict; private boolean eof; private int limit; private boolean atBoundary; private int boundaryLen; private boolean lastPart; private boolean completed; private BufferedLineReaderInputStream buffer; /** * Store the first buffer length. * Used to distinguish between an empty preamble and * no preamble. */ private int initialLength; /** * Creates a new MimeBoundaryInputStream. * * @param inbuffer The underlying stream. * @param boundary Boundary string (not including leading hyphens). * @throws IllegalArgumentException when boundary is too long */ public MimeBoundaryInputStream( final BufferedLineReaderInputStream inbuffer, final String boundary, final boolean strict) throws IOException { super(inbuffer); int bufferSize = 2 * boundary.length(); if (bufferSize < 4096) { bufferSize = 4096; } inbuffer.ensureCapacity(bufferSize); this.buffer = inbuffer; this.eof = false; this.limit = -1; this.atBoundary = false; this.boundaryLen = 0; this.lastPart = false; this.initialLength = -1; this.completed = false; this.strict = strict; this.boundary = new byte[boundary.length() + 2]; this.boundary[0] = (byte) '-'; this.boundary[1] = (byte) '-'; for (int i = 0; i < boundary.length(); i++) { byte ch = (byte) boundary.charAt(i); this.boundary[i + 2] = ch; } fillBuffer(); } /** * Creates a new MimeBoundaryInputStream. * * @param inbuffer The underlying stream. * @param boundary Boundary string (not including leading hyphens). * @throws IllegalArgumentException when boundary is too long */ public MimeBoundaryInputStream( final BufferedLineReaderInputStream inbuffer, final String boundary) throws IOException { this(inbuffer, boundary, false); } /** * Closes the underlying stream. * * @throws IOException on I/O errors. */ @Override public void close() throws IOException { } /** * @see java.io.InputStream#markSupported() */ @Override public boolean markSupported() { return false; } public boolean readAllowed() throws IOException { if (completed) { return false; } if (endOfStream() && !hasData()) { skipBoundary(); verifyEndOfStream(); return false; } return true; } /** * @see java.io.InputStream#read() */ @Override public int read() throws IOException { for (;;) { if (!readAllowed()) return -1; if (hasData()) { return buffer.read(); } fillBuffer(); } } @Override public int read(byte[] b, int off, int len) throws IOException { for (;;) { if (!readAllowed()) return -1; if (hasData()) { int chunk = Math.min(len, limit - buffer.pos()); return buffer.read(b, off, chunk); } fillBuffer(); } } @Override public int readLine(final ByteArrayBuffer dst) throws IOException { if (dst == null) { throw new IllegalArgumentException("Destination buffer may not be null"); } if (!readAllowed()) return -1; int total = 0; boolean found = false; int bytesRead = 0; while (!found) { if (!hasData()) { bytesRead = fillBuffer(); if (endOfStream() && !hasData()) { skipBoundary(); verifyEndOfStream(); bytesRead = -1; break; } } int len = this.limit - this.buffer.pos(); int i = this.buffer.indexOf((byte)'\n', this.buffer.pos(), len); int chunk; if (i != -1) { found = true; chunk = i + 1 - this.buffer.pos(); } else { chunk = len; } if (chunk > 0) { dst.append(this.buffer.buf(), this.buffer.pos(), chunk); this.buffer.skip(chunk); total += chunk; } } if (total == 0 && bytesRead == -1) { return -1; } else { return total; } } private void verifyEndOfStream() throws IOException { if (strict && eof && !atBoundary) { throw new MimeIOException(new MimeException("Unexpected end of stream")); } } private boolean endOfStream() { return eof || atBoundary; } private boolean hasData() { return limit > buffer.pos() && limit <= buffer.limit(); } private int fillBuffer() throws IOException { if (eof) { return -1; } int bytesRead; if (!hasData()) { bytesRead = buffer.fillBuffer(); if (bytesRead == -1) { eof = true; } } else { bytesRead = 0; } int i; int off = buffer.pos(); for (;;) { i = buffer.indexOf(boundary, off, buffer.limit() - off); if (i == -1) { break; } // Make sure the boundary is either at the very beginning of the buffer // or preceded with LF if (i == buffer.pos() || buffer.byteAt(i - 1) == '\n') { int pos = i + boundary.length; int remaining = buffer.limit() - pos; if (remaining <= 0) { // Make sure the boundary is terminated with EOS break; } else { // or with a whitespace or '-' char char ch = (char)(buffer.byteAt(pos)); if (CharsetUtil.isWhitespace(ch) || ch == '-') { break; } } } off = i + boundary.length; } if (i != -1) { limit = i; atBoundary = true; calculateBoundaryLen(); } else { if (eof) { limit = buffer.limit(); } else { limit = buffer.limit() - (boundary.length + 2); // [LF] [boundary] [CR][LF] minus one char } } return bytesRead; } public boolean isEmptyStream() { return initialLength == 0; } public boolean isFullyConsumed() { return completed && !buffer.hasBufferedData(); } private void calculateBoundaryLen() throws IOException { boundaryLen = boundary.length; int len = limit - buffer.pos(); if (len >= 0 && initialLength == -1) initialLength = len; if (len > 0) { if (buffer.byteAt(limit - 1) == '\n') { boundaryLen++; limit--; } } if (len > 1) { if (buffer.byteAt(limit - 1) == '\r') { boundaryLen++; limit--; } } } private void skipBoundary() throws IOException { if (!completed) { completed = true; buffer.skip(boundaryLen); boolean checkForLastPart = true; for (;;) { if (buffer.length() > 1) { int ch1 = buffer.byteAt(buffer.pos()); int ch2 = buffer.byteAt(buffer.pos() + 1); if (checkForLastPart) if (ch1 == '-' && ch2 == '-') { this.lastPart = true; buffer.skip(2); checkForLastPart = false; continue; } if (ch1 == '\r' && ch2 == '\n') { buffer.skip(2); break; } else if (ch1 == '\n') { buffer.skip(1); break; } else { // ignoring everything in a line starting with a boundary. buffer.skip(1); } } else { if (eof) { break; } fillBuffer(); } } } } public boolean isLastPart() { return lastPart; } public boolean eof() { return eof && !buffer.hasBufferedData(); } @Override public String toString() { final StringBuilder buffer = new StringBuilder("MimeBoundaryInputStream, boundary "); for (byte b : boundary) { buffer.append((char) b); } return buffer.toString(); } @Override public boolean unread(ByteArrayBuffer buf) { return false; } } ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootapache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/io/MaxHeaderLimitException.javaapache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/io/MaxHeaderLimitException.ja0000644000000000000000000000306011702050536031603 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.io; import org.apache.james.mime4j.MimeException; /** * Signals a I/O error due to the header count exceeding the maximum limit. */ public class MaxHeaderLimitException extends MimeException { private static final long serialVersionUID = 2154269045186186769L; public MaxHeaderLimitException(final String message) { super(message); } } apache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/io/LimitedInputStream.java0000644000000000000000000000451011702050536031202 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.io; import java.io.InputStream; import java.io.IOException; public class LimitedInputStream extends PositionInputStream { private final long limit; public LimitedInputStream(InputStream instream, long limit) { super(instream); if (limit < 0) { throw new IllegalArgumentException("Limit may not be negative"); } this.limit = limit; } private void enforceLimit() throws IOException { if (position >= limit) { throw new IOException("Input stream limit exceeded"); } } @Override public int read() throws IOException { enforceLimit(); return super.read(); } @Override public int read(byte b[], int off, int len) throws IOException { enforceLimit(); len = Math.min(len, getBytesLeft()); return super.read(b, off, len); } @Override public long skip(long n) throws IOException { enforceLimit(); n = Math.min(n, getBytesLeft()); return super.skip(n); } private int getBytesLeft() { return (int)Math.min(Integer.MAX_VALUE, limit - position); } } apache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/io/LineNumberSource.java0000644000000000000000000000267011702050536030645 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.io; public interface LineNumberSource { /** * Gets the current line number starting at 1 (the number of * \r\n read so far plus 1). * * @return the current line number. */ int getLineNumber(); } apache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/io/LineReaderInputStream.java0000644000000000000000000000501211702050536031623 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.io; import org.apache.james.mime4j.util.ByteArrayBuffer; import java.io.FilterInputStream; import java.io.IOException; import java.io.InputStream; /** * Input stream capable of reading lines of text. */ public abstract class LineReaderInputStream extends FilterInputStream { protected LineReaderInputStream(InputStream in) { super(in); } /** * Reads one line of text into the given {@link ByteArrayBuffer}. * * @param dst Destination * @return number of bytes copied or -1 if the end of * the stream has been reached. * * @throws MaxLineLimitException if the line exceeds a limit on * the line length imposed by a subclass. * @throws IOException in case of an I/O error. */ public abstract int readLine(final ByteArrayBuffer dst) throws MaxLineLimitException, IOException; /** * Tries to unread the last read line. * * Implementation may refuse to unread a new buffer until the previous * unread one has been competely consumed. * * Implementations will directly use the byte array backed by buf, so * make sure to not alter it anymore once this method has been called. * * @return true if the unread has been succesfull. */ public abstract boolean unread(ByteArrayBuffer buf); } apache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/stream/0000755000000000000000000000000011702050540025433 5ustar rootrootapache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/stream/MimeConfig.java0000644000000000000000000002206711702050540030322 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.stream; import org.apache.james.mime4j.MimeException; /** * Properties used to configure the behavior of MIME stream parsers. */ public final class MimeConfig implements Cloneable { private boolean strictParsing; private int maxLineLen; private int maxHeaderCount; private int maxHeaderLen; private long maxContentLen; private boolean countLineNumbers; private String headlessParsing; private boolean malformedHeaderStartsBody; public MimeConfig() { this.strictParsing = false; this.countLineNumbers = false; this.malformedHeaderStartsBody = false; this.maxLineLen = 1000; this.maxHeaderCount = 1000; this.maxHeaderLen = 10000; this.maxContentLen = -1; this.headlessParsing = null; } /** * @see #setMalformedHeaderStartsBody(boolean) * * @return true if malformed header should "end" the headers and be part of * the body */ public boolean isMalformedHeaderStartsBody() { return malformedHeaderStartsBody; } /** * Define the behaviour for dealing with malformed headers while in lenient * mode * * @param malformedHeaderStartsBody * true to make the parser interpret a malformed * header as end of the headers and as part of the body (as if * the CRLF separator was missing). false to simply * ignore malformed headers and continue parsing headers from the * following line. */ public void setMalformedHeaderStartsBody(boolean malformedHeaderStartsBody) { this.malformedHeaderStartsBody = malformedHeaderStartsBody; } /** * Returns the value of the strict parsing mode * * @see #setStrictParsing(boolean) * * @return value of the strict parsing mode */ public boolean isStrictParsing() { return this.strictParsing; } /** * Defines whether minor violations of the MIME specification should be * tolerated or should result in a {@link MimeException}. If this parameter * is set to true, a strict interpretation of the MIME * specification will be enforced, If this parameter is set to * false minor violations will result in a warning in the log. *

* Default value: false * * @param strictParsing * value of the strict parsing mode */ public void setStrictParsing(boolean strictParsing) { this.strictParsing = strictParsing; } /** * Returns the maximum line length limit * * @see #setMaxLineLen(int) * * @return value of the the maximum line length limit */ public int getMaxLineLen() { return this.maxLineLen; } /** * Sets the maximum line length limit. Parsing of a MIME entity will be * terminated with a {@link MimeException} if a line is encountered that * exceeds the maximum length limit. If this parameter is set to a non * positive value the line length check will be disabled. *

* Default value: 1000 * * @param maxLineLen * maximum line length limit */ public void setMaxLineLen(int maxLineLen) { this.maxLineLen = maxLineLen; } /** * Returns the maximum header limit * * @see #setMaxHeaderCount(int) * * @return value of the the maximum header limit */ public int getMaxHeaderCount() { return this.maxHeaderCount; } /** * Sets the maximum header limit. Parsing of a MIME entity will be * terminated with a {@link MimeException} if the number of headers exceeds * the maximum limit. If this parameter is set to a non positive value the * header limit check will be disabled. *

* Default value: 1000 * * @param maxHeaderCount * maximum header limit */ public void setMaxHeaderCount(int maxHeaderCount) { this.maxHeaderCount = maxHeaderCount; } /** * Returns the maximum header length limit * * @see #setMaxHeaderLen(int) * * @return value of the maximum header length limit */ public int getMaxHeaderLen() { return maxHeaderLen; } /** * Sets the maximum header length limit. Parsing of a MIME entity will be * terminated with a {@link MimeException} if the total length of a header * exceeds this limit. If this parameter is set to a non positive value the * header length check will be disabled. *

* A message header may be folded across multiple lines. This configuration * parameter is used to limit the total length of a header, i.e. the sum of * the length of all lines the header spans across (including line * terminators). *

* Default value: 10000 * * @param maxHeaderLen * maximum header length limit */ public void setMaxHeaderLen(int maxHeaderLen) { this.maxHeaderLen = maxHeaderLen; } /** * Returns the maximum content length limit * * @see #setMaxContentLen(long) * * @return value of the the maximum content length limit */ public long getMaxContentLen() { return maxContentLen; } /** * Sets the maximum content length limit. Parsing of a MIME entity will be * terminated with a {@link MimeException} if a content body exceeds the * maximum length limit. If this parameter is set to a non positive value * the content length check will be disabled. *

* Default value: -1 * * @param maxContentLen * maximum content length limit */ public void setMaxContentLen(long maxContentLen) { this.maxContentLen = maxContentLen; } /** * Returns the value of the line number counting mode. * * @return value of the line number counting mode. */ public boolean isCountLineNumbers() { return countLineNumbers; } /** * Defines whether the parser should count line numbers. If enabled line * numbers are included in the debug output. *

* Default value: false * * @param countLineNumbers * value of the line number counting mode. */ public void setCountLineNumbers(boolean countLineNumbers) { this.countLineNumbers = countLineNumbers; } /** * Returns the value of the default content type. When not null, indicates * that the parsing should be headless. * * @return default content type when parsing headless, null otherwise * @see org.apache.james.mime4j.parser.MimeStreamParser#parse(java.io.InputStream) */ public String getHeadlessParsing() { return headlessParsing; } /** * Defines a default content type. When not null, indicates that the parsing * should be headless. *

* Default value: null * * @param contentType * value of the default content type when parsing headless, null * otherwise * @see org.apache.james.mime4j.parser.MimeStreamParser#parse(java.io.InputStream) */ public void setHeadlessParsing(String contentType) { this.headlessParsing = contentType; } @Override public MimeConfig clone() { try { return (MimeConfig) super.clone(); } catch (CloneNotSupportedException e) { // this shouldn't happen, since we are Cloneable throw new InternalError(); } } @Override public String toString() { return "[strict parsing: " + strictParsing + ", max line length: " + maxLineLen + ", max header count: " + maxHeaderCount + ", max content length: " + maxContentLen + ", count line numbers: " + countLineNumbers + "]"; } } ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/stream/EntityStateMachine.javaapache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/stream/EntityStateMachine.jav0000644000000000000000000000771411702050540031710 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.stream; import org.apache.james.mime4j.MimeException; import java.io.IOException; import java.io.InputStream; /** * Represents the interal state of a MIME entity, which is being retrieved * from an input stream by a MIME parser. */ public interface EntityStateMachine { /** * Return the current state of the entity. * * @see EntityState * * @return current state */ EntityState getState(); /** * Sets the current recursion mode. * The recursion mode specifies the approach taken to parsing parts. * {@link RecursionMode#M_RAW} mode does not parse the part at all. * {@link RecursionMode#M_RECURSE} mode recursively parses each mail * when an message/rfc822 part is encounted; * {@link RecursionMode#M_NO_RECURSE} does not. * * @see RecursionMode * * @param recursionMode */ void setRecursionMode(RecursionMode recursionMode); /** * Advances the state machine to the next state in the * process of the MIME stream parsing. This method * may return an new state machine that represents an embedded * entity, which must be parsed before the parsing process of * the current entity can proceed. * * @return a state machine of an embedded entity, if encountered, * null otherwise. * * @throws IOException if an I/O error occurs. * @throws MimeException if the message can not be processed due * to the MIME specification violation. */ EntityStateMachine advance() throws IOException, MimeException; /** * Returns description of the entity body. * * @return body description * * @throws IllegalStateException if the body description cannot be * obtained at the current stage of the parsing process. */ BodyDescriptor getBodyDescriptor() throws IllegalStateException; /** * Returns content stream of the entity body. * * @return input stream * * @throws IllegalStateException if the content stream cannot be * obtained at the current stage of the parsing process. */ InputStream getContentStream() throws IllegalStateException; /** * Returns the decoded content stream of the entity body. * * @return input stream * * @throws IllegalStateException if the content stream cannot be * obtained at the current stage of the parsing process. */ InputStream getDecodedContentStream() throws IllegalStateException; /** * Returns current header field. * * @return header field * * @throws IllegalStateException if a header field cannot be * obtained at the current stage of the parsing process. */ Field getField() throws IllegalStateException; } apache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/stream/MimeTokenStream.java0000644000000000000000000003520111702050540031343 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.stream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.nio.charset.Charset; import java.util.LinkedList; import org.apache.james.mime4j.MimeException; import org.apache.james.mime4j.codec.DecodeMonitor; import org.apache.james.mime4j.io.LineNumberInputStream; import org.apache.james.mime4j.io.LineNumberSource; import org.apache.james.mime4j.util.CharsetUtil; /** *

* Parses MIME (or RFC822) message streams of bytes or characters. * The stream is converted into an event stream. *

*

* Typical usage: *

*
 *      MimeTokenStream stream = new MimeTokenStream();
 *      InputStream instream = new FileInputStream("mime.msg");
 *      try {
 *          stream.parse(instream);
 *          for (int state = stream.getState();
 *              state != MimeTokenStream.T_END_OF_STREAM;
 *              state = stream.next()) {
 *              switch (state) {
 *              case MimeTokenStream.T_BODY:
 *                  System.out.println("Body detected, contents = "
 *                  + stream.getInputStream() + ", header data = "
 *                  + stream.getBodyDescriptor());
 *                  break;
 *              case MimeTokenStream.T_FIELD:
 *                  System.out.println("Header field detected: "
 *                  + stream.getField());
 *                  break;
 *              case MimeTokenStream.T_START_MULTIPART:
 *                  System.out.println("Multipart message detexted,"
 *                  + " header data = "
 *                  + stream.getBodyDescriptor());
 *              ...
 *              }
 *          }
 *      } finally {
 *          instream.close();
 *      }
 * 
*

Instances of {@link MimeTokenStream} are reusable: Invoking the * method {@link #parse(InputStream)} resets the token streams internal * state. However, they are definitely not thread safe. If you * have a multi threaded application, then the suggested use is to have * one instance per thread.

*/ public class MimeTokenStream { private final MimeConfig config; private final DecodeMonitor monitor; private final FieldBuilder fieldBuilder; private final BodyDescriptorBuilder bodyDescBuilder; private final LinkedList entities = new LinkedList(); private EntityState state = EntityState.T_END_OF_STREAM; private EntityStateMachine currentStateMachine; private RecursionMode recursionMode = RecursionMode.M_RECURSE; private MimeEntity rootentity; /** * Constructs a standard (lax) stream. * Optional validation events will be logged only. * Use {@link MimeConfig#setStrictParsing(boolean)} to turn on strict * parsing mode and pass the config object to * {@link MimeTokenStream#MimeTokenStream(MimeConfig)} to create * a stream that strictly validates the input. */ public MimeTokenStream() { this(null); } public MimeTokenStream(final MimeConfig config) { this(config, null, null, null); } public MimeTokenStream( final MimeConfig config, final BodyDescriptorBuilder bodyDescBuilder) { this(config, null, null, bodyDescBuilder); } public MimeTokenStream( final MimeConfig config, final DecodeMonitor monitor, final BodyDescriptorBuilder bodyDescBuilder) { this(config, monitor, null, bodyDescBuilder); } public MimeTokenStream( final MimeConfig config, final DecodeMonitor monitor, final FieldBuilder fieldBuilder, final BodyDescriptorBuilder bodyDescBuilder) { super(); this.config = config != null ? config : new MimeConfig(); this.fieldBuilder = fieldBuilder != null ? fieldBuilder : new DefaultFieldBuilder(this.config.getMaxHeaderLen()); this.monitor = monitor != null ? monitor : (this.config.isStrictParsing() ? DecodeMonitor.STRICT : DecodeMonitor.SILENT); this.bodyDescBuilder = bodyDescBuilder != null ? bodyDescBuilder : new FallbackBodyDescriptorBuilder(); } /** Instructs the {@code MimeTokenStream} to parse the given streams contents. * If the {@code MimeTokenStream} has already been in use, resets the streams * internal state. */ public void parse(InputStream stream) { doParse(stream, EntityState.T_START_MESSAGE); } /** *

Instructs the {@code MimeTokenStream} to parse the given content with * the content type. The message stream is assumed to have no message header * and is expected to begin with a message body. This can be the case when * the message content is transmitted using a different transport protocol * such as HTTP.

*

If the {@code MimeTokenStream} has already been in use, resets the * streams internal state.

* @return a parsed Field representing the input contentType */ public Field parseHeadless(InputStream stream, String contentType) { if (contentType == null) { throw new IllegalArgumentException("Content type may not be null"); } Field newContentType; try { RawField rawContentType = new RawField("Content-Type", contentType); newContentType = bodyDescBuilder.addField(rawContentType); if (newContentType == null) newContentType = rawContentType; } catch (MimeException ex) { // should never happen throw new IllegalArgumentException(ex.getMessage()); } doParse(stream, EntityState.T_END_HEADER); try { next(); } catch (IOException e) { // Should never happend: the first next after END_HEADER does not produce IO throw new IllegalStateException(e); } catch (MimeException e) { // This should never happen throw new IllegalStateException(e); } return newContentType; } private void doParse(InputStream stream, EntityState start) { LineNumberSource lineSource = null; if (config.isCountLineNumbers()) { LineNumberInputStream lineInput = new LineNumberInputStream(stream); lineSource = lineInput; stream = lineInput; } rootentity = new MimeEntity( lineSource, stream, config, start, EntityState.T_END_MESSAGE, monitor, fieldBuilder, bodyDescBuilder); rootentity.setRecursionMode(recursionMode); currentStateMachine = rootentity; entities.clear(); entities.add(currentStateMachine); state = currentStateMachine.getState(); } /** * Determines if this parser is currently in raw mode. * * @return true if in raw mode, false * otherwise. * @see #setRecursionMode(RecursionMode) */ public boolean isRaw() { return recursionMode == RecursionMode.M_RAW; } /** * Gets the current recursion mode. * The recursion mode specifies the approach taken to parsing parts. * {@link RecursionMode#M_RAW} mode does not parse the part at all. * {@link RecursionMode#M_RECURSE} mode recursively parses each mail * when an message/rfc822 part is encountered; * {@link RecursionMode#M_NO_RECURSE} does not. * @return {@link RecursionMode#M_RECURSE}, {@link RecursionMode#M_RAW} or * {@link RecursionMode#M_NO_RECURSE} */ public RecursionMode getRecursionMode() { return recursionMode; } /** * Sets the current recursion. * The recursion mode specifies the approach taken to parsing parts. * {@link RecursionMode#M_RAW} mode does not parse the part at all. * {@link RecursionMode#M_RECURSE} mode recursively parses each mail * when an message/rfc822 part is encountered; * {@link RecursionMode#M_NO_RECURSE} does not. * @param mode {@link RecursionMode#M_RECURSE}, {@link RecursionMode#M_RAW} or * {@link RecursionMode#M_NO_RECURSE} */ public void setRecursionMode(RecursionMode mode) { recursionMode = mode; if (currentStateMachine != null) { currentStateMachine.setRecursionMode(mode); } } /** * Finishes the parsing and stops reading lines. * NOTE: No more lines will be parsed but the parser * will still trigger 'end' events to match previously * triggered 'start' events. */ public void stop() { rootentity.stop(); } /** * Returns the current state. */ public EntityState getState() { return state; } /** * This method returns the raw entity, preamble, or epilogue contents. *

* This method is valid, if {@link #getState()} returns either of * {@link EntityState#T_RAW_ENTITY}, {@link EntityState#T_PREAMBLE}, or * {@link EntityState#T_EPILOGUE}. * * @return Data stream, depending on the current state. * @throws IllegalStateException {@link #getState()} returns an * invalid value. */ public InputStream getInputStream() { return currentStateMachine.getContentStream(); } /** * This method returns a transfer decoded stream based on the MIME * fields with the standard defaults. *

* This method is valid, if {@link #getState()} returns either of * {@link EntityState#T_RAW_ENTITY}, {@link EntityState#T_PREAMBLE}, or * {@link EntityState#T_EPILOGUE}. * * @return Data stream, depending on the current state. * @throws IllegalStateException {@link #getState()} returns an * invalid value. */ public InputStream getDecodedInputStream() { return currentStateMachine.getDecodedContentStream(); } /** * Gets a reader configured for the current body or body part. * The reader will return a transfer and charset decoded * stream of characters based on the MIME fields with the standard * defaults. * This is a conveniance method and relies on {@link #getInputStream()}. * Consult the javadoc for that method for known limitations. * * @return Reader, not null * @see #getInputStream * @throws IllegalStateException {@link #getState()} returns an * invalid value * @throws UnsupportedCharsetException if there is no JVM support * for decoding the charset * @throws IllegalCharsetNameException if the charset name specified * in the mime type is illegal */ public Reader getReader() { final BodyDescriptor bodyDescriptor = getBodyDescriptor(); final String mimeCharset = bodyDescriptor.getCharset(); final Charset charset; if (mimeCharset == null || "".equals(mimeCharset)) { charset = CharsetUtil.US_ASCII; } else { charset = Charset.forName(mimeCharset); } final InputStream instream = getDecodedInputStream(); return new InputStreamReader(instream, charset); } /** *

Gets a descriptor for the current entity. * This method is valid if {@link #getState()} returns:

*
    *
  • {@link EntityState#T_BODY}
  • *
  • {@link EntityState#T_START_MULTIPART}
  • *
  • {@link EntityState#T_EPILOGUE}
  • *
  • {@link EntityState#T_PREAMBLE}
  • *
* @return BodyDescriptor, not nulls */ public BodyDescriptor getBodyDescriptor() { return currentStateMachine.getBodyDescriptor(); } /** * This method is valid, if {@link #getState()} returns {@link EntityState#T_FIELD}. * @return String with the fields raw contents. * @throws IllegalStateException {@link #getState()} returns another * value than {@link EntityState#T_FIELD}. */ public Field getField() { return currentStateMachine.getField(); } /** * This method advances the token stream to the next token. * @throws IllegalStateException The method has been called, although * {@link #getState()} was already {@link EntityState#T_END_OF_STREAM}. */ public EntityState next() throws IOException, MimeException { if (state == EntityState.T_END_OF_STREAM || currentStateMachine == null) { throw new IllegalStateException("No more tokens are available."); } while (currentStateMachine != null) { EntityStateMachine next = currentStateMachine.advance(); if (next != null) { entities.add(next); currentStateMachine = next; } state = currentStateMachine.getState(); if (state != EntityState.T_END_OF_STREAM) { return state; } entities.removeLast(); if (entities.isEmpty()) { currentStateMachine = null; } else { currentStateMachine = entities.getLast(); currentStateMachine.setRecursionMode(recursionMode); } } state = EntityState.T_END_OF_STREAM; return state; } /** * Renders a state as a string suitable for logging. * @param state * @return rendered as string, not null */ public static final String stateToString(EntityState state) { return MimeEntity.stateToString(state); } public MimeConfig getConfig() { return config; } } apache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/stream/RecursionMode.java0000644000000000000000000000322111702050540031052 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.stream; /** * Enumeration of parsing modes. */ public enum RecursionMode { /** * Recursively parse every message/rfc822 part */ M_RECURSE, /** * Do not recurse message/rfc822 parts */ M_NO_RECURSE, /** * Parse into raw entities */ M_RAW, /** * Do not recurse message/rfc822 parts * and treat multiparts as a single flat body. */ M_FLAT } apache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/stream/MimeEntity.java0000644000000000000000000004765011702050540030376 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.stream; import java.io.IOException; import java.io.InputStream; import org.apache.james.mime4j.MimeException; import org.apache.james.mime4j.codec.Base64InputStream; import org.apache.james.mime4j.codec.DecodeMonitor; import org.apache.james.mime4j.codec.QuotedPrintableInputStream; import org.apache.james.mime4j.io.BufferedLineReaderInputStream; import org.apache.james.mime4j.io.LimitedInputStream; import org.apache.james.mime4j.io.LineNumberSource; import org.apache.james.mime4j.io.LineReaderInputStream; import org.apache.james.mime4j.io.LineReaderInputStreamAdaptor; import org.apache.james.mime4j.io.MaxHeaderLimitException; import org.apache.james.mime4j.io.MaxLineLimitException; import org.apache.james.mime4j.io.MimeBoundaryInputStream; import org.apache.james.mime4j.util.ByteArrayBuffer; import org.apache.james.mime4j.util.CharsetUtil; import org.apache.james.mime4j.util.MimeUtil; class MimeEntity implements EntityStateMachine { private final EntityState endState; private final MimeConfig config; private final DecodeMonitor monitor; private final FieldBuilder fieldBuilder; private final BodyDescriptorBuilder bodyDescBuilder; private final ByteArrayBuffer linebuf; private final LineNumberSource lineSource; private final BufferedLineReaderInputStream inbuffer; private EntityState state; private int lineCount; private boolean endOfHeader; private int headerCount; private Field field; private BodyDescriptor body; private RecursionMode recursionMode; private MimeBoundaryInputStream currentMimePartStream; private LineReaderInputStreamAdaptor dataStream; private byte[] tmpbuf; MimeEntity( LineNumberSource lineSource, InputStream instream, MimeConfig config, EntityState startState, EntityState endState, DecodeMonitor monitor, FieldBuilder fieldBuilder, BodyDescriptorBuilder bodyDescBuilder) { super(); this.config = config; this.state = startState; this.endState = endState; this.monitor = monitor; this.fieldBuilder = fieldBuilder; this.bodyDescBuilder = bodyDescBuilder; this.linebuf = new ByteArrayBuffer(64); this.lineCount = 0; this.endOfHeader = false; this.headerCount = 0; this.lineSource = lineSource; this.inbuffer = new BufferedLineReaderInputStream( instream, 4 * 1024, config.getMaxLineLen()); this.dataStream = new LineReaderInputStreamAdaptor( inbuffer, config.getMaxLineLen()); } MimeEntity( LineNumberSource lineSource, InputStream instream, MimeConfig config, EntityState startState, EntityState endState, BodyDescriptorBuilder bodyDescBuilder) { this(lineSource, instream, config, startState, endState, config.isStrictParsing() ? DecodeMonitor.STRICT : DecodeMonitor.SILENT, new DefaultFieldBuilder(config.getMaxHeaderLen()), bodyDescBuilder); } MimeEntity( LineNumberSource lineSource, InputStream instream, MimeConfig config, BodyDescriptorBuilder bodyDescBuilder) { this(lineSource, instream, config, EntityState.T_START_MESSAGE, EntityState.T_END_MESSAGE, config.isStrictParsing() ? DecodeMonitor.STRICT : DecodeMonitor.SILENT, new DefaultFieldBuilder(config.getMaxHeaderLen()), bodyDescBuilder); } MimeEntity( LineNumberSource lineSource, InputStream instream, FieldBuilder fieldBuilder, BodyDescriptorBuilder bodyDescBuilder) { this(lineSource, instream, new MimeConfig(), EntityState.T_START_MESSAGE, EntityState.T_END_MESSAGE, DecodeMonitor.SILENT, fieldBuilder, bodyDescBuilder); } MimeEntity( LineNumberSource lineSource, InputStream instream, BodyDescriptorBuilder bodyDescBuilder) { this(lineSource, instream, new MimeConfig(), EntityState.T_START_MESSAGE, EntityState.T_END_MESSAGE, DecodeMonitor.SILENT, new DefaultFieldBuilder(-1), bodyDescBuilder); } public EntityState getState() { return state; } public RecursionMode getRecursionMode() { return recursionMode; } public void setRecursionMode(RecursionMode recursionMode) { this.recursionMode = recursionMode; } public void stop() { this.inbuffer.truncate(); } private int getLineNumber() { if (lineSource == null) return -1; else return lineSource.getLineNumber(); } private LineReaderInputStream getDataStream() { return dataStream; } /** * Creates an indicative message suitable for display * based on the given event and the current state of the system. * @param event Event, not null * @return message suitable for use as a message in an exception * or for logging */ protected String message(Event event) { final String message; if (event == null) { message = "Event is unexpectedly null."; } else { message = event.toString(); } int lineNumber = getLineNumber(); if (lineNumber <= 0) return message; else return "Line " + lineNumber + ": " + message; } protected void monitor(Event event) throws MimeException, IOException { if (monitor.isListening()) { String message = message(event); if (monitor.warn(message, "ignoring")) { throw new MimeParseEventException(event); } } } private void readRawField() throws IOException, MimeException { if (endOfHeader) throw new IllegalStateException(); LineReaderInputStream instream = getDataStream(); try { for (;;) { // If there's still data stuck in the line buffer // copy it to the field buffer int len = linebuf.length(); if (len > 0) { fieldBuilder.append(linebuf); } linebuf.clear(); if (instream.readLine(linebuf) == -1) { monitor(Event.HEADERS_PREMATURE_END); endOfHeader = true; break; } len = linebuf.length(); if (len > 0 && linebuf.byteAt(len - 1) == '\n') { len--; } if (len > 0 && linebuf.byteAt(len - 1) == '\r') { len--; } if (len == 0) { // empty line detected endOfHeader = true; break; } lineCount++; if (lineCount > 1) { int ch = linebuf.byteAt(0); if (ch != CharsetUtil.SP && ch != CharsetUtil.HT) { // new header detected break; } } } } catch (MaxLineLimitException e) { throw new MimeException(e); } } protected boolean nextField() throws MimeException, IOException { int maxHeaderCount = config.getMaxHeaderCount(); // the loop is here to transparently skip invalid headers for (;;) { if (endOfHeader) { return false; } if (maxHeaderCount > 0 && headerCount >= maxHeaderCount) { throw new MaxHeaderLimitException("Maximum header limit exceeded"); } headerCount++; fieldBuilder.reset(); readRawField(); try { RawField rawfield = fieldBuilder.build(); if (rawfield == null) { continue; } if (rawfield.getDelimiterIdx() != rawfield.getName().length()) { monitor(Event.OBSOLETE_HEADER); } Field parsedField = bodyDescBuilder.addField(rawfield); field = parsedField != null ? parsedField : rawfield; return true; } catch (MimeException e) { monitor(Event.INVALID_HEADER); if (config.isMalformedHeaderStartsBody()) { LineReaderInputStream instream = getDataStream(); ByteArrayBuffer buf = fieldBuilder.getRaw(); // Complain, if raw data is not available or cannot be 'unread' if (buf == null || !instream.unread(buf)) { throw new MimeParseEventException(Event.INVALID_HEADER); } return false; } } } } public EntityStateMachine advance() throws IOException, MimeException { switch (state) { case T_START_MESSAGE: state = EntityState.T_START_HEADER; break; case T_START_BODYPART: state = EntityState.T_START_HEADER; break; case T_START_HEADER: bodyDescBuilder.reset(); case T_FIELD: state = nextField() ? EntityState.T_FIELD : EntityState.T_END_HEADER; break; case T_END_HEADER: body = bodyDescBuilder.build(); String mimeType = body.getMimeType(); if (recursionMode == RecursionMode.M_FLAT) { state = EntityState.T_BODY; } else if (MimeUtil.isMultipart(mimeType)) { state = EntityState.T_START_MULTIPART; clearMimePartStream(); } else if (recursionMode != RecursionMode.M_NO_RECURSE && MimeUtil.isMessage(mimeType)) { state = EntityState.T_BODY; return nextMessage(); } else { state = EntityState.T_BODY; } break; case T_START_MULTIPART: if (dataStream.isUsed()) { advanceToBoundary(); state = EntityState.T_END_MULTIPART; break; } else { createMimePartStream(); state = EntityState.T_PREAMBLE; boolean empty = currentMimePartStream.isEmptyStream(); if (!empty) break; // continue to next state } case T_PREAMBLE: // removed specific code. Fallback to T_IN_BODYPART that // better handle missing parts. // Removed the T_IN_BODYPART state (always use T_PREAMBLE) advanceToBoundary(); if (currentMimePartStream.eof() && !currentMimePartStream.isLastPart()) { monitor(Event.MIME_BODY_PREMATURE_END); } else { if (!currentMimePartStream.isLastPart()) { clearMimePartStream(); createMimePartStream(); return nextMimeEntity(); } } boolean empty = currentMimePartStream.isFullyConsumed(); clearMimePartStream(); state = EntityState.T_EPILOGUE; if (!empty) break; // continue to next state case T_EPILOGUE: state = EntityState.T_END_MULTIPART; break; case T_BODY: case T_END_MULTIPART: state = endState; break; default: if (state == endState) { state = EntityState.T_END_OF_STREAM; break; } throw new IllegalStateException("Invalid state: " + stateToString(state)); } return null; } private void createMimePartStream() throws MimeException, IOException { String boundary = body.getBoundary(); try { currentMimePartStream = new MimeBoundaryInputStream(inbuffer, boundary, config.isStrictParsing()); } catch (IllegalArgumentException e) { // thrown when boundary is too long throw new MimeException(e.getMessage(), e); } dataStream = new LineReaderInputStreamAdaptor( currentMimePartStream, config.getMaxLineLen()); } private void clearMimePartStream() { currentMimePartStream = null; dataStream = new LineReaderInputStreamAdaptor( inbuffer, config.getMaxLineLen()); } private void advanceToBoundary() throws IOException { if (!dataStream.eof()) { if (tmpbuf == null) { tmpbuf = new byte[2048]; } InputStream instream = getLimitedContentStream(); while (instream.read(tmpbuf)!= -1) { } } } private EntityStateMachine nextMessage() { // optimize nesting of streams returning the "lower" stream instead of // always return dataStream (that would add a LineReaderInputStreamAdaptor in the chain) InputStream instream = currentMimePartStream != null ? currentMimePartStream : inbuffer; instream = decodedStream(instream); return nextMimeEntity(EntityState.T_START_MESSAGE, EntityState.T_END_MESSAGE, instream); } private InputStream decodedStream(InputStream instream) { String transferEncoding = body.getTransferEncoding(); if (MimeUtil.isBase64Encoding(transferEncoding)) { instream = new Base64InputStream(instream, monitor); } else if (MimeUtil.isQuotedPrintableEncoded(transferEncoding)) { instream = new QuotedPrintableInputStream(instream, monitor); } return instream; } private EntityStateMachine nextMimeEntity() { return nextMimeEntity(EntityState.T_START_BODYPART, EntityState.T_END_BODYPART, currentMimePartStream); } private EntityStateMachine nextMimeEntity(EntityState startState, EntityState endState, InputStream instream) { if (recursionMode == RecursionMode.M_RAW) { RawEntity message = new RawEntity(instream); return message; } else { MimeEntity mimeentity = new MimeEntity( lineSource, instream, config, startState, endState, monitor, fieldBuilder, bodyDescBuilder.newChild()); mimeentity.setRecursionMode(recursionMode); return mimeentity; } } private InputStream getLimitedContentStream() { long maxContentLimit = config.getMaxContentLen(); if (maxContentLimit >= 0) { return new LimitedInputStream(dataStream, maxContentLimit); } else { return dataStream; } } /** *

Gets a descriptor for the current entity. * This method is valid if {@link #getState()} returns:

*
    *
  • {@link EntityState#T_BODY}
  • *
  • {@link EntityState#T_START_MULTIPART}
  • *
  • {@link EntityState#T_EPILOGUE}
  • *
  • {@link EntityState#T_PREAMBLE}
  • *
* @return BodyDescriptor, not nulls */ public BodyDescriptor getBodyDescriptor() { switch (getState()) { case T_BODY: case T_START_MULTIPART: case T_PREAMBLE: case T_EPILOGUE: case T_END_OF_STREAM: return body; default: throw new IllegalStateException("Invalid state :" + stateToString(state)); } } /** * This method is valid, if {@link #getState()} returns {@link EntityState#T_FIELD}. * @return String with the fields raw contents. * @throws IllegalStateException {@link #getState()} returns another * value than {@link EntityState#T_FIELD}. */ public Field getField() { switch (getState()) { case T_FIELD: return field; default: throw new IllegalStateException("Invalid state :" + stateToString(state)); } } /** * @see org.apache.james.mime4j.stream.EntityStateMachine#getContentStream() */ public InputStream getContentStream() { switch (state) { case T_START_MULTIPART: case T_PREAMBLE: case T_EPILOGUE: case T_BODY: return getLimitedContentStream(); default: throw new IllegalStateException("Invalid state: " + stateToString(state)); } } /** * @see org.apache.james.mime4j.stream.EntityStateMachine#getDecodedContentStream() */ public InputStream getDecodedContentStream() throws IllegalStateException { return decodedStream(getContentStream()); } @Override public String toString() { return getClass().getName() + " [" + stateToString(state) + "][" + body.getMimeType() + "][" + body.getBoundary() + "]"; } /** * Renders a state as a string suitable for logging. * @param state * @return rendered as string, not null */ public static final String stateToString(EntityState state) { final String result; switch (state) { case T_END_OF_STREAM: result = "End of stream"; break; case T_START_MESSAGE: result = "Start message"; break; case T_END_MESSAGE: result = "End message"; break; case T_RAW_ENTITY: result = "Raw entity"; break; case T_START_HEADER: result = "Start header"; break; case T_FIELD: result = "Field"; break; case T_END_HEADER: result = "End header"; break; case T_START_MULTIPART: result = "Start multipart"; break; case T_END_MULTIPART: result = "End multipart"; break; case T_PREAMBLE: result = "Preamble"; break; case T_EPILOGUE: result = "Epilogue"; break; case T_START_BODYPART: result = "Start bodypart"; break; case T_END_BODYPART: result = "End bodypart"; break; case T_BODY: result = "Body"; break; default: result = "Unknown"; break; } return result; } } apache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/stream/ContentDescriptor.java0000644000000000000000000000627711702050540031763 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.stream; /** * A descriptor containing common MIME content properties. */ public interface ContentDescriptor { /** * Returns the body descriptors MIME type. * @see #getMediaType() * @see #getSubType() * @return The MIME type, which has been parsed from the * content-type definition. Must not be null, but * "text/plain", if no content-type was specified. */ String getMimeType(); /** * Gets the defaulted MIME media type for this content. * For example TEXT, IMAGE, MULTIPART * @see #getMimeType() * @return the MIME media type when content-type specified, * otherwise the correct default (TEXT) */ String getMediaType(); /** * Gets the defaulted MIME sub type for this content. * @see #getMimeType() * @return the MIME media type when content-type is specified, * otherwise the correct default (PLAIN) */ String getSubType(); /** *

The body descriptors character set, defaulted appropriately for the MIME type.

*

* For TEXT types, this will be defaulted to us-ascii. * For other types, when the charset parameter is missing this property will be null. *

* @return Character set, which has been parsed from the * content-type definition. Not null for TEXT types, when unset will * be set to default us-ascii. For other types, when unset, * null will be returned. */ String getCharset(); /** * Returns the body descriptors transfer encoding. * @return The transfer encoding. Must not be null, but "7bit", * if no transfer-encoding was specified. */ String getTransferEncoding(); /** * Returns the body descriptors content-length. * @return Content length, if known, or -1, to indicate the absence of a * content-length header. */ long getContentLength(); } ././@LongLink0000000000000000000000000000016100000000000011563 Lustar rootrootapache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/stream/FallbackBodyDescriptorBuilder.javaapache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/stream/FallbackBodyDescriptor0000644000000000000000000001716211702050540031741 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.stream; import java.util.HashMap; import java.util.Locale; import java.util.Map; import org.apache.james.mime4j.MimeException; import org.apache.james.mime4j.codec.DecodeMonitor; import org.apache.james.mime4j.util.MimeUtil; /** * Encapsulates the values of the MIME-specific header fields * (which starts with Content-). */ class FallbackBodyDescriptorBuilder implements BodyDescriptorBuilder { private static final String US_ASCII = "us-ascii"; private static final String SUB_TYPE_EMAIL = "rfc822"; private static final String MEDIA_TYPE_TEXT = "text"; private static final String MEDIA_TYPE_MESSAGE = "message"; private static final String EMAIL_MESSAGE_MIME_TYPE = MEDIA_TYPE_MESSAGE + "/" + SUB_TYPE_EMAIL; private static final String DEFAULT_SUB_TYPE = "plain"; private static final String DEFAULT_MEDIA_TYPE = MEDIA_TYPE_TEXT; private static final String DEFAULT_MIME_TYPE = DEFAULT_MEDIA_TYPE + "/" + DEFAULT_SUB_TYPE; private final String parentMimeType; private final DecodeMonitor monitor; private String mediaType; private String subType; private String mimeType; private String boundary; private String charset; private String transferEncoding; private long contentLength; /** * Creates a new root BodyDescriptor instance. */ public FallbackBodyDescriptorBuilder() { this(null, null); } /** * Creates a new BodyDescriptor instance. * * @param parent the descriptor of the parent or null if this * is the root descriptor. */ public FallbackBodyDescriptorBuilder(final String parentMimeType, final DecodeMonitor monitor) { super(); this.parentMimeType = parentMimeType; this.monitor = monitor != null ? monitor : DecodeMonitor.SILENT; reset(); } public void reset() { mimeType = null; subType = null; mediaType = null; boundary = null; charset = null; transferEncoding = null; contentLength = -1; } public BodyDescriptorBuilder newChild() { return new FallbackBodyDescriptorBuilder(mimeType, monitor); } public BodyDescriptor build() { String actualMimeType = mimeType; String actualMediaType = mediaType; String actualSubType = subType; String actualCharset = charset; if (actualMimeType == null) { if (MimeUtil.isSameMimeType("multipart/digest", parentMimeType)) { actualMimeType = EMAIL_MESSAGE_MIME_TYPE; actualMediaType = MEDIA_TYPE_MESSAGE; actualSubType = SUB_TYPE_EMAIL; } else { actualMimeType = DEFAULT_MIME_TYPE; actualMediaType = DEFAULT_MEDIA_TYPE; actualSubType = DEFAULT_SUB_TYPE; } } if (actualCharset == null && MEDIA_TYPE_TEXT.equals(actualMediaType)) { actualCharset = US_ASCII; } return new BasicBodyDescriptor(actualMimeType, actualMediaType, actualSubType, boundary, actualCharset, transferEncoding != null ? transferEncoding : "7bit", contentLength); } /** * Should be called for each Content- header field of * a MIME message or part. * * @param field the MIME field. */ public Field addField(RawField field) throws MimeException { String name = field.getName().toLowerCase(Locale.US); if (name.equals("content-transfer-encoding") && transferEncoding == null) { String value = field.getBody(); if (value != null) { value = value.trim().toLowerCase(Locale.US); if (value.length() > 0) { transferEncoding = value; } } } else if (name.equals("content-length") && contentLength == -1) { String value = field.getBody(); if (value != null) { value = value.trim(); try { contentLength = Long.parseLong(value.trim()); } catch (NumberFormatException e) { if (monitor.warn("Invalid content length: " + value, "ignoring Content-Length header")) { throw new MimeException("Invalid Content-Length header: " + value); } } } } else if (name.equals("content-type") && mimeType == null) { parseContentType(field); } return null; } private void parseContentType(Field field) throws MimeException { RawField rawfield; if (field instanceof RawField) { rawfield = ((RawField) field); } else { rawfield = new RawField(field.getName(), field.getBody()); } RawBody body = RawFieldParser.DEFAULT.parseRawBody(rawfield); String main = body.getValue(); Map params = new HashMap(); for (NameValuePair nmp: body.getParams()) { String name = nmp.getName().toLowerCase(Locale.US); params.put(name, nmp.getValue()); } String type = null; String subtype = null; if (main != null) { main = main.toLowerCase().trim(); int index = main.indexOf('/'); boolean valid = false; if (index != -1) { type = main.substring(0, index).trim(); subtype = main.substring(index + 1).trim(); if (type.length() > 0 && subtype.length() > 0) { main = type + "/" + subtype; valid = true; } } if (!valid) { main = null; type = null; subtype = null; } } String b = params.get("boundary"); if (main != null && ((main.startsWith("multipart/") && b != null) || !main.startsWith("multipart/"))) { mimeType = main; mediaType = type; subType = subtype; } if (MimeUtil.isMultipart(mimeType)) { boundary = b; } String c = params.get("charset"); charset = null; if (c != null) { c = c.trim(); if (c.length() > 0) { charset = c; } } } } apache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/stream/Event.java0000644000000000000000000000536711702050540027372 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.stream; /** * Enumerates events which can be monitored. */ public final class Event { /** Indicates that a body part ended prematurely. */ public static final Event MIME_BODY_PREMATURE_END = new Event("Body part ended prematurely. " + "Boundary detected in header or EOF reached."); /** Indicates that unexpected end of headers detected.*/ public static final Event HEADERS_PREMATURE_END = new Event("Unexpected end of headers detected. " + "Higher level boundary detected or EOF reached."); /** Indicates that unexpected end of headers detected.*/ public static final Event INVALID_HEADER = new Event("Invalid header encountered"); /** Indicates that an obsolete syntax header has been detected */ public static final Event OBSOLETE_HEADER = new Event("Obsolete header encountered"); private final String code; public Event(final String code) { super(); if (code == null) { throw new IllegalArgumentException("Code may not be null"); } this.code = code; } @Override public int hashCode() { return code.hashCode(); } @Override public boolean equals(Object obj) { if (obj == null) return false; if (this == obj) return true; if (obj instanceof Event) { Event that = (Event) obj; return this.code.equals(that.code); } else { return false; } } @Override public String toString() { return code; } } ././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootapache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/stream/BodyDescriptorBuilder.javaapache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/stream/BodyDescriptorBuilder.0000644000000000000000000000740211702050540031702 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.stream; import org.apache.james.mime4j.MimeException; /** * Body descriptor builders are intended to construct {@link BodyDescriptor} instances from * multiple unstructured {@link RawField}s. *

* Body descriptor builders are stateful and modal as they have to store intermediate results * between method invocations and also rely on a particular sequence of method invocations * (the mode of operation). *

* Consumers are expected to interact with body descriptor builders in the following way: *

    *
  • Invoke {@link #reset()} method in order to reset builder's internal state and make it * ready to start the process of building a new {@link BodyDescriptor}.
  • *
  • Invoke {@link #addField(RawField)} multiple times method in order to collect * necessary details for building a body descriptor. The builder can optionally * transform the unstructured field given an an input into a structured one and return * an instance {@link Field} that also implements a richer interface for a particular type * of fields such as Content-Type. The builder can also return null * if the field is to be ignored
  • *
  • Optionally invoke {@link #newChild()} for each embedded body of content. Please note that * the resultant {@link BodyDescriptorBuilder}} child instance can inherit some its parent * properties such as MIME type.
  • *
  • Invoke {@link #build()()} method in order to generate a {@link BodyDescriptor}} instance * based on the internal state of the builder.
  • *
*/ public interface BodyDescriptorBuilder { /** * Resets the internal state of the builder making it ready to process new input. */ void reset(); /** * Updates builder's internal state by adding a new field. The builder can optionally * transform the unstructured field given an an input into a structured one and return * an instance {@link Field} that also implements a richer interface for a particular type * of fields such as Content-Type. The builder can also return null * if the field is to be ignored. */ Field addField(RawField field) throws MimeException; /** * Builds an instance of {@link BodyDescriptor} based on the internal state. */ BodyDescriptor build(); /** * Creates an instance of {@link BodyDescriptorBuilder} to be used for processing of an * embedded content body. Please the child instance can inherit some of its parent properties * such as MIME type. */ BodyDescriptorBuilder newChild(); } apache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/stream/NameValuePair.java0000644000000000000000000000530111702050540030766 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.stream; import org.apache.james.mime4j.util.LangUtils; /** * A name / value tuple */ public final class NameValuePair { private final String name; private final String value; public NameValuePair(final String name, final String value) { super(); if (name == null) { throw new IllegalArgumentException("Name may not be null"); } this.name = name; this.value = value; } public String getName() { return this.name; } public String getValue() { return this.value; } public String toString() { if (this.value == null) { return name; } else { StringBuilder buffer = new StringBuilder(); buffer.append(this.name); buffer.append("="); buffer.append("\""); buffer.append(this.value); buffer.append("\""); return buffer.toString(); } } public boolean equals(final Object object) { if (this == object) return true; if (object instanceof NameValuePair) { NameValuePair that = (NameValuePair) object; return this.name.equals(that.name) && LangUtils.equals(this.value, that.value); } else { return false; } } public int hashCode() { int hash = LangUtils.HASH_SEED; hash = LangUtils.hashCode(hash, this.name); hash = LangUtils.hashCode(hash, this.value); return hash; } } apache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/stream/RawField.java0000644000000000000000000000625711702050540030005 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.stream; import org.apache.james.mime4j.util.ByteSequence; import org.apache.james.mime4j.util.CharsetUtil; import org.apache.james.mime4j.util.ContentUtil; import org.apache.james.mime4j.util.MimeUtil; /** * Raw (unstructured) MIME field. The field's body is unparsed and possibly encoded. *

* Instances of this class can be created by using * {@link RawFieldParser#parseField(ByteSequence)} method. */ public final class RawField implements Field { private final ByteSequence raw; private final int delimiterIdx; private final String name; private final String body; RawField(ByteSequence raw, int delimiterIdx, String name, String body) { if (name == null) { throw new IllegalArgumentException("Field may not be null"); } this.raw = raw; this.delimiterIdx = delimiterIdx; this.name = name.trim(); this.body = body; } public RawField(String name, String body) { this(null, -1, name, body); } public ByteSequence getRaw() { return raw; } public String getName() { return name; } public String getBody() { if (body != null) { return body; } if (raw != null) { int len = raw.length(); int off = delimiterIdx + 1; if (len > off + 1 && (CharsetUtil.isWhitespace((char) (raw.byteAt(off) & 0xff)))) { off++; } return MimeUtil.unfold(ContentUtil.decode(raw, off, len - off)); } return null; } public int getDelimiterIdx() { return delimiterIdx; } @Override public String toString() { if (raw != null) { return ContentUtil.decode(raw); } else { StringBuilder buf = new StringBuilder(); buf.append(name); buf.append(": "); if (body != null) { buf.append(body); } return buf.toString(); } } } apache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/stream/BodyDescriptor.java0000644000000000000000000000307211702050540031234 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.stream; /** * A descriptor containing common MIME content body properties. */ public interface BodyDescriptor extends ContentDescriptor { /** * Returns the body descriptors boundary. * @return Boundary string, if known, or null. The latter may be the * case, in particular, if the body is no multipart entity. */ String getBoundary(); } apache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/stream/FieldBuilder.java0000644000000000000000000000611211702050540030630 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.stream; import org.apache.james.mime4j.MimeException; import org.apache.james.mime4j.util.ByteArrayBuffer; /** * Field builders are intended to construct {@link RawField} instances from multiple lines * contained in {@link ByteArrayBuffer}s. *

* Field builders are stateful and modal as they have to store intermediate results between * method invocations and also rely on a particular sequence of method invocations * (the mode of operation). *

* Consumers are expected to interact with field builder in the following way: *

    *
  • Invoke {@link #reset()} method in order to reset builder's internal state and make it * ready to start the process of building a new {@link RawField}.
  • *
  • Invoke {@link #append(ByteArrayBuffer)} method one or multiple times in order to build * an internal representation of a MIME field from individual lines of text.
  • *
  • Optionally {@link #getRaw()} method can be invoked in order to get combined content * of all lines processed so far. Please note builder implementations can return * null if they do not retain original raw content.
  • *
  • Invoke {@link #build()} method in order to generate a {@link RawField} instance * based on the internal state of the builder.
  • *
*/ public interface FieldBuilder { /** * Resets the internal state of the builder making it ready to process new input. */ void reset(); /** * Updates builder's internal state by adding a new line of text. */ void append(ByteArrayBuffer line) throws MimeException; /** * Builds an instance of {@link RawField} based on the internal state. */ RawField build() throws MimeException; /** * Returns combined content of all lines processed so far or null * if the builder does not retain original raw content. */ ByteArrayBuffer getRaw(); } apache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/stream/EntityState.java0000644000000000000000000000600311702050540030552 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.stream; /** * Enumeration of states an entity is expected to go through * in the process of the MIME stream parsing. */ public enum EntityState { /** * This token indicates, that the MIME stream is currently * at the beginning of a message. */ T_START_MESSAGE, /** * This token indicates, that the MIME stream is currently * at the end of a message. */ T_END_MESSAGE, /** * This token indicates, that a raw entity is currently being processed. */ T_RAW_ENTITY, /** * This token indicates, that a message parts headers are now * being parsed. */ T_START_HEADER, /** * This token indicates, that a message parts field has now * been parsed. */ T_FIELD, /** * This token indicates, that part headers have now been * parsed. */ T_END_HEADER, /** * This token indicates, that a multipart body is being parsed. */ T_START_MULTIPART, /** * This token indicates, that a multipart body has been parsed. */ T_END_MULTIPART, /** * This token indicates, that a multiparts preamble is being * parsed. */ T_PREAMBLE, /** * This token indicates, that a multiparts epilogue is being * parsed. */ T_EPILOGUE, /** * This token indicates, that the MIME stream is currently * at the beginning of a body part. */ T_START_BODYPART, /** * This token indicates, that the MIME stream is currently * at the end of a body part. */ T_END_BODYPART, /** * This token indicates, that an atomic entity is being parsed. */ T_BODY, /** * This token indicates, that the MIME stream has been completely * and successfully parsed, and no more data is available. */ T_END_OF_STREAM } apache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/stream/RawBody.java0000644000000000000000000000453511702050540027654 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.stream; import java.util.ArrayList; import java.util.List; /** * This class represents a field's body consisting of a textual value and a number of optional * name / value parameters separated with semicolon. *
 * value; param1 = value1; param2 = "value2";
 * 
*/ public final class RawBody { private final String value; private final List params; RawBody(final String value, final List params) { if (value == null) { throw new IllegalArgumentException("Field value not be null"); } this.value = value; this.params = params != null ? params : new ArrayList(); } public String getValue() { return this.value; } public List getParams() { return new ArrayList(this.params); } @Override public String toString() { StringBuilder buf = new StringBuilder(); buf.append(this.value); buf.append("; "); for (NameValuePair param: this.params) { buf.append("; "); buf.append(param); } return buf.toString(); } } apache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/stream/ParserCursor.java0000644000000000000000000000607211702050540030735 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.stream; /** * This class represents a context of a parsing operation: *
    *
  • the current position the parsing operation is expected to start at
  • *
  • the bounds limiting the scope of the parsing operation
  • *
*

* Copied from Apache HttpCore project */ public class ParserCursor { private final int lowerBound; private final int upperBound; private int pos; public ParserCursor(int lowerBound, int upperBound) { super(); if (lowerBound < 0) { throw new IndexOutOfBoundsException("Lower bound cannot be negative"); } if (lowerBound > upperBound) { throw new IndexOutOfBoundsException("Lower bound cannot be greater then upper bound"); } this.lowerBound = lowerBound; this.upperBound = upperBound; this.pos = lowerBound; } public int getLowerBound() { return this.lowerBound; } public int getUpperBound() { return this.upperBound; } public int getPos() { return this.pos; } public void updatePos(int pos) { if (pos < this.lowerBound) { throw new IndexOutOfBoundsException("pos: "+pos+" < lowerBound: "+this.lowerBound); } if (pos > this.upperBound) { throw new IndexOutOfBoundsException("pos: "+pos+" > upperBound: "+this.upperBound); } this.pos = pos; } public boolean atEnd() { return this.pos >= this.upperBound; } public String toString() { StringBuilder buffer = new StringBuilder(); buffer.append('['); buffer.append(Integer.toString(this.lowerBound)); buffer.append('>'); buffer.append(Integer.toString(this.pos)); buffer.append('>'); buffer.append(Integer.toString(this.upperBound)); buffer.append(']'); return buffer.toString(); } } apache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/stream/RawEntity.java0000644000000000000000000000565211702050540030234 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.stream; import java.io.InputStream; /** * Raw MIME entity. Such entities will not be parsed into elements * by the parser. They are meant to be consumed as a raw data stream * by the caller. */ public class RawEntity implements EntityStateMachine { private final InputStream stream; private EntityState state; RawEntity(InputStream stream) { this.stream = stream; this.state = EntityState.T_RAW_ENTITY; } public EntityState getState() { return state; } /** * This method has no effect. */ public void setRecursionMode(RecursionMode recursionMode) { } public EntityStateMachine advance() { state = EntityState.T_END_OF_STREAM; return null; } /** * Returns raw data stream. */ public InputStream getContentStream() { return stream; } /** * This method has no effect and always returns null. */ public BodyDescriptor getBodyDescriptor() { return null; } /** * This method has no effect and always returns null. */ public RawField getField() { return null; } /** * This method has no effect and always returns null. */ public String getFieldName() { return null; } /** * This method has no effect and always returns null. */ public String getFieldValue() { return null; } /** * @see org.apache.james.mime4j.stream.EntityStateMachine#getDecodedContentStream() */ public InputStream getDecodedContentStream() throws IllegalStateException { throw new IllegalStateException("Raw entity does not support stream decoding"); } } apache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/stream/RawFieldParser.java0000644000000000000000000003456511702050540031165 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.stream; import java.util.ArrayList; import java.util.BitSet; import java.util.List; import org.apache.james.mime4j.MimeException; import org.apache.james.mime4j.util.ByteSequence; import org.apache.james.mime4j.util.CharsetUtil; import org.apache.james.mime4j.util.ContentUtil; /** * Low level parser for header field elements. The parsing routines of this class are designed * to produce near zero intermediate garbage and make no intermediate copies of input data. *

* This class is immutable and thread safe. */ public class RawFieldParser { public static BitSet INIT_BITSET(int ... b) { BitSet bitset = new BitSet(b.length); for (int i = 0; i < b.length; i++) { bitset.set(b[i]); } return bitset; } static final BitSet COLON = INIT_BITSET(':'); static final BitSet EQUAL_OR_SEMICOLON = INIT_BITSET('=', ';'); static final BitSet SEMICOLON = INIT_BITSET(';'); public static final RawFieldParser DEFAULT = new RawFieldParser(); /** * Parses the sequence of bytes into {@link RawField}. * * @throws MimeException if the input data does not contain a valid MIME field. */ public RawField parseField(final ByteSequence raw) throws MimeException { if (raw == null) { return null; } ParserCursor cursor = new ParserCursor(0, raw.length()); String name = parseToken(raw, cursor, COLON); if (cursor.atEnd()) { throw new MimeException("Invalid MIME field: no name/value separator found: " + raw.toString()); } return new RawField(raw, cursor.getPos(), name, null); } /** * Parses the field body containing a value with parameters into {@link RawBody}. * * @param field unstructured (raw) field */ public RawBody parseRawBody(final RawField field) { ByteSequence buf = field.getRaw(); int pos = field.getDelimiterIdx() + 1; if (buf == null) { String body = field.getBody(); if (body == null) { return new RawBody("", null); } buf = ContentUtil.encode(body); pos = 0; } ParserCursor cursor = new ParserCursor(pos, buf.length()); return parseRawBody(buf, cursor); } /** * Parses the sequence of bytes containing a value with parameters into {@link RawBody}. * * @param buf buffer with the sequence of bytes to be parsed * @param cursor defines the bounds and current position of the buffer */ public RawBody parseRawBody(final ByteSequence buf, final ParserCursor cursor) { String value = parseToken(buf, cursor, SEMICOLON); if (cursor.atEnd()) { return new RawBody(value, new ArrayList()); } cursor.updatePos(cursor.getPos() + 1); List params = parseParameters(buf, cursor); return new RawBody(value, params); } /** * Parses the sequence of bytes containing field parameters delimited with semicolon into * a list of {@link NameValuePair}s. * * @param buf buffer with the sequence of bytes to be parsed * @param cursor defines the bounds and current position of the buffer */ public List parseParameters(final ByteSequence buf, final ParserCursor cursor) { List params = new ArrayList(); skipWhiteSpace(buf, cursor); while (!cursor.atEnd()) { NameValuePair param = parseParameter(buf, cursor); params.add(param); } return params; } /** * Parses the sequence of bytes containing a field parameter delimited with semicolon into * {@link NameValuePair}. * * @param buf buffer with the sequence of bytes to be parsed * @param cursor defines the bounds and current position of the buffer */ public NameValuePair parseParameter(final ByteSequence buf, final ParserCursor cursor) { String name = parseToken(buf, cursor, EQUAL_OR_SEMICOLON); if (cursor.atEnd()) { return new NameValuePair(name, null); } int delim = buf.byteAt(cursor.getPos()); cursor.updatePos(cursor.getPos() + 1); if (delim == ';') { return new NameValuePair(name, null); } String value = parseValue(buf, cursor, SEMICOLON); if (!cursor.atEnd()) { cursor.updatePos(cursor.getPos() + 1); } return new NameValuePair(name, value); } /** * Extracts from the sequence of bytes a token terminated with any of the given delimiters * discarding semantically insignificant whitespace characters and comments. * * @param buf buffer with the sequence of bytes to be parsed * @param cursor defines the bounds and current position of the buffer * @param delimiters set of delimiting characters. Can be null if the token * is not delimited by any character. */ public String parseToken(final ByteSequence buf, final ParserCursor cursor, final BitSet delimiters) { StringBuilder dst = new StringBuilder(); boolean whitespace = false; while (!cursor.atEnd()) { char current = (char) (buf.byteAt(cursor.getPos()) & 0xff); if (delimiters != null && delimiters.get(current)) { break; } else if (CharsetUtil.isWhitespace(current)) { skipWhiteSpace(buf, cursor); whitespace = true; } else if (current == '(') { skipComment(buf, cursor); } else { if (dst.length() > 0 && whitespace) { dst.append(' '); } copyContent(buf, cursor, delimiters, dst); whitespace = false; } } return dst.toString(); } /** * Extracts from the sequence of bytes a value which can be enclosed in quote marks and * terminated with any of the given delimiters discarding semantically insignificant * whitespace characters and comments. * * @param buf buffer with the sequence of bytes to be parsed * @param cursor defines the bounds and current position of the buffer * @param delimiters set of delimiting characters. Can be null if the value * is not delimited by any character. */ public String parseValue(final ByteSequence buf, final ParserCursor cursor, final BitSet delimiters) { StringBuilder dst = new StringBuilder(); boolean whitespace = false; while (!cursor.atEnd()) { char current = (char) (buf.byteAt(cursor.getPos()) & 0xff); if (delimiters != null && delimiters.get(current)) { break; } else if (CharsetUtil.isWhitespace(current)) { skipWhiteSpace(buf, cursor); whitespace = true; } else if (current == '(') { skipComment(buf, cursor); } else if (current == '\"') { if (dst.length() > 0 && whitespace) { dst.append(' '); } copyQuotedContent(buf, cursor, dst); whitespace = false; } else { if (dst.length() > 0 && whitespace) { dst.append(' '); } copyContent(buf, cursor, delimiters, dst); whitespace = false; } } return dst.toString(); } /** * Skips semantically insignificant whitespace characters and moves the cursor to the closest * non-whitespace character. * * @param buf buffer with the sequence of bytes to be parsed * @param cursor defines the bounds and current position of the buffer */ public void skipWhiteSpace(final ByteSequence buf, final ParserCursor cursor) { int pos = cursor.getPos(); int indexFrom = cursor.getPos(); int indexTo = cursor.getUpperBound(); for (int i = indexFrom; i < indexTo; i++) { char current = (char) (buf.byteAt(i) & 0xff); if (!CharsetUtil.isWhitespace(current)) { break; } else { pos++; } } cursor.updatePos(pos); } /** * Skips semantically insignificant content if the current position is positioned at the * beginning of a comment and moves the cursor past the end of the comment. * Nested comments and escaped characters are recognized and handled appropriately. * * @param buf buffer with the sequence of bytes to be parsed * @param cursor defines the bounds and current position of the buffer */ public void skipComment(final ByteSequence buf, final ParserCursor cursor) { if (cursor.atEnd()) { return; } int pos = cursor.getPos(); int indexFrom = cursor.getPos(); int indexTo = cursor.getUpperBound(); char current = (char) (buf.byteAt(pos) & 0xff); if (current != '(') { return; } pos++; indexFrom++; int level = 1; boolean escaped = false; for (int i = indexFrom; i < indexTo; i++, pos++) { current = (char) (buf.byteAt(i) & 0xff); if (escaped) { escaped = false; } else { if (current == '\\') { escaped = true; } else if (current == '(') { level++; } else if (current == ')') { level--; } } if (level <= 0) { pos++; break; } } cursor.updatePos(pos); } /** * Skips semantically insignificant whitespace characters and comments and moves the cursor * to the closest semantically significant non-whitespace character. * Nested comments and escaped characters are recognized and handled appropriately. * * @param buf buffer with the sequence of bytes to be parsed * @param cursor defines the bounds and current position of the buffer */ public void skipAllWhiteSpace(final ByteSequence buf, final ParserCursor cursor) { while (!cursor.atEnd()) { char current = (char) (buf.byteAt(cursor.getPos()) & 0xff); if (CharsetUtil.isWhitespace(current)) { skipWhiteSpace(buf, cursor); } else if (current == '(') { skipComment(buf, cursor); } else { break; } } } /** * Transfers content into the destination buffer until a whitespace character, a comment, * or any of the given delimiters is encountered. * * @param buf buffer with the sequence of bytes to be parsed * @param cursor defines the bounds and current position of the buffer * @param delimiters set of delimiting characters. Can be null if the value * is delimited by a whitespace or a comment only. * @param dst destination buffer */ public void copyContent(final ByteSequence buf, final ParserCursor cursor, final BitSet delimiters, final StringBuilder dst) { int pos = cursor.getPos(); int indexFrom = cursor.getPos(); int indexTo = cursor.getUpperBound(); for (int i = indexFrom; i < indexTo; i++) { char current = (char) (buf.byteAt(i) & 0xff); if ((delimiters != null && delimiters.get(current)) || CharsetUtil.isWhitespace(current) || current == '(') { break; } else { pos++; dst.append(current); } } cursor.updatePos(pos); } /** * Transfers content enclosed with quote marks into the destination buffer. * * @param buf buffer with the sequence of bytes to be parsed * @param cursor defines the bounds and current position of the buffer * @param dst destination buffer */ public void copyQuotedContent(final ByteSequence buf, final ParserCursor cursor, final StringBuilder dst) { if (cursor.atEnd()) { return; } int pos = cursor.getPos(); int indexFrom = cursor.getPos(); int indexTo = cursor.getUpperBound(); char current = (char) (buf.byteAt(pos) & 0xff); if (current != '\"') { return; } pos++; indexFrom++; boolean escaped = false; for (int i = indexFrom; i < indexTo; i++, pos++) { current = (char) (buf.byteAt(i) & 0xff); if (escaped) { if (current != '\"' && current != '\\') { dst.append('\\'); } dst.append(current); escaped = false; } else { if (current == '\"') { pos++; break; } if (current == '\\') { escaped = true; } else if (current != '\r' && current != '\n') { dst.append(current); } } } cursor.updatePos(pos); } } ././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootrootapache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/stream/MimeParseEventException.javaapache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/stream/MimeParseEventExceptio0000644000000000000000000000374711702050540031756 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.stream; import org.apache.james.mime4j.MimeException; /** * Indicates that strict parsing has been enabled * and an optional invality has been found in the input. * {@link #getEvent()} indicates the type of invalidity. */ public class MimeParseEventException extends MimeException { private static final long serialVersionUID = 4632991604246852302L; private final Event event; /** * Constructs an exception * @param event MimeTokenStream.Event, not null */ public MimeParseEventException(final Event event) { super(event.toString()); this.event = event; } /** * Gets the causal parse event. * @return MimeTokenStream.Event, not null */ public Event getEvent() { return event; } } ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootapache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/stream/DefaultFieldBuilder.javaapache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/stream/DefaultFieldBuilder.ja0000644000000000000000000000643011702050540031611 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.stream; import java.util.BitSet; import org.apache.james.mime4j.MimeException; import org.apache.james.mime4j.io.MaxHeaderLengthLimitException; import org.apache.james.mime4j.util.ByteArrayBuffer; /** * Default implementation of {@link FieldBuilder}. * */ public class DefaultFieldBuilder implements FieldBuilder { private static final BitSet FIELD_CHARS = new BitSet(); static { for (int i = 0x21; i <= 0x39; i++) { FIELD_CHARS.set(i); } for (int i = 0x3b; i <= 0x7e; i++) { FIELD_CHARS.set(i); } } private final ByteArrayBuffer buf; private final int maxlen; public DefaultFieldBuilder(int maxlen) { this.buf = new ByteArrayBuffer(1024); this.maxlen = maxlen; } public void reset() { this.buf.clear(); } public void append(final ByteArrayBuffer line) throws MaxHeaderLengthLimitException { if (line == null) { return; } int len = line.length(); if (this.maxlen > 0 && this.buf.length() + len >= this.maxlen) { throw new MaxHeaderLengthLimitException("Maximum header length limit exceeded"); } this.buf.append(line.buffer(), 0, line.length()); } public RawField build() throws MimeException { int len = this.buf.length(); if (len > 0) { if (this.buf.byteAt(len - 1) == '\n') { len --; } if (this.buf.byteAt(len - 1) == '\r') { len --; } } ByteArrayBuffer copy = new ByteArrayBuffer(this.buf.buffer(), len, false); RawField field = RawFieldParser.DEFAULT.parseField(copy); String name = field.getName(); for (int i = 0; i < name.length(); i++) { char ch = name.charAt(i); if (!FIELD_CHARS.get(ch)) { throw new MimeException("MIME field name contains illegal characters: " + field.getName()); } } return field; } public ByteArrayBuffer getRaw() { return this.buf; } } apache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/stream/Field.java0000644000000000000000000000420511702050540027322 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.stream; import org.apache.james.mime4j.util.ByteSequence; /** * This interface represents an abstract MIME field. A MIME field must have a non null * name and a content body (unfolded but unparsed and possibly encoded). Optionally implementing * classes may also retain the original (raw) representation in a form of {@link ByteSequence}. *

* Specific implementations of this interface may also use a richer model to represent the field * if its body can be parsed into a set of constituent elements. */ public interface Field { /** * Returns the name of the field. */ String getName(); /** * Gets the unparsed and possibly encoded (see RFC 2047) field body string. * * @return the unparsed field body string. */ String getBody(); /** * Gets original (raw) representation of the field, if available, * null otherwise. */ ByteSequence getRaw(); } ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootapache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/stream/BasicBodyDescriptor.javaapache-mime4j-project-0.7.2/core/src/main/java/org/apache/james/mime4j/stream/BasicBodyDescriptor.ja0000644000000000000000000000576611702050540031663 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.stream; class BasicBodyDescriptor implements BodyDescriptor { private final String mimeType; private final String mediaType; private final String subType; private final String boundary; private final String charset; private final String transferEncoding; private final long contentLength; BasicBodyDescriptor( final String mimeType, final String mediaType, final String subType, final String boundary, final String charset, final String transferEncoding, final long contentLength) { super(); this.mimeType = mimeType; this.mediaType = mediaType; this.subType = subType; this.boundary = boundary; this.charset = charset; this.transferEncoding = transferEncoding; this.contentLength = contentLength; } public String getMimeType() { return mimeType; } public String getMediaType() { return mediaType; } public String getSubType() { return subType; } public String getBoundary() { return boundary; } public String getCharset() { return charset; } public String getTransferEncoding() { return transferEncoding; } public long getContentLength() { return contentLength; } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("[mimeType="); sb.append(mimeType); sb.append(", mediaType="); sb.append(mediaType); sb.append(", subType="); sb.append(subType); sb.append(", boundary="); sb.append(boundary); sb.append(", charset="); sb.append(charset); sb.append("]"); return sb.toString(); } } apache-mime4j-project-0.7.2/core/src/main/appended-resources/0000755000000000000000000000000011702050540022513 5ustar rootrootapache-mime4j-project-0.7.2/core/src/main/appended-resources/supplemental-models.xml0000644000000000000000000000377111702050540027237 0ustar rootroot commons-io commons-io Apache Commons IO http://jakarta.apache.org/commons/io/ The Apache Software Foundation http://www.apache.org/ Apache License, Version 2.0 http://www.apache.org/licenses/LICENSE-2.0.html repo junit junit JUnit http://www.junit.org/ Kent Beck, Erich Gamma, and David Saff Common Public License Version 1.0 http://www.opensource.org/licenses/cpl.php apache-mime4j-project-0.7.2/core/src/test/0000755000000000000000000000000011702050532016757 5ustar rootrootapache-mime4j-project-0.7.2/core/src/test/java/0000755000000000000000000000000011702050530017676 5ustar rootrootapache-mime4j-project-0.7.2/core/src/test/java/org/0000755000000000000000000000000011702050530020465 5ustar rootrootapache-mime4j-project-0.7.2/core/src/test/java/org/apache/0000755000000000000000000000000011702050530021706 5ustar rootrootapache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/0000755000000000000000000000000011702050530023005 5ustar rootrootapache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/0000755000000000000000000000000011702050532024174 5ustar rootrootapache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/parser/0000755000000000000000000000000011702050530025466 5ustar rootrootapache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/parser/TestHandler.java0000644000000000000000000000730311702050530030551 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.parser; import java.io.IOException; import java.io.InputStream; import org.apache.james.mime4j.parser.ContentHandler; import org.apache.james.mime4j.stream.BodyDescriptor; import org.apache.james.mime4j.stream.Field; import org.apache.james.mime4j.util.ContentUtil; /** * Helper class to run comparison of parsed results */ class TestHandler implements ContentHandler { StringBuilder sb = new StringBuilder(); private String escape(char c) { if (c == '&') { return "&"; } if (c == '>') { return ">"; } if (c == '<') { return "<"; } return "" + c; } private String escape(String s) { s = s.replaceAll("&", "&"); s = s.replaceAll(">", ">"); s = s.replaceAll("<", "<"); return s; } public void epilogue(InputStream is) throws IOException { sb.append("\r\n"); int b = 0; while ((b = is.read()) != -1) { sb.append(escape((char) b)); } sb.append("\r\n"); } public void preamble(InputStream is) throws IOException { sb.append("\r\n"); int b = 0; while ((b = is.read()) != -1) { sb.append(escape((char) b)); } sb.append("\r\n"); } public void startMultipart(BodyDescriptor bd) { sb.append("\r\n"); } public void body(BodyDescriptor bd, InputStream is) throws IOException { sb.append("\r\n"); int b = 0; while ((b = is.read()) != -1) { sb.append(escape((char) b)); } sb.append("\r\n"); } public void endMultipart() { sb.append("\r\n"); } public void startBodyPart() { sb.append("\r\n"); } public void endBodyPart() { sb.append("\r\n"); } public void startHeader() { sb.append("

\r\n"); } public void field(Field field) { sb.append("\r\n" + escape(ContentUtil.decode(field.getRaw())) + "\r\n"); } public void endHeader() { sb.append("
\r\n"); } public void startMessage() { sb.append("\r\n"); } public void endMessage() { sb.append("\r\n"); } public void raw(InputStream is) throws IOException { MimeStreamParserExampleMessagesTest.fail("raw should never be called"); } } ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/parser/MimeStreamParserTest.javaapache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/parser/MimeStreamParserTest.j0000644000000000000000000003647711702050530031742 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.parser; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.util.LinkedList; import junit.framework.TestCase; import org.apache.james.mime4j.parser.AbstractContentHandler; import org.apache.james.mime4j.parser.MimeStreamParser; import org.apache.james.mime4j.stream.BodyDescriptor; import org.apache.james.mime4j.stream.Field; import org.apache.james.mime4j.util.ByteSequence; import org.apache.james.mime4j.util.ContentUtil; public class MimeStreamParserTest extends TestCase { public void testBoundaryInEpilogue() throws Exception { StringBuilder sb = new StringBuilder(); sb.append("From: foo@bar.com\r\n"); sb.append("To: someone@else.com\r\n"); sb.append("Content-type: multipart/something; boundary=myboundary\r\n"); sb.append("\r\n"); sb.append("This is the preamble.\r\n"); sb.append("--myboundary\r\n"); sb.append("Content-type: text/plain\r\n"); sb.append("\r\n"); sb.append("This is the first body.\r\n"); sb.append("It's completely meaningless.\r\n"); sb.append("After this line the body ends.\r\n"); sb.append("\r\n"); sb.append("--myboundary--\r\n"); StringBuilder epilogue = new StringBuilder(); epilogue.append("Content-type: text/plain\r\n"); epilogue.append("\r\n"); epilogue.append("This is actually the epilogue but it looks like a second body.\r\n"); epilogue.append("Yada yada yada.\r\n"); epilogue.append("\r\n"); epilogue.append("--myboundary--\r\n"); epilogue.append("This is still the epilogue.\r\n"); sb.append(epilogue.toString()); ByteArrayInputStream bais = new ByteArrayInputStream(sb.toString().getBytes("US-ASCII")); final StringBuilder actual = new StringBuilder(); MimeStreamParser parser = new MimeStreamParser(); parser.setContentHandler(new AbstractContentHandler() { @Override public void epilogue(InputStream is) throws IOException { int b; while ((b = is.read()) != -1) { actual.append((char) b); } } }); parser.parse(bais); assertEquals(epilogue.toString(), actual.toString()); } public void testParseOneLineFields() throws Exception { StringBuilder sb = new StringBuilder(); final LinkedList expected = new LinkedList(); expected.add("From: foo@abr.com"); sb.append(expected.getLast() + "\r\n"); expected.add("Subject: A subject"); sb.append(expected.getLast() + "\r\n"); MimeStreamParser parser = new MimeStreamParser(); parser.setContentHandler(new AbstractContentHandler() { @Override public void field(Field field) { assertEquals(expected.removeFirst(), decode(field.getRaw())); } }); parser.parse(new ByteArrayInputStream(sb.toString().getBytes())); assertEquals(0, expected.size()); } public void testCRWithoutLFInHeader() throws Exception { /* * Test added because \r:s not followed by \n:s in the header would * cause an infinite loop. */ StringBuilder sb = new StringBuilder(); final LinkedList expected = new LinkedList(); expected.add("The-field: This field\r\rcontains CR:s\r\r" + "not\r\n\tfollowed by LF"); sb.append(expected.getLast() + "\r\n"); MimeStreamParser parser = new MimeStreamParser(); parser.setContentHandler(new AbstractContentHandler() { @Override public void field(Field field) { assertEquals(expected.removeFirst(), decode(field.getRaw())); } }); parser.parse(new ByteArrayInputStream(sb.toString().getBytes())); assertEquals(0, expected.size()); } public void testParseMultiLineFields() throws Exception { StringBuilder sb = new StringBuilder(); final LinkedList expected = new LinkedList(); expected.add("Received: by netmbx.netmbx.de (/\\==/\\ Smail3.1.28.1)\r\n" + "\tfrom mail.cs.tu-berlin.de with smtp\r\n" + "\tid <m0uWPrO-0004wpC>;" + " Wed, 19 Jun 96 18:12 MES"); sb.append(expected.getLast() + "\r\n"); expected.add("Subject: A folded subject\r\n Line 2\r\n\tLine 3"); sb.append(expected.getLast() + "\r\n"); MimeStreamParser parser = new MimeStreamParser(); parser.setContentHandler(new AbstractContentHandler() { @Override public void field(Field field) { assertEquals(expected.removeFirst(), decode(field.getRaw())); } }); parser.parse(new ByteArrayInputStream(sb.toString().getBytes())); assertEquals(0, expected.size()); } public void testStop() throws Exception { final MimeStreamParser parser = new MimeStreamParser(); TestHandler handler = new TestHandler() { @Override public void endHeader() { super.endHeader(); parser.stop(); } }; parser.setContentHandler(handler); String msg = "Subject: Yada yada\r\n" + "From: foo@bar.com\r\n" + "\r\n" + "Line 1\r\n" + "Line 2\r\n"; String expected = "\r\n" + "
\r\n" + "\r\n" + "Subject: Yada yada" + "\r\n" + "\r\n" + "From: foo@bar.com" + "\r\n" + "
\r\n" + "\r\n" + "\r\n" + "
\r\n"; parser.parse(new ByteArrayInputStream(msg.getBytes())); String result = handler.sb.toString(); assertEquals(expected, result); } /* * Tests that invalid fields are ignored. */ public void testInvalidFields() throws Exception { StringBuilder sb = new StringBuilder(); final LinkedList expected = new LinkedList(); sb.append("From - foo@abr.com\r\n"); expected.add("From: some@one.com"); sb.append(expected.getLast() + "\r\n"); expected.add("Subject: A subject"); sb.append(expected.getLast() + "\r\n"); sb.append("A line which should be ignored\r\n"); MimeStreamParser parser = new MimeStreamParser(); parser.setContentHandler(new AbstractContentHandler() { @Override public void field(Field field) { assertEquals(expected.removeFirst(), decode(field.getRaw())); } }); parser.parse(new ByteArrayInputStream(sb.toString().getBytes())); assertEquals(0, expected.size()); } /* * Tests that empty streams still generate the expected series of events. */ public void testEmptyStream() throws Exception { final LinkedList expected = new LinkedList(); expected.add("startMessage"); expected.add("startHeader"); expected.add("endHeader"); expected.add("body"); expected.add("endMessage"); MimeStreamParser parser = new MimeStreamParser(); parser.setContentHandler(new AbstractContentHandler() { @Override public void body(BodyDescriptor bd, InputStream is) { assertEquals(expected.removeFirst(), "body"); } @Override public void endMultipart() { fail("endMultipart shouldn't be called for empty stream"); } @Override public void endBodyPart() { fail("endBodyPart shouldn't be called for empty stream"); } @Override public void endHeader() { assertEquals(expected.removeFirst(), "endHeader"); } @Override public void endMessage() { assertEquals(expected.removeFirst(), "endMessage"); } @Override public void field(Field field) { fail("field shouldn't be called for empty stream"); } @Override public void startMultipart(BodyDescriptor bd) { fail("startMultipart shouldn't be called for empty stream"); } @Override public void startBodyPart() { fail("startBodyPart shouldn't be called for empty stream"); } @Override public void startHeader() { assertEquals(expected.removeFirst(), "startHeader"); } @Override public void startMessage() { assertEquals(expected.removeFirst(), "startMessage"); } }); parser.parse(new ByteArrayInputStream(new byte[0])); assertEquals(0, expected.size()); } /* * Tests parsing of empty headers. */ public void testEmpyHeader() throws Exception { StringBuilder sb = new StringBuilder(); sb.append("\r\n"); sb.append("The body is right here\r\n"); final StringBuilder body = new StringBuilder(); MimeStreamParser parser = new MimeStreamParser(); parser.setContentHandler(new AbstractContentHandler() { @Override public void field(Field field) { fail("No fields should be reported"); } @Override public void body(BodyDescriptor bd, InputStream is) throws IOException { int b; while ((b = is.read()) != -1) { body.append((char) b); } } }); parser.parse(new ByteArrayInputStream(sb.toString().getBytes())); assertEquals("The body is right here\r\n", body.toString()); } /* * Tests parsing of empty body. */ public void testEmptyBody() throws Exception { StringBuilder sb = new StringBuilder(); final LinkedList expected = new LinkedList(); expected.add("From: some@one.com"); sb.append(expected.getLast() + "\r\n"); expected.add("Subject: A subject"); sb.append(expected.getLast() + "\r\n\r\n"); MimeStreamParser parser = new MimeStreamParser(); parser.setContentHandler(new AbstractContentHandler() { @Override public void field(Field field) { assertEquals(expected.removeFirst(), decode(field.getRaw())); } @Override public void body(BodyDescriptor bd, InputStream is) throws IOException { assertEquals(-1, is.read()); } }); parser.parse(new ByteArrayInputStream(sb.toString().getBytes())); assertEquals(0, expected.size()); } /* * Tests that invalid fields are ignored. */ public void testPrematureEOFAfterFields() throws Exception { StringBuilder sb = new StringBuilder(); final LinkedList expected = new LinkedList(); expected.add("From: some@one.com"); sb.append(expected.getLast() + "\r\n"); expected.add("Subject: A subject"); sb.append(expected.getLast()); MimeStreamParser parser = new MimeStreamParser(); parser.setContentHandler(new AbstractContentHandler() { @Override public void field(Field field) { assertEquals(expected.removeFirst(), decode(field.getRaw())); } }); parser.parse(new ByteArrayInputStream(sb.toString().getBytes())); assertEquals(0, expected.size()); sb = new StringBuilder(); expected.clear(); expected.add("From: some@one.com"); sb.append(expected.getLast() + "\r\n"); expected.add("Subject: A subject"); sb.append(expected.getLast() + "\r\n"); parser = new MimeStreamParser(); parser.setContentHandler(new AbstractContentHandler() { @Override public void field(Field field) { assertEquals(expected.removeFirst(), decode(field.getRaw())); } }); parser.parse(new ByteArrayInputStream(sb.toString().getBytes())); assertEquals(0, expected.size()); } public void testAutomaticContentDecoding() throws Exception { MimeStreamParser parser = new MimeStreamParser(); parser.setContentDecoding(true); TestHandler handler = new TestHandler(); parser.setContentHandler(handler); String msg = "Subject: Yada yada\r\n" + "From: foo@bar.com\r\n" + "Content-Type: application/octet-stream\r\n" + "Content-Transfer-Encoding: base64\r\n" + "\r\n" + "V2hvIGF0ZSBteSBjYWtlPwo="; String expected = "\r\n" + "
\r\n" + "\r\n" + "Subject: Yada yada" + "\r\n" + "\r\n" + "From: foo@bar.com" + "\r\n" + "\r\n" + "Content-Type: application/octet-stream" + "\r\n" + "\r\n" + "Content-Transfer-Encoding: base64" + "\r\n" + "
\r\n" + "\r\n" + "Who ate my cake?\n" + "\r\n" + "
\r\n"; parser.parse(new ByteArrayInputStream(msg.getBytes())); String result = handler.sb.toString(); assertEquals(expected, result); } protected String decode(ByteSequence byteSequence) { return ContentUtil.decode(byteSequence); } } ././@LongLink0000000000000000000000000000016700000000000011571 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/parser/MimeStreamParserExampleMessagesTest.javaapache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/parser/MimeStreamParserExampl0000644000000000000000000001226011702050530032001 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.parser; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.JarURLConnection; import java.net.MalformedURLException; import java.net.URISyntaxException; import java.net.URL; import java.util.Enumeration; import java.util.jar.JarEntry; import java.util.jar.JarFile; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; import org.apache.commons.io.IOUtils; import org.apache.james.mime4j.parser.MimeStreamParser; import org.apache.james.mime4j.stream.MimeConfig; /** * Creates a TestSuite running the test for each .msg file in the test resouce folder. * Allow running of a single test from Unit testing GUIs */ public class MimeStreamParserExampleMessagesTest extends TestCase { private URL url; public MimeStreamParserExampleMessagesTest(String name, URL url) { super(name); this.url = url; } @Override protected void runTest() throws Throwable { MimeStreamParser parser = null; TestHandler handler = null; MimeConfig config = new MimeConfig(); if (getName().startsWith("malformedHeaderStartsBody")) { config.setMalformedHeaderStartsBody(true); } config.setMaxLineLen(-1); parser = new MimeStreamParser(config); handler = new TestHandler(); parser.setContentHandler(handler); parser.parse(url.openStream()); String result = handler.sb.toString(); String s = url.toString(); String prefix = s.substring(0, s.lastIndexOf('.')); URL xmlFileUrl = new URL(prefix + ".xml"); try { InputStream openStream = xmlFileUrl.openStream(); String expected = IOUtils.toString(openStream, "ISO8859-1"); assertEquals(expected, result); } catch (FileNotFoundException e) { IOUtils.write(result, new FileOutputStream(xmlFileUrl.getPath()+".expected")); fail("Expected file created."); } } public static Test suite() throws IOException, URISyntaxException { return new MimeStreamParserExampleMessagesTestSuite(); } static class MimeStreamParserExampleMessagesTestSuite extends TestSuite { public MimeStreamParserExampleMessagesTestSuite() throws IOException, URISyntaxException { addTests("/testmsgs"); addTests("/mimetools-testmsgs"); } private void addTests(String testsFolder) throws URISyntaxException, MalformedURLException, IOException { URL resource = MimeStreamParserExampleMessagesTestSuite.class.getResource(testsFolder); if (resource != null) { if (resource.getProtocol().equalsIgnoreCase("file")) { File dir = new File(resource.toURI()); File[] files = dir.listFiles(); for (File f : files) { if (f.getName().endsWith(".msg")) { addTest(new MimeStreamParserExampleMessagesTest(f.getName(), f.toURI().toURL())); } } } else if (resource.getProtocol().equalsIgnoreCase("jar")) { JarURLConnection conn = (JarURLConnection) resource.openConnection(); JarFile jar = conn.getJarFile(); for (Enumeration it = jar.entries(); it.hasMoreElements(); ) { JarEntry entry = it.nextElement(); String s = "/" + entry.toString(); File f = new File(s); if (s.startsWith(testsFolder) && s.endsWith(".msg")) { addTest(new MimeStreamParserExampleMessagesTest(f.getName(), new URL("jar:file:" + jar.getName() + "!" + s))); } } } } } } } apache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/ExampleMail.java0000644000000000000000000011414111702050532027237 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j; import java.nio.charset.Charset; import java.util.Locale; import org.apache.james.mime4j.util.CharsetUtil; public class ExampleMail { public static final String MIME_MULTIPART_EMBEDDED_MESSAGES_INNER_MULTIPART_MIXED = "--4.66920160910299\r\n" + "Content-Type: image/gif\r\n" + "Content-Transfer-Encoding: base64\r\n" + "MIME-Version: 1.0\r\n" + "Content-ID: 238478934723847238947892374\r\n" + "Content-Description: Bogus Image Data\r\n" + "\r\n" + "ABCDFEGHIJKLMNO\r\n" + "\r\n" + "--4.66920160910299\r\n" + "Content-Type: message/rfc822\r\n" + "\r\n" + "From: Timothy Tayler \r\n" + "To: John Smith \r\n" + "Date: Sat, 16 Feb 2008 12:00:00 +0000 (GMT)\r\n" + "Subject: Another Example Email\r\n" + "Content-Type: multipart/mixed;boundary=2.50290787509\r\n" + "\r\n" + "Yet another preamble\r\n" + "\r\n" + "--2.50290787509\r\n" + "Content-Type: text/plain\r\n" + "\r\n" + "Rhubard AND Custard!\r\n" + "\r\n" + "--2.50290787509\r\n" + "Content-Type: multipart/alternative;boundary=3.243F6A8885A308D3\r\n" + "\r\n" + "--3.243F6A8885A308D3\r\n" + "Content-Type: text/plain\r\n" + "\r\n" + "Rhubard?Custard?\r\n" + "\r\n" + "--3.243F6A8885A308D3\r\n" + "\r\n" + "Content-Type: text/richtext\r\n" + "\r\n" + "Rhubard?Custard?\r\n" + "\r\n" + "--3.243F6A8885A308D3--\r\n" + "\r\n" + "--2.50290787509--\r\n" + "\r\n" + "--4.66920160910299--"; public static final String MIME_MULTIPART_EMBEDDED_MESSAGES_INNER_MAIL = "From: Timothy Tayler \r\n" + "To: Samual Smith \r\n" + "Date: Thu, 14 Feb 2008 12:00:00 +0000 (GMT)\r\n" + "Subject: A Multipart Alternative Email\r\n" + "Content-Type: multipart/alternative;boundary=42\r\n" + "\r\n" + "This message has a premable\r\n" + "\r\n" + "--42\r\n" + "Content-Type: text/plain; charset=US-ASCII\r\n" + "\r\n" + "Custard!\r\n" + "\r\n" + "--42\r\n" + "Content-Type: application/octet-stream\r\n" + "\r\n" + "CUSTARDCUSTARDCUSTARD\r\n" + "\r\n" + "--42--\r\n"; public static final String MIME_MULTIPART_EMBEDDED_MESSAGES_BODY = "Start with a preamble\r\n" + "\r\n" + "--1729\r\n" + "Content-Type: text/plain; charset=US-ASCII\r\n" + "\r\n" + "Rhubarb!\r\n" + "\r\n" + "--1729\r\n" + "Content-Type: application/octet-stream\r\n" + "Content-Transfer-Encoding: base64\r\n" + "\r\n" + "987654321AHPLA\r\n" + "\r\n" + "--1729\r\n" + "Content-Type: message/rfc822\r\n" + "\r\n" + MIME_MULTIPART_EMBEDDED_MESSAGES_INNER_MAIL + "\r\n" + "--1729\r\n" + "Content-Type: multipart/mixed; boundary=4.66920160910299\r\n" + "\r\n" + MIME_MULTIPART_EMBEDDED_MESSAGES_INNER_MULTIPART_MIXED + "\r\n" + "--1729--\r\n" + "\r\n"; public static final String MD5_CONTENT = "Q2hlY2sgSW50ZWdyaXR5IQ=="; public static final String CONTENT_DESCRIPTION = "Blah blah blah"; public static final String CONTENT_ID = ""; public static final Charset US_ASCII = CharsetUtil.US_ASCII; public static final Charset LATIN1 = CharsetUtil.ISO_8859_1; public static final String MIME_MULTIPART_EMBEDDED_MESSAGES = "From: Timothy Tayler \r\n" + "To: Samual Smith \r\n" + "Date: Thu, 14 Feb 2008 12:00:00 +0000 (GMT)\r\n" + "Subject: A Multipart Email\r\n" + "Content-Type: multipart/mixed;boundary=1729\r\n" + "\r\n" + MIME_MULTIPART_EMBEDDED_MESSAGES_BODY; public static final String MULTIPART_WITH_CONTENT_LOCATION = "From: Timothy Tayler \r\n" + "To: Samual Smith \r\n" + "Date: Thu, 14 Feb 2008 12:00:00 +0000 (GMT)\r\n" + "Subject: A Multipart Email With Content-Location\r\n" + "Content-Type: multipart/mixed;boundary=1729\r\n\r\n" + "Start with a preamble\r\n" + "\r\n--1729\r\n" + "Content-Type: application/xhtml+xml\r\n" + "Content-Location: relative/url\r\n\r\n" + "\r\n" + "RhubarbRhubarb!\r\n" + "\r\n--1729\r\n" + "Content-Type: text/plain; charset=US-ASCII\r\n" + "Content-Location: http://www.example.org/absolute/rhubard.txt\r\n\r\n" + "Rhubarb!\r\n" + "\r\n--1729\r\n" + "Content-Type: text/html; charset=US-ASCII\r\n\r\n" + "RhubarbRhubarb!\r\n" + "\r\n--1729\r\n" + "Content-Type: text/plain; charset=US-ASCII\r\n" + "Content-Location: (Some comment) \"http://www.example.org/absolute/comments/rhubard.txt\"(Another comment)\r\n\r\n" + "Rhubarb!\r\n" + "\r\n--1729\r\n" + "Content-Type: text/html; charset=US-ASCII\r\n" + "Content-Location:\"http://www.example.org/this/\r\n" + " is/a/very/long/url/split/\r\n" + " over/two/lines/\"\r\n\r\n" + "RhubarbRhubarb!\r\n" + "\r\n--1729--\r\n" + "This is the epilogue\r\n"; public static final String MULTIPART_WITH_BINARY_ATTACHMENTS_HEADER = "Return-Path: \r\n" + "Received: (qmail 18554 invoked from network); 25 May 2008 14:38:53 -0000\r\n" + "Received: from unknown (HELO p3presmtp01-16.prod.phx3.secureserver.net)\r\n" + " ([208.109.80.165]) (envelope-sender ) by\r\n" + " smtp20-01.prod.mesa1.secureserver.net (qmail-1.03) with SMTP for\r\n" + " ; 25 May 2008 14:38:53 -0000\r\n" + "Received: (qmail 9751 invoked from network); 25 May 2008 14:38:53 -0000\r\n" + "Received: from minotaur.apache.org ([140.211.11.9]) (envelope-sender\r\n" + " ) by\r\n" + " p3presmtp01-16.prod.phx3.secureserver.net (qmail-ldap-1.03) with SMTP for\r\n" + " ; 25 May 2008 14:38:50 -0000\r\n" + "Received: (qmail 46768 invoked by uid 1289); 25 May 2008 14:38:46 -0000\r\n" + "Delivered-To: rdonkin@locus.apache.org\r\n" + "Received: (qmail 46763 invoked from network); 25 May 2008 14:38:46 -0000\r\n" + "Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by\r\n" + " minotaur.apache.org with SMTP; 25 May 2008 14:38:46 -0000\r\n" + "Received: (qmail 61275 invoked by uid 500); 25 May 2008 14:38:48 -0000\r\n" + "Delivered-To: apmail-rdonkin@apache.org\r\n" + "Delivered-To: rob@localhost\r\n" + "Delivered-To: rob@localhost\r\n" + "Received: (qmail 61272 invoked by uid 99); 25 May 2008 14:38:48 -0000\r\n" + "Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136)\r\n" + " by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 25 May 2008 07:38:48 -0700\r\n" + "X-ASF-Spam-Status: No, hits=-0.0 required=10.0 tests=SPF_PASS\r\n" + "X-Spam-Check-By: apache.org\r\n" + "Received-SPF: pass (athena.apache.org: domain of\r\n" + " robertburrelldonkin@blueyonder.co.uk designates 195.188.213.5 as permitted\r\n" + " sender)\r\n" + "Received: from [195.188.213.5] (HELO smtp-out2.blueyonder.co.uk)\r\n" + " (195.188.213.5) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 25 May 2008\r\n" + " 14:38:00 +0000\r\n" + "Received: from [172.23.170.140] (helo=anti-virus02-07) by\r\n" + " smtp-out2.blueyonder.co.uk with smtp (Exim 4.52) id 1K0HMV-00087e-HY for\r\n" + " rdonkin@apache.org; Sun, 25 May 2008 15:38:15 +0100\r\n" + "Received: from [82.38.65.6] (helo=[10.0.0.27]) by\r\n" + " asmtp-out5.blueyonder.co.uk with esmtpa (Exim 4.52) id 1K0HMU-0001A2-3q for\r\n" + " rdonkin@apache.org; Sun, 25 May 2008 15:38:14 +0100\r\n" + "Subject: This is an example of a multipart mixed email with image content\r\n" + "From: Robert Burrell Donkin \r\n" + "To: Robert Burrell Donkin \r\n" + "Content-Type: multipart/mixed; boundary=\"=-tIdGYVstQJghyEDATnJ+\"\r\n" + "Date: Sun, 25 May 2008 15:38:13 +0100\r\n" + "Message-Id: <1211726293.5772.10.camel@localhost>\r\n" + "Mime-Version: 1.0\r\n" + "X-Mailer: Evolution 2.12.3 \r\n" + "X-Virus-Checked: Checked by ClamAV on apache.org\r\n" + "X-Nonspam: None\r\n" + "X-fetched-from: mail.xmlmapt.org\r\n" + "X-Evolution-Source: imap://rob@thebes/\r\n" + "\r\n"; public static final String MULTIPART_WITH_BINARY_ATTACHMENTS_BODY = "--=-tIdGYVstQJghyEDATnJ+\r\n" + "Content-Type: text/plain\r\n" + "Content-Transfer-Encoding: 7bit\r\n" + "\r\n" + "Licensed to the Apache Software Foundation (ASF) under one\r\n" + "or more contributor license agreements. See the NOTICE file\r\n" + "distributed with this work for additional information\r\n" + "regarding copyright ownership. The ASF licenses this file\r\n" + "to you under the Apache License, Version 2.0 (the\r\n" + "\"License\"); you may not use this file except in compliance\r\n" + "with the License. You may obtain a copy of the License at\r\n" + "\r\n" + " http://www.apache.org/licenses/LICENSE-2.0\r\n" + " \r\n" + "Unless required by applicable law or agreed to in writing,\r\n" + "software distributed under the License is distributed on an\r\n" + "\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n" + "KIND, either express or implied. See the License for the\r\n" + "specific language governing permissions and limitations\r\n" + "under the License.\r\n" + " \r\n" + "\r\n" + "--=-tIdGYVstQJghyEDATnJ+\r\n" + "Content-Disposition: attachment; filename=blob.png;\r\n modification-date=\"Sun, 21 Jun 2008 15:32:18 +0000\"; " + "creation-date=\"Sat, 20 Jun 2008 10:15:09 +0000\"; read-date=\"Mon, 22 Jun 2008 12:08:56 +0000\";size=10234;\r\n" + "Content-Type: image/png; name=blob.png\r\n" + "Content-Transfer-Encoding: base64\r\n" + "\r\n" + "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAIAAAACUFjqAAAAAXNSR0IArs4c6QAAAAlwSFlzAAAL\r\n" + "EwAACxMBAJqcGAAAAAd0SU1FB9gFGQ4iJ99ufcYAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRo\r\n" + "IEdJTVBXgQ4XAAAA0ElEQVQY02XMwUrDQBhF4XsnkyYhjWJaCloEN77/a/gERVwJLQiiNjYmbTqZ\r\n" + "/7qIG/VsPziMTw+23Wj/ovZdMQJgViCvWNVusfa23djuUf2nugbnI2RynkWF5a2Fwdvrs7q9vhqE\r\n" + "E2QAEIO6BhZBerUf6luMw49NyTR0OLw5kJD9sqk4Ipwc6GAREv5n5piXTDOQfy1JMSs8ZgXKq2kF\r\n" + "iwDgEriEecnLlefFEmGAIvqD4ggJJNMM85qLtXfX9xYGuEQ+4/kIi0g88zlXd66++QaQDG5GPZyp\r\n" + "rQAAAABJRU5ErkJggg==\r\n" + "\r\n" + "--=-tIdGYVstQJghyEDATnJ+\r\n" + "Content-Disposition: attachment; filename=blob.png\r\n" + "Content-Type: image/png; name=blob.png\r\n" + "Content-Transfer-Encoding: base64\r\n" + "\r\n" + "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAIAAAACUFjqAAAAAXNSR0IArs4c6QAAAAlwSFlzAAAL\r\n" + "EwAACxMBAJqcGAAAAAd0SU1FB9gFGQ4iJ99ufcYAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRo\r\n" + "IEdJTVBXgQ4XAAAA0ElEQVQY02XMwUrDQBhF4XsnkyYhjWJaCloEN77/a/gERVwJLQiiNjYmbTqZ\r\n" + "/7qIG/VsPziMTw+23Wj/ovZdMQJgViCvWNVusfa23djuUf2nugbnI2RynkWF5a2Fwdvrs7q9vhqE\r\n" + "E2QAEIO6BhZBerUf6luMw49NyTR0OLw5kJD9sqk4Ipwc6GAREv5n5piXTDOQfy1JMSs8ZgXKq2kF\r\n" + "iwDgEriEecnLlefFEmGAIvqD4ggJJNMM85qLtXfX9xYGuEQ+4/kIi0g88zlXd66++QaQDG5GPZyp\r\n" + "rQAAAABJRU5ErkJggg==\r\n" + "\r\n" + "--=-tIdGYVstQJghyEDATnJ+\r\n" + "Content-Disposition: attachment; filename=rhubarb.txt\r\n" + "Content-Type: text/plain; name=rhubarb.txt; charset=us-ascii\r\n" + "Content-Language: en, en-US, en-CA\r\n" + "Content-Transfer-Encoding: quoted-printable\r\n" + "\r\n" + "Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhu=\r\n" + "barb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubar=\r\n" + "b Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb R=\r\n" + "hubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhub=\r\n" + "arb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb=\r\n" + " Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rh=\r\n" + "ubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhuba=\r\n" + "rb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb =\r\n" + "Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhu=\r\n" + "barb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubar=\r\n" + "b Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb R=\r\n" + "hubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhub=\r\n" + "arb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb=\r\n" + " Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rh=\r\n" + "ubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhuba=\r\n" + "rb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb =\r\n" + "Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhu=\r\n" + "barb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubar=\r\n" + "b Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb R=\r\n" + "hubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhub=\r\n" + "arb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb=\r\n" + " Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rh=\r\n" + "ubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhuba=\r\n" + "rb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb =\r\n" + "Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhu=\r\n" + "barb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubar=\r\n" + "b Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb R=\r\n" + "hubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhub=\r\n" + "arb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb=\r\n" + " Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rh=\r\n" + "ubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhuba=\r\n" + "rb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb =\r\n" + "Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhu=\r\n" + "barb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubar=\r\n" + "b Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb R=\r\n" + "hubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhub=\r\n" + "arb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb=\r\n" + " Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rh=\r\n" + "ubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhuba=\r\n" + "rb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb =\r\n" + "Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb\r\n" + "\r\n" + "--=-tIdGYVstQJghyEDATnJ+--\r\n"; public static final String MULTIPART_WITH_BINARY_ATTACHMENTS = MULTIPART_WITH_BINARY_ATTACHMENTS_HEADER + "\r\n" + MULTIPART_WITH_BINARY_ATTACHMENTS_BODY; public static final String MULTIPART_WITH_BINARY_ATTACHMENTS_NOPREAMBLE = MULTIPART_WITH_BINARY_ATTACHMENTS_HEADER + MULTIPART_WITH_BINARY_ATTACHMENTS_BODY; public static final String MULTIPART_WITH_BINARY_ATTACHMENTS_PREAMBLE_EPILOGUE = MULTIPART_WITH_BINARY_ATTACHMENTS_HEADER + "This is a preamble\r\n" + "With 2 lines\r\n" + MULTIPART_WITH_BINARY_ATTACHMENTS_BODY + "This is an epilogue\r\n" + "With 2 lines\r\n"; public static final String ONE_PART_MIME_ASCII_BODY = "A single part MIME mail.\r\n"; public static final String RFC822_SIMPLE_BODY = "This is a very simple email.\r\n"; public static final String ONE_PART_MIME_8859_BODY = "M\u00F6nchengladbach\r\n"; public static final String ONE_PART_MIME_BASE64_LATIN1_BODY = "Hello Mo\u00F6nchengladbach\r\n"; public static final String ONE_PART_MIME_QUOTED_PRINTABLE_ASCII_BODY = "Sonnet LXXXI By William Shakespeare\r\n" + "Or I shall live your epitaph to make,\r\n" + "Or you survive when I in earth am rotten;\r\n" + "From hence your memory death cannot take,\r\n" + "Although in me each part will be forgotten.\r\n" + "Your name from hence immortal life shall have,\r\n" + "Though I, once gone, to all the world must die:\r\n" + "The earth can yield me but a common grave,\r\n" + "When you entombed in men's eyes shall lie.\r\n" + "Your monument shall be my gentle verse,\r\n" + "Which eyes not yet created shall o'er-read;\r\n" + "And tongues to be, your being shall rehearse,\r\n" + "When all the breathers of this world are dead;\r\n" + " You still shall live,--such virtue hath my pen,--\r\n" + " Where breath most breathes, even in the mouths of men.\r\n"; private static final byte[] ONE_PART_MIME_BASE64_LATIN1_ENCODED = EncodeUtils.toBase64(latin1(ONE_PART_MIME_BASE64_LATIN1_BODY)); public static final String ONE_PART_MIME_BASE64_ASCII_BODY = "Hello, World!\r\n"; public static final String ONE_PART_MIME_WITH_CONTENT_DISPOSITION_PARAMETERS = "Message-ID: \r\n" + "Date: Thu, 6 Mar 2008 18:02:03 +0000\r\n" + "From: \"Robert Burrell Donkin\" \r\n" + "To: \"James Developers List\" \r\n" + "Subject: [Mime4J] getReader\r\n" + "MIME-Version: 1.0\r\n" + "Content-Type: text/plain; charset=US-ASCII\r\n" + "Content-Transfer-Encoding: 7bit\r\n" + "Content-Disposition: inline; foo=bar; one=1; param=value;\r\n" + "Content-MD5: " + MD5_CONTENT + "\r\n" + "Delivered-To: robertburrelldonkin@gmail.com\r\n" + "\r\n" + ONE_PART_MIME_ASCII_BODY; private static final byte[] ONE_PART_MIME_BASE64_ASCII_ENCODED = EncodeUtils.toBase64(ascii(ONE_PART_MIME_BASE64_ASCII_BODY)); public static final String ONE_PART_MIME_ASCII = "Received: by 10.114.126.16 with HTTP; Thu, 6 Mar 2008 10:02:03 -0800 (PST)\r\n" + "Message-ID: \r\n" + "Date: Thu, 6 Mar 2008 18:02:03 +0000\r\n" + "From: \"Robert Burrell Donkin\" \r\n" + "To: \"James Developers List\" \r\n" + "Subject: [Mime4J] getReader\r\n" + "MIME-Version: 1.0\r\n" + "Content-Type: text/plain; charset=US-ASCII\r\n" + "Content-Transfer-Encoding: 7bit\r\n" + "Content-Disposition: inline\r\n" + "Delivered-To: robertburrelldonkin@gmail.com\r\n" + "\r\n" + ONE_PART_MIME_ASCII_BODY; public static final String ONE_PART_MIME_ASCII_COMMENT_IN_MIME_VERSION = "Received: by 10.114.126.16 with HTTP; Thu, 6 Mar 2008 10:02:03 -0800 (PST)\r\n" + "Message-ID: \r\n" + "Date: Thu, 6 Mar 2008 18:02:03 +0000\r\n" + "From: \"Robert Burrell Donkin\" \r\n" + "To: \"James Developers List\" \r\n" + "Subject: [Mime4J] getReader\r\n" + "MIME-Version: 2.(This is a comment)4\r\n" + "Content-Type: text/plain; charset=US-ASCII\r\n" + "Content-Transfer-Encoding: 7bit\r\n" + "Content-Disposition: inline\r\n" + "Delivered-To: robertburrelldonkin@gmail.com\r\n" + "\r\n" + ONE_PART_MIME_ASCII_BODY; public static final String ONE_PART_MIME_ASCII_MIME_VERSION_SPANS_TWO_LINES = "Received: by 10.114.126.16 with HTTP; Thu, 6 Mar 2008 10:02:03 -0800 (PST)\r\n" + "Message-ID: \r\n" + "Date: Thu, 6 Mar 2008 18:02:03 +0000\r\n" + "From: \"Robert Burrell Donkin\" \r\n" + "To: \"James Developers List\" \r\n" + "Subject: [Mime4J] getReader\r\n" + "MIME-Version: 4. \r\n" + " 1\r\n" + "Content-Type: text/plain; charset=US-ASCII\r\n" + "Content-Transfer-Encoding: 7bit\r\n" + "Content-Disposition: inline\r\n" + "Delivered-To: robertburrelldonkin@gmail.com\r\n" + "\r\n" + ONE_PART_MIME_ASCII_BODY; public static final String INNER_MAIL = "From: Timothy Tayler \r\n" + "To: Joshua Tetley \r\n" + "Date: Tue, 12 Feb 2008 17:34:09 +0000 (GMT)\r\n" + "Subject: Multipart Without RFC822 Part\r\n" + "Content-Type: multipart/mixed;boundary=42\r\n\r\n" + "--42\r\n" + "Content-Type:text/plain; charset=US-ASCII\r\n\r\n" + "First part of this mail\r\n" + "--42\r\n" + "Content-Type:text/plain; charset=US-ASCII\r\n\r\n" + "Second part of this mail\r\n" + "--42--\r\n"; public static final String MAIL_WITH_RFC822_PART = "MIME-Version: 1.0\r\n" + "From: Timothy Tayler \r\n" + "To: Joshua Tetley \r\n" + "Date: Tue, 12 Feb 2008 17:34:09 +0000 (GMT)\r\n" + "Subject: Multipart With RFC822 Part\r\n" + "Content-Type: multipart/mixed;boundary=1729\r\n\r\n" + "A short premable\r\n" + "--1729\r\n\r\n" + "First part has no headers\r\n" + "--1729\r\n" + "Content-Type: text/plain; charset=US-ASCII\r\n\r\n" + "Second part is plain text\r\n" + "--1729\r\n" + "Content-Type: message/rfc822\r\n\r\n" + INNER_MAIL + "--1729\r\n" + "Content-Type: text/plain; charset=US-ASCII\r\n\r\n" + "Last part is plain text\r\n" + "--1729--\r\n" + "The End"; public static final String ONE_PART_MIME_8859 = "Received: by 10.114.126.16 with HTTP; Thu, 6 Mar 2008 10:02:03 -0800 (PST)\r\n" + "Message-ID: \r\n" + "Date: Thu, 6 Mar 2008 18:02:03 +0000\r\n" + "From: \"Robert Burrell Donkin\" \r\n" + "To: \"James Developers List\" \r\n" + "Subject: [Mime4J] getReader\r\n" + "MIME-Version: 1.0\r\n" + "Content-Type: text/plain; charset=ISO-8859-1\r\n" + "Content-Transfer-Encoding: 8bit\r\n" + "Content-Disposition: inline\r\n" + "Content-ID: " + CONTENT_ID + "\r\n" + "Content-Description: " + CONTENT_DESCRIPTION + "\r\n" + "Delivered-To: robertburrelldonkin@gmail.com\r\n" + "\r\n" + ONE_PART_MIME_8859_BODY; public static final String ONE_PART_MIME_BASE64_ASCII_HEADERS = "Received: by 10.114.126.16 with HTTP; Thu, 6 Mar 2008 10:02:03 -0800 (PST)\r\n" + "Message-ID: \r\n" + "Date: Thu, 6 Mar 2008 18:02:03 +0000\r\n" + "From: \"Robert Burrell Donkin\" \r\n" + "To: \"James Developers List\" \r\n" + "Subject: [Mime4J] getReader\r\n" + "MIME-Version: 1.0\r\n" + "Content-Type: text/plain; charset=US-ASCII\r\n" + "Content-Transfer-Encoding: base64\r\n" + "Content-Disposition: inline\r\n" + "Delivered-To: robertburrelldonkin@gmail.com\r\n" + "\r\n"; public static final String ONE_PART_MIME_BASE64_LATIN1_HEADERS = "Received: by 10.114.126.16 with HTTP; Thu, 6 Mar 2008 10:02:03 -0800 (PST)\r\n" + "Message-ID: \r\n" + "Date: Thu, 6 Mar 2008 18:02:03 +0000\r\n" + "From: \"Robert Burrell Donkin\" \r\n" + "To: \"James Developers List\" \r\n" + "Subject: [Mime4J] getReader\r\n" + "MIME-Version: 1.0\r\n" + "Content-Type: text/plain; charset=ISO-8859-1\r\n" + "Content-Transfer-Encoding: base64\r\n" + "Content-Disposition: inline\r\n" + "Delivered-To: robertburrelldonkin@gmail.com\r\n" + "\r\n"; public static final String ONE_PART_MIME_QUOTED_PRINTABLE_ASCII = "Received: by 10.114.126.16 with HTTP; Thu, 6 Mar 2008 10:02:03 -0800 (PST)\r\n" + "Message-ID: \r\n" + "Date: Thu, 6 Mar 2008 18:02:03 +0000\r\n" + "From: \"Robert Burrell Donkin\" \r\n" + "To: \"James Developers List\" \r\n" + "Subject: [Mime4J] getReader\r\n" + "MIME-Version: 1.0\r\n" + "Content-Type: text/plain; charset=US-ASCII\r\n" + "Content-Transfer-Encoding: Quoted-Printable\r\n" + "Content-Disposition: inline\r\n" + "Delivered-To: robertburrelldonkin@gmail.com\r\n" + "\r\n" + breakLines(ONE_PART_MIME_QUOTED_PRINTABLE_ASCII_BODY.replaceAll("\r\n", "=0D=0A")); public static final String RFC_SIMPLE = "From: Timothy Tayler \r\n" + "To: Samual Smith \r\n" + "Date: Thu, 14 Feb 2008 12:00:00 +0000 (GMT)\r\n" + "Subject: A Simple Email\r\n" + "\r\n" + RFC822_SIMPLE_BODY; public static final String MIME_RFC822_SIMPLE = "From: Samual Smith \r\n" + "To: Joshua Tetley \r\n" + "Date: Thu, 14 Feb 2008 12:30:00 +0000 (GMT)\r\n" + "Subject: FW: A Simple Email\r\n" + "MIME-Version: 1.0\r\n" + "Content-Type: message/rfc822\r\n" + "\r\n" + RFC_SIMPLE; public static final String MIME_MIXED_MULTIPART_VARIOUS_ENCODINGS_7BIT = "Sonnet XXXIII By William Shakespeare\r\n" + "\r\n" + "Full many a glorious morning have I seen\r\n" + "Flatter the mountain tops with sovereign eye,\r\n" + "Kissing with golden face the meadows green,\r\n" + "Gilding pale streams with heavenly alchemy;\r\n" + "Anon permit the basest clouds to ride\r\n" + "With ugly rack on his celestial face,\r\n" + "And from the forlorn world his visage hide,\r\n" + "Stealing unseen to west with this disgrace:\r\n" + "Even so my sun one early morn did shine,\r\n" + "With all triumphant splendour on my brow;\r\n" + "But out! alack! he was but one hour mine,\r\n" + "The region cloud hath mask'd him from me now.\r\n" + " Yet him for this my love no whit disdaineth;\r\n" + " Suns of the world may stain when heaven's sun staineth.\r\n"; public static final String MIME_MIXED_MULTIPART_VARIOUS_ENCODINGS_QUOTED_PRINTABLE = "Sonnet XXXV By William Shakespeare\r\n" + "\r\n" + "No more be griev'd at that which thou hast done:\r\n" + "Roses have thorns, and silver fountains mud:\r\n" + "Clouds and eclipses stain both moon and sun,\r\n" + "And loathsome canker lives in sweetest bud.\r\n" + "All men make faults, and even I in this,\r\n" + "Authorizing thy trespass with compare,\r\n" + "Myself corrupting, salving thy amiss,\r\n" + "Excusing thy sins more than thy sins are;\r\n" + "For to thy sensual fault I bring in sense,--\r\n" + "Thy adverse party is thy advocate,--\r\n" + "And 'gainst myself a lawful plea commence:\r\n" + "Such civil war is in my love and hate,\r\n" + " That I an accessary needs must be,\r\n" + " To that sweet thief which sourly robs from me.\r\n"; public static final String MIME_MIXED_MULTIPART_VARIOUS_ENCODINGS_BASE64 = "Sonnet XXXVIII By William Shakespeare\r\n" + "\r\n" + "How can my muse want subject to invent,\r\n" + "While thou dost breathe, that pour'st into my verse\r\n" + "Thine own sweet argument, too excellent\r\n" + "For every vulgar paper to rehearse?\r\n" + "O! give thy self the thanks, if aught in me\r\n" + "Worthy perusal stand against thy sight;\r\n" + "For who's so dumb that cannot write to thee,\r\n" + "When thou thy self dost give invention light?\r\n" + "Be thou the tenth Muse, ten times more in worth\r\n" + "Than those old nine which rhymers invocate;\r\n" + "And he that calls on thee, let him bring forth\r\n" + "Eternal numbers to outlive long date.\r\n" + " If my slight muse do please these curious days,\r\n" + " The pain be mine, but thine shall be the praise.\r\n"; public static final String MIME_MIXED_MULTIPART_VARIOUS_ENCODINGS_ONE = "From: Timothy Tayler \r\n" + "To: Samual Smith \r\n" + "Date: Thu, 14 Feb 2008 12:00:00 +0000 (GMT)\r\n" + "Subject: A Multipart Email\r\n" + "Content-Type: multipart/mixed;boundary=1729\r\n" + "\r\n" + "Start with a preamble\r\n" + "\r\n" + "--1729\r\n" + "Content-Type: text/plain; charset=US-ASCII\r\n" + "Content-Transfer-Encoding: 7bit\r\n\r\n"; public static final String MIME_MIXED_MULTIPART_VARIOUS_ENCODINGS_TWO = "\r\n--1729\r\n" + "Content-Type: text/plain; charset=US-ASCII\r\n" + "Content-Transfer-Encoding: Quoted-Printable\r\n\r\n"; public static final String MIME_MIXED_MULTIPART_VARIOUS_ENCODINGS_THREE = "\r\n--1729\r\n" + "Content-Type: text/plain; charset=US-ASCII\r\n" + "Content-Transfer-Encoding: base64\r\n\r\n"; public static final String MIME_MIXED_MULTIPART_VARIOUS_ENCODINGS_END = "\r\n--1729--\r\n"; public static final String MIME_MULTIPART_ALTERNATIVE = "From: Timothy Tayler \r\n" + "To: Samual Smith \r\n" + "Date: Thu, 14 Feb 2008 12:00:00 +0000 (GMT)\r\n" + "Subject: A Multipart Email\r\n" + "Content-Type: multipart/alternative;boundary=1729\r\n\r\n" + "Start with a preamble\r\n" + "\r\n--1729\r\n" + "Content-Type: application/xhtml+xml\r\n\r\n" + "\r\n" + "RhubarbRhubarb!\r\n" + "\r\n--1729\r\n" + "Content-Type: text/plain; charset=US-ASCII\r\n\r\n" + "Rhubarb!\r\n" + "\r\n--1729\r\n" + "Content-Type: text/html; charset=US-ASCII\r\n\r\n" + "RhubarbRhubarb!\r\n" + "\r\n--1729--\r\n" + "This is the epilogue\r\n"; private static final byte[][] MIME_MIXED_MULTIPART_VARIOUS_ENCODINGS_BYTE_ARRAYS = { ascii(MIME_MIXED_MULTIPART_VARIOUS_ENCODINGS_ONE), ascii(MIME_MIXED_MULTIPART_VARIOUS_ENCODINGS_7BIT), ascii(MIME_MIXED_MULTIPART_VARIOUS_ENCODINGS_TWO), ascii(breakLines(MIME_MIXED_MULTIPART_VARIOUS_ENCODINGS_QUOTED_PRINTABLE.replaceAll("\r\n", "=0D=0A"))), ascii(MIME_MIXED_MULTIPART_VARIOUS_ENCODINGS_THREE), EncodeUtils.toBase64(ascii(MIME_MIXED_MULTIPART_VARIOUS_ENCODINGS_BASE64)), ascii(MIME_MIXED_MULTIPART_VARIOUS_ENCODINGS_END), }; public static final byte[] MIME_RFC822_SIMPLE_BYTES = ascii(MIME_RFC822_SIMPLE); public static final byte[] MULTIPART_WITH_CONTENT_LOCATION_BYTES = ascii(MULTIPART_WITH_CONTENT_LOCATION); public static final byte[] ONE_PART_MIME_WITH_CONTENT_DISPOSITION_PARAMETERS_BYTES = ascii(ONE_PART_MIME_WITH_CONTENT_DISPOSITION_PARAMETERS); public static final byte[] MIME_MULTIPART_ALTERNATIVE_BYTES = ascii(MIME_MULTIPART_ALTERNATIVE); public static final byte[] MIME_MIXED_MULTIPART_VARIOUS_ENCODINGS_BYTES = join(MIME_MIXED_MULTIPART_VARIOUS_ENCODINGS_BYTE_ARRAYS); public static final byte[] ONE_PART_MIME_QUOTED_PRINTABLE_ASCII_BYTES = ascii(ONE_PART_MIME_QUOTED_PRINTABLE_ASCII); public static final byte[] ONE_PART_MIME_BASE64_LATIN1_UPPERCASE_BYTES = join(ascii(ONE_PART_MIME_BASE64_LATIN1_HEADERS.toUpperCase(Locale.UK)), ONE_PART_MIME_BASE64_LATIN1_ENCODED); public static final byte[] ONE_PART_MIME_BASE64_LATIN1_BYTES = join(ascii(ONE_PART_MIME_BASE64_LATIN1_HEADERS), ONE_PART_MIME_BASE64_LATIN1_ENCODED); public static final byte[] ONE_PART_MIME_BASE64_ASCII_BYTES = join(ascii(ONE_PART_MIME_BASE64_ASCII_HEADERS), ONE_PART_MIME_BASE64_ASCII_ENCODED); public static final byte[] RFC822_SIMPLE_BYTES = US_ASCII.encode(RFC_SIMPLE).array(); public static final byte[] ONE_PART_MIME_ASCII_BYTES = US_ASCII.encode(ONE_PART_MIME_ASCII).array(); public static final byte[] ONE_PART_MIME_8859_BYTES = LATIN1.encode(ONE_PART_MIME_8859).array(); public static final byte[] MULTIPART_WITH_BINARY_ATTACHMENTS_BYTES = US_ASCII.encode(MULTIPART_WITH_BINARY_ATTACHMENTS).array(); public static final byte[] MULTIPART_WITH_BINARY_ATTACHMENTS_NOPREAMBLE_BYTES = US_ASCII.encode(MULTIPART_WITH_BINARY_ATTACHMENTS_NOPREAMBLE).array(); public static final byte[] MULTIPART_WITH_BINARY_ATTACHMENTS_PREAMBLE_EPILOGUE_BYTES = US_ASCII.encode(MULTIPART_WITH_BINARY_ATTACHMENTS_PREAMBLE_EPILOGUE).array(); public static final byte[] ONE_PART_MIME_ASCII_COMMENT_IN_MIME_VERSION_BYTES = US_ASCII.encode(ONE_PART_MIME_ASCII_COMMENT_IN_MIME_VERSION).array(); public static final byte[] ONE_PART_MIME_ASCII_MIME_VERSION_SPANS_TWO_LINES_BYTES = US_ASCII.encode(ONE_PART_MIME_ASCII_MIME_VERSION_SPANS_TWO_LINES).array(); public static final byte[] MAIL_WITH_RFC822_PART_BYTES = ascii(MAIL_WITH_RFC822_PART); public static final byte[] MIME_MULTIPART_EMBEDDED_MESSAGES_BYTES = ascii(MIME_MULTIPART_EMBEDDED_MESSAGES); public static final byte[] ascii(String text) { return US_ASCII.encode(text).array(); } public static final byte[] latin1(String text) { return LATIN1.encode(text).array(); } public static final byte[] join(byte[] one, byte[] two) { byte[] results = new byte[one.length + two.length]; System.arraycopy(one, 0, results, 0, one.length); System.arraycopy(two, 0, results, one.length, two.length); return results; } public static final byte[] join(byte[][] byteArrays) { int length = 0; for (byte[] bytes : byteArrays) { length += bytes.length; } byte[] results = new byte[length]; int count = 0; for (byte[] bytes : byteArrays) { System.arraycopy(bytes, 0, results, count, bytes.length); count += bytes.length; } return results; } public static String breakLines(String original) { StringBuilder buffer = new StringBuilder(original); int count = 76; while(count < buffer.length()) { if (buffer.charAt(count) == '=') { count = count - 1; } else if (buffer.charAt(count-1) == '=') { count = count - 4; } else if (buffer.charAt(count-2) == '=') { count = count - 3; } buffer.insert(count, '\n'); buffer.insert(count, '\r'); buffer.insert(count, '='); count += 79; } final String result = buffer.toString(); return result; } } apache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/util/0000755000000000000000000000000011702050532025151 5ustar rootrootapache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/util/CharsetUtilTest.java0000644000000000000000000000442311702050532031106 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.util; import java.nio.charset.Charset; import junit.framework.TestCase; public class CharsetUtilTest extends TestCase { private static final String SWISS_GERMAN_HELLO = "Gr\374ezi_z\344m\344"; private static final String RUSSIAN_HELLO = "\u0412\u0441\u0435\u043C_\u043F\u0440\u0438\u0432\u0435\u0442"; public void testAllASCII() { String s = "Like hello and stuff"; assertTrue(CharsetUtil.isASCII(s)); } public void testNonASCII() { assertFalse(CharsetUtil.isASCII(SWISS_GERMAN_HELLO)); assertFalse(CharsetUtil.isASCII(RUSSIAN_HELLO)); } public void testCharsetLookup() { Charset c1 = CharsetUtil.lookup("us-ascii"); Charset c2 = CharsetUtil.lookup("ascii"); assertEquals(CharsetUtil.US_ASCII, c1); assertEquals(CharsetUtil.US_ASCII, c2); } public void testCharsetLookupNullInput() { Charset c1 = CharsetUtil.lookup(null); assertNull(c1); } public void testCharsetLookupFailure() { Charset c1 = CharsetUtil.lookup("whatever"); assertNull(c1); } } apache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/util/MimeUtilTest.java0000644000000000000000000000621311702050532030403 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.util; import junit.framework.TestCase; public class MimeUtilTest extends TestCase { public void testFold() throws Exception { assertEquals("this is\r\n a test", MimeUtil.fold("this is a test", 68)); assertEquals("this is\r\n a test", MimeUtil.fold("this is a test", 69)); assertEquals("this\r\n is a test", MimeUtil.fold("this is a test", 70)); assertEquals("this \r\n is a test", MimeUtil.fold( "this is a test", 70)); } public void testFoldOverlyLongNonWhitespace() throws Exception { String ninety = "1234567890123456789012345678901234567890" + "12345678901234567890123456789012345678901234567890"; String input = String.format("testing 1 2 %s testing %s", ninety, ninety); String expected = String.format( "testing 1 2\r\n %s\r\n testing\r\n %s", ninety, ninety); assertEquals(expected, MimeUtil.fold(input, 0)); } public void testUnfold() throws Exception { assertEquals("", MimeUtil.unfold("")); assertEquals("x", MimeUtil.unfold("x")); assertEquals(" x ", MimeUtil.unfold(" x ")); assertEquals("", MimeUtil.unfold("\r")); assertEquals("", MimeUtil.unfold("\n")); assertEquals("", MimeUtil.unfold("\r\n")); assertEquals(" ", MimeUtil.unfold(" \n")); assertEquals(" ", MimeUtil.unfold("\n ")); assertEquals(" ", MimeUtil.unfold(" \r\n")); assertEquals(" ", MimeUtil.unfold("\r\n ")); assertEquals("this is a test", MimeUtil.unfold("this is\r\n a test")); assertEquals("this is a test", MimeUtil.unfold("this is\r\n a test")); assertEquals("this is a test", MimeUtil.unfold("this\r\n is a test")); assertEquals("this is a test", MimeUtil .unfold("this \r\n is a test")); assertEquals("this is a test", MimeUtil .unfold("this\r\n is\r\n a\r\n test")); } } apache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/util/TestByteArrayBuffer.java0000644000000000000000000001744211702050532031720 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.util; import org.apache.james.mime4j.util.ByteArrayBuffer; import junit.framework.TestCase; /** * Unit tests for {@link ByteArrayBuffer}. */ public class TestByteArrayBuffer extends TestCase { public void testConstructor() throws Exception { ByteArrayBuffer buffer = new ByteArrayBuffer(16); assertEquals(16, buffer.capacity()); assertEquals(0, buffer.length()); assertNotNull(buffer.buffer()); assertEquals(16, buffer.buffer().length); try { new ByteArrayBuffer(-1); fail("IllegalArgumentException should have been thrown"); } catch (IllegalArgumentException ex) { // expected } } public void testSimpleAppend() throws Exception { ByteArrayBuffer buffer = new ByteArrayBuffer(16); assertEquals(16, buffer.capacity()); assertEquals(0, buffer.length()); byte[] b1 = buffer.toByteArray(); assertNotNull(b1); assertEquals(0, b1.length); assertTrue(buffer.isEmpty()); assertFalse(buffer.isFull()); byte[] tmp = new byte[] { 1, 2, 3, 4}; buffer.append(tmp, 0, tmp.length); assertEquals(16, buffer.capacity()); assertEquals(4, buffer.length()); assertFalse(buffer.isEmpty()); assertFalse(buffer.isFull()); byte[] b2 = buffer.toByteArray(); assertNotNull(b2); assertEquals(4, b2.length); for (int i = 0; i < tmp.length; i++) { assertEquals(tmp[i], b2[i]); assertEquals(tmp[i], buffer.byteAt(i)); } buffer.clear(); assertEquals(16, buffer.capacity()); assertEquals(0, buffer.length()); assertTrue(buffer.isEmpty()); assertFalse(buffer.isFull()); } public void testExpandAppend() throws Exception { ByteArrayBuffer buffer = new ByteArrayBuffer(4); assertEquals(4, buffer.capacity()); byte[] tmp = new byte[] { 1, 2, 3, 4}; buffer.append(tmp, 0, 2); buffer.append(tmp, 0, 4); buffer.append(tmp, 0, 0); assertEquals(8, buffer.capacity()); assertEquals(6, buffer.length()); buffer.append(tmp, 0, 4); assertEquals(16, buffer.capacity()); assertEquals(10, buffer.length()); } public void testInvalidAppend() throws Exception { ByteArrayBuffer buffer = new ByteArrayBuffer(4); buffer.append((byte[])null, 0, 0); byte[] tmp = new byte[] { 1, 2, 3, 4}; try { buffer.append(tmp, -1, 0); fail("IndexOutOfBoundsException should have been thrown"); } catch (IndexOutOfBoundsException ex) { // expected } try { buffer.append(tmp, 0, -1); fail("IndexOutOfBoundsException should have been thrown"); } catch (IndexOutOfBoundsException ex) { // expected } try { buffer.append(tmp, 0, 8); fail("IndexOutOfBoundsException should have been thrown"); } catch (IndexOutOfBoundsException ex) { // expected } try { buffer.append(tmp, 10, Integer.MAX_VALUE); fail("IndexOutOfBoundsException should have been thrown"); } catch (IndexOutOfBoundsException ex) { // expected } try { buffer.append(tmp, 2, 4); fail("IndexOutOfBoundsException should have been thrown"); } catch (IndexOutOfBoundsException ex) { // expected } } public void testAppendOneByte() throws Exception { ByteArrayBuffer buffer = new ByteArrayBuffer(4); assertEquals(4, buffer.capacity()); byte[] tmp = new byte[] { 1, 127, -1, -128, 1, -2}; for (byte b : tmp) { buffer.append(b); } assertEquals(8, buffer.capacity()); assertEquals(6, buffer.length()); for (int i = 0; i < tmp.length; i++) { assertEquals(tmp[i], buffer.byteAt(i)); } } public void testSetLength() throws Exception { ByteArrayBuffer buffer = new ByteArrayBuffer(4); buffer.setLength(2); assertEquals(2, buffer.length()); } public void testSetInvalidLength() throws Exception { ByteArrayBuffer buffer = new ByteArrayBuffer(4); try { buffer.setLength(-2); fail("IndexOutOfBoundsException should have been thrown"); } catch (IndexOutOfBoundsException ex) { // expected } try { buffer.setLength(200); fail("IndexOutOfBoundsException should have been thrown"); } catch (IndexOutOfBoundsException ex) { // expected } } public void testRemove() throws Exception { ByteArrayBuffer b = new ByteArrayBuffer(16); byte tmp[] = "--+++-".getBytes("US-ASCII"); b.append(tmp, 0, tmp.length); b.remove(2, 3); assertEquals(3, b.length()); assertEquals("---", new String(b.buffer(), 0, b.length(), "US-ASCII")); b.remove(2, 1); b.remove(1, 1); b.remove(0, 1); assertEquals(0, b.length()); tmp = "+++---".getBytes("US-ASCII"); b.append(tmp, 0, tmp.length); b.remove(0, 3); assertEquals(3, b.length()); assertEquals("---", new String(b.buffer(), 0, b.length(), "US-ASCII")); b.remove(0, 3); assertEquals(0, b.length()); tmp = "---+++".getBytes("US-ASCII"); b.append(tmp, 0, tmp.length); b.remove(3, 3); assertEquals(3, b.length()); assertEquals("---", new String(b.buffer(), 0, b.length(), "US-ASCII")); b.remove(0, 3); assertEquals(0, b.length()); } public void testInvalidRemove() throws Exception { ByteArrayBuffer buffer = new ByteArrayBuffer(16); buffer.setLength(8); try { buffer.remove(-1, 0); fail("IndexOutOfBoundsException should have been thrown"); } catch (IndexOutOfBoundsException ex) { // expected } try { buffer.remove(0, -1); fail("IndexOutOfBoundsException should have been thrown"); } catch (IndexOutOfBoundsException ex) { // expected } try { buffer.remove(0, 9); fail("IndexOutOfBoundsException should have been thrown"); } catch (IndexOutOfBoundsException ex) { // expected } try { buffer.remove(10, 2); fail("IndexOutOfBoundsException should have been thrown"); } catch (IndexOutOfBoundsException ex) { // expected } } } apache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/codec/0000755000000000000000000000000011702050532025251 5ustar rootrootapache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/codec/DecoderUtilTest.java0000644000000000000000000001570211702050532031164 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.codec; import java.io.UnsupportedEncodingException; import junit.framework.TestCase; public class DecoderUtilTest extends TestCase { public void testDecodeB() throws UnsupportedEncodingException { String s = DecoderUtil.decodeB("VGhpcyBpcyB0aGUgcGxhaW4gd" + "GV4dCBtZXNzYWdlIQ==", "ISO8859-1", DecodeMonitor.STRICT); assertEquals("This is the plain text message!", s); } public void testDecodeQ() throws UnsupportedEncodingException { String s = DecoderUtil.decodeQ("=e1_=e2=09=E3_=E4_", "ISO8859-1", DecodeMonitor.STRICT); assertEquals("\u00e1 \u00e2\t\u00e3 \u00e4 ", s); } public void testNonEncodedWordsAreIgnored() { assertEquals("", DecoderUtil.decodeEncodedWords("")); assertEquals("Yada yada", DecoderUtil.decodeEncodedWords("Yada yada")); } public void testDecodeSomeEncodedWords() { assertEquals(" \u00e1\u00e2\u00e3\t\u00e4", DecoderUtil.decodeEncodedWords("=?iso-8859-1?Q?_=20=e1=e2=E3=09=E4?=")); assertEquals("Word 1 ' \u00e2\u00e3\t\u00e4'. Word 2 ' \u00e2\u00e3\t\u00e4'", DecoderUtil.decodeEncodedWords("Word 1 '=?iso-8859-1?Q?_=20=e2=E3=09=E4?=" + "'. Word 2 '=?iso-8859-1?q?_=20=e2=E3=09=E4?='")); assertEquals("=?iso-8859-YADA?Q?_=20=t1=e2=E3=09=E4?=", DecoderUtil.decodeEncodedWords("=?iso-8859-YADA?Q?_=20=t1=e2=E3=09=E4?=")); assertEquals("A short text", DecoderUtil.decodeEncodedWords("=?US-ASCII?B?QSBzaG9ydCB0ZXh0?=")); assertEquals("A short text again!", DecoderUtil.decodeEncodedWords("=?US-ASCII?b?QSBzaG9ydCB0ZXh0IGFnYWluIQ==?=")); } public void testDecodeJapaneseEncodedWords() { String enc = "=?ISO-2022-JP?B?GyRCTCQbKEobJEI+NRsoShskQkJ6GyhKGyRCOS0bKEo=?= " + "=?ISO-2022-JP?B?GyRCOXAbKEobJEIiKBsoShskQiU1GyhKGyRCJSQbKEo=?= " + "=?ISO-2022-JP?B?GyRCJUkbKEobJEIlUxsoShskQiU4GyhKGyRCJU0bKEo=?= " + "=?ISO-2022-JP?B?GyRCJTkbKEobJEIkThsoShskQjdoGyhKGyRCRGobKEo=?= " + "=?ISO-2022-JP?B?GyRCSEcbKEobJEIkRxsoShskQiQ5GyhKGyRCISobKEo=?="; String dec = DecoderUtil.decodeEncodedWords(enc); assertEquals("\u672A\u627F\u8AFE\u5E83\u544A\u203B\u30B5\u30A4\u30C9\u30D3" + "\u30B8\u30CD\u30B9\u306E\u6C7A\u5B9A\u7248\u3067\u3059\uFF01", dec); } public void testInvalidEncodedWordsAreIgnored() { assertEquals("=?iso8859-1?Q?=", DecoderUtil.decodeEncodedWords("=?iso8859-1?Q?=")); assertEquals("=?iso8859-1?b?=", DecoderUtil.decodeEncodedWords("=?iso8859-1?b?=")); assertEquals("=?ISO-8859-1?Q?", DecoderUtil.decodeEncodedWords("=?ISO-8859-1?Q?")); assertEquals("=?ISO-8859-1?R?abc?=", DecoderUtil.decodeEncodedWords("=?ISO-8859-1?R?abc?=")); assertEquals("test =?ISO-8859-1?R?abc?=", DecoderUtil.decodeEncodedWords("test =?ISO-8859-1?R?abc?=")); } public void testEmptyEncodedTextIsIgnored() { // encoded-text requires at least one character according to rfc 2047 assertEquals("=?ISO-8859-1?Q??=", DecoderUtil.decodeEncodedWords("=?ISO-8859-1?Q??=")); assertEquals("=?ISO-8859-1?B??=", DecoderUtil.decodeEncodedWords("=?ISO-8859-1?B??=")); } // see MIME4J-104 public void testWhiteSpaceBetweenEncodedWordsGetsRemoved() { assertEquals("a", DecoderUtil.decodeEncodedWords("=?ISO-8859-1?Q?a?=")); assertEquals("a b", DecoderUtil.decodeEncodedWords("=?ISO-8859-1?Q?a?= b")); assertEquals("ab", DecoderUtil.decodeEncodedWords("=?ISO-8859-1?Q?a?= =?ISO-8859-1?Q?b?=")); assertEquals("ab", DecoderUtil.decodeEncodedWords("=?ISO-8859-1?Q?a?= =?ISO-8859-1?Q?b?=")); assertEquals("ab", DecoderUtil.decodeEncodedWords("=?ISO-8859-1?Q?a?=\r\n =?ISO-8859-1?Q?b?=")); assertEquals("a b", DecoderUtil.decodeEncodedWords("=?ISO-8859-1?Q?a_b?=")); assertEquals("a b", DecoderUtil.decodeEncodedWords("=?ISO-8859-1?Q?a?= =?ISO-8859-2?Q?_b?=")); } // see MIME4J-138 public void testEncodedTextMayStartWithAnEqualsSign() { assertEquals(" foo", DecoderUtil.decodeEncodedWords("=?utf-8?Q?=20foo?=")); assertEquals("Re: How to place a view at the bottom with a 100% width", DecoderUtil.decodeEncodedWords("=?utf-8?Q?Re:=20How=20to=20place=20a=20view=20at=20the=20bottom?= " + "=?utf-8?Q?=20with=20a=20100%=20width?=")); assertEquals("Test \u00fc and more", DecoderUtil.decodeEncodedWords("Test =?ISO-8859-1?Q?=FC_?= =?ISO-8859-1?Q?and_more?=")); } // see MIME4J-142 public void testEncodedTextMayContainDollarSign() { assertEquals("variable ${target.nl}", DecoderUtil.decodeEncodedWords("=?utf-8?Q?variable=20${target.nl}?=")); } // see MIME4J-209 public void testEncodedTextMayContainQuestionMark() { assertEquals("?", DecoderUtil.decodeEncodedWords("=?ISO-8859-1?Q???=")); } public void testNonWhiteSpaceBetweenEncodedWordsIsRetained() { assertEquals("a b c", DecoderUtil.decodeEncodedWords("=?ISO-8859-1?Q?a?= b =?ISO-8859-1?Q?c?=")); assertEquals("a\rb\nc", DecoderUtil.decodeEncodedWords("=?ISO-8859-1?Q?a?=\rb\n=?ISO-8859-1?Q?c?=")); } public void testTextBeforeAndAfterEncodedWordIsRetained() { assertEquals(" a b c ", DecoderUtil.decodeEncodedWords(" =?ISO-8859-1?Q?a?= b =?ISO-8859-1?Q?c?= ")); assertEquals("! a b c !", DecoderUtil.decodeEncodedWords("! =?ISO-8859-1?Q?a?= b =?ISO-8859-1?Q?c?= !")); } public void testFunnyInputDoesNotRaiseOutOfMemoryError() { // Bug detected on June 7, 2005. Decoding the following string caused OutOfMemoryError. assertEquals("=3?!!\\=?\"!g6P\"!Xp:\"!", DecoderUtil.decodeEncodedWords("=3?!!\\=?\"!g6P\"!Xp:\"!")); } } ././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/codec/QuotedPrintableEncodeTest.javaapache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/codec/QuotedPrintableEncodeTe0000644000000000000000000001225011702050532031705 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.codec; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.nio.charset.Charset; import java.util.Arrays; import junit.framework.TestCase; import org.apache.commons.io.IOUtils; import org.apache.james.mime4j.util.CharsetUtil; public class QuotedPrintableEncodeTest extends TestCase { @Override protected void setUp() throws Exception { super.setUp(); } @Override protected void tearDown() throws Exception { super.tearDown(); } public void testEscapedSoftBreak() throws Exception { byte[] content = new byte[500]; Arrays.fill(content, (byte)0x20); byte[] expected = new byte[1557]; int index = 0; for (int l=0;l<20;l++) { for (int i=0;i<25;i++) { expected[index++] = '='; expected[index++] = '2'; expected[index++] = '0'; } if (l<19) { expected[index++] = '='; expected[index++] = '\r'; expected[index++] = '\n'; } } check(content, expected); } public void testPlainAsciiSoftBreak() throws Exception { byte[] content = new byte[500]; Arrays.fill(content, (byte)0x29); byte[] expected = new byte[518]; Arrays.fill(expected, (byte)0x29); expected[75] = '='; expected[76] = '\r'; expected[77] = '\n'; expected[153] = '='; expected[154] = '\r'; expected[155] = '\n'; expected[231] = '='; expected[232] = '\r'; expected[233] = '\n'; expected[309] = '='; expected[310] = '\r'; expected[311] = '\n'; expected[387] = '='; expected[388] = '\r'; expected[389] = '\n'; expected[465] = '='; expected[466] = '\r'; expected[467] = '\n'; check(content, expected); } public void testPlainASCII() throws Exception { checkRoundtrip("Thisisaverysimplemessage.Thisisaverysimplemessage.Thisisaverysimplemessage." + "Thisisaverysimplemessage.Thisisaverysimplemessage.Thisisaverysimplemessage." + "Thisisaverysimplemessage.Thisisaverysimplemessage.Thisisaverysimplemessage." + "Thisisaverysimplemessage.Thisisaverysimplemessage.Thisisaverysimplemessage."); } public void testEncodeSpace() throws Exception { checkRoundtrip(" "); } public void testLetterEncoding() throws Exception { for (byte b=0;b=3F@ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "[\\]^=5F`abcdefghijklmnopqrstuvwxyz{|}~=7F=80=81=82=83"; assertEquals(expected, EncoderUtil.encodeQ(b, Usage.TEXT_TOKEN)); } public void testEncodeQRestricted() throws Exception { byte[] b = new byte[136]; for (int i = 0; i < 136; i++) { b[i] = (byte) i; } String expected = "=00=01=02=03=04=05=06=07=08=09=0A=0B=0C=0D=0E=0F" + "=10=11=12=13=14=15=16=17=18=19=1A=1B=1C=1D=1E=1F_!=22=23" + "=24=25=26=27=28=29*+=2C-=2E/0123456789=3A=3B=3C=3D=3E=3F" + "=40ABCDEFGHIJKLMNOPQRSTUVWXYZ=5B=5C=5D=5E=5F=60abcdefghi" + "jklmnopqrstuvwxyz=7B=7C=7D=7E=7F=80=81=82=83=84=85=86=87"; assertEquals(expected, EncoderUtil.encodeQ(b, Usage.WORD_ENTITY)); } private String encodeB(String s) { try { return EncoderUtil.encodeB(s.getBytes("us-ascii")); } catch (UnsupportedEncodingException e) { throw new Error(e); } } } apache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/codec/CodecUtilTest.java0000644000000000000000000001470711702050532030640 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.codec; import org.apache.james.mime4j.ExampleMail; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import junit.framework.TestCase; public class CodecUtilTest extends TestCase { @Override protected void setUp() throws Exception { super.setUp(); } @Override protected void tearDown() throws Exception { super.tearDown(); } public void testCopy() throws Exception { byte[] content = ExampleMail.MULTIPART_WITH_BINARY_ATTACHMENTS_BYTES; ByteArrayInputStream in = new ByteArrayInputStream(content); ByteArrayOutputStream out = new ByteArrayOutputStream(); CodecUtil.copy(in, out); assertEquals(content, out.toByteArray()); } public void testEncodeQuotedPrintableLargeInput() throws Exception { StringBuilder sb = new StringBuilder(); for (int i = 0; i < 1024 * 5; i++) { sb.append((char) ('0' + (i % 10))); } String expected = sb.toString().replaceAll("(\\d{75})", "$1=\r\n"); InputStream in = new ByteArrayInputStream(sb.toString().getBytes("US-ASCII")); ByteArrayOutputStream out = new ByteArrayOutputStream(); CodecUtil.encodeQuotedPrintableBinary(in, out); String actual = new String(out.toByteArray(), "US-ASCII"); assertEquals(expected, actual); } public void testEncodeQuotedPrintableNonAsciiChars() throws Exception { String s = "7bit content with euro \u20AC symbol"; InputStream in = new ByteArrayInputStream(s.getBytes("iso-8859-15")); ByteArrayOutputStream out = new ByteArrayOutputStream(); CodecUtil.encodeQuotedPrintableBinary(in, out); String actual = new String(out.toByteArray(), "US-ASCII"); assertEquals("7bit=20content=20with=20euro=20=A4=20symbol", actual); } public void testBase64OutputStream() throws Exception { StringBuilder sb = new StringBuilder(2048); for (int i = 0; i < 128; i++) { sb.append("0123456789ABCDEF"); } String input = sb.toString(); String output = roundtripUsingOutputStream(input); assertEquals(input, output); } private String roundtripUsingOutputStream(String input) throws IOException { ByteArrayOutputStream out2 = new ByteArrayOutputStream(); Base64OutputStream outb64 = new Base64OutputStream(out2, 76); CodecUtil.copy(new ByteArrayInputStream(input.getBytes()), outb64); outb64.flush(); outb64.close(); InputStream is = new Base64InputStream(new ByteArrayInputStream(out2.toByteArray())); ByteArrayOutputStream outRoundtrip = new ByteArrayOutputStream(); CodecUtil.copy(is, outRoundtrip); String output = new String(outRoundtrip.toByteArray()); return output; } /** * This test is a proof for MIME4J-67 */ public void testBase64Encoder() throws Exception { StringBuilder sb = new StringBuilder(2048); for (int i = 0; i < 128; i++) { sb.append("0123456789ABCDEF"); } String input = sb.toString(); String output = roundtripUsingEncoder(input); assertEquals(input, output); } private String roundtripUsingEncoder(String input) throws IOException { ByteArrayOutputStream out = new ByteArrayOutputStream(); CodecUtil.encodeBase64(new ByteArrayInputStream(input.getBytes()), out); InputStream is = new Base64InputStream(new ByteArrayInputStream(out.toByteArray())); ByteArrayOutputStream outRoundtrip = new ByteArrayOutputStream(); CodecUtil.copy(is, outRoundtrip); String output = new String(outRoundtrip.toByteArray()); return output; } /* performance test, not a unit test */ /* public void testPerformance() throws Exception { // if (true) return; byte[] bytes = new byte[10000]; Random r = new Random(432875623874L); r.nextBytes(bytes); long totalEncoder1 = 0; long totalStream1 = 0; long totalEncoder2 = 0; for (int i = 0; i < 10000; i++) { int length = r.nextInt(1000); int pos = r.nextInt(9000); String input = new String(bytes, pos, length); long time1 = System.currentTimeMillis(); roundtripUsingEncoder(input); long time2 = System.currentTimeMillis(); roundtripUsingOutputStream(input); long time3 = System.currentTimeMillis(); roundtripUsingEncoder(input); long time4 = System.currentTimeMillis(); totalEncoder1 += time2-time1; totalStream1 += time3-time2; totalEncoder2 += time4-time3; } System.out.println("Encoder 1st: "+totalEncoder1); System.out.println("Encoder 2nd: "+totalEncoder2); System.out.println("Stream 1st: "+totalStream1); } */ private void assertEquals(byte[] expected, byte[] actual) { StringBuilder buffer = new StringBuilder(expected.length); assertEquals(expected.length, actual.length); for (int i = 0; i < actual.length; i++) { buffer.append((char)actual[i]); assertEquals("Mismatch@" + i, expected[i], actual[i]); } } } apache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/io/0000755000000000000000000000000011702050530024601 5ustar rootroot././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/io/MimeBoundaryInputStreamTest.javaapache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/io/MimeBoundaryInputStreamTes0000644000000000000000000003105511702050530031773 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.io; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import org.apache.james.mime4j.io.BufferedLineReaderInputStream; import org.apache.james.mime4j.io.LineReaderInputStream; import org.apache.james.mime4j.io.MimeBoundaryInputStream; import org.apache.james.mime4j.util.ByteArrayBuffer; import junit.framework.TestCase; public class MimeBoundaryInputStreamTest extends TestCase { public void testBasicReading() throws IOException { String text = "Line 1\r\nLine 2\r\n--boundary\r\n" + "Line 3\r\nLine 4\r\n--boundary--"; ByteArrayInputStream bis = new ByteArrayInputStream(text.getBytes("US-ASCII")); BufferedLineReaderInputStream buffer = new BufferedLineReaderInputStream(bis, 4096); MimeBoundaryInputStream mime1 = new MimeBoundaryInputStream(buffer, "boundary"); assertEquals("Line 1\r\nLine 2", read(mime1, 5)); assertFalse(mime1.isLastPart()); MimeBoundaryInputStream mime2 = new MimeBoundaryInputStream(buffer, "boundary"); assertEquals("Line 3\r\nLine 4", read(mime2, 5)); assertTrue(mime2.isLastPart()); } public void testLenientLineDelimiterReading() throws IOException { String text = "Line 1\r\nLine 2\n--boundary\n" + "Line 3\r\nLine 4\n--boundary--\n"; ByteArrayInputStream bis = new ByteArrayInputStream(text.getBytes("US-ASCII")); BufferedLineReaderInputStream buffer = new BufferedLineReaderInputStream(bis, 4096); MimeBoundaryInputStream mime1 = new MimeBoundaryInputStream(buffer, "boundary"); assertEquals("Line 1\r\nLine 2", read(mime1, 5)); assertFalse(mime1.isLastPart()); MimeBoundaryInputStream mime2 = new MimeBoundaryInputStream(buffer, "boundary"); assertEquals("Line 3\r\nLine 4", read(mime2, 5)); assertTrue(mime2.isLastPart()); } public void testBasicReadingSmallBuffer1() throws IOException { String text = "yadayadayadayadayadayadayadayadayadayadayadayadayadayadayadayada\r\n--boundary\r\n" + "blahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblah\r\n--boundary--"; ByteArrayInputStream bis = new ByteArrayInputStream(text.getBytes("US-ASCII")); BufferedLineReaderInputStream buffer = new BufferedLineReaderInputStream(bis, 20); MimeBoundaryInputStream mime1 = new MimeBoundaryInputStream(buffer, "boundary"); assertEquals("yadayadayadayadayadayadayadayadayadayadayadayadayadayadayadayada", read(mime1, 10)); assertFalse(mime1.isLastPart()); MimeBoundaryInputStream mime2 = new MimeBoundaryInputStream(buffer, "boundary"); assertEquals("blahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblah", read(mime2, 10)); assertTrue(mime2.isLastPart()); } public void testBasicReadingSmallBuffer2() throws IOException { String text = "yadayadayadayadayadayadayadayadayadayadayadayadayadayadayadayada\r\n--boundary\r\n" + "blahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblah\r\n--boundary--"; ByteArrayInputStream bis = new ByteArrayInputStream(text.getBytes("US-ASCII")); BufferedLineReaderInputStream buffer = new BufferedLineReaderInputStream(bis, 20); MimeBoundaryInputStream mime1 = new MimeBoundaryInputStream(buffer, "boundary"); assertEquals("yadayadayadayadayadayadayadayadayadayadayadayadayadayadayadayada", read(mime1, 25)); assertFalse(mime1.isLastPart()); MimeBoundaryInputStream mime2 = new MimeBoundaryInputStream(buffer, "boundary"); assertEquals("blahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblah", read(mime2, 25)); assertTrue(mime2.isLastPart()); } public void testBasicReadingByOneByte() throws IOException { String text = "Line 1\r\nLine 2\r\n--boundary\r\n" + "Line 3\r\nLine 4\r\n--boundary--"; ByteArrayInputStream bis = new ByteArrayInputStream(text.getBytes("US-ASCII")); BufferedLineReaderInputStream buffer = new BufferedLineReaderInputStream(bis, 4096); MimeBoundaryInputStream mime1 = new MimeBoundaryInputStream(buffer, "boundary"); assertEquals("Line 1\r\nLine 2", readByOneByte(mime1)); assertFalse(mime1.isLastPart()); MimeBoundaryInputStream mime2 = new MimeBoundaryInputStream(buffer, "boundary"); assertEquals("Line 3\r\nLine 4", readByOneByte(mime2)); assertTrue(mime2.isLastPart()); } /** * Tests that a CRLF immediately preceding a boundary isn't included in * the stream. */ public void testCRLFPrecedingBoundary() throws IOException { String text = "Line 1\r\nLine 2\r\n--boundary\r\n" + "Line 3\r\nLine 4\r\n\r\n--boundary\r\n"; ByteArrayInputStream bis = new ByteArrayInputStream(text.getBytes("US-ASCII")); BufferedLineReaderInputStream buffer = new BufferedLineReaderInputStream(bis, 4096); MimeBoundaryInputStream mime1 = new MimeBoundaryInputStream(buffer, "boundary"); assertEquals("Line 1\r\nLine 2", read(mime1, 5)); assertFalse(mime1.isLastPart()); MimeBoundaryInputStream mime2 = new MimeBoundaryInputStream(buffer, "boundary"); assertEquals("Line 3\r\nLine 4\r\n", read(mime2, 5)); assertFalse(mime2.isLastPart()); } private String readByOneByte(InputStream is) throws IOException { StringBuilder sb = new StringBuilder(); int b = 0; while ((b = is.read()) != -1) { sb.append((char) b); } return sb.toString(); } private String read(InputStream is, int bufsize) throws IOException { StringBuilder sb = new StringBuilder(); int l; byte[] tmp = new byte[bufsize]; while ((l = is.read(tmp)) != -1) { for (int i = 0; i < l; i++) { sb.append((char) tmp[i]); } } return sb.toString(); } /** * Tests that a stream containing only a boundary is empty. */ public void testImmediateBoundary() throws IOException { String text = "--boundary\r\n"; ByteArrayInputStream bis = new ByteArrayInputStream(text.getBytes()); BufferedLineReaderInputStream buffer = new BufferedLineReaderInputStream(bis, 4096); MimeBoundaryInputStream stream = new MimeBoundaryInputStream(buffer, "boundary"); assertEquals(-1, stream.read()); text = "\r\n--boundary\r\n"; bis = new ByteArrayInputStream(text.getBytes()); buffer = new BufferedLineReaderInputStream(bis, 4096); stream = new MimeBoundaryInputStream(buffer, "boundary"); assertEquals(-1, stream.read()); } /** * Tests that hasMoreParts behave as expected. */ public void testHasMoreParts() throws IOException { String text = "--boundary--\r\n"; ByteArrayInputStream bis = new ByteArrayInputStream(text.getBytes()); BufferedLineReaderInputStream buffer = new BufferedLineReaderInputStream(bis, 4096); MimeBoundaryInputStream stream = new MimeBoundaryInputStream(buffer, "boundary"); assertEquals(-1, stream.read()); assertTrue(stream.isLastPart()); } /** * Tests that a stream containing only a boundary is empty. */ public void testPrefixIsBoundary() throws IOException { String text = "Line 1\r\n\r\n--boundary\r\n"; ByteArrayInputStream bis = new ByteArrayInputStream(text.getBytes()); BufferedLineReaderInputStream buffer = new BufferedLineReaderInputStream(bis, 4096); MimeBoundaryInputStream stream = new MimeBoundaryInputStream(buffer, "boundary"); assertEquals("Line 1\r\n", read(stream, 100)); text = "--boundary\r\n"; bis = new ByteArrayInputStream(text.getBytes()); buffer = new BufferedLineReaderInputStream(bis, 4096); stream = new MimeBoundaryInputStream(buffer, "boundary"); assertEquals(-1, stream.read()); } public void testBasicReadLine() throws Exception { String[] teststrs = new String[5]; teststrs[0] = "Hello\r\n"; teststrs[1] = "This string should be much longer than the size of the input buffer " + "which is only 20 bytes for this test\r\n"; StringBuilder sb = new StringBuilder(); for (int i = 0; i < 15; i++) { sb.append("123456789 "); } sb.append("and stuff like that\r\n"); teststrs[2] = sb.toString(); teststrs[3] = "\r\n"; teststrs[4] = "And goodbye\r\n"; String term = "\r\n--1234\r\n"; ByteArrayOutputStream outstream = new ByteArrayOutputStream(); for (String teststr : teststrs) { outstream.write(teststr.getBytes("US-ASCII")); } outstream.write(term.getBytes("US-ASCII")); byte[] raw = outstream.toByteArray(); BufferedLineReaderInputStream inbuffer = new BufferedLineReaderInputStream(new ByteArrayInputStream(raw), 20); LineReaderInputStream instream = new MimeBoundaryInputStream(inbuffer, "1234"); ByteArrayBuffer linebuf = new ByteArrayBuffer(8); for (String teststr : teststrs) { linebuf.clear(); instream.readLine(linebuf); String s = new String(linebuf.toByteArray(), "US-ASCII"); assertEquals(teststr, s); } assertEquals(-1, instream.readLine(linebuf)); assertEquals(-1, instream.readLine(linebuf)); } public void testReadEmptyLine() throws Exception { String teststr = "01234567890123456789\n\n\r\n\r\r\n\n\n\n\n\n--1234\r\n"; byte[] raw = teststr.getBytes("US-ASCII"); BufferedLineReaderInputStream inbuffer = new BufferedLineReaderInputStream(new ByteArrayInputStream(raw), 20); LineReaderInputStream instream = new MimeBoundaryInputStream(inbuffer, "1234"); ByteArrayBuffer linebuf = new ByteArrayBuffer(8); linebuf.clear(); instream.readLine(linebuf); String s = new String(linebuf.toByteArray(), "US-ASCII"); assertEquals("01234567890123456789\n", s); linebuf.clear(); instream.readLine(linebuf); s = new String(linebuf.toByteArray(), "US-ASCII"); assertEquals("\n", s); linebuf.clear(); instream.readLine(linebuf); s = new String(linebuf.toByteArray(), "US-ASCII"); assertEquals("\r\n", s); linebuf.clear(); instream.readLine(linebuf); s = new String(linebuf.toByteArray(), "US-ASCII"); assertEquals("\r\r\n", s); linebuf.clear(); instream.readLine(linebuf); s = new String(linebuf.toByteArray(), "US-ASCII"); assertEquals("\n", s); linebuf.clear(); instream.readLine(linebuf); s = new String(linebuf.toByteArray(), "US-ASCII"); assertEquals("\n", s); linebuf.clear(); instream.readLine(linebuf); s = new String(linebuf.toByteArray(), "US-ASCII"); assertEquals("\n", s); linebuf.clear(); instream.readLine(linebuf); s = new String(linebuf.toByteArray(), "US-ASCII"); assertEquals("\n", s); assertEquals(-1, instream.readLine(linebuf)); assertEquals(-1, instream.readLine(linebuf)); } } ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/io/LimitedInputStreamTest.javaapache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/io/LimitedInputStreamTest.jav0000644000000000000000000000456311702050530031736 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.io; import java.io.ByteArrayInputStream; import java.io.IOException; import junit.framework.TestCase; public class LimitedInputStreamTest extends TestCase { public void testUpToLimitRead() throws IOException { byte[] data = new byte[] {'0', '1', '2', '3', '4', '5', '6'}; ByteArrayInputStream instream = new ByteArrayInputStream(data); LimitedInputStream limitedStream = new LimitedInputStream(instream, 3); assertEquals(0, limitedStream.getPosition()); assertTrue(limitedStream.read() != -1); assertEquals(1, limitedStream.getPosition()); byte[] tmp = new byte[3]; assertEquals(2, limitedStream.read(tmp)); assertEquals(3, limitedStream.getPosition()); try { limitedStream.read(); fail("IOException should have been thrown"); } catch (IOException ex) { } try { limitedStream.read(tmp); fail("IOException should have been thrown"); } catch (IOException ex) { } try { limitedStream.skip(2); fail("IOException should have been thrown"); } catch (IOException ex) { } } } ././@LongLink0000000000000000000000000000016000000000000011562 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/io/LineReaderInputStreamAdaptorTest.javaapache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/io/LineReaderInputStreamAdapt0000644000000000000000000001417011702050530031707 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.io; import org.apache.james.mime4j.io.LineReaderInputStreamAdaptor; import org.apache.james.mime4j.io.MaxLineLimitException; import org.apache.james.mime4j.util.ByteArrayBuffer; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import junit.framework.TestCase; public class LineReaderInputStreamAdaptorTest extends TestCase { public void testBasicOperations() throws Exception { String text = "ah blahblah"; byte[] b1 = text.getBytes("US-ASCII"); LineReaderInputStreamAdaptor instream = new LineReaderInputStreamAdaptor( new ByteArrayInputStream(b1)); assertEquals((byte)'a', instream.read()); assertEquals((byte)'h', instream.read()); assertEquals((byte)' ', instream.read()); byte[] tmp1 = new byte[4]; assertEquals(4, instream.read(tmp1)); assertEquals(4, instream.read(tmp1)); assertEquals(-1, instream.read(tmp1)); assertEquals(-1, instream.read(tmp1)); assertEquals(-1, instream.read()); assertEquals(-1, instream.read()); } public void testBasicReadLine() throws Exception { String[] teststrs = new String[5]; teststrs[0] = "Hello\r\n"; teststrs[1] = "This string should be much longer than the size of the input buffer " + "which is only 16 bytes for this test\r\n"; StringBuilder sb = new StringBuilder(); for (int i = 0; i < 15; i++) { sb.append("123456789 "); } sb.append("and stuff like that\r\n"); teststrs[2] = sb.toString(); teststrs[3] = "\r\n"; teststrs[4] = "And goodbye\r\n"; ByteArrayOutputStream outstream = new ByteArrayOutputStream(); for (String teststr : teststrs) { outstream.write(teststr.getBytes("US-ASCII")); } byte[] raw = outstream.toByteArray(); LineReaderInputStreamAdaptor instream = new LineReaderInputStreamAdaptor( new ByteArrayInputStream(raw)); ByteArrayBuffer linebuf = new ByteArrayBuffer(8); for (String teststr : teststrs) { linebuf.clear(); instream.readLine(linebuf); String s = new String(linebuf.toByteArray(), "US-ASCII"); assertEquals(teststr, s); } assertEquals(-1, instream.readLine(linebuf)); assertEquals(-1, instream.readLine(linebuf)); } public void testReadEmptyLine() throws Exception { String teststr = "\n\n\r\n\r\r\n\n\n\n\n\n"; byte[] raw = teststr.getBytes("US-ASCII"); LineReaderInputStreamAdaptor instream = new LineReaderInputStreamAdaptor( new ByteArrayInputStream(raw)); ByteArrayBuffer linebuf = new ByteArrayBuffer(8); linebuf.clear(); instream.readLine(linebuf); String s = new String(linebuf.toByteArray(), "US-ASCII"); assertEquals("\n", s); linebuf.clear(); instream.readLine(linebuf); s = new String(linebuf.toByteArray(), "US-ASCII"); assertEquals("\n", s); linebuf.clear(); instream.readLine(linebuf); s = new String(linebuf.toByteArray(), "US-ASCII"); assertEquals("\r\n", s); linebuf.clear(); instream.readLine(linebuf); s = new String(linebuf.toByteArray(), "US-ASCII"); assertEquals("\r\r\n", s); linebuf.clear(); instream.readLine(linebuf); s = new String(linebuf.toByteArray(), "US-ASCII"); assertEquals("\n", s); linebuf.clear(); instream.readLine(linebuf); s = new String(linebuf.toByteArray(), "US-ASCII"); assertEquals("\n", s); linebuf.clear(); instream.readLine(linebuf); s = new String(linebuf.toByteArray(), "US-ASCII"); assertEquals("\n", s); linebuf.clear(); instream.readLine(linebuf); s = new String(linebuf.toByteArray(), "US-ASCII"); assertEquals("\n", s); linebuf.clear(); instream.readLine(linebuf); s = new String(linebuf.toByteArray(), "US-ASCII"); assertEquals("\n", s); assertEquals(-1, instream.readLine(linebuf)); assertEquals(-1, instream.readLine(linebuf)); } public void testReadEmptyLineMaxLimit() throws Exception { String teststr = "1234567890\r\n"; byte[] raw = teststr.getBytes("US-ASCII"); LineReaderInputStreamAdaptor instream1 = new LineReaderInputStreamAdaptor( new ByteArrayInputStream(raw), 13); ByteArrayBuffer linebuf = new ByteArrayBuffer(8); linebuf.clear(); instream1.readLine(linebuf); LineReaderInputStreamAdaptor instream2 = new LineReaderInputStreamAdaptor( new ByteArrayInputStream(raw), 12); linebuf.clear(); try { instream2.readLine(linebuf); fail("MaxLineLimitException should have been thrown"); } catch (MaxLineLimitException ex) { } } } ././@LongLink0000000000000000000000000000016100000000000011563 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/io/BufferedLineReaderInputStreamTest.javaapache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/io/BufferedLineReaderInputStr0000644000000000000000000001421211702050530031712 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.io; import org.apache.james.mime4j.io.BufferedLineReaderInputStream; import org.apache.james.mime4j.io.LineReaderInputStream; import org.apache.james.mime4j.io.MaxLineLimitException; import org.apache.james.mime4j.util.ByteArrayBuffer; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import junit.framework.TestCase; public class BufferedLineReaderInputStreamTest extends TestCase { public void testBasicOperations() throws Exception { String text = "ah blahblah"; byte[] b1 = text.getBytes("US-ASCII"); BufferedLineReaderInputStream instream = new BufferedLineReaderInputStream(new ByteArrayInputStream(b1), 4096); assertEquals((byte)'a', instream.read()); assertEquals((byte)'h', instream.read()); assertEquals((byte)' ', instream.read()); byte[] tmp1 = new byte[4]; assertEquals(4, instream.read(tmp1)); assertEquals(4, instream.read(tmp1)); assertEquals(-1, instream.read(tmp1)); assertEquals(-1, instream.read(tmp1)); assertEquals(-1, instream.read()); assertEquals(-1, instream.read()); } public void testBasicReadLine() throws Exception { String[] teststrs = new String[5]; teststrs[0] = "Hello\r\n"; teststrs[1] = "This string should be much longer than the size of the input buffer " + "which is only 16 bytes for this test\r\n"; StringBuilder sb = new StringBuilder(); for (int i = 0; i < 15; i++) { sb.append("123456789 "); } sb.append("and stuff like that\r\n"); teststrs[2] = sb.toString(); teststrs[3] = "\r\n"; teststrs[4] = "And goodbye\r\n"; ByteArrayOutputStream outstream = new ByteArrayOutputStream(); for (String teststr : teststrs) { outstream.write(teststr.getBytes("US-ASCII")); } byte[] raw = outstream.toByteArray(); BufferedLineReaderInputStream instream = new BufferedLineReaderInputStream(new ByteArrayInputStream(raw), 16); ByteArrayBuffer linebuf = new ByteArrayBuffer(8); for (String teststr : teststrs) { linebuf.clear(); instream.readLine(linebuf); String s = new String(linebuf.toByteArray(), "US-ASCII"); assertEquals(teststr, s); } assertEquals(-1, instream.readLine(linebuf)); assertEquals(-1, instream.readLine(linebuf)); } public void testReadEmptyLine() throws Exception { String teststr = "\n\n\r\n\r\r\n\n\n\n\n\n"; byte[] raw = teststr.getBytes("US-ASCII"); LineReaderInputStream instream = new BufferedLineReaderInputStream(new ByteArrayInputStream(raw), 4); ByteArrayBuffer linebuf = new ByteArrayBuffer(8); linebuf.clear(); instream.readLine(linebuf); String s = new String(linebuf.toByteArray(), "US-ASCII"); assertEquals("\n", s); linebuf.clear(); instream.readLine(linebuf); s = new String(linebuf.toByteArray(), "US-ASCII"); assertEquals("\n", s); linebuf.clear(); instream.readLine(linebuf); s = new String(linebuf.toByteArray(), "US-ASCII"); assertEquals("\r\n", s); linebuf.clear(); instream.readLine(linebuf); s = new String(linebuf.toByteArray(), "US-ASCII"); assertEquals("\r\r\n", s); linebuf.clear(); instream.readLine(linebuf); s = new String(linebuf.toByteArray(), "US-ASCII"); assertEquals("\n", s); linebuf.clear(); instream.readLine(linebuf); s = new String(linebuf.toByteArray(), "US-ASCII"); assertEquals("\n", s); linebuf.clear(); instream.readLine(linebuf); s = new String(linebuf.toByteArray(), "US-ASCII"); assertEquals("\n", s); linebuf.clear(); instream.readLine(linebuf); s = new String(linebuf.toByteArray(), "US-ASCII"); assertEquals("\n", s); linebuf.clear(); instream.readLine(linebuf); s = new String(linebuf.toByteArray(), "US-ASCII"); assertEquals("\n", s); assertEquals(-1, instream.readLine(linebuf)); assertEquals(-1, instream.readLine(linebuf)); } public void testReadEmptyLineMaxLimit() throws Exception { String teststr = "1234567890\r\n"; byte[] raw = teststr.getBytes("US-ASCII"); LineReaderInputStream instream1 = new BufferedLineReaderInputStream( new ByteArrayInputStream(raw), 1024, 13); ByteArrayBuffer linebuf = new ByteArrayBuffer(8); linebuf.clear(); instream1.readLine(linebuf); LineReaderInputStream instream2 = new BufferedLineReaderInputStream( new ByteArrayInputStream(raw), 1024, 12); linebuf.clear(); try { instream2.readLine(linebuf); fail("MaxLineLimitException should have been thrown"); } catch (MaxLineLimitException ex) { } } } ././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/io/LineNumberInputStreamTest.javaapache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/io/LineNumberInputStreamTest.0000644000000000000000000000570411702050530031704 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.io; import java.io.ByteArrayInputStream; import java.io.IOException; import org.apache.james.mime4j.io.LineNumberInputStream; import junit.framework.TestCase; public class LineNumberInputStreamTest extends TestCase { /** * Tests that reading single bytes updates the line number appropriately. */ public void testReadSingleByte() throws IOException { String s = "Yada\r\nyada\r\nyada\r\n"; LineNumberInputStream is = new LineNumberInputStream( new ByteArrayInputStream(s.getBytes())); for (int i = 0; i < 6; i++) { assertEquals(1, is.getLineNumber()); is.read(); } for (int i = 6; i < 12; i++) { assertEquals(2, is.getLineNumber()); is.read(); } for (int i = 12; i < 18; i++) { assertEquals(3, is.getLineNumber()); is.read(); } assertEquals(4, is.getLineNumber()); assertEquals(-1, is.read()); } /** * Tests that reading multiple bytes at once updates the line number * appropriately. */ public void testReadManyBytes() throws IOException { String s = "Yada\r\nyada\r\nyada\r\n"; LineNumberInputStream is = new LineNumberInputStream( new ByteArrayInputStream(s.getBytes())); byte[] buf = new byte[4]; assertEquals(1, is.getLineNumber()); is.read(buf); assertEquals(1, is.getLineNumber()); is.read(buf); assertEquals(2, is.getLineNumber()); is.read(buf); assertEquals(3, is.getLineNumber()); is.read(buf); assertEquals(3, is.getLineNumber()); is.read(buf); assertEquals(4, is.getLineNumber()); assertEquals(-1, is.read()); } } ././@LongLink0000000000000000000000000000016700000000000011571 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/io/BufferedLineReaderInputStreamBufferTest.javaapache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/io/BufferedLineReaderInputStr0000644000000000000000000002075211702050530031720 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.io; import org.apache.james.mime4j.io.BufferedLineReaderInputStream; import java.io.ByteArrayInputStream; import junit.framework.TestCase; public class BufferedLineReaderInputStreamBufferTest extends TestCase { public void testInvalidInput() throws Exception { String text = "blah blah yada yada"; byte[] b1 = text.getBytes("US-ASCII"); String pattern = "blah"; byte[] b2 = pattern.getBytes("US-ASCII"); BufferedLineReaderInputStream inbuffer = new BufferedLineReaderInputStream(new ByteArrayInputStream(b1), 4096); inbuffer.fillBuffer(); assertEquals('b', inbuffer.read()); assertEquals('l', inbuffer.read()); try { inbuffer.byteAt(1); fail("IndexOutOfBoundsException should have been thrown"); } catch (IndexOutOfBoundsException expected) { } try { inbuffer.byteAt(20); fail("IndexOutOfBoundsException should have been thrown"); } catch (IndexOutOfBoundsException expected) { } try { inbuffer.indexOf(b2, -1, 3); fail("IndexOutOfBoundsException should have been thrown"); } catch (IndexOutOfBoundsException expected) { } try { inbuffer.indexOf(b2, 1, 3); fail("IndexOutOfBoundsException should have been thrown"); } catch (IndexOutOfBoundsException expected) { } try { inbuffer.indexOf(b2, 2, -1); fail("IndexOutOfBoundsException should have been thrown"); } catch (IndexOutOfBoundsException expected) { } try { inbuffer.indexOf(b2, 2, 18); fail("IndexOutOfBoundsException should have been thrown"); } catch (IndexOutOfBoundsException expected) { } assertEquals(5, inbuffer.indexOf(b2, 2, 17)); try { inbuffer.indexOf((byte)' ', -1, 3); fail("IndexOutOfBoundsException should have been thrown"); } catch (IndexOutOfBoundsException expected) { } try { inbuffer.indexOf((byte)' ', 1, 3); fail("IndexOutOfBoundsException should have been thrown"); } catch (IndexOutOfBoundsException expected) { } try { inbuffer.indexOf((byte)' ', 2, -1); fail("IndexOutOfBoundsException should have been thrown"); } catch (IndexOutOfBoundsException expected) { } try { inbuffer.indexOf((byte)' ', 2, 18); fail("IndexOutOfBoundsException should have been thrown"); } catch (IndexOutOfBoundsException expected) { } assertEquals(10, inbuffer.indexOf((byte)'y', 2, 17)); } public void testBasicOperations() throws Exception { String text = "bla bla yada yada haha haha"; byte[] b1 = text.getBytes("US-ASCII"); BufferedLineReaderInputStream inbuffer = new BufferedLineReaderInputStream(new ByteArrayInputStream(b1), 4096); inbuffer.fillBuffer(); assertEquals(0, inbuffer.pos()); assertEquals(27, inbuffer.limit()); assertEquals(27, inbuffer.length()); inbuffer.read(); inbuffer.read(); assertEquals(2, inbuffer.pos()); assertEquals(27, inbuffer.limit()); assertEquals(25, inbuffer.length()); byte[] tmp1 = new byte[3]; assertEquals(3, inbuffer.read(tmp1)); assertEquals(5, inbuffer.pos()); assertEquals(27, inbuffer.limit()); assertEquals(22, inbuffer.length()); byte[] tmp2 = new byte[22]; assertEquals(22, inbuffer.read(tmp2)); assertEquals(27, inbuffer.pos()); assertEquals(27, inbuffer.limit()); assertEquals(0, inbuffer.length()); assertEquals(-1, inbuffer.read(tmp1)); assertEquals(-1, inbuffer.read(tmp1)); assertEquals(-1, inbuffer.read()); assertEquals(-1, inbuffer.read()); } public void testPatternMatching1() throws Exception { String text = "blabla d is the word"; String pattern = "d"; byte[] b1 = text.getBytes("US-ASCII"); byte[] b2 = pattern.getBytes("US-ASCII"); BufferedLineReaderInputStream inbuffer = new BufferedLineReaderInputStream(new ByteArrayInputStream(b1), 4096); inbuffer.fillBuffer(); int i = inbuffer.indexOf(b2); assertEquals(7, i); } public void testPatternMatching2() throws Exception { String text = "disddisdissdsidsidsiid"; String pattern = "siid"; byte[] b1 = text.getBytes("US-ASCII"); byte[] b2 = pattern.getBytes("US-ASCII"); BufferedLineReaderInputStream inbuffer = new BufferedLineReaderInputStream(new ByteArrayInputStream(b1), 4096); inbuffer.fillBuffer(); int i = inbuffer.indexOf(b2); assertEquals(18, i); } public void testPatternMatching3() throws Exception { String text = "bla bla yada yada haha haha"; String pattern = "blah"; byte[] b1 = text.getBytes("US-ASCII"); byte[] b2 = pattern.getBytes("US-ASCII"); BufferedLineReaderInputStream inbuffer = new BufferedLineReaderInputStream(new ByteArrayInputStream(b1), 4096); inbuffer.fillBuffer(); int i = inbuffer.indexOf(b2); assertEquals(-1, i); } public void testPatternMatching4() throws Exception { String text = "bla bla yada yada haha haha"; String pattern = "bla"; byte[] b1 = text.getBytes("US-ASCII"); byte[] b2 = pattern.getBytes("US-ASCII"); BufferedLineReaderInputStream inbuffer = new BufferedLineReaderInputStream(new ByteArrayInputStream(b1), 4096); inbuffer.fillBuffer(); int i = inbuffer.indexOf(b2); assertEquals(0, i); } public void testPatternOutOfBound() throws Exception { String text = "bla bla yada yada haha haha"; String pattern1 = "bla bla"; byte[] b1 = text.getBytes("US-ASCII"); byte[] b2 = pattern1.getBytes("US-ASCII"); BufferedLineReaderInputStream inbuffer = new BufferedLineReaderInputStream(new ByteArrayInputStream(b1), 4096); inbuffer.fillBuffer(); byte[] tmp = new byte[3]; inbuffer.read(tmp); int i = inbuffer.indexOf(b2, inbuffer.pos(), inbuffer.length()); assertEquals(-1, i); i = inbuffer.indexOf(b2, inbuffer.pos(), inbuffer.length() - 1); assertEquals(-1, i); } public void testCharOutOfBound() throws Exception { String text = "zzz blah blah blah ggg"; byte[] b1 = text.getBytes("US-ASCII"); BufferedLineReaderInputStream inbuffer = new BufferedLineReaderInputStream(new ByteArrayInputStream(b1), 4096); inbuffer.fillBuffer(); byte[] tmp = new byte[3]; inbuffer.read(tmp); int i = inbuffer.indexOf((byte)'z', inbuffer.pos(), inbuffer.length()); assertEquals(-1, i); i = inbuffer.indexOf((byte)'g', inbuffer.pos(), inbuffer.length() - 3); assertEquals(-1, i); } public void test0xFFInBinaryStream() throws Exception { byte[] b1 = new byte[] {1, 2, 3, (byte) 0xff, 10, 1, 2, 3}; byte[] b2 = new byte[] {10}; BufferedLineReaderInputStream inbuffer = new BufferedLineReaderInputStream(new ByteArrayInputStream(b1), 4096); inbuffer.fillBuffer(); int i = inbuffer.indexOf(b2); assertEquals(4, i); } } ././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/io/EOLConvertingInputStreamTest.javaapache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/io/EOLConvertingInputStreamTe0000644000000000000000000001105711702050530031673 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.io; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; import org.apache.james.mime4j.io.EOLConvertingInputStream; import junit.framework.TestCase; public class EOLConvertingInputStreamTest extends TestCase { public void testRead() throws IOException { testConvertBoth("Line 1\r\nLine 2\r\n", "Line 1\r\nLine 2\r\n"); testConvertCR("Line 1\r\nLine 2\r\n", "Line 1\r\nLine 2\r\n"); testConvertLF("Line 1\r\nLine 2\r\n", "Line 1\r\nLine 2\r\n"); testConvertBoth("Line 1\n\rLine 2\n\r", "Line 1\r\n\r\nLine 2\r\n\r\n"); testConvertCR("Line 1\n\rLine 2\n\r", "Line 1\n\r\nLine 2\n\r\n"); testConvertLF("Line 1\n\rLine 2\n\r", "Line 1\r\n\rLine 2\r\n\r"); testConvertBoth("Line 1\nLine 2\n", "Line 1\r\nLine 2\r\n"); testConvertCR("Line 1\nLine 2\n", "Line 1\nLine 2\n"); testConvertLF("Line 1\nLine 2\n", "Line 1\r\nLine 2\r\n"); testConvertBoth("Line 1\rLine 2\r", "Line 1\r\nLine 2\r\n"); testConvertCR("Line 1\rLine 2\r", "Line 1\r\nLine 2\r\n"); testConvertLF("Line 1\rLine 2\r", "Line 1\rLine 2\r"); testConvertBoth("\r\n", "\r\n"); testConvertCR("\r\n", "\r\n"); testConvertLF("\r\n", "\r\n"); testConvertBoth("\n", "\r\n"); testConvertCR("\n", "\n"); testConvertLF("\n", "\r\n"); testConvertBoth("\r", "\r\n"); testConvertCR("\r", "\r\n"); testConvertLF("\r", "\r"); testConvertBoth("", ""); testConvertCR("", ""); testConvertLF("", ""); } private void testConvertBoth(String s1, String s2) throws IOException { byte[] bytes = new byte[1024]; ByteArrayInputStream bais = new ByteArrayInputStream(fromString(s1)); EOLConvertingInputStream in = new EOLConvertingInputStream(bais, EOLConvertingInputStream.CONVERT_BOTH); int n = in.read(bytes); assertEquals(s2, toString(bytes, n)); } private void testConvertCR(String s1, String s2) throws IOException { byte[] bytes = new byte[1024]; ByteArrayInputStream bais = new ByteArrayInputStream(fromString(s1)); EOLConvertingInputStream in = new EOLConvertingInputStream(bais, EOLConvertingInputStream.CONVERT_CR); int n = in.read(bytes); assertEquals(s2, toString(bytes, n)); } private void testConvertLF(String s1, String s2) throws IOException { byte[] bytes = new byte[1024]; ByteArrayInputStream bais = new ByteArrayInputStream(fromString(s1)); EOLConvertingInputStream in = new EOLConvertingInputStream(bais, EOLConvertingInputStream.CONVERT_LF); int n = in.read(bytes); assertEquals(s2, toString(bytes, n)); } private String toString(byte[] b, int len) { try { if (len == -1) { return ""; } return new String(b, 0, len, "US-ASCII"); } catch (UnsupportedEncodingException e) { fail(e.getMessage()); return null; } } private byte[] fromString(String s) { try { return s.getBytes("US-ASCII"); } catch (UnsupportedEncodingException e) { fail(e.getMessage()); return null; } } } ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/io/PositionInputStreamTest.javaapache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/io/PositionInputStreamTest.ja0000644000000000000000000000505411702050530031761 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.io; import java.io.ByteArrayInputStream; import java.io.IOException; import junit.framework.TestCase; public class PositionInputStreamTest extends TestCase { public void testPositionCounting() throws IOException { byte[] data = new byte[] {'0', '1', '2', '3', '4', '5', '6'}; ByteArrayInputStream instream = new ByteArrayInputStream(data); PositionInputStream countingStream = new PositionInputStream(instream); assertEquals(0, countingStream.getPosition()); assertTrue(countingStream.read() != -1); assertEquals(1, countingStream.getPosition()); byte[] tmp = new byte[3]; assertEquals(3, countingStream.read(tmp)); assertEquals(4, countingStream.getPosition()); assertEquals(2, countingStream.skip(2)); assertEquals(6, countingStream.getPosition()); assertTrue(countingStream.read() != -1); assertEquals(7, countingStream.getPosition()); assertTrue(countingStream.read() == -1); assertEquals(7, countingStream.getPosition()); assertTrue(countingStream.read() == -1); assertEquals(7, countingStream.getPosition()); assertTrue(countingStream.read(tmp) == -1); assertEquals(7, countingStream.getPosition()); assertTrue(countingStream.read(tmp) == -1); assertEquals(7, countingStream.getPosition()); } } apache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/MimeIOExceptionTest.java0000644000000000000000000000304711702050532030701 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j; import junit.framework.TestCase; public class MimeIOExceptionTest extends TestCase { public void testMimeIOExceptionMimeException() { MimeException cause = new MimeException("cause"); MimeIOException e = new MimeIOException(cause); assertEquals("cause", e.getMessage()); assertSame(cause, e.getCause()); } } apache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/stream/0000755000000000000000000000000011702050530025465 5ustar rootroot././@LongLink0000000000000000000000000000016400000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/stream/MimeStreamTokenMessageRfc822Test.javaapache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/stream/MimeStreamTokenMessage0000644000000000000000000000755611702050530031776 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.stream; import java.io.ByteArrayInputStream; import junit.framework.TestCase; import org.apache.james.mime4j.ExampleMail; public class MimeStreamTokenMessageRfc822Test extends TestCase { MimeTokenStream stream; @Override protected void setUp() throws Exception { super.setUp(); stream = new MimeTokenStream(); stream.parse(new ByteArrayInputStream(ExampleMail.MIME_RFC822_SIMPLE_BYTES)); } @Override protected void tearDown() throws Exception { super.tearDown(); } public void testShouldParseMessageRFC822CorrectWithDefaultConfiguration() throws Exception { nextIs(EntityState.T_START_HEADER); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_END_HEADER); nextIs(EntityState.T_START_MESSAGE); nextIs(EntityState.T_START_HEADER); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_END_HEADER); nextIs(EntityState.T_BODY); nextIs(EntityState.T_END_MESSAGE); nextIs(EntityState.T_END_MESSAGE); nextIs(EntityState.T_END_OF_STREAM); } public void testShouldParseMessageRFC822CorrectWithNoRecurse() throws Exception { stream.setRecursionMode(RecursionMode.M_NO_RECURSE); nextIs(EntityState.T_START_HEADER); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_END_HEADER); nextIs(EntityState.T_BODY); nextIs(EntityState.T_END_MESSAGE); nextIs(EntityState.T_END_OF_STREAM); } public void testShouldParseMessageRFC822CorrectWithFlat() throws Exception { stream.setRecursionMode(RecursionMode.M_FLAT); nextIs(EntityState.T_START_HEADER); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_END_HEADER); nextIs(EntityState.T_BODY); nextIs(EntityState.T_END_MESSAGE); nextIs(EntityState.T_END_OF_STREAM); } private void nextIs(EntityState state) throws Exception { assertEquals(MimeTokenStream.stateToString(state), MimeTokenStream.stateToString(stream.next())); } } ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/stream/MimeTokenNoRecurseTest.javaapache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/stream/MimeTokenNoRecurseTest0000644000000000000000000002066011702050530031772 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.stream; import java.io.ByteArrayInputStream; import java.io.InputStream; import junit.framework.TestCase; import org.apache.james.mime4j.util.CharsetUtil; public class MimeTokenNoRecurseTest extends TestCase { private static final String INNER_MAIL = "From: Timothy Tayler \r\n" + "To: Joshua Tetley \r\n" + "Date: Tue, 12 Feb 2008 17:34:09 +0000 (GMT)\r\n" + "Subject: Multipart Without RFC822 Part\r\n" + "Content-Type: multipart/mixed;boundary=42\r\n\r\n" + "--42\r\n" + "Content-Type:text/plain; charset=US-ASCII\r\n\r\n" + "First part of this mail\r\n" + "--42\r\n" + "Content-Type:text/plain; charset=US-ASCII\r\n\r\n" + "Second part of this mail\r\n" + "--42--\r\n"; private static final String MAIL_WITH_RFC822_PART = "MIME-Version: 1.0\r\n" + "From: Timothy Tayler \r\n" + "To: Joshua Tetley \r\n" + "Date: Tue, 12 Feb 2008 17:34:09 +0000 (GMT)\r\n" + "Subject: Multipart With RFC822 Part\r\n" + "Content-Type: multipart/mixed;boundary=1729\r\n\r\n" + "A short premable\r\n" + "--1729\r\n\r\n" + "First part has no headers\r\n" + "--1729\r\n" + "Content-Type: text/plain; charset=US-ASCII\r\n\r\n" + "Second part is plain text\r\n" + "--1729\r\n" + "Content-Type: message/rfc822\r\n\r\n" + INNER_MAIL + "--1729\r\n" + "Content-Type: text/plain; charset=US-ASCII\r\n\r\n" + "Last part is plain text\r\n" + "--1729--\r\n" + "The End"; MimeTokenStream stream; @Override protected void setUp() throws Exception { super.setUp(); stream = new MimeTokenStream(); byte[] bytes = CharsetUtil.US_ASCII.encode(MAIL_WITH_RFC822_PART).array(); InputStream in = new ByteArrayInputStream(bytes); stream.parse(in); } @Override protected void tearDown() throws Exception { super.tearDown(); } public void testWhenRecurseShouldRecurseInnerMail() throws Exception { stream.setRecursionMode(RecursionMode.M_RECURSE); nextIs(EntityState.T_START_HEADER); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_END_HEADER); nextIs(EntityState.T_START_MULTIPART); nextIs(EntityState.T_PREAMBLE); nextShouldBeStandardPart(false); nextShouldBeStandardPart(true); nextIs(EntityState.T_START_BODYPART); nextIs(EntityState.T_START_HEADER); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_END_HEADER); nextIs(EntityState.T_START_MESSAGE); nextIs(EntityState.T_START_HEADER); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_END_HEADER); nextIs(EntityState.T_START_MULTIPART); nextShouldBeStandardPart(true); nextShouldBeStandardPart(true); nextIs(EntityState.T_END_MULTIPART); nextIs(EntityState.T_END_MESSAGE); nextIs(EntityState.T_END_BODYPART); nextShouldBeStandardPart(true); nextIs(EntityState.T_EPILOGUE); nextIs(EntityState.T_END_MULTIPART); } public void testWhenRecurseShouldTreatInnerMailAsAnyOtherPart() throws Exception { stream.setRecursionMode(RecursionMode.M_NO_RECURSE); nextIs(EntityState.T_START_HEADER); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_END_HEADER); nextIs(EntityState.T_START_MULTIPART); nextIs(EntityState.T_PREAMBLE); nextShouldBeStandardPart(false); nextShouldBeStandardPart(true); nextShouldBeStandardPart(true); nextShouldBeStandardPart(true); nextIs(EntityState.T_EPILOGUE); nextIs(EntityState.T_END_MULTIPART); } public void testWhenNoRecurseInputStreamShouldContainInnerMail() throws Exception { stream.setRecursionMode(RecursionMode.M_NO_RECURSE); nextIs(EntityState.T_START_HEADER); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_END_HEADER); nextIs(EntityState.T_START_MULTIPART); nextIs(EntityState.T_PREAMBLE); nextShouldBeStandardPart(false); nextShouldBeStandardPart(true); nextIs(EntityState.T_START_BODYPART); nextIs(EntityState.T_START_HEADER); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_END_HEADER); nextIs(EntityState.T_BODY); InputStream inputStream = stream.getInputStream(); int next = inputStream.read(); int i=0; while (next != -1) { assertEquals("@" + i, INNER_MAIL.charAt(i++), (char) next); next = inputStream.read(); } assertEquals(INNER_MAIL.length()-2, i); } public void testSetNoRecurseSoInputStreamShouldContainInnerMail() throws Exception { nextIs(EntityState.T_START_HEADER); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_END_HEADER); nextIs(EntityState.T_START_MULTIPART); nextIs(EntityState.T_PREAMBLE); nextShouldBeStandardPart(false); nextShouldBeStandardPart(true); stream.setRecursionMode(RecursionMode.M_NO_RECURSE); nextIs(EntityState.T_START_BODYPART); nextIs(EntityState.T_START_HEADER); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_END_HEADER); nextIs(EntityState.T_BODY); InputStream inputStream = stream.getInputStream(); int next = inputStream.read(); int i=0; while (next != -1) { assertEquals("@" + i, INNER_MAIL.charAt(i++), (char) next); next = inputStream.read(); } assertEquals(INNER_MAIL.length()-2, i); } private void nextShouldBeStandardPart(boolean withHeader) throws Exception { nextIs(EntityState.T_START_BODYPART); nextIs(EntityState.T_START_HEADER); if (withHeader) { nextIs(EntityState.T_FIELD); } nextIs(EntityState.T_END_HEADER); nextIs(EntityState.T_BODY); nextIs(EntityState.T_END_BODYPART); } private void nextIs(EntityState state) throws Exception { assertEquals(MimeTokenStream.stateToString(state), MimeTokenStream.stateToString(stream.next())); } } ././@LongLink0000000000000000000000000000016500000000000011567 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/stream/MimeTokenStreamBodyDescriptorTest.javaapache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/stream/MimeTokenStreamBodyDes0000644000000000000000000001547411702050530031741 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.stream; import java.io.ByteArrayInputStream; import junit.framework.TestCase; import org.apache.james.mime4j.ExampleMail; public class MimeTokenStreamBodyDescriptorTest extends TestCase { MimeTokenStream parser; @Override protected void setUp() throws Exception { super.setUp(); parser = new MimeTokenStream(); parser.parse(new ByteArrayInputStream(ExampleMail.MIME_MULTIPART_ALTERNATIVE_BYTES)); } @Override protected void tearDown() throws Exception { super.tearDown(); } public void testShouldReturnValidDescriptorForPreamble() throws Exception { assertEquals(MimeTokenStream.stateToString(EntityState.T_START_HEADER), MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_FIELD), MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_FIELD), MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_FIELD), MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_FIELD), MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_FIELD), MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_END_HEADER), MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_START_MULTIPART), MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_PREAMBLE), MimeTokenStream.stateToString(parser.next())); BodyDescriptor descriptor = parser.getBodyDescriptor(); assertNotNull(descriptor); assertEquals("1729", descriptor.getBoundary()); assertEquals( "multipart/alternative", descriptor.getMimeType()); } public void testShouldReturnValidDescriptorForEpilogue() throws Exception { assertEquals(MimeTokenStream.stateToString(EntityState.T_START_HEADER), MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_FIELD), MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_FIELD), MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_FIELD), MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_FIELD), MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_FIELD), MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_END_HEADER), MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_START_MULTIPART), MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_PREAMBLE), MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_START_BODYPART), MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_START_HEADER), MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_FIELD), MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_END_HEADER), MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_BODY), MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_END_BODYPART), MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_START_BODYPART), MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_START_HEADER), MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_FIELD), MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_END_HEADER), MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_BODY), MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_END_BODYPART), MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_START_BODYPART), MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_START_HEADER), MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_FIELD), MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_END_HEADER), MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_BODY), MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_END_BODYPART), MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_EPILOGUE), MimeTokenStream.stateToString(parser.next())); BodyDescriptor descriptor = parser.getBodyDescriptor(); assertNotNull(descriptor); assertEquals("1729", descriptor.getBoundary()); assertEquals( "multipart/alternative", descriptor.getMimeType()); } } ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/stream/RawFieldParserTest.javaapache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/stream/RawFieldParserTest.jav0000644000000000000000000004225511702050530031711 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.stream; import java.util.List; import org.apache.james.mime4j.MimeException; import org.apache.james.mime4j.util.ByteSequence; import org.apache.james.mime4j.util.ContentUtil; import junit.framework.Assert; import junit.framework.TestCase; public class RawFieldParserTest extends TestCase { private RawFieldParser parser; @Override protected void setUp() throws Exception { parser = new RawFieldParser(); } public void testBasicTokenParsing() throws Exception { String s = " raw: \" some stuff \""; ByteSequence raw = ContentUtil.encode(s); ParserCursor cursor = new ParserCursor(0, s.length()); parser.skipWhiteSpace(raw, cursor); Assert.assertFalse(cursor.atEnd()); Assert.assertEquals(3, cursor.getPos()); StringBuilder strbuf1 = new StringBuilder(); parser.copyContent(raw, cursor, RawFieldParser.INIT_BITSET(':'), strbuf1); Assert.assertFalse(cursor.atEnd()); Assert.assertEquals(6, cursor.getPos()); Assert.assertEquals("raw", strbuf1.toString()); Assert.assertEquals(':', raw.byteAt(cursor.getPos())); cursor.updatePos(cursor.getPos() + 1); parser.skipWhiteSpace(raw, cursor); Assert.assertFalse(cursor.atEnd()); Assert.assertEquals(8, cursor.getPos()); StringBuilder strbuf2 = new StringBuilder(); parser.copyQuotedContent(raw, cursor, strbuf2); Assert.assertTrue(cursor.atEnd()); Assert.assertEquals(" some stuff ", strbuf2.toString()); parser.copyQuotedContent(raw, cursor, strbuf2); Assert.assertTrue(cursor.atEnd()); parser.skipWhiteSpace(raw, cursor); Assert.assertTrue(cursor.atEnd()); } public void testTokenParsingWithQuotedPairs() throws Exception { String s = "raw: \"\\\"some\\stuff\\\\\""; ByteSequence raw = ContentUtil.encode(s); ParserCursor cursor = new ParserCursor(0, s.length()); parser.skipWhiteSpace(raw, cursor); Assert.assertFalse(cursor.atEnd()); Assert.assertEquals(0, cursor.getPos()); StringBuilder strbuf1 = new StringBuilder(); parser.copyContent(raw, cursor, RawFieldParser.INIT_BITSET(':'), strbuf1); Assert.assertFalse(cursor.atEnd()); Assert.assertEquals("raw", strbuf1.toString()); Assert.assertEquals(':', raw.byteAt(cursor.getPos())); cursor.updatePos(cursor.getPos() + 1); parser.skipWhiteSpace(raw, cursor); Assert.assertFalse(cursor.atEnd()); StringBuilder strbuf2 = new StringBuilder(); parser.copyQuotedContent(raw, cursor, strbuf2); Assert.assertTrue(cursor.atEnd()); Assert.assertEquals("\"some\\stuff\\", strbuf2.toString()); } public void testTokenParsingIncompleteQuote() throws Exception { String s = "\"stuff and more stuff "; ByteSequence raw = ContentUtil.encode(s); ParserCursor cursor = new ParserCursor(0, s.length()); StringBuilder strbuf1 = new StringBuilder(); parser.copyQuotedContent(raw, cursor, strbuf1); Assert.assertEquals("stuff and more stuff ", strbuf1.toString()); } public void testSkipComments() throws Exception { String s = "(some (((maybe))human readable) stuff())"; ByteSequence raw = ContentUtil.encode(s); ParserCursor cursor = new ParserCursor(0, s.length()); parser.skipComment(raw, cursor); Assert.assertTrue(cursor.atEnd()); } public void testSkipCommentsWithQuotedPairs() throws Exception { String s = "(some (((\\)maybe))human readable\\() stuff())"; ByteSequence raw = ContentUtil.encode(s); ParserCursor cursor = new ParserCursor(0, s.length()); parser.skipComment(raw, cursor); Assert.assertTrue(cursor.atEnd()); } public void testTokenParsingTokensWithUnquotedBlanks() throws Exception { String s = " stuff and \tsome\tmore stuff ;"; ByteSequence raw = ContentUtil.encode(s); ParserCursor cursor = new ParserCursor(0, s.length()); String result = parser.parseToken(raw, cursor, RawFieldParser.INIT_BITSET(';')); Assert.assertEquals("stuff and some more stuff", result); } public void testTokenParsingTokensWithComments() throws Exception { String s = " (blah-blah) stuff(blah-blah) and some mo(blah-blah)re stuff (blah-blah) ;"; ByteSequence raw = ContentUtil.encode(s); ParserCursor cursor = new ParserCursor(0, s.length()); String result = parser.parseToken(raw, cursor, RawFieldParser.INIT_BITSET(';')); Assert.assertEquals("stuff and some more stuff", result); } public void testTokenParsingMixedValuesAndQuotedValues() throws Exception { String s = " stuff and \" some more \" \"stuff ;"; ByteSequence raw = ContentUtil.encode(s); ParserCursor cursor = new ParserCursor(0, s.length()); String result = parser.parseValue(raw, cursor, RawFieldParser.INIT_BITSET(';')); Assert.assertEquals("stuff and some more stuff ;", result); } public void testTokenParsingQuotedValuesWithComments() throws Exception { String s = " (blah blah) \"(stuff)(and)(some)(more)(stuff)\" (yada yada) "; ByteSequence raw = ContentUtil.encode(s); ParserCursor cursor = new ParserCursor(0, s.length()); String result = parser.parseValue(raw, cursor, RawFieldParser.INIT_BITSET(';')); Assert.assertEquals("(stuff)(and)(some)(more)(stuff)", result); } public void testBasicParsing() throws Exception { String s = "raw: stuff;\r\n more stuff"; ByteSequence raw = ContentUtil.encode(s); RawField field = parser.parseField(raw); Assert.assertSame(raw, field.getRaw()); Assert.assertEquals("raw", field.getName()); Assert.assertEquals("stuff; more stuff", field.getBody()); Assert.assertEquals(s, field.toString()); } public void testParsingNoBlankAfterColon() throws Exception { String s = "raw:stuff"; ByteSequence raw = ContentUtil.encode(s); RawField field = parser.parseField(raw); Assert.assertSame(raw, field.getRaw()); Assert.assertEquals("raw", field.getName()); Assert.assertEquals("stuff", field.getBody()); Assert.assertEquals(s, field.toString()); } public void testParsingObsoleteSyntax() throws Exception { String s = "raw \t : stuff;\r\n more stuff"; ByteSequence raw = ContentUtil.encode(s); RawField field = parser.parseField(raw); Assert.assertSame(raw, field.getRaw()); Assert.assertEquals("raw", field.getName()); Assert.assertEquals("stuff; more stuff", field.getBody()); Assert.assertEquals(s, field.toString()); } public void testParsingInvalidSyntax1() throws Exception { String s = "raw stuff;\r\n more stuff"; ByteSequence raw = ContentUtil.encode(s); try { parser.parseField(raw); fail("MimeException should have been thrown"); } catch (MimeException expected) { } } public void testParsingInvalidSyntax2() throws Exception { String s = "raw \t \t"; ByteSequence raw = ContentUtil.encode(s); try { parser.parseField(raw); fail("MimeException should have been thrown"); } catch (MimeException expected) { } } public void testNameValueParseBasics() { String s = "test"; ByteSequence buf = ContentUtil.encode(s); ParserCursor cursor = new ParserCursor(0, s.length()); NameValuePair param = parser.parseParameter(buf, cursor); assertEquals("test", param.getName()); assertEquals(null, param.getValue()); assertEquals(s.length(), cursor.getPos()); assertTrue(cursor.atEnd()); s = "test;"; buf = ContentUtil.encode(s); cursor = new ParserCursor(0, s.length()); param = parser.parseParameter(buf, cursor); assertEquals("test", param.getName()); assertEquals(null, param.getValue()); assertEquals(s.length(), cursor.getPos()); assertTrue(cursor.atEnd()); s = "test=stuff"; buf = ContentUtil.encode(s); cursor = new ParserCursor(0, s.length()); param = parser.parseParameter(buf, cursor); assertEquals("test", param.getName()); assertEquals("stuff", param.getValue()); assertEquals(s.length(), cursor.getPos()); assertTrue(cursor.atEnd()); s = " test = stuff "; buf = ContentUtil.encode(s); cursor = new ParserCursor(0, s.length()); param = parser.parseParameter(buf, cursor); assertEquals("test", param.getName()); assertEquals("stuff", param.getValue()); assertEquals(s.length(), cursor.getPos()); assertTrue(cursor.atEnd()); s = " test = stuff ;1234"; buf = ContentUtil.encode(s); cursor = new ParserCursor(0, s.length()); param = parser.parseParameter(buf, cursor); assertEquals("test", param.getName()); assertEquals("stuff", param.getValue()); assertEquals(s.length() - 4, cursor.getPos()); assertFalse(cursor.atEnd()); s = "test = \"stuff\""; buf = ContentUtil.encode(s); cursor = new ParserCursor(0, s.length()); param = parser.parseParameter(buf, cursor); assertEquals("test", param.getName()); assertEquals("stuff", param.getValue()); s = "test = text(text of some kind)/stuff(stuff of some kind)"; buf = ContentUtil.encode(s); cursor = new ParserCursor(0, s.length()); param = parser.parseParameter(buf, cursor); assertEquals("test", param.getName()); assertEquals("text/stuff", param.getValue()); s = "test = \" stuff\\\"\""; buf = ContentUtil.encode(s); cursor = new ParserCursor(0, s.length()); param = parser.parseParameter(buf, cursor); assertEquals("test", param.getName()); assertEquals(" stuff\"", param.getValue()); s = "test = \" stuff\\\\\\\"\""; buf = ContentUtil.encode(s); cursor = new ParserCursor(0, s.length()); param = parser.parseParameter(buf, cursor); assertEquals("test", param.getName()); assertEquals(" stuff\\\"", param.getValue()); s = " test"; buf = ContentUtil.encode(s); cursor = new ParserCursor(0, s.length()); param = parser.parseParameter(buf, cursor); assertEquals("test", param.getName()); assertEquals(null, param.getValue()); s = " "; buf = ContentUtil.encode(s); cursor = new ParserCursor(0, s.length()); param = parser.parseParameter(buf, cursor); assertEquals("", param.getName()); assertEquals(null, param.getValue()); s = " = stuff "; buf = ContentUtil.encode(s); cursor = new ParserCursor(0, s.length()); param = parser.parseParameter(buf, cursor); assertEquals("", param.getName()); assertEquals("stuff", param.getValue()); } public void testNameValueListParseBasics() { ByteSequence buf = ContentUtil.encode( "test; test1 = stuff ; test2 = \"stuff; stuff\"; test3=\"stuff"); ParserCursor cursor = new ParserCursor(0, buf.length()); List params = parser.parseParameters(buf, cursor); assertEquals("test", params.get(0).getName()); assertEquals(null, params.get(0).getValue()); assertEquals("test1", params.get(1).getName()); assertEquals("stuff", params.get(1).getValue()); assertEquals("test2", params.get(2).getName()); assertEquals("stuff; stuff", params.get(2).getValue()); assertEquals("test3", params.get(3).getName()); assertEquals("stuff", params.get(3).getValue()); assertEquals(buf.length(), cursor.getPos()); assertTrue(cursor.atEnd()); } public void testNameValueListParseEmpty() { ByteSequence buf = ContentUtil.encode(" "); ParserCursor cursor = new ParserCursor(0, buf.length()); List params = parser.parseParameters(buf, cursor); assertEquals(0, params.size()); } public void testNameValueListParseEscaped() { ByteSequence buf = ContentUtil.encode( "test1 = \"\\\"stuff\\\"\"; test2= \"\\\\\"; test3 = \"stuff; stuff\""); ParserCursor cursor = new ParserCursor(0, buf.length()); List params = parser.parseParameters(buf, cursor); assertEquals(3, params.size()); assertEquals("test1", params.get(0).getName()); assertEquals("\"stuff\"", params.get(0).getValue()); assertEquals("test2", params.get(1).getName()); assertEquals("\\", params.get(1).getValue()); assertEquals("test3", params.get(2).getName()); assertEquals("stuff; stuff", params.get(2).getValue()); } public void testRawBodyParse() { ByteSequence buf = ContentUtil.encode( " text/plain ; charset=ISO-8859-1; " + "boundary=foo; param1=value1; param2=\"value2\"; param3=value3"); ParserCursor cursor = new ParserCursor(0, buf.length()); RawBody body = parser.parseRawBody(buf, cursor); assertNotNull(body); assertEquals("text/plain", body.getValue()); List params = body.getParams(); assertEquals(5, params.size()); assertEquals("charset", params.get(0).getName()); assertEquals("ISO-8859-1", params.get(0).getValue()); assertEquals("boundary", params.get(1).getName()); assertEquals("foo", params.get(1).getValue()); assertEquals("param1", params.get(2).getName()); assertEquals("value1", params.get(2).getValue()); assertEquals("param2", params.get(3).getName()); assertEquals("value2", params.get(3).getValue()); assertEquals("param3", params.get(4).getName()); assertEquals("value3", params.get(4).getValue()); } public void testRawBodyParseWithComments() { ByteSequence buf = ContentUtil.encode( " text/(nothing special)plain ; charset=(latin)ISO-8859-1; " + "boundary=foo(bar);"); ParserCursor cursor = new ParserCursor(0, buf.length()); RawBody body = parser.parseRawBody(buf, cursor); assertNotNull(body); assertEquals("text/plain", body.getValue()); List params = body.getParams(); assertEquals(2, params.size()); assertEquals("charset", params.get(0).getName()); assertEquals("ISO-8859-1", params.get(0).getValue()); assertEquals("boundary", params.get(1).getName()); assertEquals("foo", params.get(1).getValue()); } public void testRawBodyParseEmptyParam() { ByteSequence buf = ContentUtil.encode( "multipart/alternative;; boundary=\"boundary\""); ParserCursor cursor = new ParserCursor(0, buf.length()); RawBody body = parser.parseRawBody(buf, cursor); assertNotNull(body); assertEquals("multipart/alternative", body.getValue()); List params = body.getParams(); assertEquals(2, params.size()); assertEquals("", params.get(0).getName()); assertEquals(null, params.get(0).getValue()); assertEquals("boundary", params.get(1).getName()); assertEquals("boundary", params.get(1).getValue()); } public void testRawBodyParseFolded() { ByteSequence buf = ContentUtil.encode( "multipart/alternative; boundary=\"simple\r\n boundary\""); ParserCursor cursor = new ParserCursor(0, buf.length()); RawBody body = parser.parseRawBody(buf, cursor); assertNotNull(body); assertEquals("multipart/alternative", body.getValue()); List params = body.getParams(); assertEquals(1, params.size()); assertEquals("boundary", params.get(0).getName()); assertEquals("simple boundary", params.get(0).getValue()); } } ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/stream/MultipartTokensTest.javaapache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/stream/MultipartTokensTest.ja0000644000000000000000000003244211702050530032013 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.stream; import java.io.ByteArrayInputStream; import java.io.IOException; import java.nio.charset.Charset; import junit.framework.TestCase; import org.apache.commons.io.IOUtils; import org.apache.james.mime4j.MimeException; import org.apache.james.mime4j.util.CharsetUtil; public class MultipartTokensTest extends TestCase { private static final Charset US_ASCII = CharsetUtil.US_ASCII; private static final String BODY = "A Preamble\r\n" + "--1729\r\n\r\n" + "Simple plain text\r\n" + "--1729\r\n" + "Content-Type: text/plain; charset=US-ASCII\r\n\r\n" + "Some more text\r\n" + "--1729--\r\n" + "An Epilogue\r\n"; public static final String MESSAGE = "To: Road Runner \r\n" + "From: Wile E. Cayote \r\n" + "Date: Tue, 12 Feb 2008 17:34:09 +0000 (GMT)\r\n" + "Subject: Mail\r\n" + "Content-Type: multipart/mixed;boundary=1729\r\n\r\n" + BODY; public static final String COMPLEX_MESSAGE = "To: Wile E. Cayote \r\n" + "From: Road Runner \r\n" + "Date: Tue, 19 Feb 2008 17:34:09 +0000 (GMT)\r\n" + "Subject: Mail\r\n" + "Content-Type: multipart/mixed;boundary=42\r\n\r\n" + "A little preamble\r\n" + "--42\r\n" + "Content-Type: text/plain; charset=US-ASCII\r\n\r\n" + "Rhubard!\r\n" + "--42\r\n" + "Content-Type: message/rfc822\r\n\r\n" + MESSAGE + "\r\n" + "--42\r\n" + "\r\n" + "Custard!" + "\r\n" + "--42--\r\n" + "A little epilogue\r\n"; public static final String COMPLEX_QP_MESSAGE = "Content-Transfer-Encoding: quoted-printable\r\n" + "Content-Type: message/rfc822; charset=us-ascii\r\n" + "\r\n" + "Subject: The subject\r\n" + "Content-Type: multipart/alternative;\r\n" + " boundary=3D=22----=3DNextPart=22\r\n" + "\r\n" + "This is a multi-part message in MIME format.\r\n" + "\r\n" + "------=3DNextPart\r\n" + "Content-Type: text/plain;\r\n" + " charset=3D=22iso-8859-1=22\r\n" + "\r\n" + "Some text\r\n" + "\r\n" + "------=3DNextPart\r\n" + "Content-Type: text/html;\r\n" + " charset=3D=22iso-8859-1=22\r\n" + "\r\n" + "=3D Some HTML =3D\r\n" + "------=3DNextPart--\r\n" + "\r\n" + "\r\n"; MimeTokenStream parser; @Override protected void setUp() throws Exception { super.setUp(); parser = new MimeTokenStream(); } @Override protected void tearDown() throws Exception { super.tearDown(); } public void testShouldParseSimpleMessage() throws Exception { parser.parse(new ByteArrayInputStream(US_ASCII.encode(MESSAGE).array())); checkState(EntityState.T_START_HEADER); checkState(EntityState.T_FIELD); checkState(EntityState.T_FIELD); checkState(EntityState.T_FIELD); checkState(EntityState.T_FIELD); checkState(EntityState.T_FIELD); checkState(EntityState.T_END_HEADER); checkState(EntityState.T_START_MULTIPART); checkState(EntityState.T_PREAMBLE); checkState(EntityState.T_START_BODYPART); checkState(EntityState.T_START_HEADER); checkState(EntityState.T_END_HEADER); checkState(EntityState.T_BODY); checkState(EntityState.T_END_BODYPART); checkState(EntityState.T_START_BODYPART); checkState(EntityState.T_START_HEADER); checkState(EntityState.T_FIELD); checkState(EntityState.T_END_HEADER); checkState(EntityState.T_BODY); checkState(EntityState.T_END_BODYPART); checkState(EntityState.T_EPILOGUE); checkState(EntityState.T_END_MULTIPART); checkState(EntityState.T_END_MESSAGE); checkState(EntityState.T_END_OF_STREAM); } public void testShouldParseMoreComplexMessage() throws Exception { String message = "Content-Type: multipart/alternative; boundary=\"outer-boundary\"\r\n" + "\r\n" + "--outer-boundary\r\n" + "Content-Type: multipart/alternative; boundary=\"inner-boundary\"\r\n" + "\r\n" + "--inner-boundary\r\n" + "Content-Type: text/plain\r\n" + "\r\n" + "Some text\r\n" + "--inner-boundary--\r\n" + "\r\n" + "foo\r\n" + "--outer-boundary--\r\n"; parser.parse(new ByteArrayInputStream(US_ASCII.encode(message).array())); checkState(EntityState.T_START_HEADER); checkState(EntityState.T_FIELD); checkState(EntityState.T_END_HEADER); checkState(EntityState.T_START_MULTIPART); checkState(EntityState.T_START_BODYPART); checkState(EntityState.T_START_HEADER); checkState(EntityState.T_FIELD); checkState(EntityState.T_END_HEADER); checkState(EntityState.T_START_MULTIPART); checkState(EntityState.T_START_BODYPART); checkState(EntityState.T_START_HEADER); checkState(EntityState.T_FIELD); checkState(EntityState.T_END_HEADER); checkState(EntityState.T_BODY); checkState(EntityState.T_END_BODYPART); checkState(EntityState.T_EPILOGUE); checkState(EntityState.T_END_MULTIPART); checkState(EntityState.T_END_BODYPART); checkState(EntityState.T_END_MULTIPART); checkState(EntityState.T_END_MESSAGE); checkState(EntityState.T_END_OF_STREAM); } public void testShouldParseMessageWithEmbeddedMessage() throws Exception { parser.parse(new ByteArrayInputStream(US_ASCII.encode(COMPLEX_MESSAGE).array())); checkState(EntityState.T_START_HEADER); checkState(EntityState.T_FIELD); checkState(EntityState.T_FIELD); checkState(EntityState.T_FIELD); checkState(EntityState.T_FIELD); checkState(EntityState.T_FIELD); checkState(EntityState.T_END_HEADER); checkState(EntityState.T_START_MULTIPART); checkState(EntityState.T_PREAMBLE); checkState(EntityState.T_START_BODYPART); checkState(EntityState.T_START_HEADER); checkState(EntityState.T_FIELD); checkState(EntityState.T_END_HEADER); checkState(EntityState.T_BODY); checkState(EntityState.T_END_BODYPART); checkState(EntityState.T_START_BODYPART); checkState(EntityState.T_START_HEADER); checkState(EntityState.T_FIELD); checkState(EntityState.T_END_HEADER); checkState(EntityState.T_START_MESSAGE); checkState(EntityState.T_START_HEADER); checkState(EntityState.T_FIELD); checkState(EntityState.T_FIELD); checkState(EntityState.T_FIELD); checkState(EntityState.T_FIELD); checkState(EntityState.T_FIELD); checkState(EntityState.T_END_HEADER); checkState(EntityState.T_START_MULTIPART); checkState(EntityState.T_PREAMBLE); checkState(EntityState.T_START_BODYPART); checkState(EntityState.T_START_HEADER); checkState(EntityState.T_END_HEADER); checkState(EntityState.T_BODY); checkState(EntityState.T_END_BODYPART); checkState(EntityState.T_START_BODYPART); checkState(EntityState.T_START_HEADER); checkState(EntityState.T_FIELD); checkState(EntityState.T_END_HEADER); checkState(EntityState.T_BODY); checkState(EntityState.T_END_BODYPART); checkState(EntityState.T_EPILOGUE); checkState(EntityState.T_END_MULTIPART); checkState(EntityState.T_END_MESSAGE); checkState(EntityState.T_END_BODYPART); checkState(EntityState.T_START_BODYPART); checkState(EntityState.T_START_HEADER); checkState(EntityState.T_END_HEADER); checkState(EntityState.T_BODY); checkState(EntityState.T_END_BODYPART); checkState(EntityState.T_EPILOGUE); checkState(EntityState.T_END_MULTIPART); checkState(EntityState.T_END_MESSAGE); checkState(EntityState.T_END_OF_STREAM); } public void testShouldParseMessagesWithEmbeddedQuotedPrintableEncodedMessage() throws Exception { parser.parse(new ByteArrayInputStream(US_ASCII.encode(COMPLEX_QP_MESSAGE).array())); checkState(EntityState.T_START_HEADER); checkState(EntityState.T_FIELD); checkState(EntityState.T_FIELD); checkState(EntityState.T_END_HEADER); checkState(EntityState.T_START_MESSAGE); checkState(EntityState.T_START_HEADER); checkState(EntityState.T_FIELD); checkState(EntityState.T_FIELD); checkState(EntityState.T_END_HEADER); checkState(EntityState.T_START_MULTIPART); checkState(EntityState.T_PREAMBLE); checkState(EntityState.T_START_BODYPART); checkState(EntityState.T_START_HEADER); checkState(EntityState.T_FIELD); checkState(EntityState.T_END_HEADER); checkState(EntityState.T_BODY); assertEquals("text/plain", parser.getBodyDescriptor().getMimeType()); assertEquals("iso-8859-1", parser.getBodyDescriptor().getCharset()); assertEquals("Some text\r\n", IOUtils.toString(parser.getInputStream())); checkState(EntityState.T_END_BODYPART); checkState(EntityState.T_START_BODYPART); checkState(EntityState.T_START_HEADER); checkState(EntityState.T_FIELD); checkState(EntityState.T_END_HEADER); checkState(EntityState.T_BODY); assertEquals("text/html", parser.getBodyDescriptor().getMimeType()); assertEquals("iso-8859-1", parser.getBodyDescriptor().getCharset()); assertEquals("= Some HTML =", IOUtils.toString(parser.getInputStream())); checkState(EntityState.T_END_BODYPART); checkState(EntityState.T_EPILOGUE); checkState(EntityState.T_END_MULTIPART); checkState(EntityState.T_END_MESSAGE); checkState(EntityState.T_END_MESSAGE); checkState(EntityState.T_END_OF_STREAM); } public void testMultipartMessageWithoutHeader() throws Exception { parser.parseHeadless(new ByteArrayInputStream(US_ASCII.encode(BODY).array()), "multipart/mixed;boundary=1729"); // see https://issues.apache.org/jira/browse/MIME4J-153 // checkState(EntityStates.T_END_HEADER); // see https://issues.apache.org/jira/browse/MIME4J-153 // checkState(EntityStates.T_START_MULTIPART); // actually T_START_MULTIPART is the first state, but the // checkState method calls next() before checking. checkState(EntityState.T_PREAMBLE); checkState(EntityState.T_START_BODYPART); checkState(EntityState.T_START_HEADER); checkState(EntityState.T_END_HEADER); checkState(EntityState.T_BODY); checkState(EntityState.T_END_BODYPART); checkState(EntityState.T_START_BODYPART); checkState(EntityState.T_START_HEADER); checkState(EntityState.T_FIELD); checkState(EntityState.T_END_HEADER); checkState(EntityState.T_BODY); checkState(EntityState.T_END_BODYPART); checkState(EntityState.T_EPILOGUE); checkState(EntityState.T_END_MULTIPART); checkState(EntityState.T_END_MESSAGE); checkState(EntityState.T_END_OF_STREAM); } private void checkState(final EntityState state) throws IOException, MimeException { assertEquals(MimeTokenStream.stateToString(state), MimeTokenStream.stateToString(parser.next())); } } ././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/stream/StrictMimeTokenStreamTest.javaapache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/stream/StrictMimeTokenStreamT0000644000000000000000000001024211702050530031770 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.stream; import java.io.ByteArrayInputStream; import java.io.InputStream; import org.apache.james.mime4j.MimeIOException; import junit.framework.TestCase; public class StrictMimeTokenStreamTest extends TestCase { private static final String HEADER_ONLY = "From: foo@abr.com\r\nSubject: A subject\r\n"; private static final String CORRECT_HEADERS = HEADER_ONLY + "\r\n"; MimeTokenStream parser; @Override protected void setUp() throws Exception { super.setUp(); MimeConfig config = new MimeConfig(); config.setStrictParsing(true); parser = new MimeTokenStream(config); } @Override protected void tearDown() throws Exception { super.tearDown(); } public void testUnexpectedEndOfHeaders() throws Exception { parser.parse(new ByteArrayInputStream(HEADER_ONLY.getBytes("US-ASCII"))); checkNextIs(EntityState.T_START_HEADER); checkNextIs(EntityState.T_FIELD); try { parser.next(); fail("Expected exception to be thrown"); } catch (MimeParseEventException e) { assertEquals("Premature end of headers", Event.HEADERS_PREMATURE_END, e.getEvent()); } } public void testCorrectEndOfHeaders() throws Exception { parser.parse(new ByteArrayInputStream(CORRECT_HEADERS.getBytes("US-ASCII"))); checkNextIs(EntityState.T_START_HEADER); checkNextIs(EntityState.T_FIELD); checkNextIs(EntityState.T_FIELD); checkNextIs(EntityState.T_END_HEADER); } public void testMissingBoundary() throws Exception { String message = "Content-Type: multipart/mixed;boundary=aaaa\r\n\r\n" + "--aaaa\r\n" + "Content-Type:text/plain; charset=US-ASCII\r\n\r\n" + "Oh my god! Boundary is missing!\r\n"; parser.parse(new ByteArrayInputStream(message.getBytes("US-ASCII"))); checkNextIs(EntityState.T_START_HEADER); checkNextIs(EntityState.T_FIELD); checkNextIs(EntityState.T_END_HEADER); checkNextIs(EntityState.T_START_MULTIPART); checkNextIs(EntityState.T_START_BODYPART); checkNextIs(EntityState.T_START_HEADER); checkNextIs(EntityState.T_FIELD); checkNextIs(EntityState.T_END_HEADER); checkNextIs(EntityState.T_BODY); InputStream in = parser.getInputStream(); StringBuilder sb = new StringBuilder(); try { byte[] tmp = new byte[1024]; int l; while ((l = in.read(tmp)) != -1) { sb.append(new String(tmp, 0, l, "US-ASCII")); } fail("MimeIOException should have been thrown"); } catch (MimeIOException expected) { assertEquals("Oh my god! Boundary is missing!\r\n", sb.toString()); } } private void checkNextIs(EntityState expected) throws Exception { assertEquals(MimeTokenStream.stateToString(expected), MimeTokenStream.stateToString(parser.next())); } } ././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/stream/MimeTokenStreamReaderTest.javaapache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/stream/MimeTokenStreamReaderT0000644000000000000000000001751311702050530031732 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.stream; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.Reader; import junit.framework.TestCase; import org.apache.commons.io.IOUtils; import org.apache.james.mime4j.ExampleMail; import org.apache.james.mime4j.MimeException; public class MimeTokenStreamReaderTest extends TestCase { MimeTokenStream parser; @Override protected void setUp() throws Exception { super.setUp(); parser = new MimeTokenStream(); } @Override protected void tearDown() throws Exception { super.tearDown(); } public void testShouldReadSimpleBody() throws Exception { byte[] bytes = ExampleMail.RFC822_SIMPLE_BYTES; String body = ExampleMail.RFC822_SIMPLE_BODY; checkSimpleMail(bytes, body, 4); } public void testShouldReadOnePartMimeASCIIBody() throws Exception { byte[] bytes = ExampleMail.ONE_PART_MIME_ASCII_BYTES; String body = ExampleMail.ONE_PART_MIME_ASCII_BODY; checkSimpleMail(bytes, body, 11); } public void testShouldReadOnePartMime8859Body() throws Exception { byte[] bytes = ExampleMail.ONE_PART_MIME_8859_BYTES; String body = ExampleMail.ONE_PART_MIME_8859_BODY; checkSimpleMail(bytes, body, 13); } public void testShouldReadOnePartMimeBase64ASCIIBody() throws Exception { byte[] bytes = ExampleMail.ONE_PART_MIME_BASE64_ASCII_BYTES; String body = ExampleMail.ONE_PART_MIME_BASE64_ASCII_BODY; checkSimpleMail(bytes, body, 11); } public void testShouldReadOnePartMimeBase64Latin1Body() throws Exception { byte[] bytes = ExampleMail.ONE_PART_MIME_BASE64_LATIN1_BYTES; String body = ExampleMail.ONE_PART_MIME_BASE64_LATIN1_BODY; checkSimpleMail(bytes, body, 11); } public void testShouldReadOnePartMimeQuotedPrintable() throws Exception { byte[] bytes = ExampleMail.ONE_PART_MIME_QUOTED_PRINTABLE_ASCII_BYTES; String body = ExampleMail.ONE_PART_MIME_QUOTED_PRINTABLE_ASCII_BODY; checkSimpleMail(bytes, body, 11); } public void testShouldReadPartBodies() throws IOException, MimeException { InputStream in = new ByteArrayInputStream(ExampleMail.MIME_MIXED_MULTIPART_VARIOUS_ENCODINGS_BYTES); parser.parse(in); assertEquals(MimeTokenStream.stateToString(EntityState.T_START_HEADER),MimeTokenStream.stateToString(parser.next())); for (int i=0;i<5;i++) { assertEquals(MimeTokenStream.stateToString(EntityState.T_FIELD),MimeTokenStream.stateToString(parser.next())); } assertEquals(MimeTokenStream.stateToString(EntityState.T_END_HEADER),MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_START_MULTIPART),MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_PREAMBLE),MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_START_BODYPART),MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_START_HEADER),MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_FIELD),MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_FIELD),MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_END_HEADER),MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_BODY),MimeTokenStream.stateToString(parser.next())); checkBody(ExampleMail.MIME_MIXED_MULTIPART_VARIOUS_ENCODINGS_7BIT); assertEquals(MimeTokenStream.stateToString(EntityState.T_END_BODYPART),MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_START_BODYPART),MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_START_HEADER),MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_FIELD),MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_FIELD),MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_END_HEADER),MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_BODY),MimeTokenStream.stateToString(parser.next())); checkBody(ExampleMail.MIME_MIXED_MULTIPART_VARIOUS_ENCODINGS_QUOTED_PRINTABLE); assertEquals(MimeTokenStream.stateToString(EntityState.T_END_BODYPART),MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_START_BODYPART),MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_START_HEADER),MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_FIELD),MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_FIELD),MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_END_HEADER),MimeTokenStream.stateToString(parser.next())); assertEquals(MimeTokenStream.stateToString(EntityState.T_BODY),MimeTokenStream.stateToString(parser.next())); checkBody(ExampleMail.MIME_MIXED_MULTIPART_VARIOUS_ENCODINGS_BASE64); assertEquals(MimeTokenStream.stateToString(EntityState.T_END_BODYPART),MimeTokenStream.stateToString(parser.next())); } private void checkSimpleMail(byte[] bytes, String body, int fields) throws IOException, MimeException { InputStream in = new ByteArrayInputStream(bytes); parser.parse(in); assertEquals(MimeTokenStream.stateToString(EntityState.T_START_HEADER),MimeTokenStream.stateToString(parser.next())); for (int i=0;i\r\n" + "Date: Tue, 12 Feb 2008 17:34:09 +0000 (GMT)\r\n" + "Subject: Mail\r\n" + "Content-Type: multipart/mixed;boundary=1729\r\n\r\n" + BODY; public static final String COMPLEX_MESSAGE = "To: Wile E. Cayote \r\n" + "From: Road Runner \r\n" + "Date: Tue, 19 Feb 2008 17:34:09 +0000 (GMT)\r\n" + "Subject: Mail\r\n" + "Content-Type: multipart/mixed;boundary=42\r\n\r\n" + "A little preamble\r\n" + "--42\r\n" + "Content-Type: text/plain; charset=US-ASCII\r\n\r\n" + "Rhubard!\r\n" + "--42\r\n" + "Content-Type: message/rfc822\r\n\r\n" + MESSAGE + "\r\n" + "--42\r\n" + "Content-Type: text/plain; charset=US-ASCII\r\n\r\n" + "Custard!" + "\r\n" + "--42--\r\n"; MimeTokenStream parser; @Override protected void setUp() throws Exception { super.setUp(); parser = new MimeTokenStream(); } @Override protected void tearDown() throws Exception { super.tearDown(); } public void testShouldSupplyInputStreamForSimpleBody() throws Exception { parser.parse(new ByteArrayInputStream(US_ASCII.encode(MESSAGE).array())); checkState(EntityState.T_START_HEADER); checkState(EntityState.T_FIELD); checkState(EntityState.T_FIELD); checkState(EntityState.T_FIELD); checkState(EntityState.T_FIELD); checkState(EntityState.T_FIELD); checkState(EntityState.T_END_HEADER); checkState(EntityState.T_START_MULTIPART); InputStream out = parser.getInputStream(); assertEquals(BODY, IOUtils.toString(out, "us-ascii")); checkState(EntityState.T_END_MULTIPART); } public void testInputStreamShouldReadOnlyMessage() throws Exception { parser.parse(new ByteArrayInputStream(US_ASCII.encode(COMPLEX_MESSAGE).array())); checkState(EntityState.T_START_HEADER); checkState(EntityState.T_FIELD); checkState(EntityState.T_FIELD); checkState(EntityState.T_FIELD); checkState(EntityState.T_FIELD); checkState(EntityState.T_FIELD); checkState(EntityState.T_END_HEADER); checkState(EntityState.T_START_MULTIPART); checkState(EntityState.T_PREAMBLE); checkState(EntityState.T_START_BODYPART); checkState(EntityState.T_START_HEADER); checkState(EntityState.T_FIELD); checkState(EntityState.T_END_HEADER); checkState(EntityState.T_BODY); checkState(EntityState.T_END_BODYPART); checkState(EntityState.T_START_BODYPART); checkState(EntityState.T_START_HEADER); checkState(EntityState.T_FIELD); checkState(EntityState.T_END_HEADER); checkState(EntityState.T_START_MESSAGE); checkState(EntityState.T_START_HEADER); checkState(EntityState.T_FIELD); checkState(EntityState.T_FIELD); checkState(EntityState.T_FIELD); checkState(EntityState.T_FIELD); checkState(EntityState.T_FIELD); checkState(EntityState.T_END_HEADER); checkState(EntityState.T_START_MULTIPART); InputStream out = parser.getInputStream(); assertEquals(BODY, IOUtils.toString(out, "us-ascii")); checkState(EntityState.T_END_MULTIPART); checkState(EntityState.T_END_MESSAGE); checkState(EntityState.T_END_BODYPART); checkState(EntityState.T_START_BODYPART); checkState(EntityState.T_START_HEADER); checkState(EntityState.T_FIELD); checkState(EntityState.T_END_HEADER); checkState(EntityState.T_BODY); checkState(EntityState.T_END_BODYPART); checkState(EntityState.T_END_MULTIPART); checkState(EntityState.T_END_MESSAGE); checkState(EntityState.T_END_OF_STREAM); } private void checkState(final EntityState state) throws IOException, MimeException { assertEquals(MimeTokenStream.stateToString(state), MimeTokenStream.stateToString(parser.next())); } } ././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/stream/DefaultFieldBuilderTest.javaapache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/stream/DefaultFieldBuilderTes0000644000000000000000000001346011702050530031727 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.stream; import org.apache.james.mime4j.MimeException; import org.apache.james.mime4j.util.ByteArrayBuffer; import org.apache.james.mime4j.util.ByteSequence; import junit.framework.TestCase; public class DefaultFieldBuilderTest extends TestCase { static ByteArrayBuffer line(final String line) throws Exception { ByteArrayBuffer buf = new ByteArrayBuffer(line.length()); byte[] b = line.getBytes("US-ASCII"); buf.append(b, 0, b.length); return buf; } public void testBasics() throws Exception { DefaultFieldBuilder builder = new DefaultFieldBuilder(0); builder.reset(); builder.append(line("raw: stuff;\r\n")); builder.append(line(" more stuff;\r\n")); builder.append(line(" a lot more stuff\r\n")); ByteArrayBuffer buf = builder.getRaw(); assertNotNull(buf); assertEquals("raw: stuff;\r\n more stuff;\r\n a lot more stuff\r\n", new String(buf.toByteArray(), "US-ASCII")); RawField field = builder.build(); assertNotNull(field); assertEquals("raw", field.getName()); assertEquals(" stuff; more stuff; a lot more stuff", field.getBody()); ByteSequence raw = field.getRaw(); assertNotNull(raw); assertEquals("raw: stuff;\r\n more stuff;\r\n a lot more stuff", new String(raw.toByteArray(), "US-ASCII")); } public void testObsoleteSyntax() throws Exception { DefaultFieldBuilder builder = new DefaultFieldBuilder(0); builder.reset(); builder.append(line("raw : stuff;\r\n")); builder.append(line(" more stuff;\r\n")); builder.append(line(" a lot more stuff\r\n")); ByteArrayBuffer buf = builder.getRaw(); assertNotNull(buf); assertEquals("raw : stuff;\r\n more stuff;\r\n a lot more stuff\r\n", new String(buf.toByteArray(), "US-ASCII")); RawField field = builder.build(); assertNotNull(field); assertEquals("raw", field.getName()); assertEquals("stuff; more stuff; a lot more stuff", field.getBody()); ByteSequence raw = field.getRaw(); assertNotNull(raw); assertEquals("raw : stuff;\r\n more stuff;\r\n a lot more stuff", new String(raw.toByteArray(), "US-ASCII")); } public void testNoTrailingCRLF() throws Exception { DefaultFieldBuilder builder = new DefaultFieldBuilder(0); builder.reset(); builder.append(line("raw: stuff;\r\n")); builder.append(line(" more stuff;\r\n")); builder.append(line(" a lot more stuff")); ByteArrayBuffer buf = builder.getRaw(); assertNotNull(buf); assertEquals("raw: stuff;\r\n more stuff;\r\n a lot more stuff", new String(buf.toByteArray(), "US-ASCII")); RawField field = builder.build(); assertNotNull(field); assertEquals("raw", field.getName()); assertEquals(" stuff; more stuff; a lot more stuff", field.getBody()); ByteSequence raw = field.getRaw(); assertNotNull(raw); assertEquals("raw: stuff;\r\n more stuff;\r\n a lot more stuff", new String(raw.toByteArray(), "US-ASCII")); } public void testIllegalCharsInName() throws Exception { DefaultFieldBuilder builder = new DefaultFieldBuilder(0); builder.reset(); builder.append(line("raw stuff: some stuff\r\n")); try { builder.build(); fail("MimeException should have been thrown"); } catch (MimeException expected) { } } public void testReset() throws Exception { DefaultFieldBuilder builder = new DefaultFieldBuilder(0); builder.reset(); builder.append(line("raw: some stuff\r\n")); ByteArrayBuffer buf = builder.getRaw(); assertNotNull(buf); assertEquals("raw: some stuff\r\n", new String(buf.toByteArray(), "US-ASCII")); builder.reset(); buf = builder.getRaw(); assertTrue(buf.isEmpty()); try { builder.build(); fail("MimeException should have been thrown"); } catch (MimeException expected) { } } public void testTooLong() throws Exception { DefaultFieldBuilder builder = new DefaultFieldBuilder(20); builder.reset(); builder.append(line("raw: some stuff\r\n")); try { builder.append(line("toooooooooooooooooooooooooooooooooooooons of stuff\r\n")); fail("MimeException should have been thrown"); } catch (MimeException expected) { } } } ././@LongLink0000000000000000000000000000016000000000000011562 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/stream/MimeTokenEmbeddedMessageTest.javaapache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/stream/MimeTokenEmbeddedMessa0000644000000000000000000001755711702050530031722 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.stream; import java.io.ByteArrayInputStream; import java.io.InputStream; import junit.framework.TestCase; import org.apache.james.mime4j.ExampleMail; public class MimeTokenEmbeddedMessageTest extends TestCase { MimeTokenStream stream; @Override protected void setUp() throws Exception { super.setUp(); stream = new MimeTokenStream(); InputStream in = new ByteArrayInputStream(ExampleMail.MIME_MULTIPART_EMBEDDED_MESSAGES_BYTES); stream.parse(in); } @Override protected void tearDown() throws Exception { super.tearDown(); } public void testWhenRecurseShouldVisitInnerMailsAndInnerMultiparts() throws Exception { stream.setRecursionMode(RecursionMode.M_RECURSE); nextIs(EntityState.T_START_HEADER); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_END_HEADER); nextIs(EntityState.T_START_MULTIPART); nextIs(EntityState.T_PREAMBLE); // PART ONE nextIs(EntityState.T_START_BODYPART); nextIs(EntityState.T_START_HEADER); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_END_HEADER); nextIs(EntityState.T_BODY); checkInputStream("Rhubarb!\r\n"); nextIs(EntityState.T_END_BODYPART); // PART TWO nextIs(EntityState.T_START_BODYPART); nextIs(EntityState.T_START_HEADER); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_END_HEADER); nextIs(EntityState.T_BODY); checkInputStream("987654321AHPLA\r\n"); nextIs(EntityState.T_END_BODYPART); // PART THREE nextIs(EntityState.T_START_BODYPART); nextIs(EntityState.T_START_HEADER); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_END_HEADER); nextIs(EntityState.T_START_MESSAGE); nextIs(EntityState.T_START_HEADER); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_END_HEADER); nextIs(EntityState.T_START_MULTIPART); nextIs(EntityState.T_PREAMBLE); nextIs(EntityState.T_START_BODYPART); nextIs(EntityState.T_START_HEADER); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_END_HEADER); nextIs(EntityState.T_BODY); checkInputStream("Custard!\r\n"); nextIs(EntityState.T_END_BODYPART); nextIs(EntityState.T_START_BODYPART); nextIs(EntityState.T_START_HEADER); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_END_HEADER); nextIs(EntityState.T_BODY); checkInputStream("CUSTARDCUSTARDCUSTARD\r\n"); nextIs(EntityState.T_END_BODYPART); nextIs(EntityState.T_END_MULTIPART); nextIs(EntityState.T_END_MESSAGE); nextIs(EntityState.T_END_BODYPART); // PART FOUR nextIs(EntityState.T_START_BODYPART); nextIs(EntityState.T_START_HEADER); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_END_HEADER); nextIs(EntityState.T_START_MULTIPART); checkInputStream(ExampleMail.MIME_MULTIPART_EMBEDDED_MESSAGES_INNER_MULTIPART_MIXED); nextIs(EntityState.T_END_MULTIPART); nextIs(EntityState.T_END_BODYPART); nextIs(EntityState.T_EPILOGUE); nextIs(EntityState.T_END_MULTIPART); nextIs(EntityState.T_END_MESSAGE); nextIs(EntityState.T_END_OF_STREAM); } public void testWhenFlatAtStartShouldIgnoreMultipartStructure() throws Exception { stream.setRecursionMode(RecursionMode.M_FLAT); nextIs(EntityState.T_START_HEADER); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_END_HEADER); nextIs(EntityState.T_BODY); checkInputStream(ExampleMail.MIME_MULTIPART_EMBEDDED_MESSAGES_BODY); nextIs(EntityState.T_END_MESSAGE); } public void testWhenFlatShouldIgnoreInnerMailsAndInnerMultiparts() throws Exception { nextIs(EntityState.T_START_HEADER); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_END_HEADER); nextIs(EntityState.T_START_MULTIPART); stream.setRecursionMode(RecursionMode.M_FLAT); nextIs(EntityState.T_PREAMBLE); // PART ONE nextIs(EntityState.T_START_BODYPART); nextIs(EntityState.T_START_HEADER); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_END_HEADER); nextIs(EntityState.T_BODY); checkInputStream("Rhubarb!\r\n"); nextIs(EntityState.T_END_BODYPART); // PART TWO nextIs(EntityState.T_START_BODYPART); nextIs(EntityState.T_START_HEADER); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_END_HEADER); nextIs(EntityState.T_BODY); checkInputStream("987654321AHPLA\r\n"); nextIs(EntityState.T_END_BODYPART); // PART THREE nextIs(EntityState.T_START_BODYPART); nextIs(EntityState.T_START_HEADER); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_END_HEADER); nextIs(EntityState.T_BODY); checkInputStream(ExampleMail.MIME_MULTIPART_EMBEDDED_MESSAGES_INNER_MAIL); nextIs(EntityState.T_END_BODYPART); // PART FOUR nextIs(EntityState.T_START_BODYPART); nextIs(EntityState.T_START_HEADER); nextIs(EntityState.T_FIELD); nextIs(EntityState.T_END_HEADER); nextIs(EntityState.T_BODY); checkInputStream(ExampleMail.MIME_MULTIPART_EMBEDDED_MESSAGES_INNER_MULTIPART_MIXED); nextIs(EntityState.T_END_BODYPART); nextIs(EntityState.T_EPILOGUE); nextIs(EntityState.T_END_MULTIPART); } private void checkInputStream(String expected) throws Exception { InputStream inputStream = stream.getInputStream(); int next = inputStream.read(); int i=0; while (next != -1) { assertEquals("@" + i, expected.charAt(i++), (char) next); next = inputStream.read(); } assertEquals(expected.length(), i); } private void nextIs(EntityState state) throws Exception { assertEquals(MimeTokenStream.stateToString(state), MimeTokenStream.stateToString(stream.next())); } } ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/stream/MimeTokenStreamTest.javaapache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/stream/MimeTokenStreamTest.ja0000644000000000000000000000711311702050530031707 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.stream; import java.io.ByteArrayInputStream; import junit.framework.TestCase; import org.apache.james.mime4j.ExampleMail; public class MimeTokenStreamTest extends TestCase { MimeTokenStream stream; @Override public void setUp() throws Exception { stream = new MimeTokenStream(); } public void testSetRecursionModeBeforeParse() throws Exception { stream.setRecursionMode(RecursionMode.M_NO_RECURSE); stream.parse(new ByteArrayInputStream(ExampleMail.MAIL_WITH_RFC822_PART_BYTES)); checkNextIs(EntityState.T_START_HEADER); checkNextIs(EntityState.T_FIELD); checkNextIs(EntityState.T_FIELD); checkNextIs(EntityState.T_FIELD); checkNextIs(EntityState.T_FIELD); checkNextIs(EntityState.T_FIELD); checkNextIs(EntityState.T_FIELD); checkNextIs(EntityState.T_END_HEADER); checkNextIs(EntityState.T_START_MULTIPART); checkNextIs(EntityState.T_PREAMBLE); checkNextIs(EntityState.T_START_BODYPART); checkNextIs(EntityState.T_START_HEADER); checkNextIs(EntityState.T_END_HEADER); checkNextIs(EntityState.T_BODY); checkNextIs(EntityState.T_END_BODYPART); checkNextIs(EntityState.T_START_BODYPART); checkNextIs(EntityState.T_START_HEADER); checkNextIs(EntityState.T_FIELD); checkNextIs(EntityState.T_END_HEADER); checkNextIs(EntityState.T_BODY); checkNextIs(EntityState.T_END_BODYPART); checkNextIs(EntityState.T_START_BODYPART); checkNextIs(EntityState.T_START_HEADER); checkNextIs(EntityState.T_FIELD); checkNextIs(EntityState.T_END_HEADER); checkNextIs(EntityState.T_BODY); checkNextIs(EntityState.T_END_BODYPART); checkNextIs(EntityState.T_START_BODYPART); checkNextIs(EntityState.T_START_HEADER); checkNextIs(EntityState.T_FIELD); checkNextIs(EntityState.T_END_HEADER); checkNextIs(EntityState.T_BODY); checkNextIs(EntityState.T_END_BODYPART); checkNextIs(EntityState.T_EPILOGUE); checkNextIs(EntityState.T_END_MULTIPART); checkNextIs(EntityState.T_END_MESSAGE); checkNextIs(EntityState.T_END_OF_STREAM); } private void checkNextIs(EntityState expected) throws Exception { assertEquals(MimeTokenStream.stateToString(expected), MimeTokenStream.stateToString(stream.next())); } } apache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/stream/MimeEntityTest.java0000644000000000000000000007473011702050530031267 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.stream; import java.io.ByteArrayInputStream; import java.io.IOException; import java.util.Locale; import junit.framework.TestCase; import org.apache.commons.io.IOUtils; import org.apache.james.mime4j.MimeException; import org.apache.james.mime4j.io.BufferedLineReaderInputStream; import org.apache.james.mime4j.io.LineNumberInputStream; import org.apache.james.mime4j.io.MaxHeaderLengthLimitException; import org.apache.james.mime4j.io.MaxHeaderLimitException; import org.apache.james.mime4j.io.MaxLineLimitException; public class MimeEntityTest extends TestCase { public void testSimpleEntity() throws Exception { String message = "To: Road Runner \r\n" + "From: Wile E. Cayote \r\n" + "Date: Tue, 12 Feb 2008 17:34:09 +0000 (GMT)\r\n" + "Subject: Mail\r\n" + "Content-Type: text/plain\r\n" + "\r\n" + "a very important message"; byte[] raw = message.getBytes("US-ASCII"); ByteArrayInputStream instream = new ByteArrayInputStream(raw); LineNumberInputStream lineInput = new LineNumberInputStream(instream); BufferedLineReaderInputStream rawstream = new BufferedLineReaderInputStream(lineInput, 12); MimeEntity entity = new MimeEntity( lineInput, rawstream, new FallbackBodyDescriptorBuilder()); assertEquals(EntityState.T_START_MESSAGE, entity.getState()); entity.advance(); assertEquals(EntityState.T_START_HEADER, entity.getState()); entity.advance(); assertEquals(EntityState.T_FIELD, entity.getState()); assertEquals("To", entity.getField().getName()); assertEquals("Road Runner ", entity.getField().getBody()); entity.advance(); assertEquals(EntityState.T_FIELD, entity.getState()); assertEquals("From", entity.getField().getName()); assertEquals("Wile E. Cayote ", entity.getField().getBody()); entity.advance(); assertEquals(EntityState.T_FIELD, entity.getState()); assertEquals("Date", entity.getField().getName()); assertEquals("Tue, 12 Feb 2008 17:34:09 +0000 (GMT)", entity.getField().getBody()); entity.advance(); assertEquals(EntityState.T_FIELD, entity.getState()); assertEquals("Subject", entity.getField().getName()); assertEquals("Mail", entity.getField().getBody()); entity.advance(); assertEquals(EntityState.T_FIELD, entity.getState()); assertEquals("Content-Type", entity.getField().getName()); assertEquals("text/plain", entity.getField().getBody()); entity.advance(); assertEquals(EntityState.T_END_HEADER, entity.getState()); try { entity.getField().getName(); fail("IllegalStateException should have been thrown"); } catch (IllegalStateException expected) { } try { entity.getField().getBody(); fail("IllegalStateException should have been thrown"); } catch (IllegalStateException expected) { } entity.advance(); assertEquals(EntityState.T_BODY, entity.getState()); assertEquals("a very important message", IOUtils.toString(entity.getContentStream())); entity.advance(); assertEquals(EntityState.T_END_MESSAGE, entity.getState()); try { entity.getContentStream(); fail("IllegalStateException should have been thrown"); } catch (IllegalStateException expected) { } entity.advance(); assertEquals(EntityState.T_END_OF_STREAM, entity.getState()); try { entity.advance(); fail("IllegalStateException should have been thrown"); } catch (IllegalStateException expected) { } } public void testObsoleteSyntaxEntity() throws Exception { String message = "To : Road Runner \r\n" + "From : Wile E. Cayote \r\n" + "Date :Tue, 12 Feb 2008 17:34:09 +0000 (GMT)\r\n" + "Subject :Mail\r\n" + " \r\n" + " with a folded subject \r\n" + "Content-Type: text/plain\r\n" + "\r\n" + "a very important message"; byte[] raw = message.getBytes("US-ASCII"); ByteArrayInputStream instream = new ByteArrayInputStream(raw); LineNumberInputStream lineInput = new LineNumberInputStream(instream); BufferedLineReaderInputStream rawstream = new BufferedLineReaderInputStream(lineInput, 12); MimeEntity entity = new MimeEntity( lineInput, rawstream, new FallbackBodyDescriptorBuilder()); assertEquals(EntityState.T_START_MESSAGE, entity.getState()); entity.advance(); assertEquals(EntityState.T_START_HEADER, entity.getState()); entity.advance(); assertEquals(EntityState.T_FIELD, entity.getState()); assertEquals("To", entity.getField().getName()); assertEquals("Road Runner ", entity.getField().getBody()); entity.advance(); assertEquals(EntityState.T_FIELD, entity.getState()); assertEquals("From", entity.getField().getName()); assertEquals("Wile E. Cayote ", entity.getField().getBody()); entity.advance(); assertEquals(EntityState.T_FIELD, entity.getState()); assertEquals("Date", entity.getField().getName()); assertEquals("Tue, 12 Feb 2008 17:34:09 +0000 (GMT)", entity.getField().getBody()); entity.advance(); assertEquals(EntityState.T_FIELD, entity.getState()); assertEquals("Subject", entity.getField().getName()); assertEquals("Mail with a folded subject ", entity.getField().getBody()); entity.advance(); assertEquals(EntityState.T_FIELD, entity.getState()); assertEquals("Content-Type", entity.getField().getName()); assertEquals("text/plain", entity.getField().getBody()); entity.advance(); assertEquals(EntityState.T_END_HEADER, entity.getState()); try { entity.getField().getName(); fail("IllegalStateException should have been thrown"); } catch (IllegalStateException expected) { } try { entity.getField().getBody(); fail("IllegalStateException should have been thrown"); } catch (IllegalStateException expected) { } entity.advance(); assertEquals(EntityState.T_BODY, entity.getState()); assertEquals("a very important message", IOUtils.toString(entity.getContentStream())); entity.advance(); assertEquals(EntityState.T_END_MESSAGE, entity.getState()); try { entity.getContentStream(); fail("IllegalStateException should have been thrown"); } catch (IllegalStateException expected) { } entity.advance(); assertEquals(EntityState.T_END_OF_STREAM, entity.getState()); try { entity.advance(); fail("IllegalStateException should have been thrown"); } catch (IllegalStateException expected) { } } public void testMultipartEntity() throws Exception { String message = "To: Road Runner \r\n" + "From: Wile E. Cayote \r\n" + "Date: Tue, 12 Feb 2008 17:34:09 +0000 (GMT)\r\n" + "Subject: Mail\r\n" + "Content-Type: multipart/mixed;boundary=1729\r\n" + "\r\n" + "Hello!\r\n" + "--1729\r\n" + "Content-Type: text/plain; charset=US-ASCII\r\n" + "\r\n" + "blah blah blah\r\n" + "--1729\r\n" + "Content-Type: text/plain; charset=US-ASCII\r\n" + "\r\n" + "yada yada yada\r\n" + "--1729--\r\n" + "Goodbye!"; byte[] raw = message.getBytes("US-ASCII"); ByteArrayInputStream instream = new ByteArrayInputStream(raw); LineNumberInputStream lineInput = new LineNumberInputStream(instream); BufferedLineReaderInputStream rawstream = new BufferedLineReaderInputStream(lineInput, 24); MimeEntity entity = new MimeEntity( lineInput, rawstream, new FallbackBodyDescriptorBuilder()); assertEquals(EntityState.T_START_MESSAGE, entity.getState()); entity.advance(); assertEquals(EntityState.T_START_HEADER, entity.getState()); entity.advance(); assertEquals(EntityState.T_FIELD, entity.getState()); assertEquals("To", entity.getField().getName()); assertEquals("Road Runner ", entity.getField().getBody()); entity.advance(); assertEquals(EntityState.T_FIELD, entity.getState()); assertEquals("From", entity.getField().getName()); assertEquals("Wile E. Cayote ", entity.getField().getBody()); entity.advance(); assertEquals(EntityState.T_FIELD, entity.getState()); assertEquals("Date", entity.getField().getName()); assertEquals("Tue, 12 Feb 2008 17:34:09 +0000 (GMT)", entity.getField().getBody()); entity.advance(); assertEquals(EntityState.T_FIELD, entity.getState()); assertEquals("Subject", entity.getField().getName()); assertEquals("Mail", entity.getField().getBody()); entity.advance(); assertEquals(EntityState.T_FIELD, entity.getState()); assertEquals("Content-Type", entity.getField().getName()); assertEquals("multipart/mixed;boundary=1729", entity.getField().getBody()); entity.advance(); assertEquals(EntityState.T_END_HEADER, entity.getState()); entity.advance(); assertEquals(EntityState.T_START_MULTIPART, entity.getState()); entity.advance(); assertEquals(EntityState.T_PREAMBLE, entity.getState()); assertEquals("Hello!", IOUtils.toString(entity.getContentStream())); EntityStateMachine p1 = entity.advance(); assertNotNull(p1); assertEquals(EntityState.T_START_BODYPART, p1.getState()); p1.advance(); assertEquals(EntityState.T_START_HEADER, p1.getState()); p1.advance(); assertEquals(EntityState.T_FIELD, p1.getState()); assertEquals("Content-Type", p1.getField().getName()); assertEquals("text/plain; charset=US-ASCII", p1.getField().getBody()); p1.advance(); assertEquals(EntityState.T_END_HEADER, p1.getState()); p1.advance(); assertEquals(EntityState.T_BODY, p1.getState()); assertEquals("blah blah blah", IOUtils.toString(p1.getContentStream())); p1.advance(); assertEquals(EntityState.T_END_BODYPART, p1.getState()); p1.advance(); assertEquals(EntityState.T_END_OF_STREAM, p1.getState()); EntityStateMachine p2 = entity.advance(); assertNotNull(p2); assertEquals(EntityState.T_START_BODYPART, p2.getState()); p2.advance(); assertEquals(EntityState.T_START_HEADER, p2.getState()); p2.advance(); assertEquals(EntityState.T_FIELD, p2.getState()); assertEquals("Content-Type", p2.getField().getName()); assertEquals("text/plain; charset=US-ASCII", p2.getField().getBody()); p2.advance(); assertEquals(EntityState.T_END_HEADER, p2.getState()); p2.advance(); assertEquals(EntityState.T_BODY, p2.getState()); assertEquals("yada yada yada", IOUtils.toString(p2.getContentStream())); p2.advance(); assertEquals(EntityState.T_END_BODYPART, p2.getState()); p2.advance(); assertEquals(EntityState.T_END_OF_STREAM, p2.getState()); entity.advance(); assertEquals(EntityState.T_EPILOGUE, entity.getState()); assertEquals("Goodbye!", IOUtils.toString(entity.getContentStream())); entity.advance(); assertEquals(EntityState.T_END_MULTIPART, entity.getState()); entity.advance(); assertEquals(EntityState.T_END_MESSAGE, entity.getState()); entity.advance(); assertEquals(EntityState.T_END_OF_STREAM, entity.getState()); } public void testRawEntity() throws Exception { String message = "To: Road Runner \r\n" + "From: Wile E. Cayote \r\n" + "Date: Tue, 12 Feb 2008 17:34:09 +0000 (GMT)\r\n" + "Subject: Mail\r\n" + "Content-Type: multipart/mixed;boundary=1729\r\n" + "\r\n" + "Hello!\r\n" + "--1729\r\n" + "Content-Type: text/plain; charset=US-ASCII\r\n" + "\r\n" + "blah blah blah\r\n" + "--1729\r\n" + "Content-Type: text/plain; charset=US-ASCII\r\n" + "\r\n" + "yada yada yada\r\n" + "--1729--\r\n" + "Goodbye!"; byte[] raw = message.getBytes("US-ASCII"); ByteArrayInputStream instream = new ByteArrayInputStream(raw); LineNumberInputStream lineInput = new LineNumberInputStream(instream); BufferedLineReaderInputStream rawstream = new BufferedLineReaderInputStream(lineInput, 24); MimeEntity entity = new MimeEntity( lineInput, rawstream, new FallbackBodyDescriptorBuilder()); entity.setRecursionMode(RecursionMode.M_RAW); assertEquals(EntityState.T_START_MESSAGE, entity.getState()); entity.advance(); assertEquals(EntityState.T_START_HEADER, entity.getState()); entity.advance(); assertEquals(EntityState.T_FIELD, entity.getState()); assertEquals("To", entity.getField().getName()); assertEquals("Road Runner ", entity.getField().getBody()); entity.advance(); assertEquals(EntityState.T_FIELD, entity.getState()); assertEquals("From", entity.getField().getName()); assertEquals("Wile E. Cayote ", entity.getField().getBody()); entity.advance(); assertEquals(EntityState.T_FIELD, entity.getState()); assertEquals("Date", entity.getField().getName()); assertEquals("Tue, 12 Feb 2008 17:34:09 +0000 (GMT)", entity.getField().getBody()); entity.advance(); assertEquals(EntityState.T_FIELD, entity.getState()); assertEquals("Subject", entity.getField().getName()); assertEquals("Mail", entity.getField().getBody()); entity.advance(); assertEquals(EntityState.T_FIELD, entity.getState()); assertEquals("Content-Type", entity.getField().getName()); assertEquals("multipart/mixed;boundary=1729", entity.getField().getBody()); entity.advance(); assertEquals(EntityState.T_END_HEADER, entity.getState()); entity.advance(); assertEquals(EntityState.T_START_MULTIPART, entity.getState()); entity.advance(); assertEquals(EntityState.T_PREAMBLE, entity.getState()); assertEquals("Hello!", IOUtils.toString(entity.getContentStream())); EntityStateMachine p1 = entity.advance(); assertNotNull(p1); assertEquals(EntityState.T_RAW_ENTITY, p1.getState()); assertNull(p1.getBodyDescriptor()); assertNull(p1.getField()); assertEquals( "Content-Type: text/plain; charset=US-ASCII\r\n" + "\r\n" + "blah blah blah", IOUtils.toString(p1.getContentStream())); p1.advance(); assertEquals(EntityState.T_END_OF_STREAM, p1.getState()); EntityStateMachine p2 = entity.advance(); assertNotNull(p2); assertEquals(EntityState.T_RAW_ENTITY, p2.getState()); assertNull(p2.getBodyDescriptor()); assertNull(p2.getField()); assertEquals( "Content-Type: text/plain; charset=US-ASCII\r\n" + "\r\n" + "yada yada yada", IOUtils.toString(p2.getContentStream())); p2.advance(); assertEquals(EntityState.T_END_OF_STREAM, p2.getState()); entity.advance(); assertEquals(EntityState.T_EPILOGUE, entity.getState()); assertEquals("Goodbye!", IOUtils.toString(entity.getContentStream())); entity.advance(); assertEquals(EntityState.T_END_MULTIPART, entity.getState()); entity.advance(); assertEquals(EntityState.T_END_MESSAGE, entity.getState()); entity.advance(); assertEquals(EntityState.T_END_OF_STREAM, entity.getState()); } public void testMaxLineLimitCheck() throws Exception { MimeConfig config = new MimeConfig(); config.setMaxLineLen(50); String message = "To: Road Runner \r\n" + "From: Wile E. Cayote \r\n" + "Date: Tue, 12 Feb 2008 17:34:09 +0000 (GMT)\r\n" + "Subject: Mail\r\n" + "DoS: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\n" + "Content-Type: text/plain\r\n" + "\r\n" + "a very important message"; byte[] raw = message.getBytes("US-ASCII"); ByteArrayInputStream instream = new ByteArrayInputStream(raw); LineNumberInputStream lineInput = new LineNumberInputStream(instream); BufferedLineReaderInputStream rawstream = new BufferedLineReaderInputStream(lineInput, 12, config.getMaxLineLen()); MimeEntity entity = new MimeEntity( lineInput, rawstream, config, new FallbackBodyDescriptorBuilder()); assertEquals(EntityState.T_START_MESSAGE, entity.getState()); entity.advance(); // advances to T_START_HEADER assertEquals(EntityState.T_START_HEADER, entity.getState()); entity.advance(); // reads To: into field buffer, From: into line buffer assertEquals(EntityState.T_FIELD, entity.getState()); entity.advance(); // reads Date: into line buffer assertEquals(EntityState.T_FIELD, entity.getState()); entity.advance(); // reads Subject: into line buffer assertEquals(EntityState.T_FIELD, entity.getState()); try { entity.advance(); // reads DoS: into line buffer fail("MimeException caused by MaxLineLimitException should have been thrown"); } catch (MimeException expected) { assertTrue(expected.getCause() instanceof MaxLineLimitException); } } public void testMaxHeaderLimitCheckFoldedLines() throws Exception { String message = "To: Road Runner \r\n" + "From: Wile E. Cayote \r\n" + "Date: Tue, 12 Feb 2008 17:34:09 +0000 (GMT)\r\n" + "Subject: Mail\r\n" + "DoS: xxxxxxxxxxxxxxxxxxxxx\r\n" + " xxxxxxxxxxxxxxxxxxxxx\r\n" + " xxxxxxxxxxxxxxxxxxxxx\r\n" + " xxxxxxxxxxxxxxxxxxxxx\r\n" + " xxxxxxxxxxxxxxxxxxxxx\r\n" + " xxxxxxxxxxxxxxxxxxxxx\r\n" + " xxxxxxxxxxxxxxxxxxxxx\r\n" + " xxxxxxxxxxxxxxxxxxxxx\r\n" + " xxxxxxxxxxxxxxxxxxxxx\r\n" + " xxxxxxxxxxxxxxxxxxxxx\r\n" + " xxxxxxxxxxxxxxxxxxxxx\r\n" + " xxxxxxxxxxxxxxxxxxxxx\r\n" + "Content-Type: text/plain\r\n" + "\r\n" + "a very important message"; byte[] raw = message.getBytes("US-ASCII"); ByteArrayInputStream instream = new ByteArrayInputStream(raw); LineNumberInputStream lineInput = new LineNumberInputStream(instream); BufferedLineReaderInputStream rawstream = new BufferedLineReaderInputStream(lineInput, 12); MimeConfig config = new MimeConfig(); config.setMaxLineLen(100); config.setMaxHeaderLen(200); MimeEntity entity = new MimeEntity( lineInput, rawstream, config, new FallbackBodyDescriptorBuilder()); assertEquals(EntityState.T_START_MESSAGE, entity.getState()); entity.advance(); assertEquals(EntityState.T_START_HEADER, entity.getState()); entity.advance(); assertEquals(EntityState.T_FIELD, entity.getState()); entity.advance(); assertEquals(EntityState.T_FIELD, entity.getState()); entity.advance(); assertEquals(EntityState.T_FIELD, entity.getState()); entity.advance(); assertEquals(EntityState.T_FIELD, entity.getState()); try { entity.advance(); fail("MimeException caused by MaxLineLimitException should have been thrown"); } catch (MaxHeaderLengthLimitException expected) { } } public void testMaxHeaderLengthMayExceedMaxLineLength() throws Exception { MimeConfig config = new MimeConfig(); config.setMaxLineLen(50); config.setMaxHeaderLen(130); String message = "To: Road Runner \r\n" + "From: Wile E. Cayote \r\n" + "Date: Tue, 12 Feb 2008 17:34:09 +0000 (GMT)\r\n" + "Subject: Mail\r\n" + "X-LongHeader: xxxxxxxxxxxxxxxxxxxxxxx\r\n" + " xxxxxxxxxxxxxxxxxxxxxxx\r\n" + " xxxxxxxxxxxxxxxxxxxxxxx\r\n" + " xxxxxxxxxxxxxxxxxxxxxxx\r\n" + "Content-Type: text/plain\r\n" + "\r\n" + "a very important message"; byte[] raw = message.getBytes("US-ASCII"); ByteArrayInputStream instream = new ByteArrayInputStream(raw); LineNumberInputStream lineInput = new LineNumberInputStream(instream); BufferedLineReaderInputStream rawstream = new BufferedLineReaderInputStream(lineInput, 12, config.getMaxLineLen()); MimeEntity entity = new MimeEntity( lineInput, rawstream, config, new FallbackBodyDescriptorBuilder()); assertEquals(EntityState.T_START_MESSAGE, entity.getState()); entity.advance(); assertEquals(EntityState.T_START_HEADER, entity.getState()); for (int i = 0; i < 6; i++) { entity.advance(); assertEquals(EntityState.T_FIELD, entity.getState()); } entity.advance(); assertEquals(EntityState.T_END_HEADER, entity.getState()); } public void testMaxHeaderCount() throws Exception { String message = "To: Road Runner \r\n" + "From: Wile E. Cayote \r\n" + "Date: Tue, 12 Feb 2008 17:34:09 +0000 (GMT)\r\n" + "Subject: Mail\r\n" + "DoS: xxxxxxxxxxxxxxxxxxxxx\r\n" + "DoS: xxxxxxxxxxxxxxxxxxxxx\r\n" + "DoS: xxxxxxxxxxxxxxxxxxxxx\r\n" + "DoS: xxxxxxxxxxxxxxxxxxxxx\r\n" + "DoS: xxxxxxxxxxxxxxxxxxxxx\r\n" + "DoS: xxxxxxxxxxxxxxxxxxxxx\r\n" + "DoS: xxxxxxxxxxxxxxxxxxxxx\r\n" + "DoS: xxxxxxxxxxxxxxxxxxxxx\r\n" + "DoS: xxxxxxxxxxxxxxxxxxxxx\r\n" + "DoS: xxxxxxxxxxxxxxxxxxxxx\r\n" + "DoS: xxxxxxxxxxxxxxxxxxxxx\r\n" + "DoS: xxxxxxxxxxxxxxxxxxxxx\r\n" + "DoS: xxxxxxxxxxxxxxxxxxxxx\r\n" + "DoS: xxxxxxxxxxxxxxxxxxxxx\r\n" + "DoS: xxxxxxxxxxxxxxxxxxxxx\r\n" + "DoS: xxxxxxxxxxxxxxxxxxxxx\r\n" + "Content-Type: text/plain\r\n" + "\r\n" + "a very important message"; byte[] raw = message.getBytes("US-ASCII"); ByteArrayInputStream instream = new ByteArrayInputStream(raw); LineNumberInputStream lineInput = new LineNumberInputStream(instream); BufferedLineReaderInputStream rawstream = new BufferedLineReaderInputStream(lineInput, 12); MimeConfig config = new MimeConfig(); config.setMaxHeaderCount(20); MimeEntity entity = new MimeEntity( lineInput, rawstream, config, new FallbackBodyDescriptorBuilder()); assertEquals(EntityState.T_START_MESSAGE, entity.getState()); entity.advance(); assertEquals(EntityState.T_START_HEADER, entity.getState()); for (int i = 0; i < 20; i++) { entity.advance(); assertEquals(EntityState.T_FIELD, entity.getState()); } try { entity.advance(); fail("MaxHeaderLimitException should have been thrown"); } catch (MaxHeaderLimitException expected) { } } public void testMaxContentLimitCheck() throws Exception { String message = "To: Road Runner \r\n" + "From: Wile E. Cayote \r\n" + "Date: Tue, 12 Feb 2008 17:34:09 +0000 (GMT)\r\n" + "Subject: Mail\r\n" + "Content-Type: text/plain\r\n" + "\r\n" + "DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS\r\n" + "DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS\r\n" + "DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS\r\n" + "DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS\r\n" + "DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS\r\n" + "DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS\r\n" + "DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS\r\n" + "DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS\r\n" + "DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS\r\n" + "DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS\r\n"; byte[] raw = message.getBytes("US-ASCII"); ByteArrayInputStream instream = new ByteArrayInputStream(raw); LineNumberInputStream lineInput = new LineNumberInputStream(instream); BufferedLineReaderInputStream rawstream = new BufferedLineReaderInputStream(lineInput, 12); MimeConfig config = new MimeConfig(); config.setMaxContentLen(100); MimeEntity entity = new MimeEntity( lineInput, rawstream, config, new FallbackBodyDescriptorBuilder()); assertEquals(EntityState.T_START_MESSAGE, entity.getState()); entity.advance(); assertEquals(EntityState.T_START_HEADER, entity.getState()); entity.advance(); assertEquals(EntityState.T_FIELD, entity.getState()); entity.advance(); assertEquals(EntityState.T_FIELD, entity.getState()); entity.advance(); assertEquals(EntityState.T_FIELD, entity.getState()); entity.advance(); assertEquals(EntityState.T_FIELD, entity.getState()); entity.advance(); assertEquals(EntityState.T_FIELD, entity.getState()); entity.advance(); assertEquals(EntityState.T_END_HEADER, entity.getState()); entity.advance(); assertEquals(EntityState.T_BODY, entity.getState()); try { IOUtils.toByteArray(entity.getContentStream()); fail("IOException should have been thrown"); } catch (IOException expected) { } } public void testSkipFields() throws Exception { String message = "To: Road Runner \r\n" + "From: Wile E. Cayote \r\n" + "Date: Tue, 12 Feb 2008 17:34:09 +0000 (GMT)\r\n" + "Subject: Mail\r\n" + "Content-Type: text/plain\r\n" + "\r\n" + "a very important message"; byte[] raw = message.getBytes("US-ASCII"); ByteArrayInputStream instream = new ByteArrayInputStream(raw); LineNumberInputStream lineInput = new LineNumberInputStream(instream); BufferedLineReaderInputStream rawstream = new BufferedLineReaderInputStream(lineInput, 12); DefaultFieldBuilder fieldBuilder = new DefaultFieldBuilder(-1) { @Override public RawField build() throws MimeException { RawField raw = super.build(); String name = raw.getName().toLowerCase(Locale.US); if (name.equals("content-type") || name.equals("subject")) { return raw; } else { return null; } } }; MimeEntity entity = new MimeEntity( lineInput, rawstream, fieldBuilder, new FallbackBodyDescriptorBuilder()); assertEquals(EntityState.T_START_MESSAGE, entity.getState()); entity.advance(); assertEquals(EntityState.T_START_HEADER, entity.getState()); entity.advance(); assertEquals(EntityState.T_FIELD, entity.getState()); assertEquals("Subject", entity.getField().getName()); assertEquals("Mail", entity.getField().getBody()); entity.advance(); assertEquals(EntityState.T_FIELD, entity.getState()); assertEquals("Content-Type", entity.getField().getName()); assertEquals("text/plain", entity.getField().getBody()); entity.advance(); assertEquals(EntityState.T_END_HEADER, entity.getState()); entity.advance(); assertEquals(EntityState.T_BODY, entity.getState()); assertEquals("a very important message", IOUtils.toString(entity.getContentStream())); entity.advance(); assertEquals(EntityState.T_END_MESSAGE, entity.getState()); } } apache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/stream/RawFieldTest.java0000644000000000000000000000557411702050530030700 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.stream; import org.apache.james.mime4j.util.ByteSequence; import org.apache.james.mime4j.util.ContentUtil; import junit.framework.Assert; import junit.framework.TestCase; public class RawFieldTest extends TestCase { public void testPrivateConstructor() throws Exception { String s = "raw: stuff;\r\n more stuff"; ByteSequence raw = ContentUtil.encode(s); RawField field = new RawField(raw, 3, "raw", null); Assert.assertSame(raw, field.getRaw()); Assert.assertEquals("raw", field.getName()); Assert.assertEquals("stuff; more stuff", field.getBody()); Assert.assertEquals(s, field.toString()); } public void testPublicConstructor() throws Exception { RawField field1 = new RawField("raw", "stuff"); Assert.assertNull(field1.getRaw()); Assert.assertEquals("raw", field1.getName()); Assert.assertEquals("stuff", field1.getBody()); Assert.assertEquals("raw: stuff", field1.toString()); RawField field2 = new RawField("raw", null); Assert.assertNull(field2.getRaw()); Assert.assertEquals("raw", field2.getName()); Assert.assertEquals(null, field2.getBody()); Assert.assertEquals("raw: ", field2.toString()); } public void testTabAfterDelimiter() throws Exception { String s = "raw:\tstuff;\r\n more stuff"; ByteSequence raw = ContentUtil.encode(s); RawField field = new RawField(raw, 3, "raw", null); Assert.assertSame(raw, field.getRaw()); Assert.assertEquals("raw", field.getName()); Assert.assertEquals("stuff; more stuff", field.getBody()); Assert.assertEquals(s, field.toString()); } } apache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/TestUtil.java0000644000000000000000000000507511702050532026623 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import org.apache.commons.io.IOUtils; public class TestUtil { public static final String[] TEST_MESSAGES = new String[] { "2002_06_12_doublebound", "ak-0696", "bluedot-postcard", "bluedot-simple", "double-bound-with-embedded", "double-bound", "dup-names", "frag", "german", "hdr-fakeout", "multi-2evil", "multi-2gifs", "multi-clen", "multi-digest", "multi-frag", "multi-igor", "multi-igor2", "multi-nested", "multi-nested2", "multi-nested3", "multi-simple", "multi-weirdspace", "re-fwd", "russian", "simple", "uu-junk-target", "uu-junk", "uu-zeegee" }; public static String readResource(String resource, String charset) throws IOException { return IOUtils.toString(readResourceAsStream(resource), charset); } public static InputStream readResourceAsStream(String resource) throws IOException { return new BufferedInputStream( TestUtil.class.getResource(resource).openStream()); } } apache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/EncodeUtils.java0000644000000000000000000001217711702050532027265 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j; public class EncodeUtils { public static final int MASK = 0x3F; public static final int FIRST_MASK = MASK << 18; public static final int SECOND_MASK = MASK << 12; public static final int THIRD_MASK = MASK << 6; public static final int FORTH_MASK = MASK; public static final byte[] ENCODING = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P' ,'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'}; public static final void main(String[] args) throws Exception { byte[] bytes = {(byte) 0, (byte) 128, (byte) 0}; System.out.println(new String(toBase64(bytes))); System.out.println(new String(toBase64("Hello, World".getBytes()))); System.out.println(new String(toBase64("Monday".getBytes()))); System.out.println(new String(toBase64("M\u00F6nchengladbach\r\n".getBytes("ISO-8859-1")))); } public static byte[] toBase64(byte[] in) { int inputLength = in.length; int outputLength = (int) Math.floor((4*inputLength) / 3f) + 3; outputLength = outputLength + 2 * (int) Math.floor(outputLength / 76f); byte[] results = new byte[outputLength]; int inputIndex = 0; int outputIndex = 0; while (inputLength - inputIndex > 2) { int one = (toInt(in[inputIndex++]) << 16); int two = (toInt(in[inputIndex++]) << 8); int three = toInt(in[inputIndex++]); int quantum = one | two | three; int index = (quantum & FIRST_MASK) >> 18; outputIndex = setResult(results, outputIndex, ENCODING[index]); index = (quantum & SECOND_MASK) >> 12; outputIndex = setResult(results, outputIndex, ENCODING[index]); index = (quantum & THIRD_MASK) >> 6; outputIndex = setResult(results, outputIndex, ENCODING[index]); index = (quantum & FORTH_MASK); outputIndex = setResult(results, outputIndex, ENCODING[index]); } switch (inputLength - inputIndex) { case 1: int quantum = in[inputIndex++] << 16; int index = (quantum & FIRST_MASK) >> 18; outputIndex = setResult(results, outputIndex, ENCODING[index]); index = (quantum & SECOND_MASK) >> 12; outputIndex = setResult(results, outputIndex, ENCODING[index]); outputIndex = setResult(results, outputIndex, (byte) '='); outputIndex = setResult(results, outputIndex, (byte) '='); break; case 2: quantum = (in[inputIndex++] << 16) + (in[inputIndex++] << 8); index = (quantum & FIRST_MASK) >> 18; outputIndex = setResult(results, outputIndex, ENCODING[index]); index = (quantum & SECOND_MASK) >> 12; outputIndex = setResult(results, outputIndex, ENCODING[index]); index = (quantum & THIRD_MASK) >> 6; outputIndex = setResult(results, outputIndex, ENCODING[index]); outputIndex = setResult(results, outputIndex, (byte) '='); break; } return results; } private static int toInt(byte b) { return 255 & b; } private static int setResult(byte[] results, int outputIndex, byte value) { results[outputIndex++] = value; outputIndex = checkLineLength(results, outputIndex); return outputIndex; } private static int checkLineLength(byte[] results, int outputIndex) { if (outputIndex == 76 || outputIndex > 76 && (outputIndex - 2*Math.floor(outputIndex/76f - 1)) % 76 == 0) { results[outputIndex++] = '\r'; results[outputIndex++] = '\n'; } return outputIndex; } } apache-mime4j-project-0.7.2/core/src/test/java/org/apache/james/mime4j/MimeExceptionTest.java0000644000000000000000000000375311702050532030455 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j; import junit.framework.TestCase; public class MimeExceptionTest extends TestCase { public void testMimeExceptionString() { MimeException e = new MimeException("message"); assertEquals("message", e.getMessage()); assertNull(e.getCause()); } public void testMimeExceptionThrowable() { NullPointerException npe = new NullPointerException("npe"); MimeException e = new MimeException(npe); assertSame(npe, e.getCause()); assertNotNull(e.getMessage()); } public void testMimeExceptionStringThrowable() { NullPointerException npe = new NullPointerException("npe"); MimeException e = new MimeException("message",npe); assertEquals("message", e.getMessage()); assertSame(npe, e.getCause()); } } apache-mime4j-project-0.7.2/core/src/test/resources/0000755000000000000000000000000011702050534020773 5ustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/0000755000000000000000000000000011702050536022646 5ustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/malformedHeaderStartsBody-noheader.out0000644000000000000000000000006011702050536032254 0ustar rootroot This is a simple message not having headers. apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/intermediate-boundaries_decoded_1_2.txt0000644000000000000000000000115411702050536032323 0ustar rootrootfrom the rfc: ================================ encapsulation := delimiter transport-padding CRLF body-part ================================ and also ================================ "Composers MUST NOT generate non-zero length transport padding, but receivers MUST be able to handle padding added by message transports." ================================ second part have a start boundary ending with spaces and also have a boundary not at the beginning --boundary ... that should be ignored also a boundary with more data (a tab) shoud be ignored --boundary end of part apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/example_decoded_1_4.txt0000644000000000000000000000600111702050536027151 0ustar rootrootRhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/malformedHeaderStartsBody-noheader.msg0000644000000000000000000000013411702050536032235 0ustar rootrootThis is a simple message not having headers. The whole text should be recognized as body. apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/misplaced-boundary.xml0000644000000000000000000000057711702050536027163 0ustar rootroot
Content-Type: multipart/mixed; boundary="boundary"
Content-Type: text/plain
This should be a text including the --boundary string and should not be parsed as multiple bodies
epilouge
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/multipartnestedemptypartsnorfc822.out0000644000000000000000000000110511702050536032235 0ustar rootrootReturn-Path: something@example.com Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Me MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE" This is a multi-part message in MIME format. --------------299A70B339B65A93542D2AE Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AF" This is a nested multi-part message in MIME format. --------------299A70B339B65A93542D2AF --------------299A70B339B65A93542D2AF-- Nested epilogue --------------299A70B339B65A93542D2AE-- Epilogue apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/missing-boundary.msg0000644000000000000000000000011111702050536026641 0ustar rootrootContent-Type: multipart/alternative; boundary="inner-boundary" AAA apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/qp-body.out0000644000000000000000000000025311702050536024752 0ustar rootrootMime-Version: 1.0 Subject: subject Content-Type: text/plain; charset="iso-8859-15" Content-Transfer-Encoding: quoted-printable 7bit content with euro =A4 symbol=20 apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/weird-boundary.xml0000644000000000000000000000117111702050536026323 0ustar rootroot
Content-Type: multipart/mixed; boundary="0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? "
multipart
Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit
Text body --0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? The above line is similar to the boundary but miss a final space, so it should be part of the body.
epilogue
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/multipartemptypart_decoded_1_2.txt0000644000000000000000000000000011702050536031474 0ustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/basic-plain-very-long-lines.out0000644000000000000000000001631311702050536030615 0ustar rootrootReturn-Path: foo@example.com Subject: Simple Subject From: foo@example.com To: bar@example.com Cc: recipient1@example.com,recipient2@example.com, localrecipient Date: Wed, 11 Feb 98 11:51 CST This is a very simple message with a simple body and no weird things at all. this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line Done.apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/multipartemptypart.xml0000644000000000000000000000102711702050536027357 0ustar rootroot
Return-Path: something@example.com Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Me <me@example.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE"
This is a multi-part message in MIME format.
Epilogue
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/russian-headers.xml0000644000000000000000000000046611702050536026473 0ustar rootroot
Content-Type: text/plain; charset="US-ASCII"; name==?koi8-r?B?89DJ08/LLmRvYw==?= Content-Disposition: attachment; filename==?koi8-r?B?89DJ08/LLmRvYw==?= Subject: A simple subject
A simple body.
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/malformedHeader-nocrlfcrlf_decoded.xml0000644000000000000000000000035111702050536032245 0ustar rootroot
Subject: this is a subject AnotherHeader: is this an header or the first part of the body?
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/basic-plain.out0000644000000000000000000000043011702050536025556 0ustar rootrootReturn-Path: foo@example.com Subject: Simple Subject From: foo@example.com To: bar@example.com Cc: recipient1@example.com,recipient2@example.com, localrecipient Date: Wed, 11 Feb 98 11:51 CST This is a very simple message with a simple body and no weird things at all. ././@LongLink0000000000000000000000000000016100000000000011563 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/multipartdigestnestedemptyparts_decoded_1_1_1_1.txtapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/multipartdigestnestedemptyparts_decoded0000644000000000000000000000000011702050536033003 0ustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/simple-attachment_decoded.xml0000644000000000000000000000202511702050536030455 0ustar rootroot
Date: Fri, 27 Apr 2007 16:08:23 +0200 From: Foo Bar <bar@example.com> MIME-Version: 1.0 To: foo@example.com Subject: Here is the attachment I was waiting for. Content-Type: multipart/mixed; boundary="------------090404080405080108000909"
This is a multi-part message in MIME format.
Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: 7bit
Content-Type: application/octet-stream; name="data.bin" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="data.bin"
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/simple-attachment_decoded_1_2.bin0000644000000000000000000000200011702050536031057 0ustar rootroot”¼æÉÁ h0þ”­Ì¿ 29+ ¨T¬àÒ‚®Æåps:tˆjYûÕ/ôŒE§?+ÎõÄ>û-`D½-pÝ?]¬¿ âlzAöŸyܨ%oxq’ŽË”ùqx5õäR‡ÑPDðh+áð ÿœšL²„¬š‰_yÉÄsEÞhÍPƆe¿yƒ ç`“­÷Ûò?%pü<·¯›N׈;ˆHZ1Æ^Ò‚LÜLøqmÄ8u±²ú9¿¢TçƒkÅXªÀüÅÙ9DEÌê´\. ¤¦`":‘/ÿD³¨*¤”Ûáì˜/¡Av ÍxºƒCš3‚ísi½û+¨H „>ýö[ïV·ó#2 §)Ù>eÛ0dÚÐZ¿×¯(¨¨tKï­®˜'t{Öej#5«©åæÓô‹Ó;†ðÏK µ…Ë[â›èÔxci ù(è1¨æ€B+899sÚ@¡u_¯Úû ?÷1‰dŸSÊŸoÂÄììißqé(ůˆz…¸ÑÎDbý”Y*º¦âËÇÍÊ­H™c³ j"YŸ:)YõD—ÁÌŽ±õ‡´Ú­$$×t|σ€þZ$µ¼…j¾iOÚ /Óóâ|øŽ€Ñ´.vÈWÿY‡äã )î½<Ù¼ªÀ ÅAôFµÛ t(¶²+Ûí¯|b-GTd2‡<ûV éR®ù&دSæKÏ E…ìî”ݧµ®¶¡‚™Z4xrŸ'ܦAþûÐ x<µô0ô­´$•µñô€ÃølñüläU£„ÚX¥KЖ¬ç7ß þ™Ú] 7ïsn}ò×ì“ÞÄ•[ [ûÈèëb¹²EÅ|âZO+ùY¦‹p¾¸Öó®¾H]÷Šó¯S#ícD²Äë$äåGZØ3Ùx1¶\‡jîë’fŠúø÷x“^{s£„•[ãù]ß– :ÔÃ7)3Ðw&Z5#Õ°¾îŒN*ЦàçË1#⪃¼ÀÑ2|±§@9‡¹ÍN꿌j} â´Js´øzÌ.,F“< í*›&•4¾¬n#= Ž”ó>úªÈéS $N/üÆîbîoò*e:J÷¥ÊOu]vÝØ[J©Kâå<-”xjFá@IR "§1nÊñk ’™:Ç›ô5Na˜E›”ïg…“.ÙÏòN*ï’r"$ÑŒY Â{ÞâG¿J¢Ðº›%ÓМÐÈ¡ì 7%$T¥@ѼÞüT™ h¾°Ït—*î} àzuuZmy eÊ:-™K¢P„aÕ„\././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/multipartnestedemptyparts_decoded_1_1_1_1.txtapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/multipartnestedemptyparts_decoded_1_1_10000644000000000000000000000000011702050536032463 0ustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/example.out0000644000000000000000000002061411702050536025035 0ustar rootrootReturn-Path: Received: (qmail 18554 invoked from network); 25 May 2008 14:38:53 -0000 Received: from unknown (HELO p3presmtp01-16.prod.phx3.secureserver.net) ([208.109.80.165]) (envelope-sender ) by smtp20-01.prod.mesa1.secureserver.net (qmail-1.03) with SMTP for ; 25 May 2008 14:38:53 -0000 Received: (qmail 9751 invoked from network); 25 May 2008 14:38:53 -0000 Received: from minotaur.apache.org ([140.211.11.9]) (envelope-sender ) by p3presmtp01-16.prod.phx3.secureserver.net (qmail-ldap-1.03) with SMTP for ; 25 May 2008 14:38:50 -0000 Received: (qmail 46768 invoked by uid 1289); 25 May 2008 14:38:46 -0000 Delivered-To: rdonkin@locus.apache.org Received: (qmail 46763 invoked from network); 25 May 2008 14:38:46 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 25 May 2008 14:38:46 -0000 Received: (qmail 61275 invoked by uid 500); 25 May 2008 14:38:48 -0000 Delivered-To: apmail-rdonkin@apache.org Delivered-To: rob@localhost Delivered-To: rob@localhost Received: (qmail 61272 invoked by uid 99); 25 May 2008 14:38:48 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 25 May 2008 07:38:48 -0700 X-ASF-Spam-Status: No, hits=-0.0 required=10.0 tests=SPF_PASS X-Spam-Check-By: apache.org Received-SPF: pass (athena.apache.org: domain of robertburrelldonkin@blueyonder.co.uk designates 195.188.213.5 as permitted sender) Received: from [195.188.213.5] (HELO smtp-out2.blueyonder.co.uk) (195.188.213.5) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 25 May 2008 14:38:00 +0000 Received: from [172.23.170.140] (helo=anti-virus02-07) by smtp-out2.blueyonder.co.uk with smtp (Exim 4.52) id 1K0HMV-00087e-HY for rdonkin@apache.org; Sun, 25 May 2008 15:38:15 +0100 Received: from [82.38.65.6] (helo=[10.0.0.27]) by asmtp-out5.blueyonder.co.uk with esmtpa (Exim 4.52) id 1K0HMU-0001A2-3q for rdonkin@apache.org; Sun, 25 May 2008 15:38:14 +0100 Subject: This is an example of a multipart mixed email with image content From: Robert Burrell Donkin To: Robert Burrell Donkin Content-Type: multipart/mixed; boundary="=-tIdGYVstQJghyEDATnJ+" Date: Sun, 25 May 2008 15:38:13 +0100 Message-Id: <1211726293.5772.10.camel@localhost> Mime-Version: 1.0 X-Mailer: Evolution 2.12.3 X-Virus-Checked: Checked by ClamAV on apache.org X-Nonspam: None X-fetched-from: mail.xmlmapt.org X-Evolution-Source: imap://rob@thebes/ --=-tIdGYVstQJghyEDATnJ+ Content-Type: text/plain Content-Transfer-Encoding: 7bit Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --=-tIdGYVstQJghyEDATnJ+ Content-Disposition: attachment; filename=blob.png; modification-date="Sun, 21 Jun 2008 15:32:18 +0000"; creation-date="Sat, 20 Jun 2008 10:15:09 +0000"; read-date="Mon, 22 Jun 2008 12:08:56 +0000";size=10234; Content-Type: image/png; name=blob.png Content-Transfer-Encoding: base64 iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAIAAAACUFjqAAAAAXNSR0IArs4c6QAAAAlwSFlzAAAL EwAACxMBAJqcGAAAAAd0SU1FB9gFGQ4iJ99ufcYAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRo IEdJTVBXgQ4XAAAA0ElEQVQY02XMwUrDQBhF4XsnkyYhjWJaCloEN77/a/gERVwJLQiiNjYmbTqZ /7qIG/VsPziMTw+23Wj/ovZdMQJgViCvWNVusfa23djuUf2nugbnI2RynkWF5a2Fwdvrs7q9vhqE E2QAEIO6BhZBerUf6luMw49NyTR0OLw5kJD9sqk4Ipwc6GAREv5n5piXTDOQfy1JMSs8ZgXKq2kF iwDgEriEecnLlefFEmGAIvqD4ggJJNMM85qLtXfX9xYGuEQ+4/kIi0g88zlXd66++QaQDG5GPZyp rQAAAABJRU5ErkJggg== --=-tIdGYVstQJghyEDATnJ+ Content-Disposition: attachment; filename=blob.png Content-Type: image/png; name=blob.png Content-Transfer-Encoding: base64 iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAIAAAACUFjqAAAAAXNSR0IArs4c6QAAAAlwSFlzAAAL EwAACxMBAJqcGAAAAAd0SU1FB9gFGQ4iJ99ufcYAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRo IEdJTVBXgQ4XAAAA0ElEQVQY02XMwUrDQBhF4XsnkyYhjWJaCloEN77/a/gERVwJLQiiNjYmbTqZ /7qIG/VsPziMTw+23Wj/ovZdMQJgViCvWNVusfa23djuUf2nugbnI2RynkWF5a2Fwdvrs7q9vhqE E2QAEIO6BhZBerUf6luMw49NyTR0OLw5kJD9sqk4Ipwc6GAREv5n5piXTDOQfy1JMSs8ZgXKq2kF iwDgEriEecnLlefFEmGAIvqD4ggJJNMM85qLtXfX9xYGuEQ+4/kIi0g88zlXd66++QaQDG5GPZyp rQAAAABJRU5ErkJggg== --=-tIdGYVstQJghyEDATnJ+ Content-Disposition: attachment; filename=rhubarb.txt Content-Type: text/plain; name=rhubarb.txt; charset=us-ascii Content-Language: en, en-US, en-CA Content-Transfer-Encoding: quoted-printable Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhu= barb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubar= b Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb R= hubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhub= arb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb= Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rh= ubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhuba= rb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb = Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhu= barb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubar= b Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb R= hubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhub= arb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb= Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rh= ubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhuba= rb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb = Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhu= barb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubar= b Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb R= hubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhub= arb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb= Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rh= ubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhuba= rb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb = Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhu= barb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubar= b Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb R= hubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhub= arb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb= Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rh= ubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhuba= rb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb = Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhu= barb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubar= b Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb R= hubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhub= arb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb= Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rh= ubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhuba= rb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb = Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb --=-tIdGYVstQJghyEDATnJ+-- ././@LongLink0000000000000000000000000000016100000000000011563 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/basic-plain-with-bad-header-separator_decoded_1.txtapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/basic-plain-with-bad-header-separator_d0000644000000000000000000000004111702050536032172 0ustar rootrootThis results in a bogus header. apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/base64encoded-rfc822message.xml0000644000000000000000000000067011702050536030352 0ustar rootroot
MIME-Version: 1.0 Subject: a simple rfc822 message encoded in a base64 body. Content-Type: message/rfc822 Content-Transfer-Encoding: base64
Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit
Text body
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/intermediate-boundaries_decoded.xml0000644000000000000000000000100011702050536031631 0ustar rootroot
Content-Type: multipart/mixed; boundary="boundary"
preamble
Content-Type: text/plain
Content-Type: text/plain
epilouge
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/qp-body_decoded_1.txt0000644000000000000000000000004211702050536026645 0ustar rootroot7bit content with euro ¤ symbol apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/very-long-boundary.xml0000644000000000000000000000354511702050536027142 0ustar rootroot
Content-Type: multipart/mixed; boundary="0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? "
multipart
Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit
Text body --0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? The above line is similar to the boundary but miss a final space, so it should be part of the body.
epilogue
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/bad-newlines-multiple-parts-base64.xml0000644000000000000000000000132111702050536031777 0ustar rootroot
Content-type: message/rfc822 Content-transfer-encoding: base64 Subject: a multipart message/rfc822 which has been base64-encoded
Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE"
This is a multi-part message in MIME format.
Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit
Text body
That was a multi-part message in MIME format.
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/example_decoded_1_3.bin0000644000000000000000000000054311702050536027106 0ustar rootroot‰PNG  IHDR PXêsRGB®Îé pHYs  šœtIMEØ"'ßn}ÆtEXtCommentCreated with GIMPWÐIDATÓeÌÁJÃ@Eá{'“&!bZ Z7¾ÿkøE\ -¢66&m:™ÿºˆõl?8ŒO¶Ýhÿ¢ö]1`V ¯XÕn±ö¶ÝØîQý§ºç#držE…å­…ÁÛ볺½¾„dƒºAzµê[ŒÃMÉ4t8¼9ý²©8"œè`þg昗L3-I1+ãù‹H<ó9Ww®¾ù nF=œ©­IEND®B`‚apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/very-long-boundary.msg0000644000000000000000000000600211702050536027117 0ustar rootrootContent-Type: multipart/mixed; boundary="0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? " multipart --0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Text body --0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? The above line is similar to the boundary but miss a final space, so it should be part of the body. --0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? -- epilogue././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/multipartdigestnestedemptyparts_decoded.xmlapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/multipartdigestnestedemptyparts_decoded0000644000000000000000000000214211702050536033014 0ustar rootroot
Return-Path: something@example.com Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Me <me@example.com> MIME-Version: 1.0 Content-Type: multipart/digest; boundary="------------299A70B339B65A93542D2AE"
This is a multi-part message in MIME format.
Return-Path: something@example.com Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Me <me@example.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AF"
This is a nested multi-part message in MIME format.
Nested epilogue
Epilogue
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/obsolete.msg0000644000000000000000000000032011702050536025165 0ustar rootrootSubject :The obsolete syntax allow spaces before the colon and also empty lines in folding. Date : Malformed Date. Invalìd-Header: this is not valid. HeaderWithWSP : value. body apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/ending-boundaries.xml0000644000000000000000000000144711702050536026773 0ustar rootroot
Content-Type: multipart/mixed; boundary="boundary"
Content-Type: text/plain
first part
From the RFC about ending boundary: =================================================================== NOTE TO IMPLEMENTORS: Boundary string comparisons must compare the boundary value with the beginning of each candidate line. An exact match of the entire candidate line is not required; it is sufficient that the boundary appear in its entirety following the CRLF. =================================================================== --boundary-- The above boundary should be part of the epilogue, too.
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/multipartdigestnestedemptyparts.msg0000644000000000000000000000127711702050536032142 0ustar rootrootReturn-Path: something@example.com Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Me MIME-Version: 1.0 Content-Type: multipart/digest; boundary="------------299A70B339B65A93542D2AE" This is a multi-part message in MIME format. --------------299A70B339B65A93542D2AE Return-Path: something@example.com Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Me MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AF" This is a nested multi-part message in MIME format. --------------299A70B339B65A93542D2AF --------------299A70B339B65A93542D2AF-- Nested epilogue --------------299A70B339B65A93542D2AE-- Epilogue apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/bad-newlines-multiple-parts.xml0000644000000000000000000000075611702050536030730 0ustar rootroot
Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE"
This is a multi-part message in MIME format.
Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit
Text body
That was a multi-part message in MIME format.
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/malformedHeader-noheader_decoded.xml0000644000000000000000000000015011702050536031675 0ustar rootroot
././@LongLink0000000000000000000000000000015600000000000011567 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/malformedHeaderStartsBody-noheader_decoded_1.txtapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/malformedHeaderStartsBody-noheader_deco0000644000000000000000000000005611702050536032445 0ustar rootrootThis is a simple message not having headers. ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/missing-inner-start-boundary_decoded.xmlapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/missing-inner-start-boundary_decoded.xm0000644000000000000000000000107311702050536032422 0ustar rootroot
Content-Type: multipart/mixed; boundary="outer-boundary"
Outer preamble
Content-Type: text/plain
Content-Type: multipart/alternative; boundary="inner-boundary"
AAA
Outer epilouge
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/multipartnopart.out0000644000000000000000000000047511702050536026652 0ustar rootrootReturn-Path: something@example.com Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Me MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE" This is a multi-part message in MIME format with no parts. --------------299A70B339B65A93542D2AE-- Epilogue apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/bad-newlines-multiple-parts_decoded.xml0000644000000000000000000000102411702050536032364 0ustar rootroot
Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE"
This is a multi-part message in MIME format.
Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit
That was a multi-part message in MIME format.
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/weird-boundary_decoded_1_1.txt0000644000000000000000000000027211702050536030452 0ustar rootrootText body --0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? The above line is similar to the boundary but miss a final space, so it should be part of the body. apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/weird-boundary.msg0000644000000000000000000000105211702050536026307 0ustar rootrootContent-Type: multipart/mixed; boundary="0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? " multipart --0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Text body --0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? The above line is similar to the boundary but miss a final space, so it should be part of the body. --0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? -- epilogue././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/missing-inner-boundary_decoded_1_2_1.txtapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/missing-inner-boundary_decoded_1_2_1.tx0000644000000000000000000000000011702050536032144 0ustar rootroot././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/bad-newlines-multiple-parts-base64_decoded.xmlapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/bad-newlines-multiple-parts-base64_deco0000644000000000000000000000140011702050536032170 0ustar rootroot
Content-type: message/rfc822 Content-transfer-encoding: base64 Subject: a multipart message/rfc822 which has been base64-encoded
Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE"
This is a multi-part message in MIME format.
Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit
That was a multi-part message in MIME format.
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/base64encoded-rfc822message.msg0000644000000000000000000000042411702050536030335 0ustar rootrootMIME-Version: 1.0 Subject: a simple rfc822 message encoded in a base64 body. Content-Type: message/rfc822 Content-Transfer-Encoding: base64 Q29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXVzLWFzY2lpDQpDb250ZW50LVRyYW5z ZmVyLUVuY29kaW5nOiA3Yml0DQoNClRleHQgYm9keQoNCg== apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/ending-boundaries_decoded_1_1.txt0000644000000000000000000000001411702050536031106 0ustar rootrootfirst part apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/misplaced-boundary_decoded_1_1.txt0000644000000000000000000000014411702050536031277 0ustar rootrootThis should be a text including the --boundary string and should not be parsed as multiple bodies apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/misplaced-boundary.out0000644000000000000000000000033411702050536027161 0ustar rootrootContent-Type: multipart/mixed; boundary="boundary" --boundary Content-Type: text/plain This should be a text including the --boundary string and should not be parsed as multiple bodies --boundary-- epilouge apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/basic-plain.xml0000644000000000000000000000067111702050536025556 0ustar rootroot
Return-Path: foo@example.com Subject: Simple Subject From: foo@example.com To: bar@example.com Cc: recipient1@example.com,recipient2@example.com, localrecipient Date: Wed, 11 Feb 98 11:51 CST
This is a very simple message with a simple body and no weird things at all.
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/misplaced-boundary_decoded.xml0000644000000000000000000000050211702050536030616 0ustar rootroot
Content-Type: multipart/mixed; boundary="boundary"
Content-Type: text/plain
epilouge
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/simple-attachment_decoded_1_1.txt0000644000000000000000000000000711702050536031132 0ustar rootrootBody. apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/simple-attachment.out0000644000000000000000000000402411702050536027016 0ustar rootrootDate: Fri, 27 Apr 2007 16:08:23 +0200 From: Foo Bar MIME-Version: 1.0 To: foo@example.com Subject: Here is the attachment I was waiting for. Content-Type: multipart/mixed; boundary="------------090404080405080108000909" This is a multi-part message in MIME format. --------------090404080405080108000909 Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: 7bit Body. --------------090404080405080108000909 Content-Type: application/octet-stream; name="data.bin" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="data.bin" lLzmyQjBC2gw/hiUrcy/DDI5K6CBqFSs4NKCF67G5XBzOnSInWpZ+9Uv9IxFpz8rf871xAE++y0Z YES9LXDdP12svxsJ4hRsekH2HJ953Kglb3hxko7LlPlxeDX15FKH0VBE8Ggr4RbwoP+cmkyyhKya iV95ycRzRd5ozVDGhmW/eQIZgw3nYJOt99vyPxolkHD8PLevmx4PTteIO4hIWjHGXtKCTNwBG0z4 cW3EOHWxsvo5v6JUEueDaxfFWKrA/MWP2TkYREXMj+q0XC4MpKZgIjqRL/9Es6gqpJTb4eyYL6FB dgrNeLqDQ5ozgu1zaQi9+yuoCABIHKCEPv32W+9Wt/MjMqCnKdk+ZdswZBna0Fq/168oqKh0S++t rpgndHvWZWojNY+rDqnl5o3T9IvTgTuG8IHPSxUODbWFy1vim+jUeGNpCfko6DGo5oBCKzg5BTlz 2kAED6F1X6/a+w0/9zGJZJ9Tyg6fb8LE7OwDFp1pH99x6SgRxa+IFHoXhbjRzkRi/ZRZKrqm4jxv hFTXlx9w70SL0GawHUwuNOgEUKJM75ADmDEEtRB0pQ8SRPoKn/b1RLGQPsvHzcqtSJljgbMMBmoi BFkAnzopnVn1RJfBzI6x9YcXtNqtJCTXdHzPg4D+WhwkCB0AF7W8EoVqvmlP2g0vAdPz4gR8+I6A FdGQtC52CMhX/1mHAeTjDCnuvTzZvKrACcVB9Ea12w10KLYbsgAr2+2vfAdiLUdUZDKHPPtWC+lS rvkTJtivU+YOSw7PCkWF7BIC7pTdp7WutqGCmVo0eHKfJxXcpkH++9ALeAQ8tfQw9K20JJW18fSA w/hs8fxs5FWjhNpYpUvQlqznN98K/pnaXQo373NufYHy1+yT3sSVEwBbClv7yOjrYrmyRe6ojw+Z xXziWk8r+VkFpotwvgW41vOuvkhd94rzr1Mj7WNEssTrJOQC5Uda2DPZkHgxBbZch2ru65Jmivr4 93iTF157c6MZhJUSW+P5Xd+WoDrUwzcpMx7QdyZaNSPVsL7uD4xOKoqm4OcdyzEj4qqDvBLA0TJ8 sQ4Fp0A5h7nNTuoUvxKMan0J4rRKc7T4eswuLEaTPCDtKpsmlTS+rG4jPaCOlPM++qrI6VMgJBZO L/zG7mLub/IYKmU6Svelyk91XQF23dhbSqlLjeLlGjwtlHhqRuFASVIgIqcxbsrxa6CSmTrHmxr0 NU5hmEWblBPvZwYZhZMu2c/yTirvknIijyTRjFmgwpB73uJHv0oQotC6myXTGNCc0MihBMOsDQs3 FhslJFQcH6VA0bze/FSZoGi+sM90lyrufQngenV1EVptFBx5DQYWEWXKOi2ZS6JQGYRh1R+EXA== --------------090404080405080108000909-- apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/obsolete.xml0000644000000000000000000000043211702050536025203 0ustar rootroot
Subject :The obsolete syntax allow spaces before the colon and also empty lines in folding. Date : Malformed Date. HeaderWithWSP : value.
body
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/example_decoded_1_1.txt0000644000000000000000000000140411702050536027150 0ustar rootrootLicensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/base64encoded-rfc822message_decoded.xml0000644000000000000000000000073411702050536032022 0ustar rootroot
MIME-Version: 1.0 Subject: a simple rfc822 message encoded in a base64 body. Content-Type: message/rfc822 Content-Transfer-Encoding: base64
Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/bad-newlines-multiple-parts.msg0000644000000000000000000000052011702050536030703 0ustar rootrootContent-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE" This is a multi-part message in MIME format. --------------299A70B339B65A93542D2AE Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Text body --------------299A70B339B65A93542D2AE-- That was a multi-part message in MIME format. apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/basic-plain_decoded.xml0000644000000000000000000000060711702050536027224 0ustar rootroot
Return-Path: foo@example.com Subject: Simple Subject From: foo@example.com To: bar@example.com Cc: recipient1@example.com,recipient2@example.com, localrecipient Date: Wed, 11 Feb 98 11:51 CST
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/malformedHeader-nocrlfcrlf.msg0000644000000000000000000000020511702050536030562 0ustar rootrootSubject: this is a subject This is an invalid header AnotherHeader: is this an header or the first part of the body? Body text apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/very-very-long-boundary.out0000644000000000000000000006716211702050536030141 0ustar rootrootContent-Type: multipart/mixed; boundary="0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? " multipart --0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Text body --0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? The above line is similar to the boundary but miss a final space, so it should be part of the body. --0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? -- epilogue././@LongLink0000000000000000000000000000016200000000000011564 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/base64encoded-rfc822message-nested_decoded_1_1_1.txtapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/base64encoded-rfc822message-nested_deco0000644000000000000000000000001411702050536032015 0ustar rootrootText body ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/missing-inner-start-boundary_decoded_1_1.txtapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/missing-inner-start-boundary_decoded_1_0000644000000000000000000000000511702050536032350 0ustar rootrootFoo apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/missing-boundary.xml0000644000000000000000000000027011702050536026661 0ustar rootroot
Content-Type: multipart/alternative; boundary="inner-boundary"
AAA
././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/base64encoded-rfc822message_decoded_1_1.txtapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/base64encoded-rfc822message_decoded_1_10000644000000000000000000000001411702050536031652 0ustar rootrootText body ././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/bad-newlines-multiple-parts_decoded_1_1.txtapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/bad-newlines-multiple-parts_decoded_1_10000644000000000000000000000001211702050536032221 0ustar rootrootText body apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/russian-headers.out0000644000000000000000000000031011702050536026466 0ustar rootrootContent-Type: text/plain; charset="US-ASCII"; name==?koi8-r?B?89DJ08/LLmRvYw==?= Content-Disposition: attachment; filename==?koi8-r?B?89DJ08/LLmRvYw==?= Subject: A simple subject A simple body. apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/missing-inner-boundary_decoded_1_1.txt0000644000000000000000000000000511702050536032114 0ustar rootrootFoo apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/missing-boundary_decoded.xml0000644000000000000000000000027011702050536030330 0ustar rootroot
Content-Type: multipart/alternative; boundary="inner-boundary"
AAA
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/ending-boundaries.out0000644000000000000000000000120411702050536026771 0ustar rootrootContent-Type: multipart/mixed; boundary="boundary" --boundary Content-Type: text/plain first part --boundary-- From the RFC about ending boundary: =================================================================== NOTE TO IMPLEMENTORS: Boundary string comparisons must compare the boundary value with the beginning of each candidate line. An exact match of the entire candidate line is not required; it is sufficient that the boundary appear in its entirety following the CRLF. =================================================================== --boundary-- The above boundary should be part of the epilogue, too.apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/misplaced-boundary.msg0000644000000000000000000000033411702050536027140 0ustar rootrootContent-Type: multipart/mixed; boundary="boundary" --boundary Content-Type: text/plain This should be a text including the --boundary string and should not be parsed as multiple bodies --boundary-- epilouge apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/intermediate-boundaries_decoded_1_1.txt0000644000000000000000000000001411702050536032314 0ustar rootrootfirst part ././@LongLink0000000000000000000000000000015600000000000011567 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/malformedHeaderStartsBody-nocrlfcrlf_decoded.xmlapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/malformedHeaderStartsBody-nocrlfcrlf_de0000644000000000000000000000024111702050536032464 0ustar rootroot
Subject: this is a subject
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/very-long-boundary_decoded.xml0000644000000000000000000000213411702050536030602 0ustar rootroot
Content-Type: multipart/mixed; boundary="0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? "
multipart
Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit
epilogue
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/base64-encoded-text_decoded_1.txt0000644000000000000000000000052011702050536030740 0ustar rootrootContent-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE" This is a multi-part message in MIME format. --------------299A70B339B65A93542D2AE Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Text body --------------299A70B339B65A93542D2AE-- That was a multi-part message in MIME format. apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/missing-inner-boundary_decoded.xml0000644000000000000000000000106511702050536031444 0ustar rootroot
Content-Type: multipart/mixed; boundary="outer-boundary"
Outer preamble
Content-Type: text/plain
Content-Type: multipart/alternative; boundary="inner-boundary"
AAA
Outer epilouge
././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/basic-plain-with-bad-header-separator.msgapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/basic-plain-with-bad-header-separator.m0000644000000000000000000000057211702050536032133 0ustar rootrootReturn-Path: foo@example.com Subject: Simple Subject From: foo@example.com To: bar@example.com Cc: recipient1@example.com,recipient2@example.com, localrecipient Date: Wed, 11 Feb 98 11:51 CST This is a very simple message with a simple body but the separator between header and body contains an additional space: CRLFCRLF. This results in a bogus header. ././@LongLink0000000000000000000000000000015700000000000011570 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/basic-plain-with-bad-header-separator_decoded.xmlapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/basic-plain-with-bad-header-separator_d0000644000000000000000000000064411702050536032203 0ustar rootroot
Return-Path: foo@example.com Subject: Simple Subject From: foo@example.com To: bar@example.com Cc: recipient1@example.com,recipient2@example.com, localrecipient Date: Wed, 11 Feb 98 11:51 CST
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/multipartnestedemptyparts.out0000644000000000000000000000133611702050536030757 0ustar rootrootReturn-Path: something@example.com Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Me MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE" This is a multi-part message in MIME format. --------------299A70B339B65A93542D2AE Content-Type: message/rfc822 Return-Path: something@example.com Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Me MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AF" This is a nested multi-part message in MIME format. --------------299A70B339B65A93542D2AF --------------299A70B339B65A93542D2AF-- Nested epilogue --------------299A70B339B65A93542D2AE-- Epilogue apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/very-very-long-boundary.xml0000644000000000000000000003423511702050536030125 0ustar rootroot
Content-Type: multipart/mixed; boundary="0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? "
multipart
Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit
Text body --0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? The above line is similar to the boundary but miss a final space, so it should be part of the body.
epilogue
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/base64-encoded-text.xml0000644000000000000000000000131411702050536027034 0ustar rootroot
Content-type: text/plain Content-transfer-encoding: base64 Subject: a multipart message/rfc822 which has been base64-encoded as plain text
Q29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSItLS0tLS0tLS0tLS0yOTlB NzBCMzM5QjY1QTkzNTQyRDJBRSIKClRoaXMgaXMgYSBtdWx0aS1wYXJ0IG1lc3NhZ2UgaW4gTUlN RSBmb3JtYXQuCgotLS0tLS0tLS0tLS0tLTI5OUE3MEIzMzlCNjVBOTM1NDJEMkFFCkNvbnRlbnQt VHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD11cy1hc2NpaQpDb250ZW50LVRyYW5zZmVyLUVuY29k aW5nOiA3Yml0CgpUZXh0IGJvZHkKCi0tLS0tLS0tLS0tLS0tMjk5QTcwQjMzOUI2NUE5MzU0MkQy QUUtLQpUaGF0IHdhcyBhIG11bHRpLXBhcnQgbWVzc2FnZSBpbiBNSU1FIGZvcm1hdC4K
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/very-very-long-boundary.msg0000644000000000000000000006716211702050536030120 0ustar rootrootContent-Type: multipart/mixed; boundary="0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? " multipart --0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Text body --0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? The above line is similar to the boundary but miss a final space, so it should be part of the body. --0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? -- epilogue././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/multipartnestedemptyparts_decoded_1_1.txtapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/multipartnestedemptyparts_decoded_1_1.t0000644000000000000000000000054411702050536032522 0ustar rootrootReturn-Path: something@example.com Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Me MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AF" This is a nested multi-part message in MIME format. --------------299A70B339B65A93542D2AF --------------299A70B339B65A93542D2AF-- Nested epilogueapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/russian-headers.msg0000644000000000000000000000031011702050536026445 0ustar rootrootContent-Type: text/plain; charset="US-ASCII"; name==?koi8-r?B?89DJ08/LLmRvYw==?= Content-Disposition: attachment; filename==?koi8-r?B?89DJ08/LLmRvYw==?= Subject: A simple subject A simple body. ././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/base64encoded-rfc822message-nested_decoded.xmlapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/base64encoded-rfc822message-nested_deco0000644000000000000000000000141611702050536032024 0ustar rootroot
MIME-Version: 1.0 Content-Type: message/rfc822 Subject: the body is a base64 encode rfc822 message including another base64 encoded rfc822 message Content-Transfer-Encoding: base64
MIME-Version: 1.0 Subject: a simple rfc822 message encoded in a base64 body. Content-Type: message/rfc822 Content-Transfer-Encoding: base64
Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/multipartemptypart.out0000644000000000000000000000053211702050536027366 0ustar rootrootReturn-Path: something@example.com Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Me MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE" This is a multi-part message in MIME format. --------------299A70B339B65A93542D2AE --------------299A70B339B65A93542D2AE-- Epilogue apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/malformedHeader-noheader_decoded_1.txt0000644000000000000000000000000011702050536032126 0ustar rootroot././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/multipartnestedemptypartsnorfc822_decoded.xmlapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/multipartnestedemptypartsnorfc822_decod0000644000000000000000000000156211702050536032574 0ustar rootroot
Return-Path: something@example.com Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Me <me@example.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE"
This is a multi-part message in MIME format.
Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AF"
This is a nested multi-part message in MIME format.
Nested epilogue
Epilogue
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/base64-encoded-text.msg0000644000000000000000000000113611702050536027024 0ustar rootrootContent-type: text/plain Content-transfer-encoding: base64 Subject: a multipart message/rfc822 which has been base64-encoded as plain text Q29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSItLS0tLS0tLS0tLS0yOTlB NzBCMzM5QjY1QTkzNTQyRDJBRSIKClRoaXMgaXMgYSBtdWx0aS1wYXJ0IG1lc3NhZ2UgaW4gTUlN RSBmb3JtYXQuCgotLS0tLS0tLS0tLS0tLTI5OUE3MEIzMzlCNjVBOTM1NDJEMkFFCkNvbnRlbnQt VHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD11cy1hc2NpaQpDb250ZW50LVRyYW5zZmVyLUVuY29k aW5nOiA3Yml0CgpUZXh0IGJvZHkKCi0tLS0tLS0tLS0tLS0tMjk5QTcwQjMzOUI2NUE5MzU0MkQy QUUtLQpUaGF0IHdhcyBhIG11bHRpLXBhcnQgbWVzc2FnZSBpbiBNSU1FIGZvcm1hdC4K apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/multipartemptypart_decoded_1_1.txt0000644000000000000000000000000011702050536031473 0ustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/intermediate-boundaries.xml0000644000000000000000000000204011702050536030167 0ustar rootroot
Content-Type: multipart/mixed; boundary="boundary"
preamble
Content-Type: text/plain
first part
Content-Type: text/plain
from the rfc: ================================ encapsulation := delimiter transport-padding CRLF body-part ================================ and also ================================ "Composers MUST NOT generate non-zero length transport padding, but receivers MUST be able to handle padding added by message transports." ================================ second part have a start boundary ending with spaces and also have a boundary not at the beginning --boundary ... that should be ignored also a boundary with more data (a tab) shoud be ignored --boundary end of part
epilouge
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/weird-boundary.out0000644000000000000000000000105211702050536026330 0ustar rootrootContent-Type: multipart/mixed; boundary="0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? " multipart --0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Text body --0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? The above line is similar to the boundary but miss a final space, so it should be part of the body. --0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? -- epilogueapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/base64-encoded-text.out0000644000000000000000000000113411702050536027043 0ustar rootrootContent-type: text/plain Content-transfer-encoding: base64 Subject: a multipart message/rfc822 which has been base64-encoded as plain text Q29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSItLS0tLS0tLS0tLS0yOTlB NzBCMzM5QjY1QTkzNTQyRDJBRSIKClRoaXMgaXMgYSBtdWx0aS1wYXJ0IG1lc3NhZ2UgaW4gTUlN RSBmb3JtYXQuCgotLS0tLS0tLS0tLS0tLTI5OUE3MEIzMzlCNjVBOTM1NDJEMkFFCkNvbnRlbnQt VHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD11cy1hc2NpaQpDb250ZW50LVRyYW5zZmVyLUVuY29k aW5nOiA3Yml0CgpUZXh0IGJvZHkKCi0tLS0tLS0tLS0tLS0tMjk5QTcwQjMzOUI2NUE5MzU0MkQy QUUtLQpUaGF0IHdhcyBhIG11bHRpLXBhcnQgbWVzc2FnZSBpbiBNSU1FIGZvcm1hdC4K apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/base64encoded-rfc822message-nested.xml0000644000000000000000000000134111702050536031626 0ustar rootroot
MIME-Version: 1.0 Content-Type: message/rfc822 Subject: the body is a base64 encode rfc822 message including another base64 encoded rfc822 message Content-Transfer-Encoding: base64
MIME-Version: 1.0 Subject: a simple rfc822 message encoded in a base64 body. Content-Type: message/rfc822 Content-Transfer-Encoding: base64
Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit
Text body
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/example_decoded_1_2.bin0000644000000000000000000000054311702050536027105 0ustar rootroot‰PNG  IHDR PXêsRGB®Îé pHYs  šœtIMEØ"'ßn}ÆtEXtCommentCreated with GIMPWÐIDATÓeÌÁJÃ@Eá{'“&!bZ Z7¾ÿkøE\ -¢66&m:™ÿºˆõl?8ŒO¶Ýhÿ¢ö]1`V ¯XÕn±ö¶ÝØîQý§ºç#držE…å­…ÁÛ볺½¾„dƒºAzµê[ŒÃMÉ4t8¼9ý²©8"œè`þg昗L3-I1+ãù‹H<ó9Ww®¾ù nF=œ©­IEND®B`‚apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/basic-plain-very-long-lines_decoded.xml0000644000000000000000000000062711702050536032256 0ustar rootroot
Return-Path: foo@example.com Subject: Simple Subject From: foo@example.com To: bar@example.com Cc: recipient1@example.com,recipient2@example.com, localrecipient Date: Wed, 11 Feb 98 11:51 CST
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/basic-plain-very-long-lines.msg0000644000000000000000000001631311702050536030574 0ustar rootrootReturn-Path: foo@example.com Subject: Simple Subject From: foo@example.com To: bar@example.com Cc: recipient1@example.com,recipient2@example.com, localrecipient Date: Wed, 11 Feb 98 11:51 CST This is a very simple message with a simple body and no weird things at all. this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line Done.apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/malformedHeader-noheader.out0000644000000000000000000000000211702050536030231 0ustar rootroot apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/example_decoded.xml0000644000000000000000000001125011702050536026471 0ustar rootroot
Return-Path: <robertburrelldonkin@blueyonder.co.uk> Received: (qmail 18554 invoked from network); 25 May 2008 14:38:53 -0000 Received: from unknown (HELO p3presmtp01-16.prod.phx3.secureserver.net) ([208.109.80.165]) (envelope-sender <rdonkin-owner@locus.apache.org>) by smtp20-01.prod.mesa1.secureserver.net (qmail-1.03) with SMTP for <asf@xmlmapt.org>; 25 May 2008 14:38:53 -0000 Received: (qmail 9751 invoked from network); 25 May 2008 14:38:53 -0000 Received: from minotaur.apache.org ([140.211.11.9]) (envelope-sender <rdonkin-owner@locus.apache.org>) by p3presmtp01-16.prod.phx3.secureserver.net (qmail-ldap-1.03) with SMTP for <asf@xmlmapt.org>; 25 May 2008 14:38:50 -0000 Received: (qmail 46768 invoked by uid 1289); 25 May 2008 14:38:46 -0000 Delivered-To: rdonkin@locus.apache.org Received: (qmail 46763 invoked from network); 25 May 2008 14:38:46 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 25 May 2008 14:38:46 -0000 Received: (qmail 61275 invoked by uid 500); 25 May 2008 14:38:48 -0000 Delivered-To: apmail-rdonkin@apache.org Delivered-To: rob@localhost Delivered-To: rob@localhost Received: (qmail 61272 invoked by uid 99); 25 May 2008 14:38:48 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 25 May 2008 07:38:48 -0700 X-ASF-Spam-Status: No, hits=-0.0 required=10.0 tests=SPF_PASS X-Spam-Check-By: apache.org Received-SPF: pass (athena.apache.org: domain of robertburrelldonkin@blueyonder.co.uk designates 195.188.213.5 as permitted sender) Received: from [195.188.213.5] (HELO smtp-out2.blueyonder.co.uk) (195.188.213.5) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 25 May 2008 14:38:00 +0000 Received: from [172.23.170.140] (helo=anti-virus02-07) by smtp-out2.blueyonder.co.uk with smtp (Exim 4.52) id 1K0HMV-00087e-HY for rdonkin@apache.org; Sun, 25 May 2008 15:38:15 +0100 Received: from [82.38.65.6] (helo=[10.0.0.27]) by asmtp-out5.blueyonder.co.uk with esmtpa (Exim 4.52) id 1K0HMU-0001A2-3q for rdonkin@apache.org; Sun, 25 May 2008 15:38:14 +0100 Subject: This is an example of a multipart mixed email with image content From: Robert Burrell Donkin <robertburrelldonkin@blueyonder.co.uk> To: Robert Burrell Donkin <rdonkin@apache.org> Content-Type: multipart/mixed; boundary="=-tIdGYVstQJghyEDATnJ+" Date: Sun, 25 May 2008 15:38:13 +0100 Message-Id: <1211726293.5772.10.camel@localhost> Mime-Version: 1.0 X-Mailer: Evolution 2.12.3 X-Virus-Checked: Checked by ClamAV on apache.org X-Nonspam: None X-fetched-from: mail.xmlmapt.org X-Evolution-Source: imap://rob@thebes/
Content-Type: text/plain Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename=blob.png; modification-date="Sun, 21 Jun 2008 15:32:18 +0000"; creation-date="Sat, 20 Jun 2008 10:15:09 +0000"; read-date="Mon, 22 Jun 2008 12:08:56 +0000";size=10234; Content-Type: image/png; name=blob.png Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=blob.png Content-Type: image/png; name=blob.png Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=rhubarb.txt Content-Type: text/plain; name=rhubarb.txt; charset=us-ascii Content-Language: en, en-US, en-CA Content-Transfer-Encoding: quoted-printable
././@LongLink0000000000000000000000000000016200000000000011564 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/bad-newlines-multiple-parts-base64_decoded_1_1_1.txtapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/bad-newlines-multiple-parts-base64_deco0000644000000000000000000000001211702050536032166 0ustar rootrootText body apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/malformedHeaderStartsBody-noheader.xml0000644000000000000000000000015311702050536032250 0ustar rootroot
This is a simple message not having headers.
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/missing-inner-start-boundary.xml0000644000000000000000000000101711702050536031125 0ustar rootroot
Content-Type: multipart/mixed; boundary="outer-boundary"
Outer preamble
Content-Type: text/plain
Foo
Content-Type: multipart/alternative; boundary="inner-boundary"
AAA
Outer epilouge
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/malformedHeader-noheader.msg0000644000000000000000000000013411702050536030216 0ustar rootrootThis is a simple message not having headers. The whole text should be recognized as body. apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/malformedHeader-noheader.xml0000644000000000000000000000007511702050536030234 0ustar rootroot
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/intermediate-boundaries.out0000644000000000000000000000144411702050536030205 0ustar rootrootContent-Type: multipart/mixed; boundary="boundary" preamble --boundary Content-Type: text/plain first part --boundary Content-Type: text/plain from the rfc: ================================ encapsulation := delimiter transport-padding CRLF body-part ================================ and also ================================ "Composers MUST NOT generate non-zero length transport padding, but receivers MUST be able to handle padding added by message transports." ================================ second part have a start boundary ending with spaces and also have a boundary not at the beginning --boundary ... that should be ignored also a boundary with more data (a tab) shoud be ignored --boundary end of part --boundary-- epilougeapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/missing-inner-boundary.xml0000644000000000000000000000101711702050536027772 0ustar rootroot
Content-Type: multipart/mixed; boundary="outer-boundary"
Outer preamble
Content-Type: text/plain
Foo
Content-Type: multipart/alternative; boundary="inner-boundary"
AAA
Outer epilouge
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/multipartnestedemptyparts_decoded.xml0000644000000000000000000000221211702050536032411 0ustar rootroot
Return-Path: something@example.com Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Me <me@example.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE"
This is a multi-part message in MIME format.
Content-Type: message/rfc822
Return-Path: something@example.com Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Me <me@example.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AF"
This is a nested multi-part message in MIME format.
Nested epilogue
Epilogue
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/bad-newlines-multiple-parts-base64.msg0000644000000000000000000000112411702050536031766 0ustar rootrootContent-type: message/rfc822 Content-transfer-encoding: base64 Subject: a multipart message/rfc822 which has been base64-encoded Q29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSItLS0tLS0tLS0tLS0yOTlB NzBCMzM5QjY1QTkzNTQyRDJBRSIKClRoaXMgaXMgYSBtdWx0aS1wYXJ0IG1lc3NhZ2UgaW4gTUlN RSBmb3JtYXQuCgotLS0tLS0tLS0tLS0tLTI5OUE3MEIzMzlCNjVBOTM1NDJEMkFFCkNvbnRlbnQt VHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD11cy1hc2NpaQpDb250ZW50LVRyYW5zZmVyLUVuY29k aW5nOiA3Yml0CgpUZXh0IGJvZHkKCi0tLS0tLS0tLS0tLS0tMjk5QTcwQjMzOUI2NUE5MzU0MkQy QUUtLQpUaGF0IHdhcyBhIG11bHRpLXBhcnQgbWVzc2FnZSBpbiBNSU1FIGZvcm1hdC4K apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/qp-body_decoded.xml0000644000000000000000000000043611702050536026415 0ustar rootroot
Mime-Version: 1.0 Subject: subject Content-Type: text/plain; charset="iso-8859-15" Content-Transfer-Encoding: quoted-printable
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/russian-headers_decoded_1.txt0000644000000000000000000000002011702050536030363 0ustar rootrootA simple body. apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/basic-plain_decoded_1.txt0000644000000000000000000000012011702050536027451 0ustar rootrootThis is a very simple message with a simple body and no weird things at all. apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/very-very-long-boundary_decoded_1_1.txt0000644000000000000000000001571411702050536032254 0ustar rootrootText body --0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? The above line is similar to the boundary but miss a final space, so it should be part of the body. apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/example.xml0000644000000000000000000002261111702050536025025 0ustar rootroot
Return-Path: <robertburrelldonkin@blueyonder.co.uk> Received: (qmail 18554 invoked from network); 25 May 2008 14:38:53 -0000 Received: from unknown (HELO p3presmtp01-16.prod.phx3.secureserver.net) ([208.109.80.165]) (envelope-sender <rdonkin-owner@locus.apache.org>) by smtp20-01.prod.mesa1.secureserver.net (qmail-1.03) with SMTP for <asf@xmlmapt.org>; 25 May 2008 14:38:53 -0000 Received: (qmail 9751 invoked from network); 25 May 2008 14:38:53 -0000 Received: from minotaur.apache.org ([140.211.11.9]) (envelope-sender <rdonkin-owner@locus.apache.org>) by p3presmtp01-16.prod.phx3.secureserver.net (qmail-ldap-1.03) with SMTP for <asf@xmlmapt.org>; 25 May 2008 14:38:50 -0000 Received: (qmail 46768 invoked by uid 1289); 25 May 2008 14:38:46 -0000 Delivered-To: rdonkin@locus.apache.org Received: (qmail 46763 invoked from network); 25 May 2008 14:38:46 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 25 May 2008 14:38:46 -0000 Received: (qmail 61275 invoked by uid 500); 25 May 2008 14:38:48 -0000 Delivered-To: apmail-rdonkin@apache.org Delivered-To: rob@localhost Delivered-To: rob@localhost Received: (qmail 61272 invoked by uid 99); 25 May 2008 14:38:48 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 25 May 2008 07:38:48 -0700 X-ASF-Spam-Status: No, hits=-0.0 required=10.0 tests=SPF_PASS X-Spam-Check-By: apache.org Received-SPF: pass (athena.apache.org: domain of robertburrelldonkin@blueyonder.co.uk designates 195.188.213.5 as permitted sender) Received: from [195.188.213.5] (HELO smtp-out2.blueyonder.co.uk) (195.188.213.5) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 25 May 2008 14:38:00 +0000 Received: from [172.23.170.140] (helo=anti-virus02-07) by smtp-out2.blueyonder.co.uk with smtp (Exim 4.52) id 1K0HMV-00087e-HY for rdonkin@apache.org; Sun, 25 May 2008 15:38:15 +0100 Received: from [82.38.65.6] (helo=[10.0.0.27]) by asmtp-out5.blueyonder.co.uk with esmtpa (Exim 4.52) id 1K0HMU-0001A2-3q for rdonkin@apache.org; Sun, 25 May 2008 15:38:14 +0100 Subject: This is an example of a multipart mixed email with image content From: Robert Burrell Donkin <robertburrelldonkin@blueyonder.co.uk> To: Robert Burrell Donkin <rdonkin@apache.org> Content-Type: multipart/mixed; boundary="=-tIdGYVstQJghyEDATnJ+" Date: Sun, 25 May 2008 15:38:13 +0100 Message-Id: <1211726293.5772.10.camel@localhost> Mime-Version: 1.0 X-Mailer: Evolution 2.12.3 X-Virus-Checked: Checked by ClamAV on apache.org X-Nonspam: None X-fetched-from: mail.xmlmapt.org X-Evolution-Source: imap://rob@thebes/
Content-Type: text/plain Content-Transfer-Encoding: 7bit
Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
Content-Disposition: attachment; filename=blob.png; modification-date="Sun, 21 Jun 2008 15:32:18 +0000"; creation-date="Sat, 20 Jun 2008 10:15:09 +0000"; read-date="Mon, 22 Jun 2008 12:08:56 +0000";size=10234; Content-Type: image/png; name=blob.png Content-Transfer-Encoding: base64
iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAIAAAACUFjqAAAAAXNSR0IArs4c6QAAAAlwSFlzAAAL EwAACxMBAJqcGAAAAAd0SU1FB9gFGQ4iJ99ufcYAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRo IEdJTVBXgQ4XAAAA0ElEQVQY02XMwUrDQBhF4XsnkyYhjWJaCloEN77/a/gERVwJLQiiNjYmbTqZ /7qIG/VsPziMTw+23Wj/ovZdMQJgViCvWNVusfa23djuUf2nugbnI2RynkWF5a2Fwdvrs7q9vhqE E2QAEIO6BhZBerUf6luMw49NyTR0OLw5kJD9sqk4Ipwc6GAREv5n5piXTDOQfy1JMSs8ZgXKq2kF iwDgEriEecnLlefFEmGAIvqD4ggJJNMM85qLtXfX9xYGuEQ+4/kIi0g88zlXd66++QaQDG5GPZyp rQAAAABJRU5ErkJggg==
Content-Disposition: attachment; filename=blob.png Content-Type: image/png; name=blob.png Content-Transfer-Encoding: base64
iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAIAAAACUFjqAAAAAXNSR0IArs4c6QAAAAlwSFlzAAAL EwAACxMBAJqcGAAAAAd0SU1FB9gFGQ4iJ99ufcYAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRo IEdJTVBXgQ4XAAAA0ElEQVQY02XMwUrDQBhF4XsnkyYhjWJaCloEN77/a/gERVwJLQiiNjYmbTqZ /7qIG/VsPziMTw+23Wj/ovZdMQJgViCvWNVusfa23djuUf2nugbnI2RynkWF5a2Fwdvrs7q9vhqE E2QAEIO6BhZBerUf6luMw49NyTR0OLw5kJD9sqk4Ipwc6GAREv5n5piXTDOQfy1JMSs8ZgXKq2kF iwDgEriEecnLlefFEmGAIvqD4ggJJNMM85qLtXfX9xYGuEQ+4/kIi0g88zlXd66++QaQDG5GPZyp rQAAAABJRU5ErkJggg==
Content-Disposition: attachment; filename=rhubarb.txt Content-Type: text/plain; name=rhubarb.txt; charset=us-ascii Content-Language: en, en-US, en-CA Content-Transfer-Encoding: quoted-printable
Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhu= barb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubar= b Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb R= hubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhub= arb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb= Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rh= ubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhuba= rb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb = Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhu= barb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubar= b Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb R= hubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhub= arb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb= Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rh= ubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhuba= rb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb = Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhu= barb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubar= b Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb R= hubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhub= arb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb= Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rh= ubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhuba= rb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb = Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhu= barb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubar= b Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb R= hubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhub= arb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb= Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rh= ubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhuba= rb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb = Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhu= barb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubar= b Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb R= hubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhub= arb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb= Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rh= ubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhuba= rb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb = Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb
././@LongLink0000000000000000000000000000016100000000000011563 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/multipartnestedemptypartsnorfc822_decoded_1_1_1.txtapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/multipartnestedemptypartsnorfc822_decod0000644000000000000000000000000011702050536032556 0ustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/basic-plain-very-long-lines.xml0000644000000000000000000001655411702050536030615 0ustar rootroot
Return-Path: foo@example.com Subject: Simple Subject From: foo@example.com To: bar@example.com Cc: recipient1@example.com,recipient2@example.com, localrecipient Date: Wed, 11 Feb 98 11:51 CST
This is a very simple message with a simple body and no weird things at all. this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line Done.
././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/malformedHeaderStartsBody-nocrlfcrlf.outapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/malformedHeaderStartsBody-nocrlfcrlf.ou0000644000000000000000000000010611702050536032436 0ustar rootrootSubject: this is a subject This is an invalid header Body text ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/basic-plain-with-bad-header-separator.outapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/basic-plain-with-bad-header-separator.o0000644000000000000000000000035411702050536032133 0ustar rootrootReturn-Path: foo@example.com Subject: Simple Subject From: foo@example.com To: bar@example.com Cc: recipient1@example.com,recipient2@example.com, localrecipient Date: Wed, 11 Feb 98 11:51 CST This results in a bogus header. apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/multipartdigestnestedemptyparts.xml0000644000000000000000000000205211702050536032144 0ustar rootroot
Return-Path: something@example.com Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Me <me@example.com> MIME-Version: 1.0 Content-Type: multipart/digest; boundary="------------299A70B339B65A93542D2AE"
This is a multi-part message in MIME format.
Return-Path: something@example.com Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Me <me@example.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AF"
This is a nested multi-part message in MIME format.
Nested epilogue
Epilogue
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/weird-boundary_decoded.xml0000644000000000000000000000074211702050536027775 0ustar rootroot
Content-Type: multipart/mixed; boundary="0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? "
multipart
Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit
epilogue
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/multipartnestedemptypartsnorfc822.xml0000644000000000000000000000147211702050536032235 0ustar rootroot
Return-Path: something@example.com Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Me <me@example.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE"
This is a multi-part message in MIME format.
Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AF"
This is a nested multi-part message in MIME format.
Nested epilogue
Epilogue
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/basic-plain.msg0000644000000000000000000000043011702050536025535 0ustar rootrootReturn-Path: foo@example.com Subject: Simple Subject From: foo@example.com To: bar@example.com Cc: recipient1@example.com,recipient2@example.com, localrecipient Date: Wed, 11 Feb 98 11:51 CST This is a very simple message with a simple body and no weird things at all. apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/base64encoded-rfc822message.out0000644000000000000000000000042211702050536030354 0ustar rootrootMIME-Version: 1.0 Subject: a simple rfc822 message encoded in a base64 body. Content-Type: message/rfc822 Content-Transfer-Encoding: base64 Q29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXVzLWFzY2lpDQpDb250ZW50LVRyYW5z ZmVyLUVuY29kaW5nOiA3Yml0DQoNClRleHQgYm9keQoNCg== apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/simple-attachment.msg0000644000000000000000000000402411702050536026775 0ustar rootrootDate: Fri, 27 Apr 2007 16:08:23 +0200 From: Foo Bar MIME-Version: 1.0 To: foo@example.com Subject: Here is the attachment I was waiting for. Content-Type: multipart/mixed; boundary="------------090404080405080108000909" This is a multi-part message in MIME format. --------------090404080405080108000909 Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: 7bit Body. --------------090404080405080108000909 Content-Type: application/octet-stream; name="data.bin" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="data.bin" lLzmyQjBC2gw/hiUrcy/DDI5K6CBqFSs4NKCF67G5XBzOnSInWpZ+9Uv9IxFpz8rf871xAE+ +y0ZYES9LXDdP12svxsJ4hRsekH2HJ953Kglb3hxko7LlPlxeDX15FKH0VBE8Ggr4RbwoP+c mkyyhKyaiV95ycRzRd5ozVDGhmW/eQIZgw3nYJOt99vyPxolkHD8PLevmx4PTteIO4hIWjHG XtKCTNwBG0z4cW3EOHWxsvo5v6JUEueDaxfFWKrA/MWP2TkYREXMj+q0XC4MpKZgIjqRL/9E s6gqpJTb4eyYL6FBdgrNeLqDQ5ozgu1zaQi9+yuoCABIHKCEPv32W+9Wt/MjMqCnKdk+Zdsw ZBna0Fq/168oqKh0S++trpgndHvWZWojNY+rDqnl5o3T9IvTgTuG8IHPSxUODbWFy1vim+jU eGNpCfko6DGo5oBCKzg5BTlz2kAED6F1X6/a+w0/9zGJZJ9Tyg6fb8LE7OwDFp1pH99x6SgR xa+IFHoXhbjRzkRi/ZRZKrqm4jxvhFTXlx9w70SL0GawHUwuNOgEUKJM75ADmDEEtRB0pQ8S RPoKn/b1RLGQPsvHzcqtSJljgbMMBmoiBFkAnzopnVn1RJfBzI6x9YcXtNqtJCTXdHzPg4D+ WhwkCB0AF7W8EoVqvmlP2g0vAdPz4gR8+I6AFdGQtC52CMhX/1mHAeTjDCnuvTzZvKrACcVB 9Ea12w10KLYbsgAr2+2vfAdiLUdUZDKHPPtWC+lSrvkTJtivU+YOSw7PCkWF7BIC7pTdp7Wu tqGCmVo0eHKfJxXcpkH++9ALeAQ8tfQw9K20JJW18fSAw/hs8fxs5FWjhNpYpUvQlqznN98K /pnaXQo373NufYHy1+yT3sSVEwBbClv7yOjrYrmyRe6ojw+ZxXziWk8r+VkFpotwvgW41vOu vkhd94rzr1Mj7WNEssTrJOQC5Uda2DPZkHgxBbZch2ru65Jmivr493iTF157c6MZhJUSW+P5 Xd+WoDrUwzcpMx7QdyZaNSPVsL7uD4xOKoqm4OcdyzEj4qqDvBLA0TJ8sQ4Fp0A5h7nNTuoU vxKMan0J4rRKc7T4eswuLEaTPCDtKpsmlTS+rG4jPaCOlPM++qrI6VMgJBZOL/zG7mLub/IY KmU6Svelyk91XQF23dhbSqlLjeLlGjwtlHhqRuFASVIgIqcxbsrxa6CSmTrHmxr0NU5hmEWb lBPvZwYZhZMu2c/yTirvknIijyTRjFmgwpB73uJHv0oQotC6myXTGNCc0MihBMOsDQs3Fhsl JFQcH6VA0bze/FSZoGi+sM90lyrufQngenV1EVptFBx5DQYWEWXKOi2ZS6JQGYRh1R+EXA== --------------090404080405080108000909-- apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/qp-body.xml0000644000000000000000000000045211702050536024744 0ustar rootroot
Mime-Version: 1.0 Subject: subject Content-Type: text/plain; charset="iso-8859-15" Content-Transfer-Encoding: quoted-printable
7bit content with euro =A4 symbol=20
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/very-long-boundary.out0000644000000000000000000000600211702050536027140 0ustar rootrootContent-Type: multipart/mixed; boundary="0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? " multipart --0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Text body --0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? The above line is similar to the boundary but miss a final space, so it should be part of the body. --0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? -- epilogueapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/bad-newlines-multiple-parts.out0000644000000000000000000000053111702050536030726 0ustar rootrootContent-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE" This is a multi-part message in MIME format. --------------299A70B339B65A93542D2AE Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Text body --------------299A70B339B65A93542D2AE-- That was a multi-part message in MIME format. ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/malformedHeaderStartsBody-nocrlfcrlf.xmlapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/malformedHeaderStartsBody-nocrlfcrlf.xm0000644000000000000000000000022211702050536032436 0ustar rootroot
Subject: this is a subject
This is an invalid header Body text
././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/basic-plain-very-long-lines_decoded_1.txtapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/basic-plain-very-long-lines_decoded_1.t0000644000000000000000000001600311702050536032134 0ustar rootrootThis is a very simple message with a simple body and no weird things at all. this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line this is a very very long line Done.././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/basic-plain-with-bad-header-separator.xmlapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/basic-plain-with-bad-header-separator.x0000644000000000000000000000061511702050536032144 0ustar rootroot
Return-Path: foo@example.com Subject: Simple Subject From: foo@example.com To: bar@example.com Cc: recipient1@example.com,recipient2@example.com, localrecipient Date: Wed, 11 Feb 98 11:51 CST
This results in a bogus header.
././@LongLink0000000000000000000000000000016000000000000011562 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/malformedHeaderStartsBody-nocrlfcrlf_decoded_1.txtapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/malformedHeaderStartsBody-nocrlfcrlf_de0000644000000000000000000000005011702050536032462 0ustar rootrootThis is an invalid header Body text apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/simple-attachment.xml0000644000000000000000000000451211702050536027011 0ustar rootroot
Date: Fri, 27 Apr 2007 16:08:23 +0200 From: Foo Bar <bar@example.com> MIME-Version: 1.0 To: foo@example.com Subject: Here is the attachment I was waiting for. Content-Type: multipart/mixed; boundary="------------090404080405080108000909"
This is a multi-part message in MIME format.
Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: 7bit
Body.
Content-Type: application/octet-stream; name="data.bin" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="data.bin"
lLzmyQjBC2gw/hiUrcy/DDI5K6CBqFSs4NKCF67G5XBzOnSInWpZ+9Uv9IxFpz8rf871xAE+ +y0ZYES9LXDdP12svxsJ4hRsekH2HJ953Kglb3hxko7LlPlxeDX15FKH0VBE8Ggr4RbwoP+c mkyyhKyaiV95ycRzRd5ozVDGhmW/eQIZgw3nYJOt99vyPxolkHD8PLevmx4PTteIO4hIWjHG XtKCTNwBG0z4cW3EOHWxsvo5v6JUEueDaxfFWKrA/MWP2TkYREXMj+q0XC4MpKZgIjqRL/9E s6gqpJTb4eyYL6FBdgrNeLqDQ5ozgu1zaQi9+yuoCABIHKCEPv32W+9Wt/MjMqCnKdk+Zdsw ZBna0Fq/168oqKh0S++trpgndHvWZWojNY+rDqnl5o3T9IvTgTuG8IHPSxUODbWFy1vim+jU eGNpCfko6DGo5oBCKzg5BTlz2kAED6F1X6/a+w0/9zGJZJ9Tyg6fb8LE7OwDFp1pH99x6SgR xa+IFHoXhbjRzkRi/ZRZKrqm4jxvhFTXlx9w70SL0GawHUwuNOgEUKJM75ADmDEEtRB0pQ8S RPoKn/b1RLGQPsvHzcqtSJljgbMMBmoiBFkAnzopnVn1RJfBzI6x9YcXtNqtJCTXdHzPg4D+ WhwkCB0AF7W8EoVqvmlP2g0vAdPz4gR8+I6AFdGQtC52CMhX/1mHAeTjDCnuvTzZvKrACcVB 9Ea12w10KLYbsgAr2+2vfAdiLUdUZDKHPPtWC+lSrvkTJtivU+YOSw7PCkWF7BIC7pTdp7Wu tqGCmVo0eHKfJxXcpkH++9ALeAQ8tfQw9K20JJW18fSAw/hs8fxs5FWjhNpYpUvQlqznN98K /pnaXQo373NufYHy1+yT3sSVEwBbClv7yOjrYrmyRe6ojw+ZxXziWk8r+VkFpotwvgW41vOu vkhd94rzr1Mj7WNEssTrJOQC5Uda2DPZkHgxBbZch2ru65Jmivr493iTF157c6MZhJUSW+P5 Xd+WoDrUwzcpMx7QdyZaNSPVsL7uD4xOKoqm4OcdyzEj4qqDvBLA0TJ8sQ4Fp0A5h7nNTuoU vxKMan0J4rRKc7T4eswuLEaTPCDtKpsmlTS+rG4jPaCOlPM++qrI6VMgJBZOL/zG7mLub/IY KmU6Svelyk91XQF23dhbSqlLjeLlGjwtlHhqRuFASVIgIqcxbsrxa6CSmTrHmxr0NU5hmEWb lBPvZwYZhZMu2c/yTirvknIijyTRjFmgwpB73uJHv0oQotC6myXTGNCc0MihBMOsDQs3Fhsl JFQcH6VA0bze/FSZoGi+sM90lyrufQngenV1EVptFBx5DQYWEWXKOi2ZS6JQGYRh1R+EXA==
././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/malformedHeader-nocrlfcrlf_decoded_1.txtapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/malformedHeader-nocrlfcrlf_decoded_1.tx0000644000000000000000000000001311702050536032313 0ustar rootrootBody text apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/qp-body.msg0000644000000000000000000000025311702050536024731 0ustar rootrootMime-Version: 1.0 Subject: subject Content-Type: text/plain; charset="iso-8859-15" Content-Transfer-Encoding: quoted-printable 7bit content with euro =A4 symbol=20 apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/multipartnestedemptyparts.msg0000644000000000000000000000133411702050536030734 0ustar rootrootReturn-Path: something@example.com Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Me MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE" This is a multi-part message in MIME format. --------------299A70B339B65A93542D2AE Content-Type: message/rfc822 Return-Path: something@example.com Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Me MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AF" This is a nested multi-part message in MIME format. --------------299A70B339B65A93542D2AF --------------299A70B339B65A93542D2AF-- Nested epilogue --------------299A70B339B65A93542D2AE-- Epilogue ././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/malformedHeaderStartsBody-noheader_decoded.xmlapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/malformedHeaderStartsBody-noheader_deco0000644000000000000000000000016211702050536032443 0ustar rootroot
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/base64-encoded-text_decoded.xml0000644000000000000000000000044411702050536030506 0ustar rootroot
Content-type: text/plain Content-transfer-encoding: base64 Subject: a multipart message/rfc822 which has been base64-encoded as plain text
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/multipartemptypart.msg0000644000000000000000000000052611702050536027350 0ustar rootrootReturn-Path: something@example.com Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Me MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE" This is a multi-part message in MIME format. --------------299A70B339B65A93542D2AE --------------299A70B339B65A93542D2AE-- Epilogue apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/malformedHeader-nocrlfcrlf.out0000644000000000000000000000015211702050536030604 0ustar rootrootSubject: this is a subject AnotherHeader: is this an header or the first part of the body? Body text apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/ending-boundaries.msg0000644000000000000000000000136411702050536026757 0ustar rootrootContent-Type: multipart/mixed; boundary="boundary" --boundary This should be ignored Content-Type: message/rfc822 Content-Type: text/plain first part --boundary-- This should be ignored at all and not part of the epilogue. From the RFC about ending boundary: =================================================================== NOTE TO IMPLEMENTORS: Boundary string comparisons must compare the boundary value with the beginning of each candidate line. An exact match of the entire candidate line is not required; it is sufficient that the boundary appear in its entirety following the CRLF. =================================================================== --boundary-- The above boundary should be part of the epilogue, too.apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/multipartnopart_decoded.xml0000644000000000000000000000074411702050536030311 0ustar rootroot
Return-Path: something@example.com Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Me <me@example.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE"
This is a multi-part message in MIME format with no parts. Epilogue
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/obsolete.out0000644000000000000000000000025411702050536025214 0ustar rootrootSubject :The obsolete syntax allow spaces before the colon and also empty lines in folding. Date : Malformed Date. HeaderWithWSP : value. body apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/missing-boundary.out0000644000000000000000000000013711702050536026672 0ustar rootrootContent-Type: multipart/alternative; boundary="inner-boundary" AAA --inner-boundary-- apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/base64encoded-rfc822message-nested.msg0000644000000000000000000000106711702050536031621 0ustar rootrootMIME-Version: 1.0 Content-Type: message/rfc822 Subject: the body is a base64 encode rfc822 message including another base64 encoded rfc822 message Content-Transfer-Encoding: base64 TUlNRS1WZXJzaW9uOiAxLjANClN1YmplY3Q6IGEgc2ltcGxlIHJmYzgyMiBtZXNzYWdlIGVuY29k ZWQgaW4gYSBiYXNlNjQgYm9keS4NCkNvbnRlbnQtVHlwZTogbWVzc2FnZS9yZmM4MjINCkNvbnRl bnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NA0KDQpRMjl1ZEdWdWRDMVVlWEJsT2lCMFpYaDBM M0JzWVdsdU95QmphR0Z5YzJWMFBYVnpMV0Z6WTJscERRcERiMjUwWlc1MExWUnlZVzV6DQpabVZ5 TFVWdVkyOWthVzVuT2lBM1ltbDBEUW9OQ2xSbGVIUWdZbTlrZVFvTkNnPT0NCg0K apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/multipartemptypart_decoded.xml0000644000000000000000000000107611702050536031032 0ustar rootroot
Return-Path: something@example.com Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Me <me@example.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE"
This is a multi-part message in MIME format.
Epilogue
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/example.msg0000644000000000000000000002062011702050536025011 0ustar rootrootReturn-Path: Received: (qmail 18554 invoked from network); 25 May 2008 14:38:53 -0000 Received: from unknown (HELO p3presmtp01-16.prod.phx3.secureserver.net) ([208.109.80.165]) (envelope-sender ) by smtp20-01.prod.mesa1.secureserver.net (qmail-1.03) with SMTP for ; 25 May 2008 14:38:53 -0000 Received: (qmail 9751 invoked from network); 25 May 2008 14:38:53 -0000 Received: from minotaur.apache.org ([140.211.11.9]) (envelope-sender ) by p3presmtp01-16.prod.phx3.secureserver.net (qmail-ldap-1.03) with SMTP for ; 25 May 2008 14:38:50 -0000 Received: (qmail 46768 invoked by uid 1289); 25 May 2008 14:38:46 -0000 Delivered-To: rdonkin@locus.apache.org Received: (qmail 46763 invoked from network); 25 May 2008 14:38:46 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 25 May 2008 14:38:46 -0000 Received: (qmail 61275 invoked by uid 500); 25 May 2008 14:38:48 -0000 Delivered-To: apmail-rdonkin@apache.org Delivered-To: rob@localhost Delivered-To: rob@localhost Received: (qmail 61272 invoked by uid 99); 25 May 2008 14:38:48 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 25 May 2008 07:38:48 -0700 X-ASF-Spam-Status: No, hits=-0.0 required=10.0 tests=SPF_PASS X-Spam-Check-By: apache.org Received-SPF: pass (athena.apache.org: domain of robertburrelldonkin@blueyonder.co.uk designates 195.188.213.5 as permitted sender) Received: from [195.188.213.5] (HELO smtp-out2.blueyonder.co.uk) (195.188.213.5) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 25 May 2008 14:38:00 +0000 Received: from [172.23.170.140] (helo=anti-virus02-07) by smtp-out2.blueyonder.co.uk with smtp (Exim 4.52) id 1K0HMV-00087e-HY for rdonkin@apache.org; Sun, 25 May 2008 15:38:15 +0100 Received: from [82.38.65.6] (helo=[10.0.0.27]) by asmtp-out5.blueyonder.co.uk with esmtpa (Exim 4.52) id 1K0HMU-0001A2-3q for rdonkin@apache.org; Sun, 25 May 2008 15:38:14 +0100 Subject: This is an example of a multipart mixed email with image content From: Robert Burrell Donkin To: Robert Burrell Donkin Content-Type: multipart/mixed; boundary="=-tIdGYVstQJghyEDATnJ+" Date: Sun, 25 May 2008 15:38:13 +0100 Message-Id: <1211726293.5772.10.camel@localhost> Mime-Version: 1.0 X-Mailer: Evolution 2.12.3 X-Virus-Checked: Checked by ClamAV on apache.org X-Nonspam: None X-fetched-from: mail.xmlmapt.org X-Evolution-Source: imap://rob@thebes/ --=-tIdGYVstQJghyEDATnJ+ Content-Type: text/plain Content-Transfer-Encoding: 7bit Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --=-tIdGYVstQJghyEDATnJ+ Content-Disposition: attachment; filename=blob.png; modification-date="Sun, 21 Jun 2008 15:32:18 +0000"; creation-date="Sat, 20 Jun 2008 10:15:09 +0000"; read-date="Mon, 22 Jun 2008 12:08:56 +0000";size=10234; Content-Type: image/png; name=blob.png Content-Transfer-Encoding: base64 iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAIAAAACUFjqAAAAAXNSR0IArs4c6QAAAAlwSFlzAAAL EwAACxMBAJqcGAAAAAd0SU1FB9gFGQ4iJ99ufcYAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRo IEdJTVBXgQ4XAAAA0ElEQVQY02XMwUrDQBhF4XsnkyYhjWJaCloEN77/a/gERVwJLQiiNjYmbTqZ /7qIG/VsPziMTw+23Wj/ovZdMQJgViCvWNVusfa23djuUf2nugbnI2RynkWF5a2Fwdvrs7q9vhqE E2QAEIO6BhZBerUf6luMw49NyTR0OLw5kJD9sqk4Ipwc6GAREv5n5piXTDOQfy1JMSs8ZgXKq2kF iwDgEriEecnLlefFEmGAIvqD4ggJJNMM85qLtXfX9xYGuEQ+4/kIi0g88zlXd66++QaQDG5GPZyp rQAAAABJRU5ErkJggg== --=-tIdGYVstQJghyEDATnJ+ Content-Disposition: attachment; filename=blob.png Content-Type: image/png; name=blob.png Content-Transfer-Encoding: base64 iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAIAAAACUFjqAAAAAXNSR0IArs4c6QAAAAlwSFlzAAAL EwAACxMBAJqcGAAAAAd0SU1FB9gFGQ4iJ99ufcYAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRo IEdJTVBXgQ4XAAAA0ElEQVQY02XMwUrDQBhF4XsnkyYhjWJaCloEN77/a/gERVwJLQiiNjYmbTqZ /7qIG/VsPziMTw+23Wj/ovZdMQJgViCvWNVusfa23djuUf2nugbnI2RynkWF5a2Fwdvrs7q9vhqE E2QAEIO6BhZBerUf6luMw49NyTR0OLw5kJD9sqk4Ipwc6GAREv5n5piXTDOQfy1JMSs8ZgXKq2kF iwDgEriEecnLlefFEmGAIvqD4ggJJNMM85qLtXfX9xYGuEQ+4/kIi0g88zlXd66++QaQDG5GPZyp rQAAAABJRU5ErkJggg== --=-tIdGYVstQJghyEDATnJ+ Content-Disposition: attachment; filename=rhubarb.txt Content-Type: text/plain; name=rhubarb.txt; charset=us-ascii Content-Language: en, en-US, en-CA Content-Transfer-Encoding: quoted-printable Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhu= barb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubar= b Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb R= hubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhub= arb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb= Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rh= ubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhuba= rb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb = Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhu= barb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubar= b Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb R= hubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhub= arb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb= Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rh= ubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhuba= rb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb = Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhu= barb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubar= b Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb R= hubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhub= arb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb= Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rh= ubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhuba= rb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb = Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhu= barb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubar= b Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb R= hubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhub= arb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb= Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rh= ubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhuba= rb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb = Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhu= barb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubar= b Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb R= hubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhub= arb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb= Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rh= ubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhuba= rb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb = Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb --=-tIdGYVstQJghyEDATnJ+-- apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/multipartnestedemptypartsnorfc822.msg0000644000000000000000000000110311702050536032212 0ustar rootrootReturn-Path: something@example.com Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Me MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE" This is a multi-part message in MIME format. --------------299A70B339B65A93542D2AE Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AF" This is a nested multi-part message in MIME format. --------------299A70B339B65A93542D2AF --------------299A70B339B65A93542D2AF-- Nested epilogue --------------299A70B339B65A93542D2AE-- Epilogue apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/very-very-long-boundary_decoded.xml0000644000000000000000000001637511702050536031601 0ustar rootroot
Content-Type: multipart/mixed; boundary="0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? "
multipart
Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit
epilogue
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/intermediate-boundaries.msg0000644000000000000000000000145011702050536030161 0ustar rootrootContent-Type: multipart/mixed; boundary="boundary" preamble --boundary Content-Type: text/plain first part --boundary Content-Type: text/plain from the rfc: ================================ encapsulation := delimiter transport-padding CRLF body-part ================================ and also ================================ "Composers MUST NOT generate non-zero length transport padding, but receivers MUST be able to handle padding added by message transports." ================================ second part have a start boundary ending with spaces and also have a boundary not at the beginning --boundary ... that should be ignored also a boundary with more data (a tab) shoud be ignored --boundary end of part --boundary-- epilougeapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/malformedHeader-nocrlfcrlf.xml0000644000000000000000000000030711702050536030577 0ustar rootroot
Subject: this is a subject AnotherHeader: is this an header or the first part of the body?
Body text
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/obsolete_decoded.xml0000644000000000000000000000045711702050536026661 0ustar rootroot
Subject :The obsolete syntax allow spaces before the colon and also empty lines in folding. Date : Malformed Date. HeaderWithWSP : value.
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/russian-headers_decoded.xml0000644000000000000000000000051011702050536030130 0ustar rootroot
Content-Type: text/plain; charset="US-ASCII"; name==?koi8-r?B?89DJ08/LLmRvYw==?= Content-Disposition: attachment; filename==?koi8-r?B?89DJ08/LLmRvYw==?= Subject: A simple subject
././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/malformedHeaderStartsBody-nocrlfcrlf.msgapache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/malformedHeaderStartsBody-nocrlfcrlf.ms0000644000000000000000000000020511702050536032432 0ustar rootrootSubject: this is a subject This is an invalid header AnotherHeader: is this an header or the first part of the body? Body text apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/ending-boundaries_decoded.xml0000644000000000000000000000150111702050536030431 0ustar rootroot
Content-Type: multipart/mixed; boundary="boundary"
Content-Type: text/plain
From the RFC about ending boundary: =================================================================== NOTE TO IMPLEMENTORS: Boundary string comparisons must compare the boundary value with the beginning of each candidate line. An exact match of the entire candidate line is not required; it is sufficient that the boundary appear in its entirety following the CRLF. =================================================================== --boundary-- The above boundary should be part of the epilogue, too.
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/multipartnopart.xml0000644000000000000000000000074411702050536026642 0ustar rootroot
Return-Path: something@example.com Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Me <me@example.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE"
This is a multi-part message in MIME format with no parts. Epilogue
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/missing-inner-start-boundary.msg0000644000000000000000000000042611702050536031116 0ustar rootrootContent-Type: multipart/mixed; boundary="outer-boundary" Outer preamble --outer-boundary Content-Type: text/plain Foo --outer-boundary Content-Type: multipart/alternative; boundary="inner-boundary" AAA --inner-boundary-- --outer-boundary-- Outer epilouge apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/obsolete_decoded_1.txt0000644000000000000000000000000611702050536027106 0ustar rootrootbody apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/missing-inner-boundary.msg0000644000000000000000000000040211702050536027755 0ustar rootrootContent-Type: multipart/mixed; boundary="outer-boundary" Outer preamble --outer-boundary Content-Type: text/plain Foo --outer-boundary Content-Type: multipart/alternative; boundary="inner-boundary" AAA --outer-boundary-- Outer epilouge apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/missing-inner-boundary.out0000644000000000000000000000043011702050536027777 0ustar rootrootContent-Type: multipart/mixed; boundary="outer-boundary" Outer preamble --outer-boundary Content-Type: text/plain Foo --outer-boundary Content-Type: multipart/alternative; boundary="inner-boundary" AAA --inner-boundary-- --outer-boundary-- Outer epilouge apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/missing-inner-start-boundary.out0000644000000000000000000000043011702050536031132 0ustar rootrootContent-Type: multipart/mixed; boundary="outer-boundary" Outer preamble --outer-boundary Content-Type: text/plain Foo --outer-boundary Content-Type: multipart/alternative; boundary="inner-boundary" AAA --inner-boundary-- --outer-boundary-- Outer epilouge apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/multipartnopart.msg0000644000000000000000000000047511702050536026631 0ustar rootrootReturn-Path: something@example.com Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Me MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE" This is a multi-part message in MIME format with no parts. --------------299A70B339B65A93542D2AE-- Epilogue apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/base64encoded-rfc822message-nested.out0000644000000000000000000000106511702050536031640 0ustar rootrootMIME-Version: 1.0 Content-Type: message/rfc822 Subject: the body is a base64 encode rfc822 message including another base64 encoded rfc822 message Content-Transfer-Encoding: base64 TUlNRS1WZXJzaW9uOiAxLjANClN1YmplY3Q6IGEgc2ltcGxlIHJmYzgyMiBtZXNzYWdlIGVuY29k ZWQgaW4gYSBiYXNlNjQgYm9keS4NCkNvbnRlbnQtVHlwZTogbWVzc2FnZS9yZmM4MjINCkNvbnRl bnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NA0KDQpRMjl1ZEdWdWRDMVVlWEJsT2lCMFpYaDBM M0JzWVdsdU95QmphR0Z5YzJWMFBYVnpMV0Z6WTJscERRcERiMjUwWlc1MExWUnlZVzV6DQpabVZ5 TFVWdVkyOWthVzVuT2lBM1ltbDBEUW9OQ2xSbGVIUWdZbTlrZVFvTkNnPT0NCg== apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/bad-newlines-multiple-parts-base64.out0000644000000000000000000000114011702050536032005 0ustar rootrootContent-type: message/rfc822 Content-transfer-encoding: base64 Subject: a multipart message/rfc822 which has been base64-encoded Q29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSItLS0tLS0tLS0tLS0yOTlB NzBCMzM5QjY1QTkzNTQyRDJBRSINCg0KVGhpcyBpcyBhIG11bHRpLXBhcnQgbWVzc2FnZSBpbiBN SU1FIGZvcm1hdC4KDQotLS0tLS0tLS0tLS0tLTI5OUE3MEIzMzlCNjVBOTM1NDJEMkFFDQpDb250 ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXMtYXNjaWkNCkNvbnRlbnQtVHJhbnNmZXIt RW5jb2Rpbmc6IDdiaXQNCg0KVGV4dCBib2R5Cg0KLS0tLS0tLS0tLS0tLS0yOTlBNzBCMzM5QjY1 QTkzNTQyRDJBRS0tDQpUaGF0IHdhcyBhIG11bHRpLXBhcnQgbWVzc2FnZSBpbiBNSU1FIGZvcm1h dC4K apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/multipartnestedemptyparts.xml0000644000000000000000000000213011702050536030741 0ustar rootroot
Return-Path: something@example.com Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Me <me@example.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE"
This is a multi-part message in MIME format.
Content-Type: message/rfc822
Return-Path: something@example.com Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Me <me@example.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AF"
This is a nested multi-part message in MIME format.
Nested epilogue
Epilogue
apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/very-long-boundary_decoded_1_1.txt0000644000000000000000000000146011702050536031262 0ustar rootrootText body --0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? 0123456789abcdefghijklmnopqrstuvwxyzABCDEFLMNOPRSTUVWXYZ'()+_,-./:=? The above line is similar to the boundary but miss a final space, so it should be part of the body. apache-mime4j-project-0.7.2/core/src/test/resources/testmsgs/multipartdigestnestedemptyparts.out0000644000000000000000000000130111702050536032147 0ustar rootrootReturn-Path: something@example.com Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Me MIME-Version: 1.0 Content-Type: multipart/digest; boundary="------------299A70B339B65A93542D2AE" This is a multi-part message in MIME format. --------------299A70B339B65A93542D2AE Return-Path: something@example.com Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Me MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AF" This is a nested multi-part message in MIME format. --------------299A70B339B65A93542D2AF --------------299A70B339B65A93542D2AF-- Nested epilogue --------------299A70B339B65A93542D2AE-- Epilogue apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/0000755000000000000000000000000011702050534024652 5ustar rootroot././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-2gifs-base64_decoded_1_1_2.binapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-2gifs-base64_decoded_1_0000644000000000000000000000064311702050534032052 0ustar rootrootGIF87a((ã€ÿ/OOnnnp€ R-¾¾¾çççõÞ³ÿ¥ÿúÍ,((þÉI«½x’Ì;&rŒdižh Jè¾p,ÇâZ§xnÖa›À P˜ã±¨Â`Él68ãí¤d®XÀ3%õQ­(íŠê"MYlrÌmõÎ|T S•|2“ðyuy†%{m6^q†‚ƒ…‡$‰enGŽN†y”l–‹p€¥ˆ }—S ¯° “t©;«Œx ( ´•ª¢™»'½žµ|·Â#º¼¾ÀËoÃÏÇ¿¶%~ÍÄ&ƨɊÓ#ŽCA“ ÑÙ¸p$iW%êc ¡ãhY&ó b îIÃ&Ü µ@(„6Dàeé§à ì>9yÒ/AdžY#¾“˜†^‚“'AYBaŠŽ(U²©ŒB”Ù1; Ìå;›8A>$™æàÍœÛý¤ÙÒhLùt¤0Ek¦ÔTY½*µ‹‡¯pq{bÅŒ³hÓª]ËD;apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/simple.msg0000644000000000000000000000126111702050534026653 0ustar rootrootReturn-Path: eryq@rhine.gsfc.nasa.gov Date: Wed, 20 Dec 95 19:59 CST From: eryq@rhine.gsfc.nasa.gov To: sitaram@selsvr.stx.com Cc: johnson@killians.gsfc.nasa.gov,harvel@killians.gsfc.nasa.gov, eryq Subject: Request for Leave I will be taking vacation from Friday, 12/22/95, through 12/26/95. I will be back on Wednesday, 12/27/95. Advance notice: I may take a second stretch of vacation after that, around New Year's. Thanks, ____ __ | _/__________/_/ Eryq (eryq@rhine.gsfc.nasa.gov) | _| _/ | | . | Hughes STX Corporation, NASA/Goddard Space Flight Cntr. |___|_|\_ |_ |___ | | |____/ http://selsvr.stx.com/~eryq/ `-' apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-frag.out0000644000000000000000000000641111702050534027454 0ustar rootrootMIME-Version: 1.0 From: Lord John Whorfin To: Subject: A complex nested multipart example Content-Type: multipart/mixed; boundary=unique-boundary-1 The preamble of the outer multipart message. Mail readers that understand multipart format should ignore this preamble. If you are reading this text, you might want to consider changing to a mail reader that understands how to properly display multipart messages. --unique-boundary-1 Part 1 of the outer message. [Note that the preceding blank line means no header fields were given and this is text, with charset US ASCII. It could have been done with explicit typing as in the next part.] --unique-boundary-1 Content-type: text/plain; charset=US-ASCII Part 2 of the outer message. This could have been part of the previous part, but illustrates explicit versus implicit typing of body parts. --unique-boundary-1 Subject: Part 3 of the outer message is multipart! Content-Type: multipart/parallel; boundary=unique-boundary-2 A one-line preamble for the inner multipart message. --unique-boundary-2 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-vise.gif" Subject: Part 1 of the inner message is a GIF, "3d-vise.gif" R0lGODdhKAAoAOMAAAAAAAAAgB6Q/y9PT25ubnCAkKBSLb6+vufn5/Xes/+lAP/6zQAAAAAAAAAA AAAAACwAAAAAKAAoAAAE/hDJSau9eJLMOyYbcoxkaZ5oCkoH6L5wLMfiWqd4btZhmxbAoFCY47EI qMJgyWw2ATjj7aRkAq5YwDMl9VGtKO0SiuoiTVlscsxt9c4HgXxUIA0EAVOVfDKT8Hl1B3kDAYYl e202XnGGgoMHhYckiWVuR3+OTgCGeZRslotwgJ2lnYigfZdTjQULr7ALBZN0qTurjHgLKAu0B5Wq opm7J72etQN8t8Ijury+wMtvw8/Hv7Ylfs0BxCbGqMmK0yOOQ0GTCgrR2bhwJGlXJQYG6mMKoeNo WSbzCWIACe5JwxQm3AkDAbUAQCiQhDZEBeBl6afgCsOBrD45edIvQceGWSMevpOYhl6CkydBHhBZ QmGKjihVshypjB9ClAHZMTugzOU7mzhBPiSZ5uDNnA7b/aTZ0mhMnfl0pDBFa6bUElSPWb0qtYuH rxlwcR17YsWMs2jTql3LFkQEADs= --unique-boundary-2 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-eye.gif" Subject: Part 2 of the inner message is another GIF, "3d-eye.gif", but the terminating boundary is bad! R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAAAAAA AAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7VujnC96I RVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7+3dCeRRjfAKH iImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatLrU8GaQdOBAQAB7+y XliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJvs7Y5ewH3d7Fxe3jB4rj 8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjwE0cdGxQ/gswosoKUkmuU2FnJ csSKGTBjypxJsyaICAA7XXXXXXuniqueboundary2Theepiloguefortheinnermultipartmess --unique-boundary-2-- --unique-boundary-1 Content-type: text/richtext This is part 4 of the outer message as defined in RFC1341 Isn't it cool? --unique-boundary-1 Content-Type: message/rfc822; name="nice.name"; From: (mailbox in US-ASCII) To: (address in US-ASCII) Subject: Part 5 of the outer message is itself an RFC822 message! Content-Type: Text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: Quoted-printable Part 5 of the outer message is itself an RFC822 message! --unique-boundary-1-- The epilogue for the outer message. apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-nested2_decoded_1_2.txt0000644000000000000000000000022011702050534032211 0ustar rootrootPart 2 of the outer message. This could have been part of the previous part, but illustrates explicit versus implicit typing of body parts. apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/double-semicolon.out0000644000000000000000000000035511702050534030646 0ustar rootrootMime-Version: 1.0 Content-Type: multipart/alternative;; boundary="foo" Preamble --foo Content-Type: text/plain; charset=us-ascii The better part --foo Content-Type: text/plain; charset=us-ascii The worse part --foo-- apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-igor2_decoded.xml0000644000000000000000000000363711702050534031226 0ustar rootroot
Date: Thu, 6 Jun 1996 15:50:39 +0400 (MOW DST) From: Starovoitov Igor <igor@fripp.aic.synapse.ru> To: eryq@rhine.gsfc.nasa.gov Subject: Need help MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="-490585488-806670346-834061839=:2195"
This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. Send mail to mime@docserver.cac.washington.edu for more info.
Content-Type: TEXT/PLAIN; charset=US-ASCII
Content-Type: TEXT/PLAIN; charset=US-ASCII; name=Makefile Content-Transfer-Encoding: BASE64 Content-ID: <Pine.LNX.3.91.960606155039.2195B@fripp.aic.synapse.ru> Content-Description: Makefile
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="multi-nested.msg" Content-Transfer-Encoding: BASE64 Content-ID: <Pine.LNX.3.91.960606155039.2195C@fripp.aic.synapse.ru> Content-Description: test message
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="Parser.n.out" Content-Transfer-Encoding: BASE64 Content-ID: <Pine.LNX.3.91.960606155039.2195D@fripp.aic.synapse.ru> Content-Description: out from parser
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/twopart_decoded.xml0000644000000000000000000000267211702050534030552 0ustar rootroot
Return-Path: <0647842285@uk.wowlg.com> Delivered-To: wowlgcard@cpostale.com Received: from WOWLG POSTCARD (unknown [57.67.194.147]) by lbn-int.qualimucho.com (Postfix) with SMTP id B33BE3F06 for <wowlgcard@cpostale.com>; Wed, 12 Jan 2005 08:08:12 +0100 (CET) MIME-Version: 1.0 From: 0647842285@uk.wowlg.com To: wowlgcard@cpostale.com Message-Id:102.10200000000105 Content-Type: multipart/mixed; boundary="=_wowlgpostcardsender102.10200000000105_=" Date: Wed, 12 Jan 2005 08:08:12 +0100 (CET)
This is a multi-part message in MIME format...
Content-Type: text/plain; charset="ISO-8859-1" Content-Disposition: inline Content-Transfer-Encoding: 8bit
Content-Type:image/jpeg; name="/home1/eucyon/data/img_event/postcard/uk7200_110_6.jpg" Content-Disposition: attachment;filename="/home1/eucyon/data/img_event/postcard/uk7200_110_6.jpg" Content-transfer-encoding: base64
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/double-bound_decoded_1_6.txt0000644000000000000000000000002711702050534032105 0ustar rootroot

Hello? Am I here? apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/2002_06_12_doublebound.xml0000644000000000000000000003446711702050534031166 0ustar rootroot

From: Lars Hecking <lhecking@nmrc.ie> To: mutt-dev@mutt.org Subject: MIME handling bug demo Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="ReaqsoxgOBHFXBhH" Content-Disposition: inline Content-Transfer-Encoding: 8bit X-Mutt-Fcc: Status: RO Content-Length: 11138 Lines: 226
Content-Type: text/plain; charset=us-ascii Content-Disposition: inline
-- The plot was designed in a light vein that somehow became varicose. -- David Lardner
Content-Type: text/html; charset=iso-8859-15 Content-Disposition: attachment; filename="The Mutt E-Mail Client.html" Content-Transfer-Encoding: 8bit
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"><html><head><title>The Mutt E-Mail Client</title></head> <body> <center> <h1>The Mutt E-Mail Client</h1> <p> <cite> "All mail clients suck. This one just sucks less." -me, circa 1995 </cite> </p></center> <p> <a href="http://www.mutt.org/links.html#mirrors">mirrors</a> </p><hr><p> </p><h2>Latest News</h2> <!-- Stick important news (security, etc.) here, cycled out to news.html. --> <p> Mutt 1.3.28 was released on March 13, 2002. This is a <strong>release candidate</strong> for 1.4. </p><p> Mutt 1.2.5.1 and 1.3.25 were released on January 1, 2002. These releases both fix a <strong>security hole</strong> which can be remotely exploited. For more information, see the <a href="http://www.mutt.org/announce/mutt-1.2.5.1-1.3.25.html">release announcement</a>. </p><p> Mutt 1.3.24 was released on November 30, 2001. This is a <strong>beta</strong> development release toward the next stable public release version. There have been several large changes since 1.2.x, so please check the <a href="http://www.mutt.org/changes.html">recent changes page</a>. </p><p> The Mutt CVS server has <strong>moved</strong> from ftp.guug.de to ftp.mutt.org. </p><p> <a href="http://www.mutt.org/news.html">more news</a> </p><p></p><hr><p> </p><h2>General Info</h2> <p> Mutt is a small but very powerful text-based mail client for Unix operating systems. The latest public release version is 1.3.28, which is a <strong>release candidate</strong> for 1.4. The current stable public release version is 1.2.5.1. For more information, see the following: </p><p> </p><ul><li><a href="#features">Features</a> </li><li><a href="http://www.mutt.org/screenshots/">Screenshots</a> </li><li>Documentation <ul><li><a href="http://www.fefe.de/muttfaq/faq">FAQ</a> (maintained by Felix von Leitner) </li><li><a href="http://www.mutt.org/doc/man_page.html">Man Page</a> </li><li>Manual <ul><li><a href="http://www.mutt.org/doc/manual/">HTML</a> (<a href="http://www.mutt.org/doc/manual.html.tar.gz">gzipped</a>) </li><li><a href="http://www.mutt.org/doc/manual.txt">Text</a> (<a href="http://www.mutt.org/doc/manual.txt.gz">gzipped</a>) </li></ul> </li><li><a href="http://www.mutt.org/changes.html">Recent Changes to Mutt</a> (please read if upgrading) </li><li><a href="http://www.mutt.org/links.html#config">Sample Configuration (.muttrc, etc.) Files</a> </li><li><a href="http://mutt.sourceforge.net/imap/">Mutt and IMAP</a> (maintained by Brendan Cully) </li><li>Using Mutt with GPG/PGP <ul><li><a href="http://www.mutt.org/doc/PGP-Notes.txt">Official Mutt doc</a> (included in the release) </li><li><a href="http://codesorcery.net/mutt/mutt-gnupg-howto">Alternate version</a> (for PGP/GPG newbies, by Justin R. Miller) </li><li><a href="http://www.linuxdoc.org/HOWTO/Mutt-GnuPG-PGP-HOWTO.html">Alternate version</a> (from the LDP) </li></ul> </li><li><a href="http://mutt.blackfish.org.uk/">Mutt overview for newbies</a> (maintained by Bruno Postle) </li></ul> </li><li><a href="http://www.mutt.org/download.html">Downloading</a> </li><li><a href="http://www.mutt.org/news.html">News</a> (releases, security alerts, etc.) </li><li><a href="http://bugs.guug.de/db/pa/lmutt.html">Current Reported Bugs</a> </li><li><a href="#discuss">User Discussion</a> (mailing lists, newsgroups, IRC, etc.) </li><li><a href="http://www.mutt.org/links.html">Links</a> (user advocacy, international pages, user contributed docs, patches, scripts, add-ons, other recommended programs, etc.) </li><li><a href="#press">What Other People Are Saying About Mutt</a> (press) </li></ul> <p> <img src="The%20Mutt%20E-Mail%20Client_files/mutt_button.gif" alt="[Mutt Mail Agent Button]" border="0" width="88" height="31"> <!-- <img src="image/mutt_bar.gif" alt="[Mutt Running Dog Bar]" border=0 width=200 height=35> --> </p><p></p><hr><p> </p><h2><a name="features">Features</a></h2> <p> Some of Mutt's features include: </p><p> </p><ul><li>color support </li><li>message threading </li><li>MIME support (including RFC2047 support for encoded headers) </li><li>PGP/MIME (RFC2015) </li><li>various features to support mailing lists, including list-reply </li><li>active development community </li><li>POP3 support </li><li>IMAP support </li><li>full control of message headers when composing </li><li>support for multiple mailbox formats (mbox, MMDF, MH, maildir) </li><li><strong>highly</strong> customizable, including keybindings and macros </li><li>change configuration automatically based on recipients, current folder, etc. </li><li>searches using regular expressions, including an internal pattern matching language </li><li>Delivery Status Notification (DSN) support </li><li>postpone message composition indefinetly for later recall </li><li>easily include attachments when composing, even from the command line </li><li>ability to specify alternate addresses for recognition of mail forwarded from other accounts, with ability to set the From: headers on replies/etc. accordingly </li><li>multiple message tagging </li><li>reply to or forward multiple messages at once </li><li><i>.mailrc</i> style configuration files </li><li>easy to install (uses GNU autoconf) </li><li>compiles against either curses/ncurses or S-lang </li><li>translation into at least 20 languages </li><li>small and efficient </li><li><em>It's free!</em> (no cost and GPL'ed) </li></ul> <p> <a href="http://www.mutt.org/screenshots/">Screenshots</a> demonstrating some of Mutt's capabilities are available. </p><p> Though written from scratch, Mutt's initial interface was based largely on the <a href="http://www.myxa.com/elm.html">ELM</a> mail client. To a large extent, Mutt is still very ELM-like in presentation of information in menus (and in fact, ELM users will find it quite painless to switch as the default key bindings are identical). As development progressed, features found in other popular clients such as PINE and MUSH have been added, the result being a hybrid, or "mutt." At present, it most closely resembles the <a href="http://space.mit.edu/%7Edavis/slrn.html">SLRN</a> news client. Mutt was originally written by <a href="http://www.cs.hmc.edu/%7Eme/">Michael Elkins</a> but is now developed and maintained by the members of the Mutt development <a href="#discuss">mailing list</a>. </p><p> <a href="#">top</a> </p><p></p><hr><p> </p><h2><a name="discuss">Mutt User Discussion</a></h2> <p> </p><ul><li>Mailing Lists <ul><li>mutt-announce@mutt.org -- Announcements. </li><li><a href="mailto:mutt-users@mutt.org">mutt-users@mutt.org</a> -- General Discussion. </li><li><a href="http://marc.theaimsgroup.com/?l=mutt-users">mutt-users Archive</a> (AIMS) </li><li><a href="http://mail-archive.com/mutt-users%40mutt.org/">mutt-users Archive</a> (mail-archive.com) </li><li><a href="http://www.egroups.com/group/mutt-users/">mutt-users Archive</a> (Egroups) </li><li><a href="mailto:mutt-dev@mutt.org">mutt-dev@mutt.org</a> -- Development Community. </li><li><a href="http://marc.theaimsgroup.com/?l=mutt-dev">mutt-dev Archive</a> (AIMS) </li><li><a href="http://www.egroups.com/group/mutt-dev/">mutt-dev Archive</a> (Egroups) </li><li><a href="mailto:mutt-po@mutt.org">mutt-po@mutt.org</a> -- Translation Issues. </li><li><a href="http://www.mutt.org/mail-lists.html">Subscribe to the lists through this web site</a>. (You need to be subscribed to the lists to post to them.) </li></ul> <p> </p></li><li>Newsgroup <ul><li><a href="news://comp.mail.mutt/">comp.mail.mutt</a> </li><li><a href="http://www.deja.com/dnquery.xp?query=%7Eg%20comp.mail.mutt">comp.mail.mutt Archive</a> (Deja.com) </li></ul> <p> </p></li><li>IRC -- Channel #mutt on <a href="http://www.openprojects.net/irc_servers.shtml/">irc.openprojects.net</a> </li></ul> <p> <a href="#">top</a> </p><p></p><hr><p> </p><h2><a name="press">Press About Mutt</a></h2> <p> </p><ul><li><a href="http://www.devshed.com/Server_Side/Administration/Mutt/page1.html">A Man And His Mutt</a> -- <a href="http://www.devshed.com/">Developer Shed</a> </li><li><a href="http://www.linuxnovice.org/main_software.php3?VIEW=VIEW&amp;t_id=146">Mutt: An e-mail user's best friend -- Part One</a> -- <a href="http://www.linuxnovice.org/">LinuxNovice.org</a>. <a href="http://www.linuxnovice.org/main_software.php3?VIEW=VIEW&amp;t_id=164">Part Two</a> </li><li><a href="http://www.linuxcare.com/viewpoints/ap-of-the-wk/03-31-00.epl">Mutt</a> -- Mutt was the app of the week at <a href="http://www.linuxcare.com/">Linuxcare</a>. </li><li><a href="http://www.linuxworld.com/linuxworld/lw-1999-12/lw-12-mutt.html">Man's Best Friend</a> -- <a href="http://www.linuxworld.com/">Linux World</a>. </li><li><a href="http://www.32bitsonline.com/article.php3?file=issues/199812/mutt&amp;page=1">Mutt: A Unix Mailer for Experts</a> -- an article from <a href="http://www.32bitsonline.com/">32BitsOnline</a>. </li><li><a href="http://www.ssc.com/lg/issue14/mutt.html">The Mutt Mailer</a> -- an (old) article from the <a href="http://www.ssc.com/lg/">Linux Gazette</a>. </li></ul> <p> <a href="#">top</a> </p><p></p><hr> <address>Last updated on March 13, 2002 by <a href="http://jblosser.firinn.org/">Jeremy Blosser</a>. </address> URL:&lt;http://www.mutt.org/index.html&gt;<br> Copyright © 1996-9 Michael R. Elkins. All rights reserved.<br> Copyright © 1999-2002 Jeremy Blosser. All rights reserved. <hr> <!-- BEGIN HOSTED BY --> <a href="http://www.gbnet.net/"><img src="The%20Mutt%20E-Mail%20Client_files/gbnettek_w100_transb.gif" width="100" height="64" alt="GBNet/NetTek" border="0" vspace="10"></a> <br><small>hosted by<br> <a href="http://www.gbnet.net/">GBNet/NetTek</a></small> <!-- END HOSTED BY --> </body></html>
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-nested3.msg0000644000000000000000000000632511702050534030065 0ustar rootrootMIME-Version: 1.0 From: Lord John Whorfin To: Subject: A complex nested multipart example Content-Type: multipart/mixed; boundary=unique-boundary-1 The preamble of the outer multipart message. Mail readers that understand multipart format should ignore this preamble. If you are reading this text, you might want to consider changing to a mail reader that understands how to properly display multipart messages. --unique-boundary-1 Part 1 of the outer message. [Note that the preceding blank line means no header fields were given and this is text, with charset US ASCII. It could have been done with explicit typing as in the next part.] --unique-boundary-1 Content-type: text/plain; charset=US-ASCII Part 2 of the outer message. This could have been part of the previous part, but illustrates explicit versus implicit typing of body parts. --unique-boundary-1 Subject: Part 3 of the outer message is multipart! Content-Type: multipart/parallel; boundary=unique-boundary-2 A one-line preamble for the inner multipart message. --unique-boundary-2 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-vise.gif" Subject: Part 1 of the inner message is a GIF, "3d-vise.gif" R0lGODdhKAAoAOMAAAAAAAAAgB6Q/y9PT25ubnCAkKBSLb6+vufn5/Xes/+lAP/6zQAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJLMOyYbcoxkaZ5oCkoH6L5wLMfiWqd4btZhmxbA oFCY47EIqMJgyWw2ATjj7aRkAq5YwDMl9VGtKO0SiuoiTVlscsxt9c4HgXxUIA0EAVOVfDKT 8Hl1B3kDAYYle202XnGGgoMHhYckiWVuR3+OTgCGeZRslotwgJ2lnYigfZdTjQULr7ALBZN0 qTurjHgLKAu0B5Wqopm7J72etQN8t8Ijury+wMtvw8/Hv7Ylfs0BxCbGqMmK0yOOQ0GTCgrR 2bhwJGlXJQYG6mMKoeNoWSbzCWIACe5JwxQm3AkDAbUAQCiQhDZEBeBl6afgCsOBrD45edIv QceGWSMevpOYhl6CkydBHhBZQmGKjihVshypjB9ClAHZMTugzOU7mzhBPiSZ5uDNnA7b/aTZ 0mhMnfl0pDBFa6bUElSPWb0qtYuHrxlwcR17YsWMs2jTql3LFkQEADs= --unique-boundary-2 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-eye.gif" Subject: Part 2 of the inner message is another GIF, "3d-eye.gif" R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7 VujnC96IRVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7 +3dCeRRjfAKHiImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatL rU8GaQdOBAQAB7+yXliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJ vs7Y5ewH3d7Fxe3jB4rj8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjw E0cdGxQ/gswosoKUkmuU2FnJcsSKGTBjypxJsyaICAA7 --unique-boundary-2-- The epilogue for the inner multipart message. --unique-boundary-1 Content-type: text/richtext This is part 4 of the outer message as defined in RFC1341 Isn't it cool? --unique-boundary-1 Content-Type: message/rfc822; name="nice.name"; From: (mailbox in US-ASCII) To: (address in US-ASCII) Subject: Part 5 of the outer message is itself an RFC822 message! Content-Type: Text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: Quoted-printable Part 5 of the outer message is itself an RFC822 message! --unique-boundary-1-- The epilogue for the outer message. apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/uu-zeegee.msg0000644000000000000000000001566511702050534027272 0ustar rootrootFrom: me To: you Subject: uudecoding I've uuencoded the ZeeGee logo and another GIF file below. begin 644 up.gif M1TE&.#=A$P`3`*$``/___P```("`@,#`P"P`````$P`3```"1X2/F<'MSTQ0 M%(@)YMB\;W%)@$<.(*:5W2F2@<=F8]>LH4P[7)P.T&NZI7Z,(&JF^@B121Y3 4Y4SNEJ"J]8JZ:JTH(K$"/A0``#L` ` end begin 644 zeegee.gif M1TE&.#=A6P!P`/<```````@("!`0$#D`(3D`*4(`*1@8&$H`*4H`,5(`,5(` M.5H`,2$A(5H`.5((,6,`.6,`0EH(.6L`0F,(.6,(0BDI*5H0.6L(0FL(2F,0 M.6,00G,(2C$Q,4(I,6L02GL(4G,04G,02FL80H0(4H0(6E(I.7,80HP(6CDY M.6LA0D(Y.90(6I0(8XP06G,A2H084H086I008U(Y0GLA4D)"0G,I2H0A2G,I M4H0A4H0A6H0I4I0A8TI*2FLY4GLQ6G,Y4I0I8U)24F-*4EI22I0Q8Y0Q:YPQ M:Y0Y6I0Y8X1"6I0Y:UI:6HQ"6H1*8Z4YV-C8WM: M8Z5"X1C:Y1:ZU2WM[>Y1S[UC>XQ[ M>YQS>[5K>[UCE)Q[>X2$A+UKA)Q[E*5[>[UKC*5[A*5[E)R$>[USC*5[G-YC MC(R,C*U[G*6$A,YKE+U[C*V$A+5[G,YSC*V$C+5[I=YKE)24E*V,C+6$I;V$ MI;6,C+6,E-9[G+V,C*V4C+V,E-Y[E-Y[G)R>$I;V^,I:VM MK<:EI>4O>^4M=:EI=:EK>>>EK?>>EM=ZMK>>EO=ZMM>^EK?^^EO?^MK>>MM>^ESO>EO?^E MO>^MO?^EQN>UM?^ESO>MQL;&QN^UM=Z]M>^UO?^MO?>UO>>]O>^]O?^USO^U MQO>]O<[.SN?&O?>]QO^]QO^]SO?&QO^]WO?&SM;6UO_&QO_&SO_&WO_&Y__. MSN_6SO_.UM[>WO_.WO_6UO_6WO_6Y^?GY__>WO_>Y__GWO_GY__G[__G]^_O M[__O[_?W]__W]__W_____RP`````6P!P``<(_P#_"1Q(L*#!@P@3*ES(L*'# MAQ`C2IQ(L:+%BQ@S:I08J:-'2"!#BAP9DI')1(12JES)LF6@ES!C^IE)L^9, M/3ASZE2XH:?/GAB"8KA`M"B%HT@A*(7PH('3IU`;*)BJ(('5JPBR:M5ZH&N! MKV#!$AA+8(#9LSQ__A0ZM"A1I$F7-HT:E6K5JUBW379 MU["/(]_0V3-SN:,=/_^&[/MW];YCL6>/C;S[7]U66H(+\-6C;;?&%)R%>U)U7 M@$(C*(CA=H9YQR&$$4;76XA]D5BBB?NAJ-Q[<.76HHL@9I5`!M.9=Z",,]*H M77LW(I9CA]#Q:)4-9#22R2:*".+"9'P1.4*1-&;8X'?./4?78PM$T8@K=4A1 M@P4U,*$($WN-F!`)6]9I9'9>!E7;BBQZJ(`5I6RBA@B1I7"(!7LI1`*==7+9 MI8UZJKADGXV]4`HQ9U@@759()+'5`8HNVJBC)N89J9*3BMG``W8\H\@,]('_ MB$,3>H6Z**-VWKG@9AJ"&:!3+\CBRA/B.6F5!F_4FM`)MXK:J*Z[$M8K@`%: M$4TC)M05JU6'*(O0"$>01)`(*@1NNN,_J M:NJ>H+VP##'$RL=;!F/D5:^]]SJ;ZYW[2GH4$>2$,!DDTBD`)G&&W,\*K0-NV4'.89XH-C)8RKP!*%XL8QPPAV3 M6RZ#21HB#AO4JDJ:&!D0F(#//[O\,L.0ZHG*-EB@FZK2#5R`!7T*L?!SU%)[ M_#'1&,BRC1(X/DAQ`Q'H@(48+@Q85=ABC]WRK5-3_[U=*MP4P>^DO]90BSWW MW*.+!G;CS<(*>MM;]I8P(W=U$>?ZVI0&M'S#3C_WL+/*`DY-Y3@+>4?.<="5 MJW6U$?V%[."#7[3B2S7L?).-+STCL$@#;Q81_K@P<`&RB,=QV!@.Q3X"S2` M8%IP:8(02C`$(0AA""5(P/\0(L`2IDYUXH*!';"A0/4UL('O4$<$7SC!=8`# M$!>47?0\4`49J."'*G!`5/_J94(!@@^%BWJ#-<[1PG:\,![Q>$<^@@'%>-!0 M@>C`QAF^!!B`$(>XK!.LH(@!)"`)@'"*;IP#'2U\(3SBD0YYS*** M5KSB.LX!CD_D`'IPT4(*(L`DC9T1C2?\612@X48FQI&&\CC&._`HQQJB@X_4 M4`(@*:"#)$CO5SY#9"+!E09&@N.-"EQ@`]NA#F2L@Y*53.4YSM$-:H3A2V(0 MP=8:`+5#HA%A>8"&-;HQ#E0^$A[M(`@P0;_X$`*?&(* MU,PH2E(F`QK:(*8QT^=$>&Q#&N!H9B6?&8H99O@$F47 M@*'_#&J$LYCC5!\WEH$-==*0G;.4IC:@`0Q-L@4'1T!57/`)+E\*T`FX``8T M_-F-4XYS'=R0QC#*6<55KB^5T$QH-Q::C%/H('9DT(##D*(H`EJ4!3$812TT MRE%P`!2.ZPB'-&SAQ'C0XQ[XN$<]Z(%,E&)QEN-0*#24`8Q+A(`[.V#"821* M@5`1\`0"Y`,M=KI1:X33HV\4QS-F<0XGU@,?_A#(/N[!5*=>4J7:>"=5:3&& MGIS!`YF#BZV^BKH=T&*L_!1F.#LZRW,TPQ8L;`<]\%&0?-0#'JE$QUWYV(V5 MZA48M/`$"(QPA!1)RE:+LBD@8G'8Q%+#K)T]93.:P0LX_\*C'OTP"#[B`LEQB'>\U@BN<`^KBDY<05KGTM)R$=:"3IC"%*I@K72_6=9BA((: ML06'=N-QCWV8>!]UY:,TQTM>:$`C&<`X;RQ,P0E$\"I)6AK!A,'E!$YXXL+0 MC2XP.$R,69Q"&TB.+1/+*<$]KGBE>4VPBV$,6O326!(^N+%R7C.J'<>!$YRP M<'V%#(Q>%.,0U'BM61?KT_!"=?_%2(ZR@I5!Y<.N0A6>X,0CFH`V/6%G7,L] M!)C#C&'61G<8R`"$,EQ<5FNL.JZ:?+MX*! M)"9Q"3#_.,.TR$4Q*)$+?BZ:T1M-% M0%T$21A;$J8N]"YF<0E<2U<9K[:UM%T,;6?7XM*9SC,G)%$(.,PO0\/NLA*. M;>QDLZ(8=3CL3IT-#&%`&]KN?KNNM\2M?5A=WYG7^O;U'[%YG_J`1]5V%HB-?"%\#PA#T97:%W&'QN\!Y7M0>++]3M^5/_?RE=?YA3W!]8P_0O!T<`,8JN`"(Y7= M(OQ(O>I7S_K6N_[UL(?]1A32>GW$_O:XSST_9D][U=M>]ZLO"/!?S_O>\^/W MPU_(\%5?_(',0Q\$\?WR$<(/=\SC^0))OD4&P8#N>]_[CG!'__2/O_S=%\08 M/!```-8?`!08XQ_`OT@;UD__^FO"_`,A__3S3X7Z&Z#^2X!\L8<1Y@`*!FB` MFA```,``YF`0YB=[^<=\V<<#Z\+!^CE`0 MW@`*FG"!U]=Z_U"`FJ`)&)AZ`U$&ZX<'$9AZMZ"`K]!ZT_""H`!]PG=]/9B" M0.@0\Z"`/#`/`^$.*%!_`!`$WA"#J><.%%A_/.`-0.@."K@%XZ=Z\V!]7F@, M'%!_`4`%^*'MQ"#YI"'=^B' MM[![(R@`^'=[\_`*"FB'>+A^%0!]_/]P@G7(`#S``.O'`&V($-.P?EOP@)3( M`=XP$--0`0#``<9@>Z*(`MZ@>MXPAA6`@11(!=D'?_`7@O"G#].@?CQ@#JIW MBT_8@L:`B^(G$(Z`BPPABA7PB0*A"788C,ZG?GC@#LIHB06A#_\W"/PPAGC@ MA>ZPC=RXC>;PA?V'`LRW>[>P?FG8?QP0@OPP@@#0@`GA""1($$$``#SP@O;X M@C0``#3@#?,8!/=HC_G(`_S0A&6@>J_@A/77!N9`B5OPCYK@")0X"+=`B53@ M"/\(D0`P"`FA#[BHA`,QA@A9?Q5@#B`9DA7(#V](`[]7CB;Y"MY@DO6W!0<) MD^M7!@G1?W'_6!!-6`$HL`14\)-`N01M,)`+&`1+<)1(>91#J8P!D(K'UXWN MD(;J]X7KQP-'"914<)6O,)-!@)59J968J(FTN`7T.`W,*'QDF8NL%WT<28\" MZ'OSZ('\0(GW1Q#Z,`_F-PW_IPG19PZ7:!!CR`%G*1`L"0K?.!#ZD)6ZF(D` M``K/9WZ)N00QJ(Q/B)>KIP]O*`"ZN(X+Z)'_<)>OX),"\8;2^)E1J0FB>1"@ M```!L(=0.0W3,(\!H)"I9PRG.!"RV08Q.)$`((ZJ-W]P6`:O8`Z:4`9Y&(BI M1XT+N(/\8`YXH(`V^)G_QP"EJ`_>T`;0B1#`&9*TF8^L:0"1Z)GZ_["&`0"> ME6B9JN<(B>B$##`-P=>'ZR<`!I"(2T`0=!B?\[E^L(@0$/E]WF<`=?D/@Y"' M<+@%E\@/;5"'!?J6J3$H-">LSB`.$VQB%([B'7QB" M:!A]*)I_M_""@3@/AQF%U@<*GYB!MNB#[O^H$.7H"%@H$-9'$*"@H`!0`;>@ MA.Q(?V19?PP0`"[*`Z"ZA`!@D_P`"@2ZG!#Z#WJ)`I28C1JXAO07!']IEP'@ MB<^G#VU(@T'0HO-P"Z+H"'YYA*TX#R?8?V4`"N6HD0*A#PH("@,!CZDX"*.8 MJ8?XJ=VWI?^WCW>9@P!Z?>XP@J6)$(@8`$N@@AY9CEP8?:)Z"]`G`.DX$,HH MA_]0`31@?DP9!-E'`PRPI?K(IZ+8K[\8`-"G#^[0?2[Z#R.XGPGAH)0H`&5@ M#@U(`TUI$,[*`^('K_AWD/3ZG,'(`Q6P!83X#UC:!OK@H7]YD&+ZBS0@J=1* MKP3A#A40`&=Z$*__0(F]J@^C.)@"$00&\'X&4`$;"P"O(*D92;(!@`=<^G[* M:`[N(`#Z:A#F$*;_<`L"4)];ZJ%."Y7A"@!ENJ)`.`]CZ`B9&`0\^P_S5Z5! M6X0'6;0"P0$""8_B%P";"+(D"P!MA#*.)SF5XXVR0$,F+#_((D"80`,(+G.A[WQ^N\CCA_#-M]^%>.D_L/ M\&B^`T&!4BH0%%@&OS<-3=A^4PH`Z7N^'2A^U:<)#&``LAM]\\BI!3%_Y9F? MFS@0;4H0Y0BS=UO`#>RB*/F=_R<`J&J^+VF3!(&(=FB>*'#!!G&"FL"X2]@& M61FQ!?$*7SL//_C#;:@/_SN'6_"3@P!]M_"EB.J`@_"36T#"5EK%5GS%6)S% 36KS%7-S%7OS%8!S&8IP1`<$`.P`` ` end apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/russian.xml0000644000000000000000000000046011702050534027060 0ustar rootroot
Content-Type: text/plain; charset="US-ASCII"; name==?koi8-r?B?89DJ08/LLmRvYw==?= Content-Disposition: attachment; filename==?koi8-r?B?89DJ08/LLmRvYw==?= Subject: Greetings
Salutations
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/russian.out0000644000000000000000000000030211702050534027062 0ustar rootrootContent-Type: text/plain; charset="US-ASCII"; name==?koi8-r?B?89DJ08/LLmRvYw==?= Content-Disposition: attachment; filename==?koi8-r?B?89DJ08/LLmRvYw==?= Subject: Greetings Salutations apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/simple_decoded.xml0000644000000000000000000000064311702050534030337 0ustar rootroot
Return-Path: eryq@rhine.gsfc.nasa.gov Date: Wed, 20 Dec 95 19:59 CST From: eryq@rhine.gsfc.nasa.gov To: sitaram@selsvr.stx.com Cc: johnson@killians.gsfc.nasa.gov,harvel@killians.gsfc.nasa.gov, eryq Subject: Request for Leave
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/twopart_decoded_1_1.txt0000644000000000000000000000030311702050534031216 0ustar rootrootJOY LEE;Batiment Le Rabelais 22 Ave. des Nations ZI PARIS NORD II; VILLEPINTE 93240;Greece#This is test message. Términos y Condiciones ¿Contraseña? Álbum êtes le propriétaire für geschäftliche apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/ak-0696.xml0000644000000000000000000001313211702050534026371 0ustar rootroot
Date: Thu, 20 Jun 1996 08:35:17 +0200 From: Juergen Specht <specht@kulturbox.de> Organization: KULTURBOX X-Mailer: Mozilla 2.02 (WinNT; I) MIME-Version: 1.0 To: andreas.koenig@mind.de, kun@pop.combox.de, 101762.2307@compuserve.com Subject: [Fwd: Re: 34Mbit/s Netz] Content-Type: MULTIPART/MIXED; boundary="------------70522FC73543" X-Filter: mailagent [version 3.0 PL44] for k@.in-berlin.de
This is a multi-part message in MIME format.
Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit
-- Juergen Specht - KULTURBOX
Content-Type: message/rfc822 Content-Transfer-Encoding: 7bit Content-Disposition: inline
X-POP3-Rcpt: specht@trachea Return-Path: hermes Received: (from hermes@localhost) by kulturbox.netmbx.de (8.7.1/8.7.1) id SAA04513 for specht; Wed, 19 Jun 1996 18:30:12 +0200 Received: by netmbx.netmbx.de (/\==/\ Smail3.1.28.1) from mail.cs.tu-berlin.de with smtp id <m0uWPrO-0004wpC>; Wed, 19 Jun 96 18:12 MES Received: (from nobody@localhost) by mail.cs.tu-berlin.de (8.6.12/8.6.12) id SAA12413; Wed, 19 Jun 1996 18:26:28 +0200 Resent-Date: Wed, 19 Jun 1996 18:26:28 +0200 Resent-Message-Id: <199606191626.SAA12413@mail.cs.tu-berlin.de> Resent-From: nobody@cs.tu-berlin.de Resent-To: kultur@kulturbox.netmbx.de Received: from gatekeeper.telekom.de ([194.25.15.11]) by mail.cs.tu-berlin.de (8.6.12/8.6.12) with SMTP id SAA11678 for <specht@kulturbox.de>; Wed, 19 Jun 1996 18:11:29 +0200 Received: from ULM02.mnh.telekom.de by gatekeeper.telekom.de; (5.65v3.0/1.1.8.2/02Aug95-0132PM) id AA01376; Wed, 19 Jun 1996 18:11:27 +0200 Received: from ulm02.mnh.telekom.de (deuschle@mnh.telekom.de) by ULM02.mnh.telekom.de (8.6.10/3) with SMTP id SAA30680 for <specht@kulturbox.de>; Wed, 19 Jun 1996 18:14:40 GMT Message-Id: <199606191814.SAA30680@ULM02.mnh.telekom.de> X-Sender: deuschle@ulm02.mnh.telekom.de X-Mailer: Windows Eudora Version 1.4.4 Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Date: Wed, 19 Jun 1996 18:12:02 +0200 To: Juergen Specht <specht@kulturbox.de> From: deuschle@mnh.telekom.de (Guenter Deuschle) Subject: Re: 34Mbit/s Netz X-Mozilla-Status: 0011
Hallo Herr Specht, entschuldigen Sie vorab, dass ich Ihnen nicht telefonisch zur Verfuegung stehe, ich Praesentationen gehalten/ noch zu halten und viele Kundennachfragen zu projektieren. Nach Informationen des Produkt-Managers Temme steht der POP schon zur Verf=FCgung! Standort: voraussichtlich: Winterfeldstr. 21, 10781 Berlin. Der POP hat zur Zeit direkte 34M-Anbindungen zu folgenden Orten: Rostock, Hamburg, Hannover & Leipzig. 4 weitere werden in kuerze in Betrieb gehen. Damit haben Sie einen Besonderen Sicherheitsstandard verfuegbar! Kontakt muessen Sie ueber Ihre oerltliche Vertriebseinheit aufnehmen: entweder den Geschaefts-Kunden-Vertrieb oder das GrossKundenManagement. Diese Vertriebseinheiten greifen auf den oertlichen Technischen Vertriebs-Support zu. Die Informationen werden ueber TVS zur Vertriebseiheit gegeben und dann zu Ihnen. Sie benoetigen eine Standleitung von Ihrer Lokation zum Internet-POP Uebergabepunkt zu Ihrem Info-Server ist ein CISCO 1000-Router. Dann zahlen Sie neben den monatlichen Kosten fuer die Standleitung die Kosten fuer den Internet-Zugang: zB bei 64k: 1500DM bei 2GByte Freivolumen. 128K: 3000 DM bei 5 GB Freivolumen & 2M: 30.000 DM bei 50GB Freivolumen. Freundliche Gruesse=20 Guenter Deuschle >Sehr geehrter Herr Deuschle, >Sie sind mir von Herrn Meyendriesch empfohlen worden. >Ich versuche Informationen ueber das T-eigene 34Mbit/s Netz und den=20 >lokalen Pop-Berlin rauszufinden, bzw. was ein Anschluss kostet und=20 >wo man ihn herbekommt. Laut Herrn Schnick in Berlin gibt es den=20 >T-Pop nicht, laut Traceroute von Herrn Meyendriesch sehrwohl. Auch=20 >ist dies Netz in der IX vom Mai 96 erwaehnt. >Koennen Sie mir helfen? > >MfG >--=20 >Juergen Specht - KULTURBOX > > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D Dipl.-Ing. Guenter D E U S C H L E Deutsche Telekom AG Niederlassung 3 Hannover GrossKundenManagement - Techn. Vertriebs-Support: Team-Leiter Internet Online-Dienste --------------------------------------------------- GrKM-TVS-IOD Tel: +49-511-333-2772 Vahrenwalder-Str. 245 FAX: +49-511-333-2751 30179 Hannover eMail: deuschle@mnh.telekom.de=20 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/lennie_decoded_1_1.txt0000644000000000000000000000007711702050534031000 0ustar rootrootThis is the message body. A picture should also be displayed. apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-nested3.xml0000644000000000000000000001014711702050534030074 0ustar rootroot
MIME-Version: 1.0 From: Lord John Whorfin <whorfin@yoyodyne.com> To: <john-yaya@yoyodyne.com> Subject: A complex nested multipart example Content-Type: multipart/mixed; boundary=unique-boundary-1
The preamble of the outer multipart message. Mail readers that understand multipart format should ignore this preamble. If you are reading this text, you might want to consider changing to a mail reader that understands how to properly display multipart messages.
Part 1 of the outer message. [Note that the preceding blank line means no header fields were given and this is text, with charset US ASCII. It could have been done with explicit typing as in the next part.]
Content-type: text/plain; charset=US-ASCII
Part 2 of the outer message. This could have been part of the previous part, but illustrates explicit versus implicit typing of body parts.
Subject: Part 3 of the outer message is multipart! Content-Type: multipart/parallel; boundary=unique-boundary-2
A one-line preamble for the inner multipart message.
Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-vise.gif" Subject: Part 1 of the inner message is a GIF, "3d-vise.gif"
R0lGODdhKAAoAOMAAAAAAAAAgB6Q/y9PT25ubnCAkKBSLb6+vufn5/Xes/+lAP/6zQAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJLMOyYbcoxkaZ5oCkoH6L5wLMfiWqd4btZhmxbA oFCY47EIqMJgyWw2ATjj7aRkAq5YwDMl9VGtKO0SiuoiTVlscsxt9c4HgXxUIA0EAVOVfDKT 8Hl1B3kDAYYle202XnGGgoMHhYckiWVuR3+OTgCGeZRslotwgJ2lnYigfZdTjQULr7ALBZN0 qTurjHgLKAu0B5Wqopm7J72etQN8t8Ijury+wMtvw8/Hv7Ylfs0BxCbGqMmK0yOOQ0GTCgrR 2bhwJGlXJQYG6mMKoeNoWSbzCWIACe5JwxQm3AkDAbUAQCiQhDZEBeBl6afgCsOBrD45edIv QceGWSMevpOYhl6CkydBHhBZQmGKjihVshypjB9ClAHZMTugzOU7mzhBPiSZ5uDNnA7b/aTZ 0mhMnfl0pDBFa6bUElSPWb0qtYuHrxlwcR17YsWMs2jTql3LFkQEADs=
Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-eye.gif" Subject: Part 2 of the inner message is another GIF, "3d-eye.gif"
R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7 VujnC96IRVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7 +3dCeRRjfAKHiImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatL rU8GaQdOBAQAB7+yXliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJ vs7Y5ewH3d7Fxe3jB4rj8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjw E0cdGxQ/gswosoKUkmuU2FnJcsSKGTBjypxJsyaICAA7
The epilogue for the inner multipart message.
Content-type: text/richtext
This is <bold>part 4 of the outer message</bold> <smaller>as defined in RFC1341</smaller><nl> <nl> Isn't it <bigger><bigger>cool?</bigger></bigger>
Content-Type: message/rfc822; name="nice.name";
From: (mailbox in US-ASCII) To: (address in US-ASCII) Subject: Part 5 of the outer message is itself an RFC822 message! Content-Type: Text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: Quoted-printable
Part 5 of the outer message is itself an RFC822 message!
The epilogue for the outer message.
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/double-semicolon2.out0000644000000000000000000000037511702050534030732 0ustar rootrootMime-Version: 1.0 Content-Type: multipart/alternative ; ; ; ;; ;;;;;;;; boundary="foo" Preamble --foo Content-Type: text/plain; charset=us-ascii The better part --foo Content-Type: text/plain; charset=us-ascii The worse part --foo-- apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-nested3_decoded_1_4.txt0000644000000000000000000000023011702050534032215 0ustar rootrootThis is part 4 of the outer message as defined in RFC1341 Isn't it cool? apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-simple_decoded_1_2.txt0000644000000000000000000000011311702050534032137 0ustar rootrootThis is explicitly typed plain ASCII text. It DOES end with a linebreak. apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/german.out0000644000000000000000000001001511702050534026651 0ustar rootrootX-POP3-Rcpt: specht@trachea Return-Path: hermes Received: (from hermes@localhost) by kulturbox.netmbx.de (8.7.1/8.7.1) id SAA04513 for specht; Wed, 19 Jun 1996 18:30:12 +0200 Received: by netmbx.netmbx.de (/\==/\ Smail3.1.28.1) from mail.cs.tu-berlin.de with smtp id ; Wed, 19 Jun 96 18:12 MES Received: (from nobody@localhost) by mail.cs.tu-berlin.de (8.6.12/8.6.12) id SAA12413; Wed, 19 Jun 1996 18:26:28 +0200 Resent-Date: Wed, 19 Jun 1996 18:26:28 +0200 Resent-Message-Id: <199606191626.SAA12413@mail.cs.tu-berlin.de> Resent-From: nobody@cs.tu-berlin.de Resent-To: kultur@kulturbox.netmbx.de Received: from gatekeeper.telekom.de ([194.25.15.11]) by mail.cs.tu-berlin.de (8.6.12/8.6.12) with SMTP id SAA11678 for ; Wed, 19 Jun 1996 18:11:29 +0200 Received: from ULM02.mnh.telekom.de by gatekeeper.telekom.de; (5.65v3.0/1.1.8.2/02Aug95-0132PM) id AA01376; Wed, 19 Jun 1996 18:11:27 +0200 Received: from ulm02.mnh.telekom.de (deuschle@mnh.telekom.de) by ULM02.mnh.telekom.de (8.6.10/3) with SMTP id SAA30680 for ; Wed, 19 Jun 1996 18:14:40 GMT Message-Id: <199606191814.SAA30680@ULM02.mnh.telekom.de> X-Sender: deuschle@ulm02.mnh.telekom.de X-Mailer: Windows Eudora Version 1.4.4 Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Date: Wed, 19 Jun 1996 18:12:02 +0200 To: Juergen Specht From: deuschle@mnh.telekom.de (Guenter Deuschle) Subject: Re: 34Mbit/s Netz X-Mozilla-Status: 0011 Hallo Herr Specht, entschuldigen Sie vorab, dass ich Ihnen nicht telefonisch zur Verfuegung stehe, ich Praesentationen gehalten/ noch zu halten und viele Kundennachfragen zu projektieren=2E Nach Informationen des Produkt-Manager= s Temme steht der POP schon zur Verf=FCgung! Standort: voraussichtlich: Winterfeldstr=2E 21, 10781 Berlin=2E Der POP hat zur Zeit direkte 34M-Anbindungen zu folgenden Orten: Rostock, Hamburg, Hannover & Leipzig=2E 4 weitere werden in kuerze in Betrieb gehen= =2E Damit haben Sie einen Besonderen Sicherheitsstandard verfuegbar! Kontakt muessen Sie ueber Ihre oerltliche Vertriebseinheit aufnehmen: entweder den Geschaefts-Kunden-Vertrieb oder das GrossKundenManagement=2E Diese Vertriebseinheiten greifen auf den oertlichen Technischen Vertriebs-Support zu=2E Die Informationen werden ueber TVS zur Vertriebsei= heit gegeben und dann zu Ihnen=2E Sie benoetigen eine Standleitung von Ihrer Lokation zum Internet-POP Uebergabepunkt zu Ihrem Info-Server ist ein CISCO 1000-Router=2E Dann zahl= en Sie neben den monatlichen Kosten fuer die Standleitung die Kosten fuer den Internet-Zugang: zB bei 64k: 1500DM bei 2GByte Freivolumen=2E 128K: 3000 D= M bei 5 GB Freivolumen & 2M: 30=2E000 DM bei 50GB Freivolumen=2E Freundliche Gruesse=20 Guenter Deuschle >Sehr geehrter Herr Deuschle, >Sie sind mir von Herrn Meyendriesch empfohlen worden=2E >Ich versuche Informationen ueber das T-eigene 34Mbit/s Netz und den=20 >lokalen Pop-Berlin rauszufinden, bzw=2E was ein Anschluss kostet und=20 >wo man ihn herbekommt=2E Laut Herrn Schnick in Berlin gibt es den=20 >T-Pop nicht, laut Traceroute von Herrn Meyendriesch sehrwohl=2E Auch=20 >ist dies Netz in der IX vom Mai 96 erwaehnt=2E >Koennen Sie mir helfen? > >MfG >--=20 >Juergen Specht - KULTURBOX > > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D Dipl=2E-Ing=2E Guenter D E U S C H L E Deutsche Telekom AG Niederlassung 3 Hannover GrossKundenManagement - Techn=2E Vertriebs-Support: Team-Leiter Internet Online-Dienste --------------------------------------------------- GrKM-TVS-IOD Tel: +49-511-333-2772 Vahrenwalder-Str=2E 245 FAX: +49-511-333-2751 30179 Hannover eMail: deuschle@mnh=2Etelekom=2Ede=20 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/empty-preamble_decoded_1_2.binapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/empty-preamble_decoded_1_2.bi0000644000000000000000000000024011702050534032215 0ustar rootroot‰PNG  IHDRýÔšs pHYs  šœtIMEÔ4U¶û]tEXtCommentCreated with The GIMPïd%nIDATxÚcüÿÿ?$þé–¬IEND®B`‚././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/uu-junk-target_decoded_1_2_2.binapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/uu-junk-target_decoded_1_2_2.0000644000000000000000000000015611702050534032070 0ustar rootrootGIF87a¡ÿÿÿ€€€ÀÀÀ,G„™ÁíÏLPˆ æØ¼oqI€G ¦•Ý)’Çfc׬¡L;\œÐkº¥~Œ j¦ú‘ISåLî– ªõŠºj­("±>;apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/infinite.out0000644000000000000000000001264711702050534027222 0ustar rootrootContent-Type: TEXT/PLAIN; name=109f53c446c8882f4318316ecf4480ce Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: UmV0dXJuLVBhdGg6IDxvd25lci1jYWNvbXAtbEBsaW5mLnVuYi5icj4NClJlY2VpdmVkOiBmcm9t IGVpZmZlbC5iYXNlLmNvbS5iciBieSBtYWlsYnIxLm1haWxici5jb20uYnIgOyBUaHUsIDA1IE5v diAxOTk4IDIyOjU4OjIzICswMDANClJlY2VpdmVkOiBmcm9tIG1hcmNvbmkuYmFzZS5jb20uYnIg KFsyMDAuMjQwLjEwLjU1XSkgYnkgZWlmZmVsLmJhc2UuY29tLmJyDQogICAgICAgICAgKE5ldHNj YXBlIE1haWwgU2VydmVyIHYyLjApIHdpdGggRVNNVFAgaWQgQURINDkxDQogICAgICAgICAgZm9y IDxhY2VjaWxpYUBtYWlsYnIuY29tLmJyPjsgVGh1LCA1IE5vdiAxOTk4IDIxOjU1OjI0IC0wMjAw DQpSZWNlaXZlZDogZnJvbSBrZXBsZXIuYmFzZS5jb20uYnIgKFsyMDAuMjQwLjEwLjEwNF0pIGJ5 IG1hcmNvbmkuYmFzZS5jb20uYnINCiAgICAgICAgICAoTmV0c2NhcGUgTWFpbCBTZXJ2ZXIgdjIu MCkgd2l0aCBFU01UUCBpZCBBQUU2ODY7DQogICAgICAgICAgV2VkLCA0IE5vdiAxOTk4IDE0OjAw OjEwIC0wMjAwDQpSZWNlaXZlZDogZnJvbSBjeXJpdXMubGluZi51bmIuYnIgKFsxNjQuNDEuMTIu NF0pIGJ5IGtlcGxlci5iYXNlLmNvbS5icg0KICAgICAgICAgIChQb3N0Lk9mZmljZSBNVEEgdjMu NSByZWxlYXNlIDIxNSBJRCMgMC0wVTEwTDJTMTAwKSB3aXRoIFNNVFANCiAgICAgICAgICBpZCBi cjsgV2VkLCA0IE5vdiAxOTk4IDEzOjUzOjQ3IC0wMjAwDQpSZWNlaXZlZDogZnJvbSBzZW5kbWFp bCBieSBjeXJpdXMubGluZi51bmIuYnIgd2l0aCBlc210cA0KCWlkIDB6YjVJOS0wMDAzb00tMDA7 IFdlZCwgNCBOb3YgMTk5OCAxMzo1NjoxNyAtMDIwMA0KUmVjZWl2ZWQ6IGZyb20gbG9jYWxob3N0 IChtYWpvcmRvbUBsb2NhbGhvc3QpDQoJYnkgY3lyaXVzLmxpbmYudW5iLmJyICg4LjguNy84Ljgu Nykgd2l0aCBTTVRQIGlkIE5BQTE0NjM5Ow0KCVdlZCwgNCBOb3YgMTk5OCAxMzo1NDo1NCAtMDIw MCAoRURUKQ0KUmVjZWl2ZWQ6IGJ5IGxpbmYudW5iLmJyIChidWxrX21haWxlciB2MS42KTsgV2Vk LCA0IE5vdiAxOTk4IDEzOjU0OjU0IC0wMjAwDQpSZWNlaXZlZDogKGZyb20gbWFqb3Jkb21AbG9j YWxob3N0KQ0KCWJ5IGN5cml1cy5saW5mLnVuYi5iciAoOC44LjcvOC44LjcpIGlkIE5BQTE0NjMw DQoJZm9yIGNhY29tcC1sLW91dHRlcjsgV2VkLCA0IE5vdiAxOTk4IDEzOjU0OjUzIC0wMjAwIChF RFQpDQpSZWNlaXZlZDogKGZyb20gc2VuZG1haWxAbG9jYWxob3N0KQ0KCWJ5IGN5cml1cy5saW5m LnVuYi5iciAoOC44LjcvOC44LjcpIGlkIE5BQTE0NjIzDQoJZm9yIGNhY29tcC1sQGxpbmYudW5i LmJyOyBXZWQsIDQgTm92IDE5OTggMTM6NTQ6NTAgLTAyMDAgKEVEVCkNClJlY2VpdmVkOiBmcm9t IGJyYXNpbGlhLm1wZGZ0Lmdvdi5iciBbMjAwLjI1Mi44NS4yXSANCglieSBjeXJpdXMubGluZi51 bmIuYnIgd2l0aCBlc210cA0KCWlkIDB6YjVGei0wMDAzbEYtMDA7IFdlZCwgNCBOb3YgMTk5OCAx Mzo1NDoyOCAtMDIwMA0KUmVjZWl2ZWQ6IGZyb20gbG9jYWxob3N0IChsYmVja2VyQGxvY2FsaG9z dCkNCglieSBicmFzaWxpYS5tcGRmdC5nb3YuYnIgKDguOC41LzguOC44KSB3aXRoIEVTTVRQIGlk IE5BQTAyNTcxDQoJZm9yIDxjYWNvbXAtbEBsaW5mLnVuYi5icj47IFdlZCwgNCBOb3YgMTk5OCAx MzozNjoxNCAtMDIwMCAoRURUKQ0KCShlbnZlbG9wZS1mcm9tIGxiZWNrZXJAYnJhc2lsaWEubXBk ZnQuZ292LmJyKQ0KRGF0ZTogV2VkLCA0IE5vdiAxOTk4IDEzOjM2OjE0IC0wMjAwIChFRFQpDQpG cm9tOiBMdWxhIEJlY2tlciA8bGJlY2tlckBicmFzaWxpYS5tcGRmdC5nb3YuYnI+DQpUbzogY2Fj b21wLWxAbGluZi51bmIuYnINClN1YmplY3Q6IFtjYWNvbXAtbF0gPT8/UT9SZT0zQV89NUJjYWNv bXAtbD01RF9FX249M0FfQnJhcz1FRGxpYV9jb2JyZT89DQpJbi1SZXBseS1UbzogPFBpbmUuU1VO LjMuOTEuOTgxMTAzMjM1OTQzLjIyNDFFLTEwMDAwMEBhbnRhcmVzLmxpbmYudW5iLmJyPg0KTWVz c2FnZS1JRDogPFBpbmUuQlNGLjMuOTYuOTgxMTA0MTMzNTQ3LjI1MzJCLTEwMDAwMEBicmFzaWxp YS5tcGRmdC5nb3YuYnI+DQpNSU1FLVZlcnNpb246IDEuMA0KQ29udGVudC1UeXBlOiBURVhUL1BM QUlOOyBjaGFyc2V0PQ0KWC1NSU1FLUF1dG9jb252ZXJ0ZWQ6IGZyb20gOGJpdCB0byBxdW90ZWQt cHJpbnRhYmxlIGJ5IGJyYXNpbGlhLm1wZGZ0Lmdvdi5iciBpZCBOQUEwMjU3MQ0KQ29udGVudC1U cmFuc2Zlci1FbmNvZGluZzogOGJpdA0KWC1NSU1FLUF1dG9jb252ZXJ0ZWQ6IGZyb20gcXVvdGVk LXByaW50YWJsZSB0byA4Yml0IGJ5IGN5cml1cy5saW5mLnVuYi5iciBpZCBOQUIxNDYyMw0KU2Vu ZGVyOiBvd25lci1jYWNvbXAtbEBsaW5mLnVuYi5icg0KUmVwbHktVG86IGNhY29tcC1sQGxpbmYu dW5iLmJyDQpQcmVjZWRlbmNlOiBidWxrDQpYLVJjcHQtVG86IDxhY2VjaWxpYUBtYWlsYnIuY29t LmJyDQpYLURQT1A6IERQT1AgVmVyc2lvbiAyLjNkDQpYLVVJREw6IDkxMDM4NjgxNi4wMDQNClN0 YXR1czogUk8NCg0KDQoNCglDb21vIGFzc2ltLCBkYWggdW0gZXhlbXBsby4gRGVpeGFuZG8gYSBj b250YSBhYmVydGEsIG5laCwgRnJlZC4uLg0KDQoJDQoNCk9uIFdlZCwgNCBOb3YgMTk5OCwgRnJl ZGVyaWNvIE5hcmRvdHRvIHdyb3RlOg0KDQo+IFBvcnF1ZSBldSBzb3UgZWggZm9kYS4uLi4gDQo+ IFByZWdvIGVoIG8gY2FyYWxobywgVmMgbmFvIG1lIGNvbmhlY2UgcGFyYSBmaWNhciBmYWxhbmRv IGFzc2ltLi4uIE5hbyANCj4gc2FiZSBkZSBvbmRlIGV1IHZpbSwgcXVlbSBzb3UsIG91IHNlamEs IFBPUlJBIE5FTkhVTUEuLi4NCj4gDQo+IFZBSSBUT01BUiBOTyBDVSBFIE1FIERFSVhBIEVNIFBB WiEhISEhISENCj4gDQo+IE9uIFR1ZSwgMyBOb3YgMTk5OCwgR3VpbGhlcm1lIE9saXZpZXJpIENh aXhldGEgQm9yZ2VzIHdyb3RlOg0KPiANCj4gPiBT82NyYXRlcywNCj4gPiANCj4gPiAgICAgcG9y cXVlIHZvY+ogZmF6IHRhbnRhIHF1ZXN0428gZGUgc2UgaW5kaXNwb3IgY29tIFRPRE8gTVVORE8h ISEgSuEgbuNvIGJhc3Rhc3NlDQo+ID4gbWVpYSBjb21wdXRh5+NvIHRlIGFjaGFyIHVtIHByZWdv LCB2b2PqIHJlc29sdmUgYW1wbGlhciBlc3RlIHVuaXZlcnNvIHBhcmEgb3V0cmFzDQo+ID4gcGVz c29hcy4uLiBNYW7pIQ0KPiA+IA0KPiA+IFNvY3JhdGVzIEFyYW50ZXMgVGVpeGVpcmEgRmlsaG8g KDk3LzE4NDQzKSB3cm90ZToNCj4gPiANCj4gPiA+ICAgICAgVm9j6iB0ZW0gcXVlIHZlciBxdWUg cGFjaepuY2lhIHRlbSBsaW1pdGUuIEV1IGFn/GVudGVpIG8gbeF4aW1vDQo+ID4gPiBwb3Nz7XZl bCBlbGUgZmljYXIgZXNjcmV2ZW5kbyBlc3NhcyBidXJyaWNlcyBuYSBub3NzYSBzYWxhIGRlIGRp c2N1cnPjby4NCj4gPiA+IENvbSBnZW50ZSBpZ25vcmFudGUgY29tbyBlbGUsIHF1ZSB1bSByb3Jp emlzdGEgY2VnbywgbvNzIHPzIGNvbnNlZ3VpbW9zDQo+ID4gDQo+ID4gICAgIEVtIHNlIGZhbGFu ZG8gZGUgaWdub3LibmNpYTog6SBiZW0gdmVyZGFkZSBxdWUgb3MgbWFpbHMgZGEgY2Fjb21wIGVz dONvIGF0aW5naW5kbw0KPiA+IHByb3Bvcuf1ZXMgZGFudGVzY2FzLCBtYXMgbyBjZXJ0byDpIERJ U0NVU1PDTy4NCj4gPiANCj4gPiBTZW0gbWFpcywNCj4gPiANCj4gPiAtLQ0KPiA+IEd1aWxoZXJt ZSBPbGl2aWVyaSBDYWl4ZXRhIEJvcmdlcw0KPiA+ICoqKioqKioqKioqKioqKioqKioqKioqKioq DQo+ID4gV2ViIERlc2lnbiAtIFZpYSBJbnRlcm5ldA0KPiA+ICgwNjEpIDMxNS05NjU3IC8gOTY0 LTkxOTkNCj4gPiBndWlib3JnZXNAYnJhc2lsaWEuY29tLmJyDQo+ID4gZ3VpYm9yZ2VzQHZpYS1u ZXQuY29tLmJyDQo+ID4gKioqKioqKioqKioqKioqKioqKioqKioqKioNCj4gPiANCj4gPiANCj4g PiANCj4gPiANCj4gPiANCj4gDQo+IA0KDQoNCg== apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/lennie.xml0000644000000000000000000001023311702050534026645 0ustar rootroot
Return-Path: <lbj_ccsi@atl.mindspring.com> Received: from brickbat8.mindspring.com (brickbat8.mindspring.com [207.69.200.11]) by camel10.mindspring.com (8.8.5/8.8.5) with ESMTP id GAA27894 for <lbj_ccsi@atl.mindspring.com>; Fri, 25 Jul 1997 06:58:07 -0400 (EDT) Received: from lennie (user-2k7i8oq.dialup.mindspring.com [168.121.35.26]) by brickbat8.mindspring.com (8.8.5/8.8.5) with SMTP id GAA22488 for <lbj_ccsi@atl.mindspring.com>; Fri, 25 Jul 1997 06:58:05 -0400 (EDT) Message-ID: <33D89532.29EA@atl.mindspring.com> Date: Fri, 25 Jul 1997 06:59:46 -0500 From: Lennie Jarratt <lbj_ccsi@mindspring.com> Reply-To: lbj_ccsi@mindspring.com Organization: Custom Computer Services Inc. X-Mailer: Mozilla 3.01Gold (Win95; I) MIME-Version: 1.0 To: lbj_ccsi@atl.mindspring.com Subject: Test Mail Again Content-Type: multipart/mixed; boundary="------------52E03A8932B4"
This is a multi-part message in MIME format.
Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit
This is the message body. A picture should also be displayed.
Content-Type: text/html; charset=us-ascii; name="Pull3.html" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="Pull3.html" Content-Base: "file:///E|/ChckFree/Html/Pull3.html"
<BASE HREF="file:///E|/ChckFree/Html/Pull3.html"> <HTML> <HEAD> <TITLE>Client Pull Rolling Page Demo></TITLE> <META HTTP-EQUIV="REFRESH" CONTENT="10; URL=Pull1.html"> </HEAD> <BODY> This is Page 3 of my rolling web page demo. </BODY> </HTML>
Content-Type: image/gif; name="WWWIcon.gif" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="WWWIcon.gif"
R0lGODdhPAA8AOYAAP///+/v7+fv7+/39/f//9be3r3O1rXGzsbW3qW1va29xoyltXOMnGuE lClSa4ScrXuUpUJje1p7lFJzjEprhDlacxhCYylScyFKaxA5WggxUgApSt7n773GzpytvZSl tWuEnM7W3sbO1q29zqW1xoycrYSUpWN7lFpzjFJrhEJjhDlaezFScylKayFCYwgxWgApUtbe 5yFCaxg5YxAxWggpUpSlvXOEnFpzlFJrjEpjhEJaezlSc3uMpYyctYSUrb3G1sbO3qWtvbW9 zq21xufn79bW3t7e5wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAPAA8AAAH/4AAgoOEhYaHiImKi4yNjo+QkZKTlJWW l5iZmpucnZ6foKGinSIfJxEtMzMtEScfIqOKRwsUMy4YLQ4sLA4tGC4zFAtHsYQBCysWLSwr KhQ5Eyg5FCorLC0WKwsBxUAoyhU6KA0MEA8lJQ8QDCcoOhXYKECjQhUyLDo4DA8fQkRDAIcQ EfLhAQMcOljIqCAklI0WLVZMAPHAA5EDBoKE2BgCgYEDRDw8ADFhBUQbnzxgwLACBQMfCYYA QRCiQIybMYx0NDAkgQ8GKFas9NCpAwsLLChQ9KAAowiaHDcGEfFRgUgQFI6y6LBJQA4aLnjk APHjgwcSRBSMGLI24AgFRP9IePjwA0SOCi5o5BCgqQQMsEkl3Ohh4seDc+gSJz5sAsKNE1nz wiiRKUYLGBoy3Nuhg0KKHNAmiB6NYjRoCjp2KMygAUaLGJj8woDxIoMFGRBz6drFu7eDXhAx WMjwYvZkTCuMY35BI4Pz59CjR6fxorXxFZg4bNgxCIYMQydqwALwQ0OCQkVgROjuQtOGE4Nc cBc0/gcMDoKEwBg/HgAM+ILIpwkLJgyyA4AAjCDICBsMYsAG+CU4CIEGInjJDkQJckKBABjA oQHtCaKdgQZmCMCGmphgwCAmKNghgvMJwoKBEarIoouYmBDCIAusCMACMaZAiJCC0OCjjjz6 iIn/j/gpaQINDgIQoZIbLCAIkx1usmOWWwKQQoOC7OjjliFswOGWK3a5iYUA7LCBkj+q+WCM GoJCJwA0bIAjADbyuMGMhNypyYOFbGBmoBwKYoKhhBDqyQgwDDAIB7PdQAgLlg5ywmySLhjp IASkuN8gIsy2XnenChLBbP3ZB+clshlXgwYvMEcDdbXmquutuGpQg3LHXWKZcbRmMIMFFriA 7LLMLqusBTMQZ51rsMU2Ww21WYBLb7v89hu318gw3Au/BouJABRgRoO2LFSwQwTwxiuvvDtU wIJwNLRGAV+adNCCBjTMgAEzEajQGQUIJ5ywDipEYC8GM+TbAleceDBDkmbKtPuuDgcrzHEE O1iDDWszmMjJBxcb68IyzKyww7sgh2zNNcCQ/EEoHvxb27G4QbQbcC2IG211LZj8SQcpYEZr c6ocC60qGVCnQWspUDyKACVcIOvUXHNdLgwXlMBvMQDEUMIOwKYNww4lVEt2IQaUgAILM8w2 AwsolPDq23z37fffgAcu+OCEF2744YgnXnggADs=
././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-badnames_decoded_1_2.txtapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-badnames_decoded_1_2.tx0000644000000000000000000000011211702050534032233 0ustar rootrootThis is explicitly typed plain ASCII text. It DOES end with a linebreak. apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/frag_decoded_1_1.txt0000644000000000000000000000000211702050534030431 0ustar rootroot apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/re-fwd.out0000644000000000000000000000145411702050534026573 0ustar rootrootContent-Disposition: inline Content-Transfer-Encoding: binary Content-Type: message/rfc822 MIME-Version: 1.0 X-Mailer: MIME::Lite 1.147 (B2.09; Q2.03) Date: Tue, 6 Jun 2000 03:20:11 UT From: user2 To: user0 Subject: Re: Fwd: hello world Content-Disposition: inline Content-Transfer-Encoding: binary Content-Type: message/rfc822 MIME-Version: 1.0 X-Mailer: MIME::Lite 1.147 (B2.09; Q2.03) Date: Tue, 6 Jun 2000 03:20:11 UT From: user1 To: user2 Subject: Fwd: hello world Content-Disposition: inline Content-Length: 60 Content-Transfer-Encoding: binary Content-Type: text/plain MIME-Version: 1.0 X-Mailer: MIME::Lite 1.147 (B2.09; Q2.03) Date: Tue, 6 Jun 2000 03:20:11 UT From: user0 To: user1 Subject: hello world This is the original message. Let's see if we can embed it! apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/double-bound_decoded_1_5.txt0000644000000000000000000000000011702050534032073 0ustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-nested_decoded_1_2.txt0000644000000000000000000000022011702050534032127 0ustar rootrootPart 2 of the outer message. This could have been part of the previous part, but illustrates explicit versus implicit typing of body parts. apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/x-gzip64.out0000644000000000000000000000100511702050534026767 0ustar rootrootContent-Type: text/plain; name=".signature" Content-Disposition: inline; filename=".signature" Content-Transfer-Encoding: x-gzip64 Mime-Version: 1.0 X-Mailer: MIME-tools 3.204 (ME 3.204 ) Subject: Testing! Content-Length: 281 H4sIAJ+A5jIAA0VPTWvDMAy9+1e8nbpCsS877bRS1vayXdJDDwURbJEEEqez VdKC6W+fnQ0iwdN7ktAHQEQAzV7irAv9DI8fvHLGD/bCobai7TisFUyuXxJW lDB70aucxfHWtBxRnc4bfG+rrTmMztXBobrWlrHvu6YV7LwErVLZZP4n0IJA K3J9N2aaJj3YqD2LeZYzFC75tlTaCtsg/SGRwmJZklnI1wOxa3wtt8Dgu2V2 EdIyAudnBvaOHd7Qd57ji/oFWju6Pg4BAAA= apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/bluedot-postcard.msg0000644000000000000000000001564611702050534030651 0ustar rootrootContent-Type: multipart/alternative; boundary="----------=_961872013-1436-0" Content-Transfer-Encoding: binary Mime-Version: 1.0 X-Mailer: MIME-tools 5.211 (Entity 5.205) To: noone Subject: A postcard for you This is a multi-part message in MIME format... ------------=_961872013-1436-0 Content-Type: text/plain Content-Disposition: inline Content-Transfer-Encoding: binary Having a wonderful time... wish you were looking at HTML instead of this boring text! ------------=_961872013-1436-0 Content-Type: multipart/related; boundary="----------=_961872013-1436-1" Content-Transfer-Encoding: binary This is a multi-part message in MIME format... ------------=_961872013-1436-1 Content-Type: text/html Content-Disposition: inline Content-Transfer-Encoding: binary

Hey there!

Having a wonderful time... take a look!
Snapshot
------------=_961872013-1436-1 Content-Type: image/jpeg; name="bluedot.jpg" Content-Disposition: inline; filename="bluedot.jpg" Content-Transfer-Encoding: base64 Content-Id: my-graphic /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsL DBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/ 2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAEAAQADASIAAhEBAxEB/8QA HwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUF BAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkK FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1 dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXG x8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEB AQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAEC AxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRom JygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU 1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iiigAoo ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKjnnhtbeW4uJY4YIkLySSMF VFAySSeAAOc0ASUVw+p/E3TY1MeiW0uqzgkb8NBbjB6+ay/MCM4MauDgZIBB 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 KOGCJAkccahVRQMAADgADjFeFjM2veFD7/8AL/M+qy7h+zVXFf8AgP8An/l/ wxDp2nWmk6fDY2MCw20IwiAk9Tkkk8kkkkk5JJJJJNWqKK8I+r2CiiigAooo oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDlNY+H2iarcPdQef pd1I5eWawKp5pJJJZGVkLEnJfbvOAN2OK5O88AeJ7PJt5dN1ONV3kqXtZCf7 iod6k8cEyKCTg4AyfV6K6aOLr0dIS0OLEZdhcRrVgm++z+9HiU2j+IrWJprr wzqccK/edDDORngfJFI7nn0U46nABNVP9L/6A2uf+Ce6/wDjde8UV2RzjELd J/L/AIJ5suHMG3o5L5r9UeEJHfzSLHFomttI5CoraZPGCT0BZ0Cr9WIA7kCt GHwx4ruZViXw7JbFv+Wt3dwLEvf5jG7t7DCnkjOBkj2ailLN8Q9rL5f5lQ4d wcd7v1f+SR5xYfDK7lkR9Z1lTCQGe2sITGc8ZQzMxJXGRlVRjwQV6V2ukeH9 I0GN00rTra0MgUSvHGA8u3ODI/3nPJ5Yk5JOeTWlRXBVr1KrvUdz1aGFo4dW pRSCiiisjoCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA//Z ------------=_961872013-1436-1-- ------------=_961872013-1436-0-- apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-igor2.xml0000644000000000000000000002576311702050534027563 0ustar rootroot
Date: Thu, 6 Jun 1996 15:50:39 +0400 (MOW DST) From: Starovoitov Igor <igor@fripp.aic.synapse.ru> To: eryq@rhine.gsfc.nasa.gov Subject: Need help MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="-490585488-806670346-834061839=:2195"
This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. Send mail to mime@docserver.cac.washington.edu for more info.
Content-Type: TEXT/PLAIN; charset=US-ASCII
Dear Sir, I have a problem with Your MIME-Parser-1.9 and multipart-nested messages. Not all parts are parsed. Here my Makefile, Your own multipart-nested.msg and its out after "make test". Some my messages not completely parsed too. Is this a bug? Thank You for help. Igor Starovoytov.
Content-Type: TEXT/PLAIN; charset=US-ASCII; name=Makefile Content-Transfer-Encoding: BASE64 Content-ID: <Pine.LNX.3.91.960606155039.2195B@fripp.aic.synapse.ru> Content-Description: Makefile
Iy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQ0KIyBNYWtlZmlsZSBmb3IgTUlNRTo6DQojLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tDQoNCiMgV2hlcmUgdG8gaW5zdGFsbCB0aGUgbGlicmFy aWVzOg0KU0lURV9QRVJMID0gL3Vzci9saWIvcGVybDUNCg0KIyBXaGF0IFBl cmw1IGlzIGNhbGxlZCBvbiB5b3VyIHN5c3RlbSAobm8gbmVlZCB0byBnaXZl IGVudGlyZSBwYXRoKToNClBFUkw1ICAgICA9IHBlcmwNCg0KIyBZb3UgcHJv YmFibHkgd29uJ3QgbmVlZCB0byBjaGFuZ2UgdGhlc2UuLi4NCk1PRFMgICAg ICA9IERlY29kZXIucG0gRW50aXR5LnBtIEhlYWQucG0gUGFyc2VyLnBtIEJh c2U2NC5wbSBRdW90ZWRQcmludC5wbQ0KU0hFTEwgICAgID0gL2Jpbi9zaA0K DQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tDQojIEZvciBpbnN0YWxsZXJzLi4uDQojLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tDQoNCmhlbHA6CQ0KCUBlY2hvICJWYWxpZCB0YXJnZXRz OiB0ZXN0IGNsZWFuIGluc3RhbGwiDQoNCmNsZWFuOg0KCXJtIC1mIHRlc3Rv dXQvKg0KDQp0ZXN0Og0KIwlAZWNobyAiVEVTVElORyBIZWFkLnBtLi4uIg0K Iwkke1BFUkw1fSBNSU1FL0hlYWQucG0gICA8IHRlc3Rpbi9maXJzdC5oZHIg ICAgICAgPiB0ZXN0b3V0L0hlYWQub3V0DQojCUBlY2hvICJURVNUSU5HIERl Y29kZXIucG0uLi4iDQojCSR7UEVSTDV9IE1JTUUvRGVjb2Rlci5wbSA8IHRl c3Rpbi9xdW90LXByaW50LmJvZHkgPiB0ZXN0b3V0L0RlY29kZXIub3V0DQoj CUBlY2hvICJURVNUSU5HIFBhcnNlci5wbSAoc2ltcGxlKS4uLiINCiMJJHtQ RVJMNX0gTUlNRS9QYXJzZXIucG0gPCB0ZXN0aW4vc2ltcGxlLm1zZyAgICAg ID4gdGVzdG91dC9QYXJzZXIucy5vdXQNCiMJQGVjaG8gIlRFU1RJTkcgUGFy c2VyLnBtIChtdWx0aXBhcnQpLi4uIg0KIwkke1BFUkw1fSBNSU1FL1BhcnNl ci5wbSA8IHRlc3Rpbi9tdWx0aS0yZ2lmcy5tc2cgPiB0ZXN0b3V0L1BhcnNl ci5tLm91dA0KCUBlY2hvICJURVNUSU5HIFBhcnNlci5wbSAobXVsdGlfbmVz dGVkLm1zZykuLi4iDQoJJHtQRVJMNX0gTUlNRS9QYXJzZXIucG0gPCB0ZXN0 aW4vbXVsdGktbmVzdGVkLm1zZyA+IHRlc3RvdXQvUGFyc2VyLm4ub3V0DQoJ QGVjaG8gIkFsbCB0ZXN0cyBwYXNzZWQuLi4gc2VlIC4vdGVzdG91dC9NT0RV TEUqLm91dCBmb3Igb3V0cHV0Ig0KDQppbnN0YWxsOg0KCUBpZiBbICEgLWQg JHtTSVRFX1BFUkx9IF07IHRoZW4gXA0KCSAgICBlY2hvICJQbGVhc2UgZWRp dCB0aGUgU0lURV9QRVJMIGluIHlvdXIgTWFrZWZpbGUiOyBleGl0IC0xOyBc DQogICAgICAgIGZpICAgICAgICAgIA0KCUBpZiBbICEgLXcgJHtTSVRFX1BF Ukx9IF07IHRoZW4gXA0KCSAgICBlY2hvICJObyBwZXJtaXNzaW9uLi4uIHNo b3VsZCB5b3UgYmUgcm9vdD8iOyBleGl0IC0xOyBcDQogICAgICAgIGZpICAg ICAgICAgIA0KCUBpZiBbICEgLWQgJHtTSVRFX1BFUkx9L01JTUUgXTsgdGhl biBcDQoJICAgIG1rZGlyICR7U0lURV9QRVJMfS9NSU1FOyBcDQogICAgICAg IGZpDQoJaW5zdGFsbCAtbSAwNjQ0IE1JTUUvKi5wbSAke1NJVEVfUEVSTH0v TUlNRQ0KDQoNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgRm9yIGRldmVsb3BlciBv bmx5Li4uDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNClBPRDJIVE1MX0ZMQUdTID0g LS1wb2RwYXRoPS4gLS1mbHVzaCAtLWh0bWxyb290PS4uDQpIVE1MUyAgICAg ICAgICA9ICR7TU9EUzoucG09Lmh0bWx9DQpWUEFUSCAgICAgICAgICA9IE1J TUUNCg0KLlNVRkZJWEVTOiAucG0gLnBvZCAuaHRtbA0KDQojIHYuMS44IGdl bmVyYXRlZCAzMCBBcHIgOTYNCiMgdi4xLjkgaXMgb25seSBiZWNhdXNlIDEu OCBmYWlsZWQgQ1BBTiBpbmdlc3Rpb24NCmRpc3Q6IGRvY3VtZW50ZWQJDQoJ VkVSU0lPTj0xLjkgOyBcDQoJbWtkaXN0IC10Z3ogTUlNRS1wYXJzZXItJCRW RVJTSU9OIDsgXA0KCWNwIE1LRElTVC9NSU1FLXBhcnNlci0kJFZFUlNJT04u dGd6ICR7SE9NRX0vcHVibGljX2h0bWwvY3Bhbg0KCQ0KZG9jdW1lbnRlZDog JHtIVE1MU30gJHtNT0RTfQ0KDQoucG0uaHRtbDoNCglwb2QyaHRtbCAke1BP RDJIVE1MX0ZMQUdTfSBcDQoJCS0tdGl0bGU9TUlNRTo6JCogXA0KCQktLWlu ZmlsZT0kPCBcDQoJCS0tb3V0ZmlsZT1kb2NzLyQqLmh0bWwNCg0KIy0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQ0K
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="multi-nested.msg" Content-Transfer-Encoding: BASE64 Content-ID: <Pine.LNX.3.91.960606155039.2195C@fripp.aic.synapse.ru> Content-Description: test message
TUlNRS1WZXJzaW9uOiAxLjANCkZyb206IExvcmQgSm9obiBXaG9yZmluIDx3 aG9yZmluQHlveW9keW5lLmNvbT4NClRvOiA8am9obi15YXlhQHlveW9keW5l LmNvbT4NClN1YmplY3Q6IEEgY29tcGxleCBuZXN0ZWQgbXVsdGlwYXJ0IGV4 YW1wbGUNCkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOw0KICAgICBi b3VuZGFyeT11bmlxdWUtYm91bmRhcnktMQ0KDQpUaGUgcHJlYW1ibGUgb2Yg dGhlIG91dGVyIG11bHRpcGFydCBtZXNzYWdlLg0KTWFpbCByZWFkZXJzIHRo YXQgdW5kZXJzdGFuZCBtdWx0aXBhcnQgZm9ybWF0DQpzaG91bGQgaWdub3Jl IHRoaXMgcHJlYW1ibGUuDQpJZiB5b3UgYXJlIHJlYWRpbmcgdGhpcyB0ZXh0 LCB5b3UgbWlnaHQgd2FudCB0bw0KY29uc2lkZXIgY2hhbmdpbmcgdG8gYSBt YWlsIHJlYWRlciB0aGF0IHVuZGVyc3RhbmRzDQpob3cgdG8gcHJvcGVybHkg ZGlzcGxheSBtdWx0aXBhcnQgbWVzc2FnZXMuDQotLXVuaXF1ZS1ib3VuZGFy eS0xDQoNClBhcnQgMSBvZiB0aGUgb3V0ZXIgbWVzc2FnZS4NCltOb3RlIHRo YXQgdGhlIHByZWNlZGluZyBibGFuayBsaW5lIG1lYW5zDQpubyBoZWFkZXIg ZmllbGRzIHdlcmUgZ2l2ZW4gYW5kIHRoaXMgaXMgdGV4dCwNCndpdGggY2hh cnNldCBVUyBBU0NJSS4gIEl0IGNvdWxkIGhhdmUgYmVlbg0KZG9uZSB3aXRo IGV4cGxpY2l0IHR5cGluZyBhcyBpbiB0aGUgbmV4dCBwYXJ0Ll0NCg0KLS11 bmlxdWUtYm91bmRhcnktMQ0KQ29udGVudC10eXBlOiB0ZXh0L3BsYWluOyBj aGFyc2V0PVVTLUFTQ0lJDQoNClBhcnQgMiBvZiB0aGUgb3V0ZXIgbWVzc2Fn ZS4NClRoaXMgY291bGQgaGF2ZSBiZWVuIHBhcnQgb2YgdGhlIHByZXZpb3Vz IHBhcnQsDQpidXQgaWxsdXN0cmF0ZXMgZXhwbGljaXQgdmVyc3VzIGltcGxp Y2l0DQp0eXBpbmcgb2YgYm9keSBwYXJ0cy4NCg0KLS11bmlxdWUtYm91bmRh cnktMQ0KU3ViamVjdDogUGFydCAzIG9mIHRoZSBvdXRlciBtZXNzYWdlIGlz IG11bHRpcGFydCENCkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L3BhcmFsbGVs Ow0KICAgICBib3VuZGFyeT11bmlxdWUtYm91bmRhcnktMg0KDQpBIG9uZS1s aW5lIHByZWFtYmxlIGZvciB0aGUgaW5uZXIgbXVsdGlwYXJ0IG1lc3NhZ2Uu DQotLXVuaXF1ZS1ib3VuZGFyeS0yDQpDb250ZW50LVR5cGU6IGltYWdlL2dp Zg0KQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0DQpDb250ZW50 LURpc3Bvc2l0aW9uOiBpbmxpbmU7IGZpbGVuYW1lPSIzZC1jb21wcmVzcy5n aWYiDQpTdWJqZWN0OiBQYXJ0IDEgb2YgdGhlIGlubmVyIG1lc3NhZ2UgaXMg YSBHSUYsICIzZC1jb21wcmVzcy5naWYiDQoNClIwbEdPRGRoS0FBb0FPTUFB QUFBQUFBQWdCNlEveTlQVDI1dWJuQ0FrS0JTTGI2K3Z1Zm41L1hlcy8rbEFQ LzZ6UUFBQUFBQQ0KQUFBQUFBQUFBQ3dBQUFBQUtBQW9BQUFFL2hESlNhdTll SkxNT3lZYmNveGthWjVvQ2tvSDZMNXdMTWZpV3FkNGJ0WmhteGJBDQpvRkNZ NDdFSXFNSmd5V3cyQVRqajdhUmtBcTVZd0RNbDlWR3RLTzBTaXVvaVRWbHNj c3h0OWM0SGdYeFVJQTBFQVZPVmZES1QNCjhIbDFCM2tEQVlZbGUyMDJYbkdH Z29NSGhZY2tpV1Z1UjMrT1RnQ0dlWlJzbG90d2dKMmxuWWlnZlpkVGpRVUxy N0FMQlpOMA0KcVR1cmpIZ0xLQXUwQjVXcW9wbTdKNzJldFFOOHQ4SWp1cnkr d010dnc4L0h2N1lsZnMwQnhDYkdxTW1LMHlPT1EwR1RDZ3JSDQoyYmh3Skds WEpRWUc2bU1Lb2VOb1dTYnpDV0lBQ2U1Snd4UW0zQWtEQWJVQVFDaVFoRFpF QmVCbDZhZmdDc09CckQ0NWVkSXYNClFjZUdXU01ldnBPWWhsNkNreWRCSGhC WlFtR0tqaWhWc2h5cGpCOUNsQUhaTVR1Z3pPVTdtemhCUGlTWjV1RE5uQTdi L2FUWg0KMG1oTW5mbDBwREJGYTZiVUVsU1BXYjBxdFl1SHJ4bHdjUjE3WXNX TXMyalRxbDNMRmtRRUFEcz0NCi0tdW5pcXVlLWJvdW5kYXJ5LTINCkNvbnRl bnQtVHlwZTogaW1hZ2UvZ2lmDQpDb250ZW50LVRyYW5zZmVyLUVuY29kaW5n OiBiYXNlNjQNCkNvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsgZmlsZW5h bWU9IjNkLWV5ZS5naWYiDQpTdWJqZWN0OiBQYXJ0IDIgb2YgdGhlIGlubmVy IG1lc3NhZ2UgaXMgYW5vdGhlciBHSUYsICIzZC1leWUuZ2lmIg0KDQpSMGxH T0RkaEtBQW9BUE1BQUFBQUFBQUF6TjN1Lzc2K3ZvaUlpRzV1YnN6ZDd2Ly8v K2ZuNXdBQUFBQUFBQUFBQUFBQUFBQUENCkFBQUFBQUFBQUN3QUFBQUFLQUFv QUFBRS9oREpTYXU5ZUpiTU95NGJNb3hrYVo1b0Nrb0Q2TDV3TE1maVduczQx b1p0N2xNNw0KVnVqbkM5NklSVnNQV1FFNG54UGprdm1zUW11OG9jL0tCVVNW V2s3WGVwR0dMZU5yeG94Sk8xTWpJTGp0aGcva1dYUTZ3Ty83DQorM2RDZVJS amZBS0hpSW1KQVYrRENGMEJpVzVWQW8xQ0VsYVJoNU5qbGtlWW1weVRncGNU QUtHaWFhU2Zwd0twVlFheFZhdEwNCnJVOEdhUWRPQkFRQUI3K3lYbGlYVHJn QXhzVzR2RmFidjhCT3RCc0J0N2NHdndDSVQ5bk95TkVJeHVDNHpycUt6YzlY Yk9ESg0KdnM3WTVld0gzZDdGeGUzakI0cmo4dDZQdU5hNnIyYmhLUVhOMTdG WUNCTXFUR2lCelNOaHg1ZzBuRU1obHNTSmppUll2RGp3DQpFMGNkR3hRL2dz d29zb0tVa211VTJGbkpjc1NLR1RCanlweEpzeWFJQ0FBNw0KLS11bmlxdWUt Ym91bmRhcnktMi0tDQoNClRoZSBlcGlsb2d1ZSBmb3IgdGhlIGlubmVyIG11 bHRpcGFydCBtZXNzYWdlLg0KDQotLXVuaXF1ZS1ib3VuZGFyeS0xDQpDb250 ZW50LXR5cGU6IHRleHQvcmljaHRleHQNCg0KVGhpcyBpcyA8Ym9sZD5wYXJ0 IDQgb2YgdGhlIG91dGVyIG1lc3NhZ2U8L2JvbGQ+DQo8c21hbGxlcj5hcyBk ZWZpbmVkIGluIFJGQzEzNDE8L3NtYWxsZXI+PG5sPg0KPG5sPg0KSXNuJ3Qg aXQgPGJpZ2dlcj48YmlnZ2VyPmNvb2w/PC9iaWdnZXI+PC9iaWdnZXI+DQoN Ci0tdW5pcXVlLWJvdW5kYXJ5LTENCkNvbnRlbnQtVHlwZTogbWVzc2FnZS9y ZmM4MjINCg0KRnJvbTogKG1haWxib3ggaW4gVVMtQVNDSUkpDQpUbzogKGFk ZHJlc3MgaW4gVVMtQVNDSUkpDQpTdWJqZWN0OiBQYXJ0IDUgb2YgdGhlIG91 dGVyIG1lc3NhZ2UgaXMgaXRzZWxmIGFuIFJGQzgyMiBtZXNzYWdlIQ0KQ29u dGVudC1UeXBlOiBUZXh0L3BsYWluOyBjaGFyc2V0PUlTTy04ODU5LTENCkNv bnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IFF1b3RlZC1wcmludGFibGUNCg0K UGFydCA1IG9mIHRoZSBvdXRlciBtZXNzYWdlIGlzIGl0c2VsZiBhbiBSRkM4 MjIgbWVzc2FnZSENCg0KLS11bmlxdWUtYm91bmRhcnktMS0tDQoNClRoZSBl cGlsb2d1ZSBmb3IgdGhlIG91dGVyIG1lc3NhZ2UuDQo=
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="Parser.n.out" Content-Transfer-Encoding: BASE64 Content-ID: <Pine.LNX.3.91.960606155039.2195D@fripp.aic.synapse.ru> Content-Description: out from parser
KiBXYWl0aW5nIGZvciBhIE1JTUUgbWVzc2FnZSBmcm9tIFNURElOLi4uDQo9 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT0NCkNvbnRlbnQtdHlwZTogbXVsdGlwYXJ0L21peGVk DQpCb2R5LWZpbGU6IE5PTkUNClN1YmplY3Q6IEEgY29tcGxleCBuZXN0ZWQg bXVsdGlwYXJ0IGV4YW1wbGUNCk51bS1wYXJ0czogMw0KLS0NCiAgICBDb250 ZW50LXR5cGU6IHRleHQvcGxhaW4NCiAgICBCb2R5LWZpbGU6IC4vdGVzdG91 dC9tc2ctMzUzOC0xLmRvYw0KICAgIC0tDQogICAgQ29udGVudC10eXBlOiB0 ZXh0L3BsYWluDQogICAgQm9keS1maWxlOiAuL3Rlc3RvdXQvbXNnLTM1Mzgt Mi5kb2MNCiAgICAtLQ0KICAgIENvbnRlbnQtdHlwZTogbXVsdGlwYXJ0L3Bh cmFsbGVsDQogICAgQm9keS1maWxlOiBOT05FDQogICAgU3ViamVjdDogUGFy dCAzIG9mIHRoZSBvdXRlciBtZXNzYWdlIGlzIG11bHRpcGFydCENCiAgICBO dW0tcGFydHM6IDINCiAgICAtLQ0KICAgICAgICBDb250ZW50LXR5cGU6IGlt YWdlL2dpZg0KICAgICAgICBCb2R5LWZpbGU6IC4vdGVzdG91dC8zZC1jb21w cmVzcy5naWYNCiAgICAgICAgU3ViamVjdDogUGFydCAxIG9mIHRoZSBpbm5l ciBtZXNzYWdlIGlzIGEgR0lGLCAiM2QtY29tcHJlc3MuZ2lmIg0KICAgICAg ICAtLQ0KICAgICAgICBDb250ZW50LXR5cGU6IGltYWdlL2dpZg0KICAgICAg ICBCb2R5LWZpbGU6IC4vdGVzdG91dC8zZC1leWUuZ2lmDQogICAgICAgIFN1 YmplY3Q6IFBhcnQgMiBvZiB0aGUgaW5uZXIgbWVzc2FnZSBpcyBhbm90aGVy IEdJRiwgIjNkLWV5ZS5naWYiDQogICAgICAgIC0tDQo9PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT0NCg0K
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/double-bound_decoded_1_2.txt0000644000000000000000000000037311702050534032105 0ustar rootroot

This message contains double boundaries all over the place. We want to make sure that bad things don't happen.

One bad thing is that the doubled-boundary above can be mistaken for a single boundary plus a bogus premature end of headers. apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/mp-msg-rfc822_decoded.xml0000644000000000000000000000621211702050534031250 0ustar rootroot

Date: Thu, 20 Jun 1996 08:35:17 +0200 From: Juergen Specht <specht@kulturbox.de> Organization: KULTURBOX X-Mailer: Mozilla 2.02 (WinNT; I) MIME-Version: 1.0 To: andreas.koenig@mind.de, kun@pop.combox.de, 101762.2307@compuserve.com Subject: [Fwd: Re: 34Mbit/s Netz] Content-Type: multipart/mixed; boundary="------------70522FC73543" X-Filter: mailagent [version 3.0 PL44] for k@.in-berlin.de
This is a multi-part message in MIME format.
Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit
Content-Type: message/rfc822 Content-Transfer-Encoding: 7bit Content-Disposition: inline
X-POP3-Rcpt: specht@trachea Return-Path: hermes Received: (from hermes@localhost) by kulturbox.netmbx.de (8.7.1/8.7.1) id SAA04513 for specht; Wed, 19 Jun 1996 18:30:12 +0200 Received: by netmbx.netmbx.de (/\==/\ Smail3.1.28.1) from mail.cs.tu-berlin.de with smtp id <m0uWPrO-0004wpC>; Wed, 19 Jun 96 18:12 MES Received: (from nobody@localhost) by mail.cs.tu-berlin.de (8.6.12/8.6.12) id SAA12413; Wed, 19 Jun 1996 18:26:28 +0200 Resent-Date: Wed, 19 Jun 1996 18:26:28 +0200 Resent-Message-Id: <199606191626.SAA12413@mail.cs.tu-berlin.de> Resent-From: nobody@cs.tu-berlin.de Resent-To: kultur@kulturbox.netmbx.de Received: from gatekeeper.telekom.de ([194.25.15.11]) by mail.cs.tu-berlin.de (8.6.12/8.6.12) with SMTP id SAA11678 for <specht@kulturbox.de>; Wed, 19 Jun 1996 18:11:29 +0200 Received: from ULM02.mnh.telekom.de by gatekeeper.telekom.de; (5.65v3.0/1.1.8.2/02Aug95-0132PM) id AA01376; Wed, 19 Jun 1996 18:11:27 +0200 Received: from ulm02.mnh.telekom.de (deuschle@mnh.telekom.de) by ULM02.mnh.telekom.de (8.6.10/3) with SMTP id SAA30680 for <specht@kulturbox.de>; Wed, 19 Jun 1996 18:14:40 GMT Message-Id: <199606191814.SAA30680@ULM02.mnh.telekom.de> X-Sender: deuschle@ulm02.mnh.telekom.de X-Mailer: Windows Eudora Version 1.4.4 Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Date: Wed, 19 Jun 1996 18:12:02 +0200 To: Juergen Specht <specht@kulturbox.de> From: deuschle@mnh.telekom.de (Guenter Deuschle) Subject: Re: 34Mbit/s Netz X-Mozilla-Status: 0011
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/intl.out0000644000000000000000000000064511702050534026356 0ustar rootrootFrom: =?US-ASCII?Q?Keith_Moore?= To: =?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?= CC: =?ISO-8859-1?Q?Andr=E9_?= Pirard BCC: =?ISO-8859-1?Q?Patrik_F=E4ltstr=F6m?= Subject: =?ISO-8859-1?B?SWYgeW91IGNhbiByZWFkIHRoaXMgeW8=?= =?ISO-8859-2?B?dSB1bmRlcnN0YW5kIHRoZSBleGFtcGxlLg==?= =?US-ASCII?Q?.._so,_cool!?= Content-type: text/plain How's this? apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-nested2.out0000644000000000000000000000633611702050534030107 0ustar rootrootMIME-Version: 1.0 From: Lord John Whorfin To: Subject: A complex nested multipart example Content-Type: multipart/mixed; boundary=unique-boundary-1 The preamble of the outer multipart message. Mail readers that understand multipart format should ignore this preamble. If you are reading this text, you might want to consider changing to a mail reader that understands how to properly display multipart messages. --unique-boundary-1 Part 1 of the outer message. [Note that the preceding blank line means no header fields were given and this is text, with charset US ASCII. It could have been done with explicit typing as in the next part.] --unique-boundary-1 Content-type: text/plain; charset=US-ASCII Part 2 of the outer message. This could have been part of the previous part, but illustrates explicit versus implicit typing of body parts. --unique-boundary-1 Subject: Part 3 of the outer message is multipart! Content-Type: multipart/parallel; boundary=unique-boundary-2 A one-line preamble for the inner multipart message. --unique-boundary-2 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-vise.gif" Subject: Part 1 of the inner message is a GIF, "3d-vise.gif" R0lGODdhKAAoAOMAAAAAAAAAgB6Q/y9PT25ubnCAkKBSLb6+vufn5/Xes/+lAP/6zQAAAAAAAAAA AAAAACwAAAAAKAAoAAAE/hDJSau9eJLMOyYbcoxkaZ5oCkoH6L5wLMfiWqd4btZhmxbAoFCY47EI qMJgyWw2ATjj7aRkAq5YwDMl9VGtKO0SiuoiTVlscsxt9c4HgXxUIA0EAVOVfDKT8Hl1B3kDAYYl e202XnGGgoMHhYckiWVuR3+OTgCGeZRslotwgJ2lnYigfZdTjQULr7ALBZN0qTurjHgLKAu0B5Wq opm7J72etQN8t8Ijury+wMtvw8/Hv7Ylfs0BxCbGqMmK0yOOQ0GTCgrR2bhwJGlXJQYG6mMKoeNo WSbzCWIACe5JwxQm3AkDAbUAQCiQhDZEBeBl6afgCsOBrD45edIvQceGWSMevpOYhl6CkydBHhBZ QmGKjihVshypjB9ClAHZMTugzOU7mzhBPiSZ5uDNnA7b/aTZ0mhMnfl0pDBFa6bUElSPWb0qtYuH rxlwcR17YsWMs2jTql3LFkQEADs= --unique-boundary-2 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-eye.gif" Subject: Part 2 of the inner message is another GIF, "3d-eye.gif" R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAAAAAA AAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7VujnC96I RVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7+3dCeRRjfAKH iImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatLrU8GaQdOBAQAB7+y XliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJvs7Y5ewH3d7Fxe3jB4rj 8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjwE0cdGxQ/gswosoKUkmuU2FnJ csSKGTBjypxJsyaICAA7 --unique-boundary-2-- The epilogue for the inner multipart message. --unique-boundary-1 Content-type: text/richtext This is part 4 of the outer message as defined in RFC1341 Isn't it cool? --unique-boundary-1 Content-Type: message/rfc822; name="/evil/filename"; From: (mailbox in US-ASCII) To: (address in US-ASCII) Subject: Part 5 of the outer message is itself an RFC822 message! Content-Type: Text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: Quoted-printable Part 5 of the outer message is itself an RFC822 message! --unique-boundary-1-- The epilogue for the outer message. apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-weirdspace.xml0000644000000000000000000000530611702050534030656 0ustar rootroot
Return-Path: eryq@rhine.gsfc.nasa.gov Sender: john-bigboote Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Eryq <eryq@rhine.gsfc.nasa.gov> Organization: Yoyodyne Propulsion Systems X-Mailer: Mozilla 2.0 (X11; I; Linux 1.1.18 i486) MIME-Version: 1.0 To: john-bigboote@eryq.pr.mcs.net Subject: Two images for you... Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE"
Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit
When unpacked, this message should produce two GIF files: * The 1st should be called "3d-compress.gif" * The 2nd should be called "3d-eye.gif" There is an empty preamble, and linear space after the bounds. -- ____ __ / __/__________/_/ Eryq (eryq@rhine.gsfc.nasa.gov) / __/ _/ / / , / Hughes STX Corporation, NASA/Goddard /___/_/ \ /\ /___ /_/ /_____/ http://selsvr.stx.com/~eryq/
Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-compress.gif"
R0lGODdhKAAoAOMAAAAAAAAAgB6Q/y9PT25ubnCAkKBSLb6+vufn5/Xes/+lAP/6zQAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJLMOyYbcoxkaZ5oCkoH6L5wLMfiWqd4btZhmxbA oFCY47EIqMJgyWw2ATjj7aRkAq5YwDMl9VGtKO0SiuoiTVlscsxt9c4HgXxUIA0EAVOVfDKT 8Hl1B3kDAYYle202XnGGgoMHhYckiWVuR3+OTgCGeZRslotwgJ2lnYigfZdTjQULr7ALBZN0 qTurjHgLKAu0B5Wqopm7J72etQN8t8Ijury+wMtvw8/Hv7Ylfs0BxCbGqMmK0yOOQ0GTCgrR 2bhwJGlXJQYG6mMKoeNoWSbzCWIACe5JwxQm3AkDAbUAQCiQhDZEBeBl6afgCsOBrD45edIv QceGWSMevpOYhl6CkydBHhBZQmGKjihVshypjB9ClAHZMTugzOU7mzhBPiSZ5uDNnA7b/aTZ 0mhMnfl0pDBFa6bUElSPWb0qtYuHrxlwcR17YsWMs2jTql3LFkQEADs=
Content-Type: image/gif; name="3d-eye.gif" Content-Transfer-Encoding: base64
R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7 VujnC96IRVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7 +3dCeRRjfAKHiImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatL rU8GaQdOBAQAB7+yXliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJ vs7Y5ewH3d7Fxe3jB4rj8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjw E0cdGxQ/gswosoKUkmuU2FnJcsSKGTBjypxJsyaICAA7
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/bluedot-simple_decoded.xml0000644000000000000000000000050211702050534031765 0ustar rootroot
Content-Type: image/jpeg; name="bluedot.jpg" Content-Disposition: inline; filename="bluedot.jpg" Content-Transfer-Encoding: base64 Content-Id: my-graphic
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-badnames.out0000644000000000000000000000145111702050534030306 0ustar rootrootFrom: Nathaniel Borenstein To: Ned Freed Subject: Sample message MIME-Version: 1.0 Content-type: multipart/mixed; boundary="simple boundary" This is the preamble. It is to be ignored, though it is a handy place for mail composers to include an explanatory note to non-MIME conformant readers. --simple boundary Content-type: text/plain; charset=us-ascii; name="/foo/bar" --simple boundary Content-type: text/plain; charset=us-ascii; name="foo bar" This is explicitly typed plain ASCII text. It DOES end with a linebreak. --simple boundary Content-type: text/plain; charset=us-ascii; name="foobar" This is explicitly typed plain ASCII text. It DOES end with a linebreak. --simple boundary-- This is the epilogue. It is also to be ignored. ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/bluedot-postcard_decoded_1_2_1.txtapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/bluedot-postcard_decoded_1_2_0000644000000000000000000000017611702050534032323 0ustar rootroot

Hey there!

Having a wonderful time... take a look!
Snapshot
././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-2gifs-base64_decoded_1_1_3.binapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-2gifs-base64_decoded_1_0000644000000000000000000000054511702050534032053 0ustar rootrootGIF87a((óÌÝîÿ¾¾¾ˆˆˆnnnÌÝîÿÿÿççç,((þÉI«½x–Ì;.2Œdižh Jè¾p,ÇâZ{8Ö†mîS;Vèç ÞˆE[Y8Ÿã’ù¬Bk¼¡ÏÊD•ZN×z‘†-ãkÆŒI;S# ¸í†äYt:ÀïûûwByc|‡ˆ‰‰_ƒ]‰nUBV‘‡“c–G˜šœ“‚—¡¢i¤Ÿ§©U±U«K­OiN¿²^X—N¸ÆÅ¸¼V›¿ÀN´··¿ˆOÙÎÈÑÆà¸ÎºŠÍÏWlàÉ¾ÎØåìÝÞÅÅíãŠãòÞ¸Öº¯fá)Í×±X*LhÍ#aǘ4œC!–ĉŽ$X¼8ðG?‚Ì(²‚”’k”ØYÉrÄŠ0cÊœI³&ˆ;apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-simple.out0000644000000000000000000000122411702050534030023 0ustar rootrootFrom: Nathaniel Borenstein To: Ned Freed Subject: Sample message MIME-Version: 1.0 Content-type: multipart/mixed; boundary="simple boundary" This is the preamble. It is to be ignored, though it is a handy place for mail composers to include an explanatory note to non-MIME conformant readers. --simple boundary This is implicitly typed plain ASCII text. It does NOT end with a linebreak. --simple boundary Content-type: text/plain; charset=us-ascii This is explicitly typed plain ASCII text. It DOES end with a linebreak. --simple boundary-- This is the epilogue. It is also to be ignored. apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-frag_decoded_1_1.txt0000644000000000000000000000032511702050534031571 0ustar rootrootPart 1 of the outer message. [Note that the preceding blank line means no header fields were given and this is text, with charset US ASCII. It could have been done with explicit typing as in the next part.] apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/intl_decoded_1.txt0000644000000000000000000000001611702050534030245 0ustar rootrootHow's this? apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/mp-msg-rfc822.msg0000644000000000000000000001121211702050534027563 0ustar rootrootFrom specht@kulturbox.de Thu Jun 20 08:35:23 1996 Date: Thu, 20 Jun 1996 08:35:17 +0200 From: Juergen Specht Organization: KULTURBOX X-Mailer: Mozilla 2.02 (WinNT; I) MIME-Version: 1.0 To: andreas.koenig@mind.de, kun@pop.combox.de, 101762.2307@compuserve.com Subject: [Fwd: Re: 34Mbit/s Netz] Content-Type: multipart/mixed; boundary="------------70522FC73543" X-Filter: mailagent [version 3.0 PL44] for k@.in-berlin.de This is a multi-part message in MIME format. --------------70522FC73543 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit -- Juergen Specht - KULTURBOX --------------70522FC73543 Content-Type: message/rfc822 Content-Transfer-Encoding: 7bit Content-Disposition: inline X-POP3-Rcpt: specht@trachea Return-Path: hermes Received: (from hermes@localhost) by kulturbox.netmbx.de (8.7.1/8.7.1) id SAA04513 for specht; Wed, 19 Jun 1996 18:30:12 +0200 Received: by netmbx.netmbx.de (/\==/\ Smail3.1.28.1) from mail.cs.tu-berlin.de with smtp id ; Wed, 19 Jun 96 18:12 MES Received: (from nobody@localhost) by mail.cs.tu-berlin.de (8.6.12/8.6.12) id SAA12413; Wed, 19 Jun 1996 18:26:28 +0200 Resent-Date: Wed, 19 Jun 1996 18:26:28 +0200 Resent-Message-Id: <199606191626.SAA12413@mail.cs.tu-berlin.de> Resent-From: nobody@cs.tu-berlin.de Resent-To: kultur@kulturbox.netmbx.de Received: from gatekeeper.telekom.de ([194.25.15.11]) by mail.cs.tu-berlin.de (8.6.12/8.6.12) with SMTP id SAA11678 for ; Wed, 19 Jun 1996 18:11:29 +0200 Received: from ULM02.mnh.telekom.de by gatekeeper.telekom.de; (5.65v3.0/1.1.8.2/02Aug95-0132PM) id AA01376; Wed, 19 Jun 1996 18:11:27 +0200 Received: from ulm02.mnh.telekom.de (deuschle@mnh.telekom.de) by ULM02.mnh.telekom.de (8.6.10/3) with SMTP id SAA30680 for ; Wed, 19 Jun 1996 18:14:40 GMT Message-Id: <199606191814.SAA30680@ULM02.mnh.telekom.de> X-Sender: deuschle@ulm02.mnh.telekom.de X-Mailer: Windows Eudora Version 1.4.4 Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Date: Wed, 19 Jun 1996 18:12:02 +0200 To: Juergen Specht From: deuschle@mnh.telekom.de (Guenter Deuschle) Subject: Re: 34Mbit/s Netz X-Mozilla-Status: 0011 Hallo Herr Specht, entschuldigen Sie vorab, dass ich Ihnen nicht telefonisch zur Verfuegung stehe, ich Praesentationen gehalten/ noch zu halten und viele Kundennachfragen zu projektieren. Nach Informationen des Produkt-Managers Temme steht der POP schon zur Verf=FCgung! Standort: voraussichtlich: Winterfeldstr. 21, 10781 Berlin. Der POP hat zur Zeit direkte 34M-Anbindungen zu folgenden Orten: Rostock, Hamburg, Hannover & Leipzig. 4 weitere werden in kuerze in Betrieb gehen. Damit haben Sie einen Besonderen Sicherheitsstandard verfuegbar! Kontakt muessen Sie ueber Ihre oerltliche Vertriebseinheit aufnehmen: entweder den Geschaefts-Kunden-Vertrieb oder das GrossKundenManagement. Diese Vertriebseinheiten greifen auf den oertlichen Technischen Vertriebs-Support zu. Die Informationen werden ueber TVS zur Vertriebseiheit gegeben und dann zu Ihnen. Sie benoetigen eine Standleitung von Ihrer Lokation zum Internet-POP Uebergabepunkt zu Ihrem Info-Server ist ein CISCO 1000-Router. Dann zahlen Sie neben den monatlichen Kosten fuer die Standleitung die Kosten fuer den Internet-Zugang: zB bei 64k: 1500DM bei 2GByte Freivolumen. 128K: 3000 DM bei 5 GB Freivolumen & 2M: 30.000 DM bei 50GB Freivolumen. Freundliche Gruesse=20 Guenter Deuschle >Sehr geehrter Herr Deuschle, >Sie sind mir von Herrn Meyendriesch empfohlen worden. >Ich versuche Informationen ueber das T-eigene 34Mbit/s Netz und den=20 >lokalen Pop-Berlin rauszufinden, bzw. was ein Anschluss kostet und=20 >wo man ihn herbekommt. Laut Herrn Schnick in Berlin gibt es den=20 >T-Pop nicht, laut Traceroute von Herrn Meyendriesch sehrwohl. Auch=20 >ist dies Netz in der IX vom Mai 96 erwaehnt. >Koennen Sie mir helfen? > >MfG >--=20 >Juergen Specht - KULTURBOX > > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D Dipl.-Ing. Guenter D E U S C H L E Deutsche Telekom AG Niederlassung 3 Hannover GrossKundenManagement - Techn. Vertriebs-Support: Team-Leiter Internet Online-Dienste --------------------------------------------------- GrKM-TVS-IOD Tel: +49-511-333-2772 Vahrenwalder-Str. 245 FAX: +49-511-333-2751 30179 Hannover eMail: deuschle@mnh.telekom.de=20 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D --------------70522FC73543-- apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-2evil_decoded_1_1.txt0000644000000000000000000000065611702050534031702 0ustar rootrootWhen unpacked, this message should produce two GIF files: * The 1st should be called "3d-compress.gif" * The 2nd should be called "3d-eye.gif" Different ways of specifying the filenames have been used. -- ____ __ / __/__________/_/ Eryq (eryq@rhine.gsfc.nasa.gov) / __/ _/ / / , / Hughes STX Corporation, NASA/Goddard /___/_/ \ /\ /___ /_/ /_____/ http://selsvr.stx.com/~eryq/ apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/double-semicolon2.msg0000644000000000000000000000036011702050534030703 0ustar rootrootMime-Version: 1.0 Content-Type: multipart/alternative ; ; ; ;; ;;;;;;;; boundary="foo" Preamble --foo Content-Type: text/plain; charset=us-ascii The better part --foo Content-Type: text/plain; charset=us-ascii The worse part --foo-- apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/double-bound_decoded_1_8.txt0000644000000000000000000000000011702050534032076 0ustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/ticket-60931.msg0000644000000000000000000000056611702050534027334 0ustar rootrootMIME-Version: 1.0 Received: by 10.220.78.157 with HTTP; Thu, 26 Aug 2010 21:33:17 -0700 (PDT) Content-Type: multipart/alternative; boundary=90e6ba4fc6ea25d329048ec69d99 --90e6ba4fc6ea25d329048ec69d99 Content-Type: text/plain; charset=ISO-8859-1 HELLO --90e6ba4fc6ea25d329048ec69d99 Content-Type: text/html; charset=ISO-8859-1 HELLO
--90e6ba4fc6ea25d329048ec69d99-- apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-frag_decoded_1_3_1.bin0000644000000000000000000000064311702050534031747 0ustar rootrootGIF87a((ã€ÿ/OOnnnp€ R-¾¾¾çççõÞ³ÿ¥ÿúÍ,((þÉI«½x’Ì;&rŒdižh Jè¾p,ÇâZ§xnÖa›À P˜ã±¨Â`Él68ãí¤d®XÀ3%õQ­(íŠê"MYlrÌmõÎ|T S•|2“ðyuy†%{m6^q†‚ƒ…‡$‰enGŽN†y”l–‹p€¥ˆ }—S ¯° “t©;«Œx ( ´•ª¢™»'½žµ|·Â#º¼¾ÀËoÃÏÇ¿¶%~ÍÄ&ƨɊÓ#ŽCA“ ÑÙ¸p$iW%êc ¡ãhY&ó b îIÃ&Ü µ@(„6Dàeé§à ì>9yÒ/AdžY#¾“˜†^‚“'AYBaŠŽ(U²©ŒB”Ù1; Ìå;›8A>$™æàÍœÛý¤ÙÒhLùt¤0Ek¦ÔTY½*µ‹‡¯pq{bÅŒ³hÓª]ËD;apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/ak-0696_decoded_1_1.txt0000644000000000000000000000004111702050534030512 0ustar rootroot-- Juergen Specht - KULTURBOX apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/frag_decoded_1_2_1_1.txt0000644000000000000000000000004611702050534031102 0ustar rootrootjust to add to your personal hell. apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/infinite.xml0000644000000000000000000001277111702050534027211 0ustar rootroot
Content-Type: TEXT/PLAIN; name=109f53c446c8882f4318316ecf4480ce Content-Transfer-Encoding: BASE64 Content-ID: <Pine.LNX.3.96.981121145143.30463I@linux2.americasnet.com> Content-Description:
UmV0dXJuLVBhdGg6IDxvd25lci1jYWNvbXAtbEBsaW5mLnVuYi5icj4NClJl Y2VpdmVkOiBmcm9tIGVpZmZlbC5iYXNlLmNvbS5iciBieSBtYWlsYnIxLm1h aWxici5jb20uYnIgOyBUaHUsIDA1IE5vdiAxOTk4IDIyOjU4OjIzICswMDAN ClJlY2VpdmVkOiBmcm9tIG1hcmNvbmkuYmFzZS5jb20uYnIgKFsyMDAuMjQw LjEwLjU1XSkgYnkgZWlmZmVsLmJhc2UuY29tLmJyDQogICAgICAgICAgKE5l dHNjYXBlIE1haWwgU2VydmVyIHYyLjApIHdpdGggRVNNVFAgaWQgQURINDkx DQogICAgICAgICAgZm9yIDxhY2VjaWxpYUBtYWlsYnIuY29tLmJyPjsgVGh1 LCA1IE5vdiAxOTk4IDIxOjU1OjI0IC0wMjAwDQpSZWNlaXZlZDogZnJvbSBr ZXBsZXIuYmFzZS5jb20uYnIgKFsyMDAuMjQwLjEwLjEwNF0pIGJ5IG1hcmNv bmkuYmFzZS5jb20uYnINCiAgICAgICAgICAoTmV0c2NhcGUgTWFpbCBTZXJ2 ZXIgdjIuMCkgd2l0aCBFU01UUCBpZCBBQUU2ODY7DQogICAgICAgICAgV2Vk LCA0IE5vdiAxOTk4IDE0OjAwOjEwIC0wMjAwDQpSZWNlaXZlZDogZnJvbSBj eXJpdXMubGluZi51bmIuYnIgKFsxNjQuNDEuMTIuNF0pIGJ5IGtlcGxlci5i YXNlLmNvbS5icg0KICAgICAgICAgIChQb3N0Lk9mZmljZSBNVEEgdjMuNSBy ZWxlYXNlIDIxNSBJRCMgMC0wVTEwTDJTMTAwKSB3aXRoIFNNVFANCiAgICAg ICAgICBpZCBicjsgV2VkLCA0IE5vdiAxOTk4IDEzOjUzOjQ3IC0wMjAwDQpS ZWNlaXZlZDogZnJvbSBzZW5kbWFpbCBieSBjeXJpdXMubGluZi51bmIuYnIg d2l0aCBlc210cA0KCWlkIDB6YjVJOS0wMDAzb00tMDA7IFdlZCwgNCBOb3Yg MTk5OCAxMzo1NjoxNyAtMDIwMA0KUmVjZWl2ZWQ6IGZyb20gbG9jYWxob3N0 IChtYWpvcmRvbUBsb2NhbGhvc3QpDQoJYnkgY3lyaXVzLmxpbmYudW5iLmJy ICg4LjguNy84LjguNykgd2l0aCBTTVRQIGlkIE5BQTE0NjM5Ow0KCVdlZCwg NCBOb3YgMTk5OCAxMzo1NDo1NCAtMDIwMCAoRURUKQ0KUmVjZWl2ZWQ6IGJ5 IGxpbmYudW5iLmJyIChidWxrX21haWxlciB2MS42KTsgV2VkLCA0IE5vdiAx OTk4IDEzOjU0OjU0IC0wMjAwDQpSZWNlaXZlZDogKGZyb20gbWFqb3Jkb21A bG9jYWxob3N0KQ0KCWJ5IGN5cml1cy5saW5mLnVuYi5iciAoOC44LjcvOC44 LjcpIGlkIE5BQTE0NjMwDQoJZm9yIGNhY29tcC1sLW91dHRlcjsgV2VkLCA0 IE5vdiAxOTk4IDEzOjU0OjUzIC0wMjAwIChFRFQpDQpSZWNlaXZlZDogKGZy b20gc2VuZG1haWxAbG9jYWxob3N0KQ0KCWJ5IGN5cml1cy5saW5mLnVuYi5i ciAoOC44LjcvOC44LjcpIGlkIE5BQTE0NjIzDQoJZm9yIGNhY29tcC1sQGxp bmYudW5iLmJyOyBXZWQsIDQgTm92IDE5OTggMTM6NTQ6NTAgLTAyMDAgKEVE VCkNClJlY2VpdmVkOiBmcm9tIGJyYXNpbGlhLm1wZGZ0Lmdvdi5iciBbMjAw LjI1Mi44NS4yXSANCglieSBjeXJpdXMubGluZi51bmIuYnIgd2l0aCBlc210 cA0KCWlkIDB6YjVGei0wMDAzbEYtMDA7IFdlZCwgNCBOb3YgMTk5OCAxMzo1 NDoyOCAtMDIwMA0KUmVjZWl2ZWQ6IGZyb20gbG9jYWxob3N0IChsYmVja2Vy QGxvY2FsaG9zdCkNCglieSBicmFzaWxpYS5tcGRmdC5nb3YuYnIgKDguOC41 LzguOC44KSB3aXRoIEVTTVRQIGlkIE5BQTAyNTcxDQoJZm9yIDxjYWNvbXAt bEBsaW5mLnVuYi5icj47IFdlZCwgNCBOb3YgMTk5OCAxMzozNjoxNCAtMDIw MCAoRURUKQ0KCShlbnZlbG9wZS1mcm9tIGxiZWNrZXJAYnJhc2lsaWEubXBk ZnQuZ292LmJyKQ0KRGF0ZTogV2VkLCA0IE5vdiAxOTk4IDEzOjM2OjE0IC0w MjAwIChFRFQpDQpGcm9tOiBMdWxhIEJlY2tlciA8bGJlY2tlckBicmFzaWxp YS5tcGRmdC5nb3YuYnI+DQpUbzogY2Fjb21wLWxAbGluZi51bmIuYnINClN1 YmplY3Q6IFtjYWNvbXAtbF0gPT8/UT9SZT0zQV89NUJjYWNvbXAtbD01RF9F X249M0FfQnJhcz1FRGxpYV9jb2JyZT89DQpJbi1SZXBseS1UbzogPFBpbmUu U1VOLjMuOTEuOTgxMTAzMjM1OTQzLjIyNDFFLTEwMDAwMEBhbnRhcmVzLmxp bmYudW5iLmJyPg0KTWVzc2FnZS1JRDogPFBpbmUuQlNGLjMuOTYuOTgxMTA0 MTMzNTQ3LjI1MzJCLTEwMDAwMEBicmFzaWxpYS5tcGRmdC5nb3YuYnI+DQpN SU1FLVZlcnNpb246IDEuMA0KQ29udGVudC1UeXBlOiBURVhUL1BMQUlOOyBj aGFyc2V0PQ0KWC1NSU1FLUF1dG9jb252ZXJ0ZWQ6IGZyb20gOGJpdCB0byBx dW90ZWQtcHJpbnRhYmxlIGJ5IGJyYXNpbGlhLm1wZGZ0Lmdvdi5iciBpZCBO QUEwMjU3MQ0KQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdA0KWC1N SU1FLUF1dG9jb252ZXJ0ZWQ6IGZyb20gcXVvdGVkLXByaW50YWJsZSB0byA4 Yml0IGJ5IGN5cml1cy5saW5mLnVuYi5iciBpZCBOQUIxNDYyMw0KU2VuZGVy OiBvd25lci1jYWNvbXAtbEBsaW5mLnVuYi5icg0KUmVwbHktVG86IGNhY29t cC1sQGxpbmYudW5iLmJyDQpQcmVjZWRlbmNlOiBidWxrDQpYLVJjcHQtVG86 IDxhY2VjaWxpYUBtYWlsYnIuY29tLmJyDQpYLURQT1A6IERQT1AgVmVyc2lv biAyLjNkDQpYLVVJREw6IDkxMDM4NjgxNi4wMDQNClN0YXR1czogUk8NCg0K DQoNCglDb21vIGFzc2ltLCBkYWggdW0gZXhlbXBsby4gRGVpeGFuZG8gYSBj b250YSBhYmVydGEsIG5laCwgRnJlZC4uLg0KDQoJDQoNCk9uIFdlZCwgNCBO b3YgMTk5OCwgRnJlZGVyaWNvIE5hcmRvdHRvIHdyb3RlOg0KDQo+IFBvcnF1 ZSBldSBzb3UgZWggZm9kYS4uLi4gDQo+IFByZWdvIGVoIG8gY2FyYWxobywg VmMgbmFvIG1lIGNvbmhlY2UgcGFyYSBmaWNhciBmYWxhbmRvIGFzc2ltLi4u IE5hbyANCj4gc2FiZSBkZSBvbmRlIGV1IHZpbSwgcXVlbSBzb3UsIG91IHNl amEsIFBPUlJBIE5FTkhVTUEuLi4NCj4gDQo+IFZBSSBUT01BUiBOTyBDVSBF IE1FIERFSVhBIEVNIFBBWiEhISEhISENCj4gDQo+IE9uIFR1ZSwgMyBOb3Yg MTk5OCwgR3VpbGhlcm1lIE9saXZpZXJpIENhaXhldGEgQm9yZ2VzIHdyb3Rl Og0KPiANCj4gPiBT82NyYXRlcywNCj4gPiANCj4gPiAgICAgcG9ycXVlIHZv Y+ogZmF6IHRhbnRhIHF1ZXN0428gZGUgc2UgaW5kaXNwb3IgY29tIFRPRE8g TVVORE8hISEgSuEgbuNvIGJhc3Rhc3NlDQo+ID4gbWVpYSBjb21wdXRh5+Nv IHRlIGFjaGFyIHVtIHByZWdvLCB2b2PqIHJlc29sdmUgYW1wbGlhciBlc3Rl IHVuaXZlcnNvIHBhcmEgb3V0cmFzDQo+ID4gcGVzc29hcy4uLiBNYW7pIQ0K PiA+IA0KPiA+IFNvY3JhdGVzIEFyYW50ZXMgVGVpeGVpcmEgRmlsaG8gKDk3 LzE4NDQzKSB3cm90ZToNCj4gPiANCj4gPiA+ICAgICAgVm9j6iB0ZW0gcXVl IHZlciBxdWUgcGFjaepuY2lhIHRlbSBsaW1pdGUuIEV1IGFn/GVudGVpIG8g beF4aW1vDQo+ID4gPiBwb3Nz7XZlbCBlbGUgZmljYXIgZXNjcmV2ZW5kbyBl c3NhcyBidXJyaWNlcyBuYSBub3NzYSBzYWxhIGRlIGRpc2N1cnPjby4NCj4g PiA+IENvbSBnZW50ZSBpZ25vcmFudGUgY29tbyBlbGUsIHF1ZSB1bSByb3Jp emlzdGEgY2VnbywgbvNzIHPzIGNvbnNlZ3VpbW9zDQo+ID4gDQo+ID4gICAg IEVtIHNlIGZhbGFuZG8gZGUgaWdub3LibmNpYTog6SBiZW0gdmVyZGFkZSBx dWUgb3MgbWFpbHMgZGEgY2Fjb21wIGVzdONvIGF0aW5naW5kbw0KPiA+IHBy b3Bvcuf1ZXMgZGFudGVzY2FzLCBtYXMgbyBjZXJ0byDpIERJU0NVU1PDTy4N Cj4gPiANCj4gPiBTZW0gbWFpcywNCj4gPiANCj4gPiAtLQ0KPiA+IEd1aWxo ZXJtZSBPbGl2aWVyaSBDYWl4ZXRhIEJvcmdlcw0KPiA+ICoqKioqKioqKioq KioqKioqKioqKioqKioqDQo+ID4gV2ViIERlc2lnbiAtIFZpYSBJbnRlcm5l dA0KPiA+ICgwNjEpIDMxNS05NjU3IC8gOTY0LTkxOTkNCj4gPiBndWlib3Jn ZXNAYnJhc2lsaWEuY29tLmJyDQo+ID4gZ3VpYm9yZ2VzQHZpYS1uZXQuY29t LmJyDQo+ID4gKioqKioqKioqKioqKioqKioqKioqKioqKioNCj4gPiANCj4g PiANCj4gPiANCj4gPiANCj4gPiANCj4gDQo+IA0KDQoNCg==
././@LongLink0000000000000000000000000000015700000000000011570 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/attachment-filename-encoding-Latin1.outapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/attachment-filename-encoding-0000644000000000000000000000111311702050534032340 0ustar rootrootMIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------050706070100080203090004" This is a multi-part message in MIME format. --------------050706070100080203090004 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Attachment Test --------------050706070100080203090004 Content-Type: text/plain; name="=?ISO-8859-1?B?YXR0YWNobWVudC7k9vw=?=" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename*=ISO-8859-1''%61%74%74%61%63%68%6D%65%6E%74%2E%E4%F6%FC VGVzdAo= --------------050706070100080203090004-- apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-2evil.out0000644000000000000000000000510211702050534027552 0ustar rootrootReturn-Path: eryq@rhine.gsfc.nasa.gov Sender: john-bigboote Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Eryq Organization: Yoyodyne Propulsion Systems X-Mailer: Mozilla 2.0 (X11; I; Linux 1.1.18 i486) MIME-Version: 1.0 To: john-bigboote@eryq.pr.mcs.net Subject: Two images for you... Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE" This is a multi-part message in MIME format. --------------299A70B339B65A93542D2AE Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit When unpacked, this message should produce two GIF files: * The 1st should be called "3d-compress.gif" * The 2nd should be called "3d-eye.gif" Different ways of specifying the filenames have been used. -- ____ __ / __/__________/_/ Eryq (eryq@rhine.gsfc.nasa.gov) / __/ _/ / / , / Hughes STX Corporation, NASA/Goddard /___/_/ \ /\ /___ /_/ /_____/ http://selsvr.stx.com/~eryq/ --------------299A70B339B65A93542D2AE Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="/evil/because:of\path\3d-=?ISO-8859-1?Q?=63?=om=?US-ASCII*EN?Q?pr?=ess.gif" R0lGODdhKAAoAOMAAAAAAAAAgB6Q/y9PT25ubnCAkKBSLb6+vufn5/Xes/+lAP/6zQAAAAAAAAAA AAAAACwAAAAAKAAoAAAE/hDJSau9eJLMOyYbcoxkaZ5oCkoH6L5wLMfiWqd4btZhmxbAoFCY47EI qMJgyWw2ATjj7aRkAq5YwDMl9VGtKO0SiuoiTVlscsxt9c4HgXxUIA0EAVOVfDKT8Hl1B3kDAYYl e202XnGGgoMHhYckiWVuR3+OTgCGeZRslotwgJ2lnYigfZdTjQULr7ALBZN0qTurjHgLKAu0B5Wq opm7J72etQN8t8Ijury+wMtvw8/Hv7Ylfs0BxCbGqMmK0yOOQ0GTCgrR2bhwJGlXJQYG6mMKoeNo WSbzCWIACe5JwxQm3AkDAbUAQCiQhDZEBeBl6afgCsOBrD45edIvQceGWSMevpOYhl6CkydBHhBZ QmGKjihVshypjB9ClAHZMTugzOU7mzhBPiSZ5uDNnA7b/aTZ0mhMnfl0pDBFa6bUElSPWb0qtYuH rxlwcR17YsWMs2jTql3LFkQEADs= --------------299A70B339B65A93542D2AE Content-Type: image/gif; name="3d-eye-is-an-evil-filename because of excessive length and verbosity. Unfortunately what can we do given an idiotic situation such as this?" Content-Transfer-Encoding: base64 R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAAAAAA AAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7VujnC96I RVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7+3dCeRRjfAKH iImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatLrU8GaQdOBAQAB7+y XliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJvs7Y5ewH3d7Fxe3jB4rj 8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjwE0cdGxQ/gswosoKUkmuU2FnJ csSKGTBjypxJsyaICAA7 --------------299A70B339B65A93542D2AE-- That was a multi-part message in MIME format. apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-2gifs-base64.xml0000644000000000000000000000577311702050534030634 0ustar rootroot
Content-type: message/rfc822 Content-transfer-encoding: base64 Subject: a multipart message/rfc822 which has been base64-encoded
Return-Path: eryq@rhine.gsfc.nasa.gov Sender: john-bigboote Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Eryq <eryq@rhine.gsfc.nasa.gov> Organization: Yoyodyne Propulsion Systems X-Mailer: Mozilla 2.0 (X11; I; Linux 1.1.18 i486) MIME-Version: 1.0 To: john-bigboote@eryq.pr.mcs.net Subject: Two images for you... Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE"
This is a multi-part message in MIME format.
Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit
When unpacked, this message should produce two GIF files: * The 1st should be called "3d-compress.gif" * The 2nd should be called "3d-eye.gif" Different ways of specifying the filenames have been used. -- ____ __ / __/__________/_/ Eryq (eryq@rhine.gsfc.nasa.gov) / __/ _/ / / , / Hughes STX Corporation, NASA/Goddard /___/_/ \ /\ /___ /_/ /_____/ http://selsvr.stx.com/~eryq/
Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-compress.gif"
R0lGODdhKAAoAOMAAAAAAAAAgB6Q/y9PT25ubnCAkKBSLb6+vufn5/Xes/+lAP/6zQAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJLMOyYbcoxkaZ5oCkoH6L5wLMfiWqd4btZhmxbA oFCY47EIqMJgyWw2ATjj7aRkAq5YwDMl9VGtKO0SiuoiTVlscsxt9c4HgXxUIA0EAVOVfDKT 8Hl1B3kDAYYle202XnGGgoMHhYckiWVuR3+OTgCGeZRslotwgJ2lnYigfZdTjQULr7ALBZN0 qTurjHgLKAu0B5Wqopm7J72etQN8t8Ijury+wMtvw8/Hv7Ylfs0BxCbGqMmK0yOOQ0GTCgrR 2bhwJGlXJQYG6mMKoeNoWSbzCWIACe5JwxQm3AkDAbUAQCiQhDZEBeBl6afgCsOBrD45edIv QceGWSMevpOYhl6CkydBHhBZQmGKjihVshypjB9ClAHZMTugzOU7mzhBPiSZ5uDNnA7b/aTZ 0mhMnfl0pDBFa6bUElSPWb0qtYuHrxlwcR17YsWMs2jTql3LFkQEADs=
Content-Type: image/gif; name="3d-eye.gif" Content-Transfer-Encoding: base64
R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7 VujnC96IRVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7 +3dCeRRjfAKHiImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatL rU8GaQdOBAQAB7+yXliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJ vs7Y5ewH3d7Fxe3jB4rj8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjw E0cdGxQ/gswosoKUkmuU2FnJcsSKGTBjypxJsyaICAA7
That was a multi-part message in MIME format.
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/x-gzip64_decoded.xml0000644000000000000000000000067111702050534030437 0ustar rootroot
Content-Type: text/plain; name=".signature" Content-Disposition: inline; filename=".signature" Content-Transfer-Encoding: x-gzip64 Mime-Version: 1.0 X-Mailer: MIME-tools 3.204 (ME 3.204 ) Subject: Testing! Content-Length: 281
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-clen_decoded.xml0000644000000000000000000000212111702050534031110 0ustar rootroot
From: Nathaniel Borenstein <nsb@bellcore.com> To: Ned Freed <ned@innosoft.com> Subject: Sample message MIME-Version: 1.0 Content-type: multipart/mixed; boundary="simple boundary"
This is the preamble. It is to be ignored, though it is a handy place for mail composers to include an explanatory note to non-MIME conformant readers.
Content-type: text/x-numbers; charset=us-ascii Content-length: 30
Content-type: text/x-alphabet; charset=us-ascii Content-length: 600
This is the epilogue. It is also to be ignored.
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-nested2_decoded_1_4.txt0000644000000000000000000000023011702050534032214 0ustar rootrootThis is part 4 of the outer message as defined in RFC1341 Isn't it cool? apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-nested3_decoded_1_1.txt0000644000000000000000000000032511702050534032217 0ustar rootrootPart 1 of the outer message. [Note that the preceding blank line means no header fields were given and this is text, with charset US ASCII. It could have been done with explicit typing as in the next part.] apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-igor.out0000644000000000000000000002473011702050534027501 0ustar rootrootDate: Thu, 6 Jun 1996 15:50:39 +0400 (MOW DST) From: Starovoitov Igor To: eryq@rhine.gsfc.nasa.gov Subject: Need help MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="-490585488-806670346-834061839=:2195" This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. Send mail to mime@docserver.cac.washington.edu for more info. ---490585488-806670346-834061839=:2195 Content-Type: TEXT/PLAIN; charset=US-ASCII Dear Sir, I have a problem with Your MIME-Parser-1.9 and multipart-nested messages. Not all parts are parsed. Here my Makefile, Your own multipart-nested.msg and its out after "make test". Some my messages not completely parsed too. Is this a bug? Thank You for help. Igor Starovoytov. ---490585488-806670346-834061839=:2195 Content-Type: TEXT/PLAIN; charset=US-ASCII; name=Makefile Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Makefile Iy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQ0KIyBNYWtlZmlsZSBmb3IgTUlNRTo6DQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMgV2hlcmUgdG8gaW5zdGFsbCB0 aGUgbGlicmFyaWVzOg0KU0lURV9QRVJMID0gL3Vzci9saWIvcGVybDUNCg0KIyBXaGF0IFBlcmw1 IGlzIGNhbGxlZCBvbiB5b3VyIHN5c3RlbSAobm8gbmVlZCB0byBnaXZlIGVudGlyZSBwYXRoKToN ClBFUkw1ICAgICA9IHBlcmwNCg0KIyBZb3UgcHJvYmFibHkgd29uJ3QgbmVlZCB0byBjaGFuZ2Ug dGhlc2UuLi4NCk1PRFMgICAgICA9IERlY29kZXIucG0gRW50aXR5LnBtIEhlYWQucG0gUGFyc2Vy LnBtIEJhc2U2NC5wbSBRdW90ZWRQcmludC5wbQ0KU0hFTEwgICAgID0gL2Jpbi9zaA0KDQojLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t DQojIEZvciBpbnN0YWxsZXJzLi4uDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCmhlbHA6CQ0KCUBlY2hvICJWYWxpZCB0YXJn ZXRzOiB0ZXN0IGNsZWFuIGluc3RhbGwiDQoNCmNsZWFuOg0KCXJtIC1mIHRlc3RvdXQvKg0KDQp0 ZXN0Og0KIwlAZWNobyAiVEVTVElORyBIZWFkLnBtLi4uIg0KIwkke1BFUkw1fSBNSU1FL0hlYWQu cG0gICA8IHRlc3Rpbi9maXJzdC5oZHIgICAgICAgPiB0ZXN0b3V0L0hlYWQub3V0DQojCUBlY2hv ICJURVNUSU5HIERlY29kZXIucG0uLi4iDQojCSR7UEVSTDV9IE1JTUUvRGVjb2Rlci5wbSA8IHRl c3Rpbi9xdW90LXByaW50LmJvZHkgPiB0ZXN0b3V0L0RlY29kZXIub3V0DQojCUBlY2hvICJURVNU SU5HIFBhcnNlci5wbSAoc2ltcGxlKS4uLiINCiMJJHtQRVJMNX0gTUlNRS9QYXJzZXIucG0gPCB0 ZXN0aW4vc2ltcGxlLm1zZyAgICAgID4gdGVzdG91dC9QYXJzZXIucy5vdXQNCiMJQGVjaG8gIlRF U1RJTkcgUGFyc2VyLnBtIChtdWx0aXBhcnQpLi4uIg0KIwkke1BFUkw1fSBNSU1FL1BhcnNlci5w bSA8IHRlc3Rpbi9tdWx0aS0yZ2lmcy5tc2cgPiB0ZXN0b3V0L1BhcnNlci5tLm91dA0KCUBlY2hv ICJURVNUSU5HIFBhcnNlci5wbSAobXVsdGlfbmVzdGVkLm1zZykuLi4iDQoJJHtQRVJMNX0gTUlN RS9QYXJzZXIucG0gPCB0ZXN0aW4vbXVsdGktbmVzdGVkLm1zZyA+IHRlc3RvdXQvUGFyc2VyLm4u b3V0DQoJQGVjaG8gIkFsbCB0ZXN0cyBwYXNzZWQuLi4gc2VlIC4vdGVzdG91dC9NT0RVTEUqLm91 dCBmb3Igb3V0cHV0Ig0KDQppbnN0YWxsOg0KCUBpZiBbICEgLWQgJHtTSVRFX1BFUkx9IF07IHRo ZW4gXA0KCSAgICBlY2hvICJQbGVhc2UgZWRpdCB0aGUgU0lURV9QRVJMIGluIHlvdXIgTWFrZWZp bGUiOyBleGl0IC0xOyBcDQogICAgICAgIGZpICAgICAgICAgIA0KCUBpZiBbICEgLXcgJHtTSVRF X1BFUkx9IF07IHRoZW4gXA0KCSAgICBlY2hvICJObyBwZXJtaXNzaW9uLi4uIHNob3VsZCB5b3Ug YmUgcm9vdD8iOyBleGl0IC0xOyBcDQogICAgICAgIGZpICAgICAgICAgIA0KCUBpZiBbICEgLWQg JHtTSVRFX1BFUkx9L01JTUUgXTsgdGhlbiBcDQoJICAgIG1rZGlyICR7U0lURV9QRVJMfS9NSU1F OyBcDQogICAgICAgIGZpDQoJaW5zdGFsbCAtbSAwNjQ0IE1JTUUvKi5wbSAke1NJVEVfUEVSTH0v TUlNRQ0KDQoNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0NCiMgRm9yIGRldmVsb3BlciBvbmx5Li4uDQojLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNClBPRDJIVE1M X0ZMQUdTID0gLS1wb2RwYXRoPS4gLS1mbHVzaCAtLWh0bWxyb290PS4uDQpIVE1MUyAgICAgICAg ICA9ICR7TU9EUzoucG09Lmh0bWx9DQpWUEFUSCAgICAgICAgICA9IE1JTUUNCg0KLlNVRkZJWEVT OiAucG0gLnBvZCAuaHRtbA0KDQojIHYuMS44IGdlbmVyYXRlZCAzMCBBcHIgOTYNCiMgdi4xLjkg aXMgb25seSBiZWNhdXNlIDEuOCBmYWlsZWQgQ1BBTiBpbmdlc3Rpb24NCmRpc3Q6IGRvY3VtZW50 ZWQJDQoJVkVSU0lPTj0xLjkgOyBcDQoJbWtkaXN0IC10Z3ogTUlNRS1wYXJzZXItJCRWRVJTSU9O IDsgXA0KCWNwIE1LRElTVC9NSU1FLXBhcnNlci0kJFZFUlNJT04udGd6ICR7SE9NRX0vcHVibGlj X2h0bWwvY3Bhbg0KCQ0KZG9jdW1lbnRlZDogJHtIVE1MU30gJHtNT0RTfQ0KDQoucG0uaHRtbDoN Cglwb2QyaHRtbCAke1BPRDJIVE1MX0ZMQUdTfSBcDQoJCS0tdGl0bGU9TUlNRTo6JCogXA0KCQkt LWluZmlsZT0kPCBcDQoJCS0tb3V0ZmlsZT1kb2NzLyQqLmh0bWwNCg0KIy0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0K ---490585488-806670346-834061839=:2195 Content-Type: TEXT/PLAIN; charset=US-ASCII; name="multi-nested.msg" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: test message TUlNRS1WZXJzaW9uOiAxLjANCkZyb206IExvcmQgSm9obiBXaG9yZmluIDx3aG9yZmluQHlveW9k eW5lLmNvbT4NClRvOiA8am9obi15YXlhQHlveW9keW5lLmNvbT4NClN1YmplY3Q6IEEgY29tcGxl eCBuZXN0ZWQgbXVsdGlwYXJ0IGV4YW1wbGUNCkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVk Ow0KICAgICBib3VuZGFyeT11bmlxdWUtYm91bmRhcnktMQ0KDQpUaGUgcHJlYW1ibGUgb2YgdGhl IG91dGVyIG11bHRpcGFydCBtZXNzYWdlLg0KTWFpbCByZWFkZXJzIHRoYXQgdW5kZXJzdGFuZCBt dWx0aXBhcnQgZm9ybWF0DQpzaG91bGQgaWdub3JlIHRoaXMgcHJlYW1ibGUuDQpJZiB5b3UgYXJl IHJlYWRpbmcgdGhpcyB0ZXh0LCB5b3UgbWlnaHQgd2FudCB0bw0KY29uc2lkZXIgY2hhbmdpbmcg dG8gYSBtYWlsIHJlYWRlciB0aGF0IHVuZGVyc3RhbmRzDQpob3cgdG8gcHJvcGVybHkgZGlzcGxh eSBtdWx0aXBhcnQgbWVzc2FnZXMuDQotLXVuaXF1ZS1ib3VuZGFyeS0xDQoNClBhcnQgMSBvZiB0 aGUgb3V0ZXIgbWVzc2FnZS4NCltOb3RlIHRoYXQgdGhlIHByZWNlZGluZyBibGFuayBsaW5lIG1l YW5zDQpubyBoZWFkZXIgZmllbGRzIHdlcmUgZ2l2ZW4gYW5kIHRoaXMgaXMgdGV4dCwNCndpdGgg Y2hhcnNldCBVUyBBU0NJSS4gIEl0IGNvdWxkIGhhdmUgYmVlbg0KZG9uZSB3aXRoIGV4cGxpY2l0 IHR5cGluZyBhcyBpbiB0aGUgbmV4dCBwYXJ0Ll0NCg0KLS11bmlxdWUtYm91bmRhcnktMQ0KQ29u dGVudC10eXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVTLUFTQ0lJDQoNClBhcnQgMiBvZiB0aGUg b3V0ZXIgbWVzc2FnZS4NClRoaXMgY291bGQgaGF2ZSBiZWVuIHBhcnQgb2YgdGhlIHByZXZpb3Vz IHBhcnQsDQpidXQgaWxsdXN0cmF0ZXMgZXhwbGljaXQgdmVyc3VzIGltcGxpY2l0DQp0eXBpbmcg b2YgYm9keSBwYXJ0cy4NCg0KLS11bmlxdWUtYm91bmRhcnktMQ0KU3ViamVjdDogUGFydCAzIG9m IHRoZSBvdXRlciBtZXNzYWdlIGlzIG11bHRpcGFydCENCkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0 L3BhcmFsbGVsOw0KICAgICBib3VuZGFyeT11bmlxdWUtYm91bmRhcnktMg0KDQpBIG9uZS1saW5l IHByZWFtYmxlIGZvciB0aGUgaW5uZXIgbXVsdGlwYXJ0IG1lc3NhZ2UuDQotLXVuaXF1ZS1ib3Vu ZGFyeS0yDQpDb250ZW50LVR5cGU6IGltYWdlL2dpZg0KQ29udGVudC1UcmFuc2Zlci1FbmNvZGlu ZzogYmFzZTY0DQpDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7IGZpbGVuYW1lPSIzZC1jb21w cmVzcy5naWYiDQpTdWJqZWN0OiBQYXJ0IDEgb2YgdGhlIGlubmVyIG1lc3NhZ2UgaXMgYSBHSUYs ICIzZC1jb21wcmVzcy5naWYiDQoNClIwbEdPRGRoS0FBb0FPTUFBQUFBQUFBQWdCNlEveTlQVDI1 dWJuQ0FrS0JTTGI2K3Z1Zm41L1hlcy8rbEFQLzZ6UUFBQUFBQQ0KQUFBQUFBQUFBQ3dBQUFBQUtB QW9BQUFFL2hESlNhdTllSkxNT3lZYmNveGthWjVvQ2tvSDZMNXdMTWZpV3FkNGJ0WmhteGJBDQpv RkNZNDdFSXFNSmd5V3cyQVRqajdhUmtBcTVZd0RNbDlWR3RLTzBTaXVvaVRWbHNjc3h0OWM0SGdY eFVJQTBFQVZPVmZES1QNCjhIbDFCM2tEQVlZbGUyMDJYbkdHZ29NSGhZY2tpV1Z1UjMrT1RnQ0dl WlJzbG90d2dKMmxuWWlnZlpkVGpRVUxyN0FMQlpOMA0KcVR1cmpIZ0xLQXUwQjVXcW9wbTdKNzJl dFFOOHQ4SWp1cnkrd010dnc4L0h2N1lsZnMwQnhDYkdxTW1LMHlPT1EwR1RDZ3JSDQoyYmh3Skds WEpRWUc2bU1Lb2VOb1dTYnpDV0lBQ2U1Snd4UW0zQWtEQWJVQVFDaVFoRFpFQmVCbDZhZmdDc09C ckQ0NWVkSXYNClFjZUdXU01ldnBPWWhsNkNreWRCSGhCWlFtR0tqaWhWc2h5cGpCOUNsQUhaTVR1 Z3pPVTdtemhCUGlTWjV1RE5uQTdiL2FUWg0KMG1oTW5mbDBwREJGYTZiVUVsU1BXYjBxdFl1SHJ4 bHdjUjE3WXNXTXMyalRxbDNMRmtRRUFEcz0NCi0tdW5pcXVlLWJvdW5kYXJ5LTINCkNvbnRlbnQt VHlwZTogaW1hZ2UvZ2lmDQpDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNlNjQNCkNvbnRl bnQtRGlzcG9zaXRpb246IGlubGluZTsgZmlsZW5hbWU9IjNkLWV5ZS5naWYiDQpTdWJqZWN0OiBQ YXJ0IDIgb2YgdGhlIGlubmVyIG1lc3NhZ2UgaXMgYW5vdGhlciBHSUYsICIzZC1leWUuZ2lmIg0K DQpSMGxHT0RkaEtBQW9BUE1BQUFBQUFBQUF6TjN1Lzc2K3ZvaUlpRzV1YnN6ZDd2Ly8vK2ZuNXdB QUFBQUFBQUFBQUFBQUFBQUENCkFBQUFBQUFBQUN3QUFBQUFLQUFvQUFBRS9oREpTYXU5ZUpiTU95 NGJNb3hrYVo1b0Nrb0Q2TDV3TE1maVduczQxb1p0N2xNNw0KVnVqbkM5NklSVnNQV1FFNG54UGpr dm1zUW11OG9jL0tCVVNWV2s3WGVwR0dMZU5yeG94Sk8xTWpJTGp0aGcva1dYUTZ3Ty83DQorM2RD ZVJSamZBS0hpSW1KQVYrRENGMEJpVzVWQW8xQ0VsYVJoNU5qbGtlWW1weVRncGNUQUtHaWFhU2Zw d0twVlFheFZhdEwNCnJVOEdhUWRPQkFRQUI3K3lYbGlYVHJnQXhzVzR2RmFidjhCT3RCc0J0N2NH dndDSVQ5bk95TkVJeHVDNHpycUt6YzlYYk9ESg0KdnM3WTVld0gzZDdGeGUzakI0cmo4dDZQdU5h NnIyYmhLUVhOMTdGWUNCTXFUR2lCelNOaHg1ZzBuRU1obHNTSmppUll2RGp3DQpFMGNkR3hRL2dz d29zb0tVa211VTJGbkpjc1NLR1RCanlweEpzeWFJQ0FBNw0KLS11bmlxdWUtYm91bmRhcnktMi0t DQoNClRoZSBlcGlsb2d1ZSBmb3IgdGhlIGlubmVyIG11bHRpcGFydCBtZXNzYWdlLg0KDQotLXVu aXF1ZS1ib3VuZGFyeS0xDQpDb250ZW50LXR5cGU6IHRleHQvcmljaHRleHQNCg0KVGhpcyBpcyA8 Ym9sZD5wYXJ0IDQgb2YgdGhlIG91dGVyIG1lc3NhZ2U8L2JvbGQ+DQo8c21hbGxlcj5hcyBkZWZp bmVkIGluIFJGQzEzNDE8L3NtYWxsZXI+PG5sPg0KPG5sPg0KSXNuJ3QgaXQgPGJpZ2dlcj48Ymln Z2VyPmNvb2w/PC9iaWdnZXI+PC9iaWdnZXI+DQoNCi0tdW5pcXVlLWJvdW5kYXJ5LTENCkNvbnRl bnQtVHlwZTogbWVzc2FnZS9yZmM4MjINCg0KRnJvbTogKG1haWxib3ggaW4gVVMtQVNDSUkpDQpU bzogKGFkZHJlc3MgaW4gVVMtQVNDSUkpDQpTdWJqZWN0OiBQYXJ0IDUgb2YgdGhlIG91dGVyIG1l c3NhZ2UgaXMgaXRzZWxmIGFuIFJGQzgyMiBtZXNzYWdlIQ0KQ29udGVudC1UeXBlOiBUZXh0L3Bs YWluOyBjaGFyc2V0PUlTTy04ODU5LTENCkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IFF1b3Rl ZC1wcmludGFibGUNCg0KUGFydCA1IG9mIHRoZSBvdXRlciBtZXNzYWdlIGlzIGl0c2VsZiBhbiBS RkM4MjIgbWVzc2FnZSENCg0KLS11bmlxdWUtYm91bmRhcnktMS0tDQoNClRoZSBlcGlsb2d1ZSBm b3IgdGhlIG91dGVyIG1lc3NhZ2UuDQo= ---490585488-806670346-834061839=:2195 Content-Type: TEXT/PLAIN; charset=US-ASCII; name="Parser.n.out" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: out from parser KiBXYWl0aW5nIGZvciBhIE1JTUUgbWVzc2FnZSBmcm9tIFNURElOLi4uDQo9PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCkNvbnRlbnQt dHlwZTogbXVsdGlwYXJ0L21peGVkDQpCb2R5LWZpbGU6IE5PTkUNClN1YmplY3Q6IEEgY29tcGxl eCBuZXN0ZWQgbXVsdGlwYXJ0IGV4YW1wbGUNCk51bS1wYXJ0czogMw0KLS0NCiAgICBDb250ZW50 LXR5cGU6IHRleHQvcGxhaW4NCiAgICBCb2R5LWZpbGU6IC4vdGVzdG91dC9tc2ctMzUzOC0xLmRv Yw0KICAgIC0tDQogICAgQ29udGVudC10eXBlOiB0ZXh0L3BsYWluDQogICAgQm9keS1maWxlOiAu L3Rlc3RvdXQvbXNnLTM1MzgtMi5kb2MNCiAgICAtLQ0KICAgIENvbnRlbnQtdHlwZTogbXVsdGlw YXJ0L3BhcmFsbGVsDQogICAgQm9keS1maWxlOiBOT05FDQogICAgU3ViamVjdDogUGFydCAzIG9m IHRoZSBvdXRlciBtZXNzYWdlIGlzIG11bHRpcGFydCENCiAgICBOdW0tcGFydHM6IDINCiAgICAt LQ0KICAgICAgICBDb250ZW50LXR5cGU6IGltYWdlL2dpZg0KICAgICAgICBCb2R5LWZpbGU6IC4v dGVzdG91dC8zZC1jb21wcmVzcy5naWYNCiAgICAgICAgU3ViamVjdDogUGFydCAxIG9mIHRoZSBp bm5lciBtZXNzYWdlIGlzIGEgR0lGLCAiM2QtY29tcHJlc3MuZ2lmIg0KICAgICAgICAtLQ0KICAg ICAgICBDb250ZW50LXR5cGU6IGltYWdlL2dpZg0KICAgICAgICBCb2R5LWZpbGU6IC4vdGVzdG91 dC8zZC1leWUuZ2lmDQogICAgICAgIFN1YmplY3Q6IFBhcnQgMiBvZiB0aGUgaW5uZXIgbWVzc2Fn ZSBpcyBhbm90aGVyIEdJRiwgIjNkLWV5ZS5naWYiDQogICAgICAgIC0tDQo9PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0K ---490585488-806670346-834061839=:2195-- ././@LongLink0000000000000000000000000000015700000000000011570 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/attachment-filename-encoding-Latin1.xmlapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/attachment-filename-encoding-0000644000000000000000000000146511702050534032352 0ustar rootroot
MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------050706070100080203090004"
This is a multi-part message in MIME format.
Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit
Attachment Test
Content-Type: text/plain; name="=?ISO-8859-1?B?YXR0YWNobWVudC7k9vw=?=" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename*=ISO-8859-1''%61%74%74%61%63%68%6D%65%6E%74%2E%E4%F6%FC
VGVzdAo=
././@LongLink0000000000000000000000000000016700000000000011571 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/attachment-filename-encoding-Latin1_decoded.xmlapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/attachment-filename-encoding-0000644000000000000000000000161511702050534032347 0ustar rootroot
MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------050706070100080203090004"
This is a multi-part message in MIME format.
Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit
Content-Type: text/plain; name="=?ISO-8859-1?B?YXR0YWNobWVudC7k9vw=?=" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename*=ISO-8859-1''%61%74%74%61%63%68%6D%65%6E%74%2E%E4%F6%FC
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/lennie_decoded.xml0000644000000000000000000000417111702050534030320 0ustar rootroot
Return-Path: <lbj_ccsi@atl.mindspring.com> Received: from brickbat8.mindspring.com (brickbat8.mindspring.com [207.69.200.11]) by camel10.mindspring.com (8.8.5/8.8.5) with ESMTP id GAA27894 for <lbj_ccsi@atl.mindspring.com>; Fri, 25 Jul 1997 06:58:07 -0400 (EDT) Received: from lennie (user-2k7i8oq.dialup.mindspring.com [168.121.35.26]) by brickbat8.mindspring.com (8.8.5/8.8.5) with SMTP id GAA22488 for <lbj_ccsi@atl.mindspring.com>; Fri, 25 Jul 1997 06:58:05 -0400 (EDT) Message-ID: <33D89532.29EA@atl.mindspring.com> Date: Fri, 25 Jul 1997 06:59:46 -0500 From: Lennie Jarratt <lbj_ccsi@mindspring.com> Reply-To: lbj_ccsi@mindspring.com Organization: Custom Computer Services Inc. X-Mailer: Mozilla 3.01Gold (Win95; I) MIME-Version: 1.0 To: lbj_ccsi@atl.mindspring.com Subject: Test Mail Again Content-Type: multipart/mixed; boundary="------------52E03A8932B4"
This is a multi-part message in MIME format.
Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit
Content-Type: text/html; charset=us-ascii; name="Pull3.html" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="Pull3.html" Content-Base: "file:///E|/ChckFree/Html/Pull3.html"
Content-Type: image/gif; name="WWWIcon.gif" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="WWWIcon.gif"
././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-nested2_decoded_1_5_1.txtapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-nested2_decoded_1_5_1.t0000644000000000000000000000007211702050534032065 0ustar rootrootPart 5 of the outer message is itself an RFC822 message! apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/hdr-fakeout.msg0000644000000000000000000000101511702050534027570 0ustar rootrootReceived: (qmail 24486 invoked by uid 501); 20 May 2000 01:55:02 -0000 Date: Fri, 19 May 2000 21:55:02 -0400 From: "Russell P. Sutherland" To: "Russell P. Sutherland" Subject: test message 1 Message-ID: <20000519215502.A24482@quist.on.ca> Mime-Version: 1.0 Content-transfer-encoding: 7BIT Content-Type: text/plain; charset=us-ascii X-Mailer: Mutt 1.0us Organization: Quist Consulting The header is not properly terminated; the "blank line" actually has a space in it. ././@LongLink0000000000000000000000000000017100000000000011564 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/attachment-filename-encoding-UTF8_decoded_1_2.txtapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/attachment-filename-encoding-0000644000000000000000000000000511702050534032337 0ustar rootrootTest apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-bad_decoded.xml0000644000000000000000000001207511702050534030726 0ustar rootroot
From: Michelle Holm <holm@sitka.colorado.edu> Date: Mon, 21 Aug 95 13:30:57 -600 Sender: holm@sitka.colorado.edu To: imswww@rhine.gsfc.nasa.gov Mime-Version: 1.0 X-Mailer: Mozilla/1.0N (X11; IRIX 5.2 IP20) Content-Type: multipart/mixed; boundary="-------------------------------147881770724098" Subject: http://rhine.gsfc.nasa.gov:8080/ims-bin/v.b/imssearch X-Url: http://rhine.gsfc.nasa.gov:8080/ims-bin/v.b/imssearch Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit
> [[ERROR]] Error 600: Internal logic. > > Dying gasp: > Bad mode: SEARCH/ (600). > > Recommended action to correct the situation: > YIKES! IMS/www failed one of its internal consistency checks! Please SAVE > THIS FILE, and contact IMS/www's developers immediately so they can fix the > problem! If the parentheses at the end of this sentence are not blank, you > can contact them here (imswww@rhine.gsfc.nasa.gov). > > ------------------------------------------------------------------------ > > > Location of error > > Dying gasp: > Package "main", file "/usr/app/people/imswww/v.b/lib/perl/imssearch.pl", line > 753. > > Traceback: > > 1. Iw::Die: from "main", "/usr/app/people/imswww/v.b/lib/perl/imssearch.pl > line 753 > 2. main::Main: from "main", > "/usr/app/people/imswww/public_cgi/v.b/imssearch line 85 > > ------------------------------------------------------------------------ > > > Basic state information > > Include path > > /usr/app/people/imswww/v.b/lib/perl > /usr/app/people/imswww/v.b/lib/perl/Eg > /usr/local/lib/perl5/sun4-sunos > /usr/local/lib/perl5 > . > > Environment variables > > CONTENT_LENGTH = "281" > CONTENT_TYPE = "application/x-www-form-urlencoded" > DOCUMENT_ROOT = "/usr/local/etc/httpd/htdocs" > GAEADATA_DIR = "/home/rhine/ims/lib/gaea_data" > GAEATMP_DIR = "/usr/app/people/imswww/v.b/tmp/imswww-usr/809033436-10153" > GATEWAY_INTERFACE = "CGI/1.1" > HTTP_ACCEPT = "*/*, image/gif, image/x-xbitmap, image/jpeg" > HTTP_REFERER = "http://rhine.gsfc.nasa.gov:8080/ims-bin/v.b/imssearch" > HTTP_USER_AGENT = "Mozilla/1.0N (X11; IRIX 5.2 IP20)" > IMS_STAFF = "1" > IW_CGI_DIR = "/usr/app/people/imswww/v.b/cgi-bin" > IW_DOCS_DIR = "/usr/app/people/imswww/v.b/docs" > IW_LIB_DIR = "/usr/app/people/imswww/v.b/lib" > IW_SESSION_DIR = "/usr/app/people/imswww/v.b/tmp/imswww-usr/809033436-10153" > IW_SESSION_ID = "809033436-10153" > IW_TMP_DIR = "/usr/app/people/imswww/v.b/tmp" > PATH = "/bin:/usr/bin:/usr/etc:/usr/ucb:/usr/local/bin:/usr/ucb" > QUERY_STRING = "" > REMOTE_ADDR = "128.138.135.33" > REMOTE_HOST = "sitka.colorado.edu" > REQUEST_METHOD = "POST" > SCRIPT_NAME = "/ims-bin/v.b/imssearch" > SERVER_NAME = "rhine.gsfc.nasa.gov" > SERVER_PORT = "8080" > SERVER_PROTOCOL = "HTTP/1.0" > SERVER_SOFTWARE = "NCSA/1.4.2" > SYSLOG_LEVEL = "7" > USRDATA_DIR = "/usr/app/people/imswww/v.b/tmp/imswww-usr/809033436-10153" > > Tags > > pmap-geo-opt = "map" > pparam-param = "Sea Ice Concentration" > pparam-param = "Snow Cover" > pparam-param = "Total Sea Ice Concentration" > s-east-long = "-40.0" > s-north-lat = "75.3" > s-south-lat = "66.0" > s-start-date = "01-01-1990" > s-start-time = "" > s-stop-date = "31-12-1994" > s-stop-time = "" > s-west-long = "-176.0" > sid = "809033436-10153" > > Permissions > > Real user id = 65534 > Real group ids = 65534 65534 > Effective user id = 65534 > Effective group ids = 65534 65534 > > ------------------------------------------------------------------------ > > > Log file /usr/app/people/imswww/v.b/tmp/imswww-usr/10184.clog > > II 1995/08/21 15:33:50 IwLog 94 > Logging begun > WWW 1995/08/21 15:33:50 Iw 263 > Perl: Use of uninitialized value at /usr/app/people/imswww/v.b/lib/perl/ims ; > search.pl line 82. > | > EEEE 1995/08/21 15:33:51 Iw 95 > Bad mode: SEARCH/ (600). > > ------------------------------------------------------------------------ > > > Session information > > [Session Directory] > > ------------------------------------------------------------------------ > > Generated by EOSDIS IMS/www version 0.3b / imswww@rhine.gsfc.nasa.gov > NASA/GSFC Task Representative: Yonsook Enloe, yonsook@killians.gsfc.nasa.gov > > A joint project of NASA/GSFC, A/WWW Enterprises, and Hughes STX Corporation. > Full contact information is available.
Content-Type: text/plain Content-Transfer-Encoding: 8bit
././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-badnames_decoded_1_1.txtapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-badnames_decoded_1_1.tx0000644000000000000000000000000011702050534032226 0ustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/uu-junk_decoded.xml0000644000000000000000000000317011702050534030442 0ustar rootroot
Return-Path: <support@webmail.uwohali.com> Received: from virtual.mrf.mail.rcn.net ([207.172.4.103]) by mta02.mrf.mail.rcn.net (InterMail vM.4.01.02.27 201-229-119-110) with ESMTP id <20000425112650.ZPUD516.mta02.mrf.mail.rcn.net@virtual.mrf.mail.rcn.net> for <eryq@mta.mrf.mail.rcn.net>; Tue, 25 Apr 2000 07:26:50 -0400 Received: from [205.139.141.226] (helo=webmail.uwohali.com ident=root) by virtual.mrf.mail.rcn.net with esmtp (Exim 2.12 #3) id 12k3VX-00012G-00 for eryq@zeegee.com; Tue, 25 Apr 2000 07:27:59 -0400 Received: from webmail.uwohali.com (nobody@localhost [127.0.0.1]) by webmail.uwohali.com (8.8.7/8.8.7) with SMTP id GAA10264 for <eryq@zeegee.com>; Tue, 25 Apr 2000 06:34:43 -0500 Date: Tue, 25 Apr 2000 06:34:43 -0500 Message-Id: <200004251134.GAA10264@webmail.uwohali.com> From: "ADJE Webmail Tech Support" <support@webmail.uwohali.com> To: eryq@zeegee.com Subject: mime::parser Content-type: multipart/mixed; boundary="---------------------------7d033e3733c" Mime-Version: 1.0 X-Mozilla-Status: 8001
Content-Type: text/plain
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/jt-0498_decoded_1_2_1.txt0000644000000000000000000000050111702050534030756 0ustar rootrootHi Pat, I don't see any distortion in my tall Honda screen, nor any maginfication-- Visit the PC800 web page at To unsubscribe from the list, send "unsubscribe pc800" in the body of a message to majordomo@hpc.uh.edu. To report problems, send mail to pc800-owner@hpc.uh.edu. apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/bluedot-postcard.out0000644000000000000000000001557611702050534030674 0ustar rootrootContent-Type: multipart/alternative; boundary="----------=_961872013-1436-0" Content-Transfer-Encoding: binary Mime-Version: 1.0 X-Mailer: MIME-tools 5.211 (Entity 5.205) To: noone Subject: A postcard for you This is a multi-part message in MIME format... ------------=_961872013-1436-0 Content-Type: text/plain Content-Disposition: inline Content-Transfer-Encoding: binary Having a wonderful time... wish you were looking at HTML instead of this boring text! ------------=_961872013-1436-0 Content-Type: multipart/related; boundary="----------=_961872013-1436-1" Content-Transfer-Encoding: binary This is a multi-part message in MIME format... ------------=_961872013-1436-1 Content-Type: text/html Content-Disposition: inline Content-Transfer-Encoding: binary

Hey there!

Having a wonderful time... take a look!
Snapshot
------------=_961872013-1436-1 Content-Type: image/jpeg; name="bluedot.jpg" Content-Disposition: inline; filename="bluedot.jpg" Content-Transfer-Encoding: base64 Content-Id: my-graphic /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAEAAQADASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iii gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKjnnhtbeW4uJY4YIkLySSMF VFAySSeAAOc0ASUVw+p/E3TY1MeiW0uqzgkb8NBbjB6+ay/MCM4MauDgZIBBrk7zxV4p1KPy7jV4 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 2nWmk6fDY2MCw20IwiAk9Tkkk8kkkkk5JJJJJNWqKK8I+r2CiiigAooooAKKKKACiiigAooooAKK KKACiiigAooooAKKKKACiiigDlNY+H2iarcPdQefpd1I5eWawKp5pJJJZGVkLEnJfbvOAN2OK5O8 8AeJ7PJt5dN1ONV3kqXtZCf7iod6k8cEyKCTg4AyfV6K6aOLr0dIS0OLEZdhcRrVgm++z+9HiU2j +IrWJprrwzqccK/edDDORngfJFI7nn0U46nABNVP9L/6A2uf+Ce6/wDjde8UV2RzjELdJ/L/AIJ5 suHMG3o5L5r9UeEJHfzSLHFomttI5CoraZPGCT0BZ0Cr9WIA7kCtGHwx4ruZViXw7JbFv+Wt3dwL Evf5jG7t7DCnkjOBkj2ailLN8Q9rL5f5lQ4dwcd7v1f+SR5xYfDK7lkR9Z1lTCQGe2sITGc8ZQzM xJXGRlVRjwQV6V2ukeH9I0GN00rTra0MgUSvHGA8u3ODI/3nPJ5Yk5JOeTWlRXBVr1KrvUdz1aGF o4dWpRSCiiisjoCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA//Z ------------=_961872013-1436-1-- ------------=_961872013-1436-0-- apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/empty-preamble.out0000644000000000000000000000171311702050534030330 0ustar rootrootContent-Type: multipart/mixed; boundary="t0UkRYy7tHLRMCai" Content-Disposition: inline --t0UkRYy7tHLRMCai Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Das ist ein Test=2E --=20 sub i($){print$_[0]}*j=3D*ENV;sub w($){sleep$_[0]}sub _($){i"$p:$c> ",w+01 ,$_=3D$_[0],tr;i-za-h,;a-hi-z ;,i$_,w+01,i"\n"}$|=3D1;$f=3D'HO';($c=3D$j{P= WD})=3D~ s+$j{$f=2E"ME"}+~+;$p=2E=3D"$j{USER}\@"=2E`hostname`;chop$p;_"kl",$c=3D'~'= ,_"zu,"=2E "-zn,*",_"#,epg,lw,gwc,mfmkcbm,cvsvwev,uiqt,kwvbmvb?",i"$p:$c> ";w+1<<07 --t0UkRYy7tHLRMCai Content-Type: image/png Content-Disposition: attachment; filename="dot.png" Content-Transfer-Encoding: base64 iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAIAAAD91JpzAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA B3RJTUUH1AUbFQQ0Vbb7XQAAAB10RVh0Q29tbWVudABDcmVhdGVkIHdpdGggVGhlIEdJTVDvZCVu AAAAFklEQVR42mP8//8/AwMDEwMDAwMDAwAkBgMB/umWrAAAAABJRU5ErkJggg== --t0UkRYy7tHLRMCai-- apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-igor_decoded_1_3.txt0000644000000000000000000000631011702050534031614 0ustar rootrootMIME-Version: 1.0 From: Lord John Whorfin To: Subject: A complex nested multipart example Content-Type: multipart/mixed; boundary=unique-boundary-1 The preamble of the outer multipart message. Mail readers that understand multipart format should ignore this preamble. If you are reading this text, you might want to consider changing to a mail reader that understands how to properly display multipart messages. --unique-boundary-1 Part 1 of the outer message. [Note that the preceding blank line means no header fields were given and this is text, with charset US ASCII. It could have been done with explicit typing as in the next part.] --unique-boundary-1 Content-type: text/plain; charset=US-ASCII Part 2 of the outer message. This could have been part of the previous part, but illustrates explicit versus implicit typing of body parts. --unique-boundary-1 Subject: Part 3 of the outer message is multipart! Content-Type: multipart/parallel; boundary=unique-boundary-2 A one-line preamble for the inner multipart message. --unique-boundary-2 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-compress.gif" Subject: Part 1 of the inner message is a GIF, "3d-compress.gif" R0lGODdhKAAoAOMAAAAAAAAAgB6Q/y9PT25ubnCAkKBSLb6+vufn5/Xes/+lAP/6zQAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJLMOyYbcoxkaZ5oCkoH6L5wLMfiWqd4btZhmxbA oFCY47EIqMJgyWw2ATjj7aRkAq5YwDMl9VGtKO0SiuoiTVlscsxt9c4HgXxUIA0EAVOVfDKT 8Hl1B3kDAYYle202XnGGgoMHhYckiWVuR3+OTgCGeZRslotwgJ2lnYigfZdTjQULr7ALBZN0 qTurjHgLKAu0B5Wqopm7J72etQN8t8Ijury+wMtvw8/Hv7Ylfs0BxCbGqMmK0yOOQ0GTCgrR 2bhwJGlXJQYG6mMKoeNoWSbzCWIACe5JwxQm3AkDAbUAQCiQhDZEBeBl6afgCsOBrD45edIv QceGWSMevpOYhl6CkydBHhBZQmGKjihVshypjB9ClAHZMTugzOU7mzhBPiSZ5uDNnA7b/aTZ 0mhMnfl0pDBFa6bUElSPWb0qtYuHrxlwcR17YsWMs2jTql3LFkQEADs= --unique-boundary-2 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-eye.gif" Subject: Part 2 of the inner message is another GIF, "3d-eye.gif" R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7 VujnC96IRVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7 +3dCeRRjfAKHiImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatL rU8GaQdOBAQAB7+yXliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJ vs7Y5ewH3d7Fxe3jB4rj8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjw E0cdGxQ/gswosoKUkmuU2FnJcsSKGTBjypxJsyaICAA7 --unique-boundary-2-- The epilogue for the inner multipart message. --unique-boundary-1 Content-type: text/richtext This is part 4 of the outer message as defined in RFC1341 Isn't it cool? --unique-boundary-1 Content-Type: message/rfc822 From: (mailbox in US-ASCII) To: (address in US-ASCII) Subject: Part 5 of the outer message is itself an RFC822 message! Content-Type: Text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: Quoted-printable Part 5 of the outer message is itself an RFC822 message! --unique-boundary-1-- The epilogue for the outer message. apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/twopart.out0000644000000000000000000012422211702050534027106 0ustar rootrootReturn-Path: <0647842285@uk.wowlg.com> Delivered-To: wowlgcard@cpostale.com Received: from WOWLG POSTCARD (unknown [57.67.194.147]) by lbn-int.qualimucho.com (Postfix) with SMTP id B33BE3F06 for ; Wed, 12 Jan 2005 08:08:12 +0100 (CET) MIME-Version: 1.0 From: 0647842285@uk.wowlg.com To: wowlgcard@cpostale.com Message-Id:102.10200000000105 Content-Type: multipart/mixed; boundary="=_wowlgpostcardsender102.10200000000105_=" Date: Wed, 12 Jan 2005 08:08:12 +0100 (CET) This is a multi-part message in MIME format... --=_wowlgpostcardsender102.10200000000105_= Content-Type: text/plain; charset="ISO-8859-1" Content-Disposition: inline Content-Transfer-Encoding: 8bit JOY LEE;Batiment Le Rabelais 22 Ave. des Nations ZI PARIS NORD II; VILLEPINTE 93240;Greece#This is test message. Términos y Condiciones ¿Contraseña? Álbum êtes le propriétaire für geschäftliche --=_wowlgpostcardsender102.10200000000105_= Content-Type:image/jpeg; name="/home1/eucyon/data/img_event/postcard/uk7200_110_6.jpg" Content-Disposition: attachment;filename="/home1/eucyon/data/img_event/postcard/uk7200_110_6.jpg" Content-transfer-encoding: base64 /9j/4AAQSkZJRgABAgEASABIAAD/7Ri2UGhvdG9zaG9wIDMuMAA4QklNA+0KUmVzb2x1dGlvbgAA AAAQAEgAAAABAAIASAAAAAEAAjhCSU0EDRhGWCBHbG9iYWwgTGlnaHRpbmcgQW5nbGUAAAAABAAA AHg4QklNBBkSRlggR2xvYmFsIEFsdGl0dWRlAAAAAAQAAAAeOEJJTQPzC1ByaW50IEZsYWdzAAAA CQAAAAAAAAAAAQA4QklNBAoOQ29weXJpZ2h0IEZsYWcAAAAAAQAAOEJJTScQFEphcGFuZXNlIFBy aW50IEZsYWdzAAAAAAoAAQAAAAAAAAACOEJJTQP1F0NvbG9yIEhhbGZ0b25lIFNldHRpbmdzAAAA SAAvZmYAAQBsZmYABgAAAAAAAQAvZmYAAQChmZoABgAAAAAAAQAyAAAAAQBaAAAABgAAAAAAAQA1 AAAAAQAtAAAABgAAAAAAAThCSU0D+BdDb2xvciBUcmFuc2ZlciBTZXR0aW5ncwAAAHAAAP////// //////////////////////8D6AAAAAD/////////////////////////////A+gAAAAA//////// /////////////////////wPoAAAAAP////////////////////////////8D6AAAOEJJTQQIBkd1 aWRlcwAAAAAQAAAAAQAAAkAAAAJAAAAAADhCSU0EHg1VUkwgb3ZlcnJpZGVzAAAABAAAAAA4QklN BBoGU2xpY2VzAAAAAHUAAAAGAAAAAAAAAAAAAADwAAABXgAAAAoAVQBuAHQAaQB0AGwAZQBkAC0A MgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABXgAAAPAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAOEJJTQQREUlDQyBVbnRhZ2dlZCBGbGFnAAAAAQEAOEJJTQQUF0xh eWVyIElEIEdlbmVyYXRvciBCYXNlAAAABAAAAAI4QklNBAwVTmV3IFdpbmRvd3MgVGh1bWJuYWls AAAVDQAAAAEAAABwAAAATQAAAVAAAGUQAAAU8QAYAAH/2P/gABBKRklGAAECAQBIAEgAAP/uAA5B ZG9iZQBkgAAAAAH/2wCEAAwICAgJCAwJCQwRCwoLERUPDAwPFRgTExUTExgRDAwMDAwMEQwMDAwM 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 IxoVFRojIhcXFxcXIhEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAEUExMWGRYb FxcbFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM /8AAEQgA8AFeAwEiAAIRAQMRAf/dAAQAFv/EAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkK CwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEF QVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKz hMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5/cRAAICAQIEBAME BQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcm NcLSRJNUoxdkRVU2dGXi8rOEw9N14/NGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dXZ3eH l6e3x//aAAwDAQACEQMRAD8A7bYFKAkkSAiigs5u5pbxPgsXLYytxG6VrvG9hBJY3ueNFzuSaxY5 tR36Fw/eLWfSe2tvvf8A+fFl/EIkygBH1fv8X/qNt8pqSb08v+6Q2WMAOvCgMq6v+be5p7wS1V3Z DCSBrGh00lDdZx+VVowIrcF0aBFbti7NybG7bLXOb4ElV2NN7y3dta0SXf8AfPzvzEGxxI+78idh aaN1d4bbWDupLfpH97fu/wCt+p/o1OISlrfr/rLZERG1Rv8ARDp2lux0z6RgAxLdoP0fas9zy93i OCeJktb6ntRLXSweEaQZ/t/nsQnktdPZ/wBIa/5vv/8ARajhGkg0EkwWhokyBPxPt9yiXPbuEQ4a OB51/eYovJAYeTE/eVVyMrbVO4usbMg66H+X/OP+knxiSxymALTt6rm4mSRTe4A+4Ncd9f7tn6F/ 8v8A4uxdV0frbc+arG7Mhokx9B4/er/cXn92ZvrFbQCJBPciPzmfuI+B1G7FvZfXBe3TaeCP3Vfg ZRA/50WjLhlf736M31BJc1jfW7GcIyKLKj+8yLWf+irv/AlsYvVunZZ20ZDXO/dMsd/23d6b1NY6 Fg4ZDcN1JJJFCkK6nf726WDg+P8AIcipIg0ppVuYSWgjc06tn3NPt9m3+cT2Y9Vv84xrx4OaD/31 C6l01uU31KwBe0fKwf6G3/0r/wCi1z7L7q7du51Zbo5u4gtP5+9m/wD1/wDP08I8eoNS/dYZmtw6 9/Ssd4JrJqdJ49zZ/wCLs/8ARdioP6fl0u3UP36HVhLH/wBlu/8A9Gf+fP002dTyg7b/ADjR++Pd H8lzPRs/1/0v8y1/WKy01lhb2c5pL9B+Z+Zss/1/4FSj3I/1lvoPhbVd1XNraavUJPDt4l3536Nr /Zd/4IoM6gTpZX4iW+H0f5u3/wA9fo0Umq1uhbY09tHf56H9greYr3MdMAAy2Z+j+k/9KIgx6jhT UgNCmpy6LXhri6sH85zdwDR+f+j371u49mLtayl4IA9omHfv/n7H/wCtn/WscdEyqh+jcy0mJ5Y7 /poL8TKrH6Sl0D86Nwgf8Vvr/wBf8KgYwltJbxSG4em9/aRHaZ/zVJtjvIrlN1tZhjnsPxcyI/tN /wBf9H6asM6jms1FheAJ2vG8/wBv8/8A1/6ymHAehBXDL5h6QXCdW/PlO6yuCT20+/8AqrCZ1h4+ lSCRE7HR/wBU13+v/BoreqYtujprI/fB7/y276/9f+22HDIdPsXDID1b7qq7CSYcDzwf9diq3dOp eD7QT3EA/wDQ/wBf/SiZbTYdHtJOjYIdP+v+v856dz2/aXNNdLHuL5k8NA/45+3/AF/0v+DaYA7g f4S4SPQuDmdKpsefTADWmBAif7Sz39IsbO10c868fSautq6bfpvcxgHEDc4f5vp1sRx0vHkFxc6O RO1pTTDHWn/NXcReF/Z+R+cwPb3MRz/XQ/2Q7IP6HGuDv+DYXs1/e3fo/wDwWtek10U1CK2Bv5f8 5EUJhroU8Xg+cO+p/WdoLWNPk57Wu/6Lrmf+CrIycTLw7zVfW6q5oEhw12k7Wv8AUbvrsq/4T+aX ryodU6Vj9Sx/Ss9ljZNNzfp1OP8A58pf/hsf+buR4fG1X9Hy0ZD28E1EfnVksP8AbqY5lW//AIv0 lYpeLchtmTlsIHLshj8g6D+bsoe27f8A9vLRyekdRx7n1WNbYW943Nc38yytzv8AX/BqjbjbXEvx 3VEd2TtP/WrP++W1phrqPtXgnu7+J/zbseGWelVYdfUptuoqL/3Ps77avs3/AINV/OfpFrfsnp5b 6rci5tA+mBkWGp/7vqWvsds/Sf6G+tcA6kiduo/GP5X56FDxLQI3cjsf7ChlguQkJzEQeL2+KUof 3V3H0r6v/9DuJURqZKTjOnhypIrdz5Ob1HNqrZ6QMv5MT7Nv529c5Z6b2Oeyv1K2H3uDd7QT++/b /r/586bLwXvO+lzmuPIDiAsLIwbWyx4ftJ3Fu50Fw/P+msjOSMpOUThL5Y8P8z/U4JOnyxgIARIv 9Lj+Zzy780aNMce1p/s+xCLQDwHDXkeP5v76tPqIIhoETE8S47vfY9BsYWx4g6ghCMh0bdNcyD/r 4KA3iwOrIa5h5PEfy/ooxa4mQNJ5+X0VB1L+zdwnn/zFSxKDRFd0htx7WyNuJfyQ6XUukfztTv8A 1X/xf+mpXZltb3Vw14n6bDvrd/Krs/8ASn6StWBWWgkiCJidf5P0UF4aDBjy1GqeDEn5Qxe0a9M6 az820z7dT5Ks43PLpJG7nxV5zAO3CGWyeFJExGwYJ4ZdTbR9I8ageaI0AIzmd/H8B/KUqce7IcW0 VvucORW11kf1/Sa9ScVsJhwohIgIodPInyIWljfVvq95/o/pNP59zgwf9ts9fJ/8BWzi/U4aHLyf iylobH/oRketv/8AYelLhJ6I44jr9jX6J1q7Hc2i12/HJAh3Nc/nVO/0X/BLs1l4vQuk4ZDhUHvH D7neof7Dbf0Vf/Wq1ctzsWoS+wAfH/vzlLCMhvsxZJRkbA4f3v6zYSWNb16oaVw74S7X+t7Vn39X y7ZAhoPbnT+z7EjOI6/YtovSvvpZIc8SOROqzr7MXIsnY137xcB2+j9L8/8A9Rf6P9Fzz7rH6veT 35hui0MB11ldhZtDqgB79BLt38l/7n/qxIZojUngiP0lGF6bqysbDb7awa3mSYcSGg/m7Xeoz/1F /wBsW51nT9NzX6+Dh/3+r/X/AM+q4NxJB5BO6J/tO2fQ/O/1/nkUMmPMwGzqZ/Nb/X/1/SK9GZoE Hi/5zDKAvZw3Y1zYJrdr9Et9w/e9u3cr2LlZGOdwPqHvu94Ee3bXY39L/r/2/v0YgpO+xzW2ROp1 Dfo/R/8AR3/bf+E+0Usx3Ry8MyLWNfzuaSC0f8K+lr2f9v8A/qmM81j4uCRjxdlDFOvTbOrrDXEC 2ssJ7s9wn+p7H/8Agn/qLRpzMSxkstae+p2n2/yH+9Z+P0vAtMMyHOa7VrRslzf32WbX+rW9X6+k YDDuNfqOHewmwf8Abb/0P/gaBliIuJJv9z5VcMwaI+1s72ke07j5GVVs6bi2yXVe48ub+j1/sbFe YxlbQ2toY0cNaIH/AEVE21i30iffG6PI7v8A0nYouPh2PCu4b3cp3QKnOn1XAdwAJ/q79rEavoeC 3R4fb4b3cf8AbHorRLmjkhQN1Y7/AHJxyZD1KOGI6KqoppkVVtrnnaA3/qERAOR2Aj4qJveU2iUt nuob2hVDYeef9f8AX/1Im9xjxOnn/r/r/wAIjwotsm4eH+v+v+v+keu0vdEaKvtI7a+Cs0M2ie6R AASN0sJk6SYupHZW1415HB8FQtxqCSx4APcEe2Ppbvo+9aXdDtqbYIPI4PcJwrYo1ch3QsG8lxbM dwRMlVj9VMfeCHu2zqNPD6K1/bWRW8gPgwCfpAfT9Pd/Of8AqT/t8m48ax3GqBxRsGk8Z2t//9Ht e5JTb3n6I08SnMxooBhd9KT5nzThTCbGg6pA4xrqfJMQXCC0EeeqdoY3QFPIQIB0Isf1l4v97/Fa z8Gh+rmAE87Zb/1Kpu6Kyfa7aPDw/wCpWskoJcthlqYRj/s/1X/pNmjmyR0E5fX1/wDTcf8AYlB5 e6fgFIdBwzy57vmP/IrWUH2VM+m4N+aA5XCNon/Hy/8Afp+8Zv3/APuWg3oXTRzWXeZcf++ojOk4 NbXNqr2h/wBIEl4dH7zb/U/fRH9QxWCdxI8gf+/bVn5H1l6bTobGz4Tud/23R6v+v/gb/Zx7cMVH LkO8pn/Ca+R9Vanv3UW+i3u0tLwP+J/SV+mp0/VTAbrdZZcfCRW3/wABb6v/AIMqV31xoI/RNs+T A3/pZFn/AKLWdd9auoWGK2NYJ5e4u/8AA6fs7EBjgPFJzZSKM3qa+jdEx3bvs9ZcO9hNp/8AZp1y tOzMSmsahtbdBpsaBH5rrPSqXn37T6tcf6Q5g8GBjP7LPZ6iA/Ffe7dc91jj+c5xef8AwXejxRGw pjOu5MntMj61dMqO1toeRzsDrf8Azz+i/wDBVlZH1we7THrMa+6w+m2P+Lo9a3/wdc8cFwiHtE9n e1WaejdStj0cd9gdw4Da0/8AXsn0akeO+qvo3ndT6nkam8Cf9E0D/wAE/TXKNNVttrGCbLLCA0uJ cXH+t/4J/wBuItX1U6q8Bz/SpnsXuLh/2xVZV/4MtzA6HbgON78s2WlpYz27GM3/AE7P0jsh9r/Z +j3/AKH/AIFR5AaJNlIPRru6RZVSGub6t7hI2PPj/N11OYz1fZ/hL/Rr9T/g1BnSMl21ry2mPpu1 tJe4+zbTS302bP8Aj1rteQ33Vu9R3tD36vs2/oWv/M9P/SelX/pfVWXazOx3eq10VkzMk7Hfu3bf 31SOUiZAs/pf3GURNdEx6Xg1u4utiAWk7In879Gyp/p/6/ziPVj044LqaC1zyGOduJ0B9Rnq+p9P 3u/45Rpvspx3ucLLbyC4Vhsu2s9v9f8AwioFnWbT6xpLWke0Etrj/hP0tn2n/wAD/wDSijJyTBA+ RdERHzaOjXkMa4uDtjnGLCBJhu7b7VK9+bSHXhoc1slsEHa0f4T3fpfYourpFJFTBLPzxO//AI1j PoWv/wBJ/rWrHqemyC4OIhrXRGqYJGNXI6fzc8cl0hE1Q/vcTgMpycj3VhzjedbHEj1I/c9V/wBo fTv/AJn9H6H+iWhhdGoxiLssB+STLGhxsrq/0e1jvT+1W/4T1b6v57+ZWhVa1rHhjQCdRtGn/RSL 3trGvudqdPo/mqaJJlUTx5Mv6R/Q/v8A76w2Ab0AYspxaTuqpHqSTuDW1wXfzv0PTRRlu9QCPZBm eQfzNqrEEj8ifUkAnTXU8fnK3jwGBFS2+eHD87HKYINi+2rZOW48D/X/AF/1/wBJVsY85ht3yW1j cAdIa/dt9v8Ahfd/6r/nVNrDBn5+UfnKqW2fbGPGjLPY1oPO33Xetu/f2f6/zCXMZDcIg+oy49P+ YtiN/JuEjuZMmf8AX/X/ANFJEgnif9f9f9a/WRHmsVyRt2uAJA8fdv8A5f0kF1tDdTY3b4jXQf1V IOZx9ZcOvD6le1M7DiZzBA8PLVKuyh5DWvDwf3Tu4+msrqOdYK/QqaW+q33PIO5lR9llu38z1v5u n1q0+Hm41VA9NorG5xIAjb+ZX6Tf5bGf+i/0qZl5wRow9Y19TJDliRrduuC3lswRPef+nsTkEaQB 2iRyPzf7CqWWPsq3ObLXCWzqdEGMw0VemBZdUJF1haydo97PoqOHPHQECZ6/5yf+AiWChdui66hk eo9rX8c+4/8AWm73qzU+uysOrcHNPcf9JcpnVZYqsy3v+zy6NZLtoLabn7KW2+xC6Hk5eB1N+Nks cTcdtg10ez1LPtv/ABez/wAB9Oz/AAKlx57+aseP9HX5VhhXiXs0kCm4ve5jtCACEdTQmJxEh8pQ RSkkkk5CDKxacqo1XDc3kEaOa79+tc67AzGZLcMvIZaSGul3pOrb73fo/wDSeiz+Z/0n/BfpF1CY taSCQCWmWk9jGz2/2HqSMyAR+jILDGyC/wD/0u2DfmnO3knTzXE2/W692tdDv7T4H+ZUz/v6z7fr D1S06ObVP7o3O/z7XOSMh3QIvoRvob+cPkg2dRx6xLpA8TDR/nWuYvNbM7qFsF+TYf7ZaP8AwL02 Ko4OcZdLz5nf/wBUhxBNPod/1o6bVP6VhI7NJsP+Zjtes2765V/4Ouw+YDWD/wAEc9647a49ojsk IJA3AniOShxFTv3fWrPt0qYGDxc5z/8Aos9Bio2dU6jb9O9zR4MArH/RbvUsbo/Vb49LEsIj6Tm+ iP8APzXUep/1tbGP9UM54m+2uiRoBNzv6r/6NX/23ZamniKXn3F9v8491n9dznf+fHf6/wDnsW0d hDR8v/IrtKvqhiN/pOS+zXRrA2lv/uxd/wCDLUo6D0fH+hiscfGwG53+fl+skASVW+dU0utfspab bP3WA2O/7bp961cX6udVyI/Qeiw/nXEM/wDA2+rlf+y69AZXXW3bW0Mb4NAaP+ipJ3Ch5Wj6qXgR beysDtW0v/6drqv/AD1/6k06Pq706qC8PvcO9jtJ/wCJo9GlarrGN+k4BBdl1NMCSUuCI6farVVO Fh0HdRRXW4abmMa13+e1qsKi7P8A3R8+VAZN1nBPyCXFEdVUXQ0Gqr5L2FgaHQXO2h2m0Ha9/v8A cxBLLSJcSDMbe5/qbv0f+vq/8YnkP2VvG0SA1hOvH5u3f6ir8znAgYgccprox1ZPs9kE+/Unyn+o qDnXVj21i5g9xafz/wA/f/Ofmf8AqRLqGS1j9m2NunhqpYdrbsNrg6A4uD/3oa5zH+5ZwJMzKvl9 PF+9/fbXBwwH9diMsQbKmEl0bv3h/wAHZY3+b+giseXN3lvOpa/X+T71Rtc1j2uYY3Pa3a32VNqe duy5rm/8Jv8A+3Lf9GgMz/1g48uDWvdLDptDDZ+j/wCn/wBc/wDPk+LLUJRPqxShL0x/eWyhdEDh nGtSkxcotvsreNwqMfJvtYh3WPbkWY9jiXMdtYf+DI3t2f2P5xVGZIbnW7tG3HUdpb+k923/ALaV jqWzNcxzH7H7Yc+PzgfUx3s2fT+n6SjGOPCb9PySj/6kXCUrsa/N/wCgtvAyXBjg87Q36RJ503N2 7P6//Fq99oLS1j2h2ktd/JXPMLsQ+rbb6tYIL5G2R9L95633ONzQYDOzQPzY9iGwsHb5eH/0NcRr qPmSi1rpABkaaa6pn5FFbh6riNY3QS0a/wCk/kf4T/R/8CqtW9xc6CABGnubub9L1P8AX/1IgTY2 LR7GSI4c9x97va7Z+9/4GpI81ljQPr/S9Sz2cZ8B8vpbjrCZbV745cDLYPs2ez6f+v8AwtSm2loa HODdrNWlo1af8I7e/d6X+FVXANbK7mD2N3S1oMNaD/Kd/gfUVip7Xe2thc4kmSfD3b/6ibPIZ5OI /pD9XH9z/wBSIOPhsD9H9JhcbXA1tExq4OHu/fb9FUnvfpWxsPOsQeB7vU3fyFoPynVOIcASee22 P3t25Dta6xguaIftDizgwf5P9RV5DiJNyyTjfHFlgSALAjE/LL+u0bcTIfRva9jmn3HbuLjDf8H7 K/f+j/4NU+ntxrbScX2OY/dYyfpAe66u2hz/ANDZ6P8A4L/Pq/XY8PgSO5ZOhDR+kUThUZGQ68jY QA42AQ/2/Rd6rffX9D/1WnwmKqiOL/pRXSEhdn+UnTZbW5oYW7Wn6EiAWqveK2Na6B6buQDyP9WI jfTJL3jfIAA+kxs/yHJemLWbQ0O29hq0D973b0uIm71/9BYhQN6j95rjDD3Q9xG4Els8tjbscx35 /uRaA/2OyCDZRNbbHQHWt3Vvbc6z6fp1/of+NykzQ9rCHOE+12gOp+hsrbu/RqGW/wBOhuQ0GWQH hv0oJ9H1tu7/AAb07HklqP3vH92fpRkF6k7JcO978lwne2shpeBG5zh7tn/B/wCv/F6q5vH6g2u2 t1rg2ppjc4jZtb+e1/t/e/mrv09X+ju/nl0Nd1dn0HBwIkEGQ4fvMe1aHJ8Xtm/3mvMUQzSSBBAI 1B4KStLFJQkkkp//0+ca0E/o5c7wb7v/ACav4/SeqXkCrEtdIkOc00tj/jcv7PX/ANtr0pjGMaGs aGtHAAgKSbwqeFo+qXVLY9U1Y7Z1lxteB/xdLK6v/ZlaFX1LpBHrZb3DuGMbX/59+1LqkiY8vilU Qpycf6tdHog+gLnDvcTb/wCBW/oP/AlqV1VVNDKmNraOGtAaP81ig64Dj3fkUDc74BVcnO4IWL4p D9z1LhAlM+wMHiewVZ1jjy4/Aadki5ALvHhZXM89PKfSfbx/uR/7plhBax5a4GdA4fgVZdmtBgNl UbDI17f3p2tL2tdGjhMef+v+v+iufDsh4ZR6/MrLHQH6J3Zth4hv4/6/6/8AWxOutfyT5j/X/X/h P9I4rHYaf6/6/wCtXrP6Y+ff/X/X/wA+LSuR6sOiAl38ZTAGY7QrBZP+v+v+v+DSazyKAj3VaEM1 n5Cf/OlaDxTUXMEnQie/9djWuSFenf8A1/1/1/SqYYO3xTJ4TKIAl7f+DxKEgDqLaVmfc8+4fZ2A SXkQ5w/do3qePXU2cqwHcf5ve7ftbH899H6aLfievbWOBXJPH8n+T/IT5LGEaO10awEiPb+d/UWf mjOMpGzPgPDxy/71njwkAbcfzODm2Gyx7u4bMn/vyN0m6oYWxhl7A4PE+71Hufda/wDR/Tp/0Fn/ AFtHyeletU6t1kC0guaG7v5o7tn7np+q/wDTf9a/0ap4mG+lltg0srPptYRoGj2e1jdnqfSsyP8A hkwaQonhlfE2ZESIr5Y+ljnF1le9r9jgZaTH0m++v/X/AM+KrZ1X1GF5qaLg0NNjfpwP8Hu/0aN1 BzXB7nn1aXjaWaNgf6RiyMQE2lsO/KSB+/8ARrUmOA4Tf6BYsk626oxbbcHPDC8gyS0fRP8AJ2/6 /wDgS0GvyNgbub7tNpH/AJytvpVlVNYrrrFRf9IhpOn0vUb+f/OP/m//AEorF9mMTtuiwmQXu026 +36e/wDm0+RBGg0C3HY/wnn82puS1jWkkWnbW0SHFzR9P0v3P+M/mlvdLx7acNtGTYbnkwD9FoZ/ gmb3O/nav9J/1pZD8VjXB5Y4WN+iSdr+P5xEpy7aWCv2muS5z3atbW7bv3+//wBTeoorPCAPVEdP /Q2WQ4j2dLO2N33jTbBJ4DoLW7/b/hFmWZd7hYILhU0kHU7p92/9H/o1qM9KyrQhzQCDpI2O9zWb 1iY9jq8mzFe6DUfY8mHOaRvq3+79J7HoR9Vk/wB5YSY15s8LKybLS6kSwatfua3n6X02v/M/9Kfo f51a7eqGykkQZ9riOGn+pufv3/6RZHT8Gz17Mmq33VF01gbg4W/mfmWens/Tfzf/AJ6sRcjBLGbq i7Hc6XOYfcx5P85+jez2f9bTpGIPCDw8UV3zanuzsyWN99jmsb+65wG7+Q7f6exSqpysom6p8gx7 nu9v/Wqtln/F/wCD/wDSVOv1KbG/aWsLnN3Nsa0Sz6LLfo/+e/8ACf6NWmW25FzsepoENDrLBp6b p+huYmcAiO8f0l/GenpRlma1wc5redWg6iD7n7W/v/6+hYtHDyzY3cCJ1nvMfvLm8y+yoGyxpIa4 1ug6bh/r/o1a6XRlZN7LccBrNk2F2gA93pf56MsXo4rEf5fKozB0k9FX+mtIA2kAkHWJP5z/AOoi GprQ42yW8du/0XusQ8dljHOrLhxBaNWzLXfyH/QR3UbmhpHs/OAkOE/y1Xoaaev+sskQDQPoa9DX MtDg+WmQA4asd/2n/rqdTN1b2uEtPtIGv0m7XoUvqcHOrLWtdBdGjz/I/wDRaNjObZWSDDC48jUG fZ7P9f8ACJC7Aofy/wDREyBonvXqcptILbWWHa6hu4OgN31/n7t+xl1Ve/8A61bb6H/EG6VdityW sra6svDi1ugZw33NZX7PVsZ6v6Kr9Crlt/ogbPe987YBn/MVXC6W1tjDkWQ0EPbRBDvUb76/0r/9 D/wH/XbfTVmMrFfLL98SYJQrX9E9HbDjMt1HGiHk5bqKC9rd72x7Sdujvb6nta9E0GrBz5KFrJbP Mfenwy5IA0eLTp/Nf34LQI8QselLVeHkAja4gEeBkbkVZ9D2ljg3U1uLdfj7GuV/eNm/tEqzi5iU sUya9zHjM4olACYFaGXC/wD/1O0daGglxEj80aqByWa8mFmm4xA4UH2mPbAJ8Fjz57IdvS248v3d A5jiYaA2fHVQ3l30jJnT71QqtOuvBRw/TlU8+fLI1KRlH939FccQjsGxugpi/SUEv81AuVWlCCVz 0MuB+Shv/BRJAEngflThFeIr2OER3Pgr7KtrWs52gAn4LOoHrXjd9Bvuf/6L/wA+1asuPA0HP9b+ StjkojHjlOXhH/F+dgz7xiP70v8AuWIr8Ofx/wBf9f8ASJ9o/L3VXIzxQ8Nax1jnGNjR9GDt9Rzn f4GvYkMyjWoCbIDiCCHBp3fpNjlYlzkR8sekvnl+kxjBOrKYkeEn4cj/AM4QnZNc7WulpEkzrM/m P/0lSh6wiCC3dp/L1/O9rkLHw7a8oWuj09pIPg53sr9v85761W+85p2ARHi/c/QZo4oAEy/RHo/r qb1F1by14FjN3tfwWs+j7tn9VbAaORqOy566hjrHV+o2sMIDwfzWO/e/sf8Abi6NrmuEtMhWuTyz lGXGb4a4eL52PmYQBiYDh4h6kF1hqkjv95WJbmOdkVtLm7wDsbBaA9u306mb2/pLf6//AKu1c+fR e4OAdtIaDMOn8z2rnv2dfkZDbGkTW6S4/pGVg/o9/oN9P6FfqWfzvrfaFUmTLJKJNRsygyYgBHiP 9112X7Wua5+kT7gDJ/0b2e1DxZfZa4e5jRMDUOj6X0v5D1LH6fWWF17i9oMNglpIHt/Sel6XvtVq t4paa62NAa6PTbO7/X6ajjDioyPDGMZfvTXSlEWI+qRri/Qg5P7Pa7H2P91Y03cN2/8Af/pVf9cV I4PoWn0j3G4GPb/11b9mRRYHNcTvBhkcf9at22fo/wDhfTWZn0uIbSCWCTvB0Y7Tbtdt/wCts/nE bIIHFxRPDqjhB+YcJR1h3r1bGllvIJETA3OdX+Y//X/RqzdiNDy2xslpG8Elvqf+Tpf/ADn+krs/ 4z1a1gWXvb7mguYS1v7zdn0tm/3/AJn+vqKOblZILbK3HewwNNef3XbUSaPDZ3/wVgidfBk+qpzD jgCsNG6lu4u2PLv0f79n6X+a9P8A43/SemsLq+OasWm8Bzbg6LddwDS31PVb7fTqpZZ/M2/6P+dW /i5TLt/0m3CC1gMPaXt9J+21zf0lf6P+c9T/AK16iy82wVWOa8Hs0En1ay36Lmvc71K7P+uJwJEh Xq/7pQujfypfq/kWnDe14J2O2seOHzusfVs2/wCC2f8AbSPmdNrsJtvre17iDvqPva13t/m2ss/S +9//AAf+i/SIXTsg3Z9WrizZ6exseiNrvtbbP5Hso2f4T/0rfzbrJc8PLXg8j4bdqhyS4Z2LhLJL i4I/LH99lgOI8IqX9aTcoxMPGebcesVeoAHOboDt+h9L8/8A1sRMpjLK4eN7OT4abv3EZjg8NcYM iWj/ADE26WnSR+6DJ/OSlZJ9XzfL6f0oMANHb5Xies2bbX1h8PrLQ1409ztmR+d+egdJ6l9mygyx vqtynsZZM7g9z/Zd7G/pf53+a/wi0+r9JN+RY9jw3dDiXn8+Nnp+nt9//otc5gPso6njks91NrA5 rhOwl3o+/d/N2/6Cz/Sq3i4J4iPmMY+uP9b/ANiMmQyBB6H5S9Z1LpxuyXW1u3iwCt9BA97ml219 dj/0f/WrFpdKxW10H2bLbDFgPIDP5pm38z6aV7Wmh1rTJ3894/0n/TQsTJtORDo2tGs/6/mKpxHS Mj6NPl/za8xMoEj9Hv8A1XTNO1+4A6ayYOn/AJggXOvgeiGjX9I5xLQxn8llX89YjjIa8QOJ9zvL 37/+oVO+w10gtEiRLhqPcPb/AF//AEmlkEAbxmUozEmKAkTRHq/rMLbHEBgd+dOnkPZ/01IOY14k ACwtDC32gOI2fn/mfo1XqYXPcHSx41aDq1zf8Nt/4f8Awn0/5pXcqgWV1umTS4OAMe6N3tUUY9T+ j62eXCCI90fqtptLnFug1f8ASLW/Seyv6arnNsue70q7CdpmASQH+xr97N9P5v6P9MpfY7Mh26TB MAkjYwe530P5160cXGGLjirdudJLncbiVYxxMoneGPH67Y5yjH+vkPp4WOM11VfvlscNc7e4H/jF NtjXs+iST2Hf91yqPZc697hZvrEFrIDQwjd/Of6X/X/RIu57q9u4epA3AEEmNu/Y36exM4zWn9b9 Hj4+NYY/aa/wVCv0rQ+PY/SwfH6CsiwQW6TPhpMoO0kGTPEM0mPz/wDjEo0gnTkePCUJcIIFiM4y /vcMvQg60SfVF//V2AeO4MKDjr5qLSWQCNOEjY06z9650wN6ah1Yldhg+ZRg7z1VcEEwCJPAlWmY 92wPIgO+iIJPLWphhInQWqZG5KtxMDv2jlRcLG6uaR8Qn3/ZR9ot0YAQC0zYD9H20/ziqW9S3UnJ qk0HVsiNxJdR/Mfz/wBNj08cua1B4rpYDZocNeLYJHJ45Vey0udDdXT/AK/6/wCtZa6ftOI21twb eZmoggAjc1tTvbXk0/8AXK1mWXW1OLRLHAkED6U/ntUuPDRo/N1RKYAPho69A9NoEa93cAu/tf6/ +jZ355osqpa8NJBf8gPzq277Pp/o/wDBrFottddW5+4tDgTJ1ifzN/8AVUOoW2U5LLt7thDhZJlr 9WO31N2ez/0YrcthAenT0/3osUBxEyPr19X/AHzrWkAsyDJptG4lxbu2k7Weo33M/Sf8H/6UQS+s WNsY33AFod+dqfo/2/8AX/hBZLch+O266s7WbdriB+j0/R2ur/7TV7P8Io42ywGuz3NEANEh2v5j ffUqpgCeIXFtD5dalXp9Led6/wBnZYys2CwwA0gHn3ZFzrNv6Cr/ANR+kov6je9/o0uDbpLS4j86 G/R9qGMqysnELXWWODW1hrS4urP+Gf6ez0/R2fpVTx6Gmy+7IqLXvcKWPaCXMfHqusZQz+kfQ/Wf 9HXb/wCGFJGAqxY9IP8AeYjVniEZa+n+rGTY+1VOfW55a22wFpYfeN49P2b6/wCf9L9H+l/9XI2J Z6GSaWlwcfpVtJOjB6dVbMZrfVrs/wAP+n/R+j/NJ7ukOLKGP2Ftbw6doY5+38+5u3+fsr/9KI/r sNtgoe0WOkueRLhB/mP8J+f/AIFPM6qNHqtoGyPVokFgDx69oiqCCSYs2/1v6qLZk1kN3u2hxdo4 bQY+n9FZr7LPUra0AWF4hxjawztfa1z2v9LYjZdWZcwjEeS5hMOG4jdt/Pf+/dv/AJtRxhoST+ko gWL00/xXQqYPZL/YIe1pMjlZ2ZlMsu2OEMJ97SNrnR/gvWr3247/AKH/AKrT9Przmgvy3MZXAEMc bDvn9yyur09n6BVrKMbfZa5zvSb7dzXbSJ/nG0uY3Z/6gsT4AxIuvm4t+JZUTxa8XSFOj0yplFTm WP8AVLiXF0R+jO302ba3P2fT/wBL+kSyR6x/RtJP70Tx/wCQU8euuvGbYxxFLmyC4avn3Nfbt/r/ AKNFfc81gMBLSAWgA+4Bv85u/mkMps9MfBrwhbEa3816cUmk3GooDnveXbo9ziWtaR7fof8Abf8A g1aGI26r1LnySfaR+7/Ld+e/YsfL6kCw1zLyCSB+aPzt617JrxqZcW7a5cNTu096bdwMpR2j6f0f 7q+UCCBfqkf7zhXW1ViyukCmyiJ2+/Vw9VrPtH89+m/4WtZ7P2hnwaG+oxvtfvLWMB/0drv6n/ba e+9219gMOaN8iNdfz3/n/wCj/wBf0gcfqraLILJpt1exv7x/Rvupe13+i/0n/qRTQgeGxHjn/LiV kHAavht2eldLysfNbdbWKmMa6YeHgvcPSbV7Xez2f8H/AOfVtvwKbaj6pc1x/OadQB+41yzel4/2 po6gx1nogFrAZDnFh9DdZWzZ+ixvS/mv/Va1jfa4Fri1gcIa8A+3d+9Zu/1/8+RTA4xx6T4f1cJC XzMYkRrE8OvqlFK19LGBlfua3a0NEk/yPd/UalY5pYSAWMAHGir4mJcLhda7Rsw0HduJ9u9/9RW7 S0Ah0uA1IGvKPBkMOIiOLiPDw8P/AHfzrZCIlQPud5OUca87rHgObY7cBOoaPb+k/wDPiyesfbGv x6xufhMc2y4NG525p/QfaG/znoUf+rP0nprdvvcwNLYABENdoP7G3cnfmUUlrgC6xzfpHT2k/wCj UcPTPisaemXF/XjwT4GwTOQA4eLi+Xg/qoNTjNriHRucOdGCv2/9c/8APizXm4teykfpngtZOnuP 0Pe/2Vq/dkMvrfDN1Y0LdBJH0KmWINu+qttzWl2x257ZH0W+/wCn/ZTLsj9JkjcQQRUnWJbSwB0C BrEu90IbXssqhokNOnJ2iPp/10mxkN9R5G1x9rQe376lVUKyQBIA1J7f2EDxXqeHGfl9P6DX0AN/ zgaVWKyu43vk33GDG6APzf532er/AKS3+c9L9Cr49NgLGO3OOp18D7tv9RRfkPa4A666THP8tAtv Y29pcwEkFrXQJBd+45HiHfi/yfucP6PCuqUjt/W0Wfm01Flby5rrCS3bro30/Vdbv2fnuV71armu 2Ome8aLPswKHkWWMDrLCC6T7mt+jsx938z/pP0XpoznU11gtf6FFYAO46+4/+fbE+MiI1XqqPzfN /g/4GREoxIHDxcV/4KTFlhduOjncz2h30v8AriBkF7bhdW8McDtdrIcIa/3/ANtvp+op817K9x3G d3jJ9jf9EqudFbCzVzzy4ngt27vZ/o/emCREYj908XF/3K6MeKZ/en6eH+q3hkCxgfB1kEaiHT/J 3f8AnxF02d4DfPdws7plgLCx8uYZgEkw5p/N/wBGrjrG+q0cgujnj+0n8XW/Db1rOD1cNdX/1t3I w7Kgf8I3xHMfymLKc4EBzdQTtEaa/uro8gEzofksT7HdY4V7g6SeW+4f8H6f0PfZ/hbP5pY0sXDI iJPDfyN/Hkser/GbQDnfqtLoFUDId9B1k7traf8AR/8ACWfzvqWfo1VD8lhBZv8AafYdztxE/pf1 fZ6OTsp/w3/Gf4T+bvXUWNksLTa+C62PouYPU9Ot3+h9X9Ism/NbWHTYbCwFzo3NmN30mWu/nWXf +BKTGCdPllAepViukuJu2W2srfda01tcJAgDSfb6n5nr+7/BfoVUbvOTTeyx+wS4N0cNA71arH1e n+kt/wCJ/wDPStUvdVitNtnqXP8Ae9+mhcP5pjf7f/qRY3UM+zc6usfotC6G+9h/N9Oz/R2JsY+s ga7/ADfKvB9NnR2Kr8e2l1lb9rmS57HSSJ/SfTf/AOB2KDKKch7rqyLA4gl41aS4bt29yzMS7Jdh OMtb/oaWj9JBD7H5D/8AB+l/Ofzn+i9L/B1o2Hm11u2EFlhYHEslv0jttqso+h6uxPjARmTXh6Vs hxx07+l2GYrQQIAPyn89zfZ/YSDsZu5xaHuafbZpLT9H9F6vv9/+EVcl+TVDCW1NMvIOh03bG7v0 dn+kWPl2uwbWWem5tVjtnlu/e9v+GZv/ANf8E2Ujk9I9PaP7yIwjEEk/3ndyMh272za0gtII0e0/ Tqfv9NZjXCq0vxosoALthPubDd35/veypbvo0Na39I21wGj43fS9znM/M9//AG4svMbTXcba2Al7 Ye1kAF0/ov0Tf8M//g//AEWoxHhPCfVxf4S+MgRoKcr9tOa7axrhkH9GG7dztx+g1mxvqP8A+BrW 7g4torxnZDHG9jHvNZ92x952/pf37vszPS9N/wDM+pd/wap+hj4V9eU9r3ZpBYzbA3uf7PTZU5v8 7Xt/wlnqLa6fews2gl1rvc5sbY/eYzd/of5tSEwNRiDjv55/9xjj+mxzMqMtJR/Qr9L+vNzuo1Zh AO4M113HdI/N9L/hPb/N/wCErQMer0g1z2Blwh7tB7i47/W/0f0P9fUW5k2gM2ugsOh11g/urIzc m9rment9N/tc4j3+33bH/v0X/wCi/RfpUyJjRja6MpSAFcLcpyGWtfWABx7vzQ8/y3I2Rm4zdte/ btPve4aNjd/PP93856a5kdRurn0vS907nFm5pPt9Sp3v/nbfT/S/4VXbqsiyv21ustdDWhpcfTJ/ 0tv836n+v/FnWIAPyz0/d+VXBEmyaAdJzxYw3Me21pEt9LXT6DPp/wCD/wBMgZFuK62txrBhpO2B sP5vvp/m7ff/ADfqfzP6VCxsLLxWFjix7DL3FjvdVuO7+bc3+Z/4pTsxHWFhY5sA8EwR/K3JhNHT b5gmo9+INnc67YWN9gMwRp/m/n/8UqGdTfQH3+voGlxrLnNa1wG6x/s/V/0tizXdeFc1U1E3AlhD /a1hHt/mq/5y7/ttV8q7LymD13NayQSxo0Lo+lc6x36T/if5tSxxSB19PF+lI/ND+4gHX068P6Mf ++a2Lcy7Uu973g2yJO0ubv8A0X+F/R/4Nd3blOra8tqBI0Y4DSP3rP8A1GvPtnp2jmSdh/tHZ/39 eiPqdbSwV+GomAI/7+xPzkgjg6xlIenjkxAixx616S8bc2uuiwCXMY35kNP/AH9jVmZFlLyy2tu1 pEEGJ9vv3+1dNd0HqBqe1jW2MOmjoe9v/EWM9L/rfqrANHoWMZ6VlbmuAfW9ruZ3f4Rn/nmz0k/G aFni4txfp4oMmeUZH0mMo09l9WW3M6PWyxjmBpd6e786t36at9f/AAf6VXsm+ulg3QWiNwjXX89R xRb9kpaB7/TaXbtNsjftc3/Se9RycU2BrSA+A47Do1xI/OsY72fQUEpymfl2PDxfNHilk+SLXAFm y1x1DfW3a4SYAPB/r+1HbY806uOhB1mCz6Wyxn/CIrBU6tr317SQ0ne0b/5O7Z7GJPaLQfS9p4kj cNPzFEYzBJEuMn00ycUdAI8H70mk4stsaHvADSDYCOCfd7GuVfIyWuzGENbaxkCHDQtO7/qFGqqz 1bG2s97nag8D+X/U/wBbFk/aN2Tu1gu+eh2+9KIJuq24m7DGLOvFwwr/AMMekD624v6NmxrtPb+b J3vb7v8AX9Ihe0NE/RHjq1BquFgDGgfo+fJx/wCoTbAcj3CWxq0eEf6/6/zbRZOoA6MPDw3ffibW M7a5zJEVtbEaNj37f+uf8X/1xHfY4ah0EnXn/OVZtxLDY4wT7vGPzW/uqDiTULNsB8NA15H9dNnt QW8Fmz/d/wAJVmS4OBDiACZHiE+O+q+4W2OEs1Aj87/yFaizHM7ZOp90Ax/mf+CJnVegN4EENI8n fm7/APraUdNWQiFcMdJ/KCG6DYdr2EOcTBLzMbdv0KlX6hiHNDa7Ldjd27dXyR9F++qz/g1n2ZZY 9rXmZlxfMd/6yst6jQ+BW9u6OQZgf+k1JxSABAl+9/VWnFIGx4tzHrpxMdlVdjnsqIA3kOcS93ve 3/i96p9RZ6bpPuAgGdXR/KTdOvGZ1AsbIZjAOLgCd7juZ7rnez/0Zb/g1pZWHWaXgEiAXa6gOHv/ ADvf70TCZjxEdR1WRlHHkAJv99ycG0xbUJmzRsaRu+m7c76CuFt32MO3DfH0v+E/e2bv+5f/AAn/ AKSVTHoY07twYOQTyHf2VYLrfsjWitx5cWD6Q9/r+9n+j9L9L/xSAI4T2C+de7Ej9KXqf//X7Ikk gRodfwTjaCQ4z3PwVZuRqdQT/sSfdLHGdexOvt+ksnHkjImes5Xxev5eH9xm4Ds53V33WVOx8Yhr rtHOGj9u5n/bOzf/ANcWdmdPbSyttLnGuv3OY6INg3frLPWbf/g7P8Irj8w12FzxvnQmAZH/AFCr 5GawCRJHiOQUBOYoDu2hEaeAQv1oZvJgt9rZg1x+j9F3/ov/AM9Vf4PMyLHCW1zvcQAAf++tSzM8 lxYwc/R17n6TlClrqv01rW2BwDyXDftEerW9rf0fv/0v6RTQgR6pacXyxVKX6I1kkxum5jnmsuLQ ZG+qz2sLj+mZ/Nv+0f8AWUJuG7e8UMscWmNoBeZnZtufU1/p/T/wn/XF0HS3sywbNzw0OhloYWfR Ht+xel/Rt/qfpqf+D/0aFlXOoyTXbkejjsG1jNwayf3a0pZDxEfpdgtgPH5fV6klf2hlVbdzgWtG job7p3P2+n/N/wDg/q2f4T01M2CxpreJDpbuI0Ee7/vizL8sOftpcHPH0wTpI3bvTs/4NKvqHs2a axr5KuYTPqpmFU5w6vlUXGlwgBzmuYBDmGf8FY33+kj4nURZYbXuhzXMDNfbw9ljn/8An3+bQMiu m3Ifdt3Fxb7zqPaG7v5f/oxXG4ooxTY4MBL27NpaQ5h/w36Ld6vqf4NWSIGNiPDOURxMQMxLWXpu VRbr7xY9rrCbS3UNmGj/ADP9f/Rl7BycfFqLyTbbZoC4+5lc/wAxub/rYsjGsx/ULrhOwSAZ2a/m v+j6av3Yr3tacmgMa8y5zfa9ocPo/wCmx/8AgP8AC/8AXVBrGta+nEvlR9PTz+ZuXZ9OQ17GuIuM 7GAOcQ1v0H2+mz+bfYi1YGPdSHZDZe1xBHqEA6/v4/8Ar+k/S/pFRyHtwzZQ3HsZS1rnCwvDRqPT Z9j2t9Szf9C77RZWtGvprmgXmx777GgPAcfRk+71fR/wvpf6X/RpcMqkYgGXCxSIAFH2+KXp/wDR m1+qspFG1gqDdra+WbY/OrVe7qPpMAY3UAn2weP+C2/4NCOHa97W7mjdOhOsN+n9BXW4ldNBDJDn fSsn3f8AqpMxjLLikf1dR9UvkktIxxrX3ZE7fouUc8bXOfDXAT7f5xv5ux+7/ttW8fLPpyQAwD4d /wBJtag200XUMF7tzd0s3Gdp/Nqq/wCD/wDA7P5v0Ubp+LYxri4tL3H2n6TWtH5u3/T/APgf/oxo jKVCPpXkw4SZDqu/Fwsl1WbdRU+6C1psh0Dd9H9J/wCkv+I/nFRzMDpUe6KTY47bawGubPu2Xe3Z ZR/hP+C/wa1cut73tcPoN+kG+4gH+csazb+4uezqLhm12ixj8ct3UvcJjX+asZ/hPpfo7f0fqf8A gd0gExOr/V4/T/hf1f76yNVYJEjrwj/vnBuusxclri2bMd4fB+idpbdW5rmf4K9n/ga9Cxw7a7Uk yHc8yPzlgM6JiZFll+VabDaBtY2a4Mem+x/5/wDxP83/AMJ6q2MUmqusFxsc0NY92s6N2Pf/AND1 EcuSP6s2fSD7nD/rVSBPEksynMMt418ggtzrHE9o5IIGn537quWUVva4OG4dxJ/6O5Qdj4pbLami NAR7XKIxyC7n/X4OLJHj/f8Ab4ERljrWJ4u67X2e9zdWQIJ/Od7vU2+5VG3m3JbW8Tt3EtHcgfRV 2gFoNbwQAIBnt+77Vk3myrNFzQW7XzxyJ97dzv8Ag0ZaDHcjwyvih+7LjXYwCZih8vok6l4a7ifc JBBif3EqYqYPU0LBoSd3A923/RrGsz7Kso0PDq2u0qBB26nb6fre3+c/QIWX1PJfNZO1g1/9WOTx P1GQ+aVTjH/JroYZSHDY4f0v3m7Tf9pe+wg/SlojTj2+/wDkfziq3dHLbH2sh7iCRWNNfd/1n1Fa wGi3GFro3SWSPox9B/qJvUtcXQfaBAHBI/rf1Ew2NbPFJlBIkRAiMY+mUZNTFtFdcNPtcRtAnmG+ 79//AMF/61/o537Dutbo90Q3T+p7kK+lvtNAJ1jY3Uf12fuIox7wG+sC3nnSP9d6aTWtryIk3fDf 6LKd/I9reD3/AM36Chbbxuk7D30EIV2W2selW4F/f4T9NV/WJMzwmiBOpXDfyd3GtFjYbowCXPHx /R7WObv/AO3UDqFhbjCBNgc0tAI0f/6TWdRkkODGSZIIOu0Hbv8ATd/wmz+ar/8ASasWWve/3gEA nQf+fE4kih+f7rH7YE7Hy/Mlo6dW9/rXNre50zvh7Wj6OymtzbKv+Mu/nP8ArX6NaBrxSwVAMDeG 1ta3Zy73NWBe2bCwWFhP0GRIn+ru/S/8Gtip22mr2e4MaHACPcN2/wBjkb019Wn6XF/zFmSBsSvU /wCCnxfTY8U1MaytpMBgAEx7kPLdNVjy7buEDT/opAVDM9QB0PEEabNztn6T6O9j9n/Cqt1Brm6A 6N9o1ho1b+b/AFLP/RaZZ4avi9S2EQZjpcYnX/nIKHepY2AdHADv7lcbTq/2OJJB2Rq1u71/V/41 VujBvrPscdW6NbwJI99v/ov/ALcV8XfrjjpBIYD5j2/9/R4QBvvLh4f8FfM3lA/d4f8ApP8A/9DZ +1Nqe0gwQZgp6sluQX1DR4EtA/OG737P+Lfb/wCk1pXdPx7Rq0LKyugUnVreDI8o/Pas4cpKF/pR /qswyj6tO8sLg0GXkkD4hUbh7Bu+lwdPBTzcfLZMNDx/r+jVKnMeH+nkNMO4JPH9r89MjjNX2/Rb HuC2lkV3F3s+lpHHu/dauvr6M5xqL2tcymsNeDMWPDPT9Pb/AKGu7/SJdBxMUsOY9odYHuYxzp9j Rs+g3/z5Z/OLXdlVz7DI7fH85HJONAE8Nfu/P6mOzxHhDTssZRTXTQ0UtDAAGgQwfnVs/wBf+3f8 HzPWWm73EepYNGaDUfQf6n7/AOj/APBFtZtvuc/gE6wI1WHl3B8s+jJOnKhxSkcnF0iW3CERDX9I auTgXOqLdpb+6ZPYn8//ADPUV/1KK2ue47Q52swGA/nbP+NUMHomRkD1aqnuqABJeNjHA7v5p9/2 f7RX7f8AAWLrOn1OxsUX5BjKvkAOaGemyXNrqpq2/o/U/nL/AFP/AEmreQxs69OKTVjIxjWkpbbv HOZc+H01lwBGmk/yfzvZ/r/1suPdY2h1Vo2tZoGGSfcd30P7X6H0/wDtxaud0zFsexmHf9muaD+j Mux+f32/0f8A8Hp/4NazLel4rWCqr1L6h+jtcP0pe4bL3Oyf9J7/APWtMOWNamv6vq9xdUifTGU/ /SbndK6K4CvLz40lzMV7Xb94dtx7snd+Z/OWfZvS/wBD/wAUtC6+uX2F82PILtNJaNjNidl++S5x 3bdCf3gf+/7/APwOpOzDFjSdXkjVoiB+77v31Uy5ZTIoHgH6MGSMRAkzOrl5GRLHNALmEkAGTtaQ 76f/AAVv83/wa02ZdjxXVW7c6xgrb+ZqGtc7/qP0yP6VGPj7X1bt5AsGkSPZ9Bv7n+kWL02n0MvN LTuoMGouO59e42N9H3ufZ9Cr0/8AiK6kbHAdTEwjxcP95UjxGxG43wxl/wB07NjjTYx7XgjbEkae 4e/bt/m3rOzOoZIcW2Bwbu0JHtO36VbLP5H/AG7/AIRHqI3fpCSzX2zHG3aze1qPjsqznuqeBbRV scWOB9P1gW2M93/B+n/23Z+n/RpmI2eE/wA3I/JD9FU4iIs68A+dzK8fqebhvvpaBUfoMd7X2/ne tRvbs9L/AEX6X9N/4LZcwftcW1uLq31+2CNGk/vLbfZtdBHtaC57u0AKo1lr3AMdtePeBpDhu9r/ AEt3+v6JTyGtRj3j/rONhjIyB4iBFniW1hjiT+k0B7GB7f3WM/nFn2YdVZZWSRQ4n0nB24tH0/8A Dbn+t/24pPofjveXOb7oIdInj3tsrRW4r8yj0g40tBaXWCC7ew7v0Hqfv1fov5tCMpyMcfD6vl4f 636XGuMIxuYlcJU1rKbqLGtE2Nef0T2Aw7/M/mf9f+tXTXkV/SAkxMccbETEx6sRzwLLHhxH84/d oP3GM9n56JbkAEAERymSjj4SeI+qXyR/e/w0HJIkAR4tPml+kyr9TaRxzLpn/pf4RNLS9u+ZI0Gs H93ch+uHgkgSJ9wn6P8AYTYtrSXGyJAHOv7356RFyA4uKP8ArFvCaJr7Er8gtaSZaB5a/wBZU/Ws ZcC4GHaMLfou/qq3dULgAbA1h4AH+u/6KI3HoDWwAWgzPHuH5zU72ssz82kK4Zyl/wBwoShEbXxf MHIz8d+Sw7huJ1AktI3B3qfze3/1Z/wao+gXOZvBBtJDifcd7Tsf/Nro7RU5u1ujvoiOf6rfzFRy cTHtZtq9loMtklun9b3/AJn82gYkRHq46l8395kw5alrcYyH8pIcZlX2X0mn3Akx3h309yVYtpa4 B25zjI0/s796s4WM5tG6w+mdAzu8Aez3/mfpESzIG7Xv+c2YdG7Z6jfp1putWTwyI9K4z9UoxHuR 4vU1fQsY31O7odAMf9Frv0iHnWMrpLSS8uEGD3dtdZ7nbNijkZ9rLRW33bgSZiBPtr2PWZlOc5rw 9xDiPbJ4H5m3/X/1GICz134uGX/er6lQMvpwo3vrEuDWzEE7Z5/0bPpqo7Ic5zWVka6nxj87/X/1 YhWu3ABzpDT8P6yngVevkV47TtdYQA+J2gB73K0IAAk6rOOjW0f+c9F0jFe3HFl1W5tljbKTo6Gl noet9PZ/hLf+E/8APau2YbXGYg9+6u1VhlIrGjWANaNeGjaqrAXPLnuO2Jie6rZNTH96TGJkmRB4 WhkE47hc4NcSNu+Pc3+R7/8A1WiYV3q0FwB3S4yNAQ3+t/o1n5LrMt7sZlmwss952lx9p9npb/T3 rcxqH1UsYGxUwbRIhx/wfq7EKND9/wAv8myzIEaNcX7391DZYWy1wh4jQ9vouellBlrWh/D43OJ8 d1Xt2pZmrwSCDpHeW/QUrHNc2l23RpbuImBB9jEzrMXt8qB+gQN3GwjZVkuY50FoLXDxId/6L/SK 03I/SvPmD5zLUHJx4tssA0c4uDgeSVVkQTJmZnv/AK/4RSb+odGUkaHq/wD/0e4SIkJpTpIaGXit eDAGoKwMzpWjn7dAJIjWB9PY32s9RdaWgoT6Q5RzxCWo9Ml0ZkEXq8lh5QwbXsssLsG+NXRurd9F mV+h/Rens/pX/WrP8H+l1TTcQ7aJdXyz87+sxiJmdEpuO8u2DvpI1VttDcbHZVVBa1rWb7HRo0Nq r3/vrNz4yCL/AJyEda/zf+T9EG1HKL9I+f8A6Tk24mTY5rC4MD4JLjJa3853o/6StiuPwOntAx24 tV1jR9OxjHuP59lt9tjFG1loixgDngydrt0if8Ex3vfserNVTbXOJGsgOB00hr/Tf/r+l/m1BDJM DhrglKQ/v8DJPUAk3GP6P9dI+smkNqIDABsj6LWEfo27a2/zaqZmLbbWdzt1jZgTrE+xtf8AX/4T /wAE/wAIS3LIdNRADREfvfm7WfmMULclr6nWfQsH0deU73AbMT6q/S/q/urIwmK00J/wnn2ue627 bueKml7z9IVAbnbrfo+l9H9HVb+m/R/8Z6dvEYbngOeGF8hgP5+wfprGe3+br/m/URcnObV0vJYd rTcCAYAL3uHp/wDXrVV6Vn0tIFoftqBbIG4bCd7Wf8DZXv8A0n+Cto/4VSVGcRID+rPi/eZ7nESG 2vp4fUiOSG520PdLXQ6Pohg/nrvf/o61rY3UHfaPT2QwiND7ifzf+DYjO+w1XvsZSx9rvziJ9r/f sZ/g1UwsF5zrHiG4xPqjaR+8z9RfR/O1/wCF/wCC9P8AwiZcTXCQJwj/ANFBIIJmDwV6eJ0ssM9N zNxAcXa/+Bbfb/gf5xZ2PSHsc+uDt9tjgQNR+krY33fznu/m1o5GLiXOhwLxuJNYc6tjnf8ACbf5 xFrZTj1tpqDGMYNAJdtLj7v3vegYxPESeH9H0/J/jsUcnDEAAkn1epynYmfZXv2sp2CQ179pcf5W 1t2z/BrQxWU4OO2hpLjG+2wj3WPP03/6/wA2puvpqaTO/wBTvOsfu+9UbbX+m20tIrIjcI7HZvsS MzHTHX9f9JdUsnzemF+kfIlyMit5lpcxkS/aNx0O9+3cqD+qMqsc1tf6IyP5W0bP5b/9H+kTmCC6 dukAGdZ/lrN6kBSDY4D2QCQhjFy1Hzfus8RjiKl0DY+07nb4I5gE8/u71tUZjDij0/a1s7vHd/ZX F/b2sG7WAPiSp4vWbG5A2MLqzpY0fTcP3m/4JisexIAmI6SDFlyQlQvb5XqhY5wEfSBIJ/lT+coW P/Se10g8AqnXn4597Lmt8Wvlv9r/AEn+v+lVduTLi4OJa4yJOqrezQ1H2rhrs7eK8ixwmIEjvoP6 v/W0DqNlWJseSWVWENcR7tfd/XUKbWkCXe7y00R73UOxrW3jdS5uoPw/R+l+f67LP5j0/wDCoxiD QIPCsJIlf04Wuc5jmb2O/RH6BExE/mIJ6k/1A1rTscYAnV37j/es7Cqe1tNTyXPe/wBwnTU/R/0f /Cf6/pLTcHIsua2sAkODhPtGh3N/1/8AUicYRBIvivZlHDWtOi25j2OMQQDNTph5n6f/AFn/ANS/ 4JRb1LH0B5A0LgI/N+g5B6qwtZW8HcBDTAHMfyP5ayGMe8T31kIQgDGz6aTDHGWv7z1hvutra5uj XDQfvH/0kqOXkMpra926XHaxsRr7v/A0se978es2dgG6CPo+xC6hj7qWukg1+6CPpNb9Nv8Amfza ZVyFkkBZGIiaOmv6LQc95c1zjLnCPxSzGl9DLWiHsMOkfmk/+TUgQ+xgaJ3EQOy07Onm3Eit3u5A I7t/e/4NPupR023/ALi/KRwUf0vleZNcuk8qxiVWDJp9J2x5e0B3gD/Of2PR/wBf9G9jdryDo5pI PxH0v9f/AD4j4lAvvZS55rDjG8fSmNzG1/R/SP8A8F/r69gy0+jXrR68uisCIPGv9pUgHOkAeQMc H8z3KbrfZDhxxP0iBuY3d/LeiYdtYY7QhwnnwVQfrJgE8Arr/VWAGMSavVbHwsbF3PbXte8lznGX uk/9R/1tGNodXLe/DinNzHODR7txhBvrcNWO9p0c09lJMEXwnjjXD/rP8JYNT6vmP7zVzCXlrB9J hkHnSFLHe30DW4SB7nOOgif+rT3ZFdTfRJ/SBsgmP9foJ8Z9Zp9+mpdEf2Nu1RgES33Bv/vGf/Jg V8svT/37l54tAbt/mHtABjv9PYs303T5LpMyoOx/aIaIgeAb9H/oLL9LvAUsR+rI8JI4+r//0u2B UlXD3ACRPmEVr2nunELAWaSSSavYv+idJ8ljZGRZTYWlo3EE7nDjd+5uW06Y0Ve5rQxwsiwWaEO+ jws/nMfFMSB+SOv7n/qxmwyETqOMH9F545TmkOiSDJ10dtVl2YbagGg8z/K9/v8ARtb+/WjWYHqW tc+BWYDmzs9Osfu2N3e//X1FXzK+n+oDW5rQzQ1AzWT7fTvtrrd/1v8A4ZUuD0m/Tq3jOEjGo8X6 Wn6LXddqYnx5QDYRW/dJJB8fDd9FSvqyK2eq6sgkyGO+lH8v/O/1/SoYx73t3MYbANC5oJrn/R+p /X/1/m0Y46ZPcgNi5OaC6Hkw5gggiNP327lo15VDcL7PUNQCwuABeS7+T/Ob1XzGes9teQH1OcAG A+xzgD7drbW/pv0jlo4OCcQM+zMNuQ0/pLwNzWT9Nvpbq2fzf/Xf0isGQEBe46fo/wCMwyBMgRw0 R8xl+k231WkElzZMB7RJ2Fw/R+/6H6RO0zTSTaGQXCTOu7dT6Tdn836j/TU8TFyMmGWtNdcGWkET P+Edu/lqtmYeTjEQDdS2SXtaXOZt93vf/Z/4xVhA1demXo/qslxJGMyjxjs2Cy0WbbyWsJDg7s5v /B2Kw+zGspq9N8t+iSZBP9f+Wi4tlY6ZXc6Hixg5lwJP7rf3FRZ6bXBwY1gcYIb7R+cxrns+h/1x CUYxPDp+sH+FjYweKzRHtS4fT8k+H+q1L89tlxFjZaCGt7CG+3+TsVPIyxXUMVjANsuJnkfuu3f1 P+LQ8lrhk2NbLgHDWOzveq2SLGtfbseQxo3jvP8Am+ytWYQFj+t/02WRiI6foj0hsMy/U2MGh0aB w2f9XKfULWvD6m6hreRzP0f9f9fTwzlPdB2hoHhPH9b/AF/62rLMgGuGDXWfIn6XtU3siJsNQ5DK r6Bo7TLh27eX9VXK62V0gyGjaHl3/S2fmobhrrrPfzK1uhYtV17jfJqoDX7eWzu2te5m3/Bfzn/G f9tqWctL7MVUtidMyrqg8Vmtjo2G2QHunf6NVf8APM/4/wDmv9Go2NOPZFwdW0iQOdx/4FdbuYfZ bYGNJksZr39nr3/8J/xXqLP6liszWkbf0Tp3SA1wf9Njmfzf/nz/AEir8WuvykrokjZz8Qyyq5uQ Qx30mWgOaYOzbXbWz9H/AMZ/6jV3LqrfScmtxYK2gvaCXscAfe+r1Nno2/62Lmq77bJa0OLWwAI3 e1n0G/8ABLSbmPHTL/UO2x811N4tc52337f0fs9N/wDOp08Y0pMZneyktDcekZLHmwVHdDoG9v8A ha93u2We/wDnP9a7FXU3bAIc0PAPZ3t+k33/AE/9f+286qrf09zQdRq+P3XH/wBFp/UHBOvAPlH9 ZRmA13u6tljO92eTm3PadAByfgrmbU2vpTb+LHNa4Bv5stY1v0Vj5NzWscJ1gwNV0VzmuxWtdoNg BJjgNY3amzAjGJr9L/osolcgAf7yXDv24FFlehe0bo/eG/cptuD2w9pP8of5v0ln4T3MxTRtBDSX NnU7Xfup2i719pB2kCCFFLQmvl/dRwb382/E1rf1HPpx3EuruH6J5gHcC7fS7Z+f/N/+BrdbktbQ 4n2NIiSdIb7Vl9Qorf6DHQfS3EggOb7/APzhQfvc0BxJDRoPD/X/AF/4N4hxCMhcNDxsUp9D6qPo LVsPq3vc3UOdMkQTo3c7/ris4+PqB2hQY33jn4f6/wCv/o7VxqwY50/1/wBf9fTmjC6GqwyUQ9tf j+VApymbxU+W7jpu0H9T9xafpAtiFl5eProPyJuXABrVeS7Hk6F0H5gxmsIYXPfM/wAgf8J/o0zc 1oYXEh0yYB8PzVQwbG45LbGex2m4Cdv0mfzX7nuWjbg4ljA6ja1w/PbqHR+9sd7/APz4q+o39OOG n+OmXADVcXF+m44bLi7iSTB12z9Fv+YrlJPA0+H+v+v/AJ8YYljrC0N3Eclnubx+/wC1aGP09wEv 79irOPEZHQXH95bPIOpaVhJGpP3n/X/X/jUwA2H+/wA/9f8A1X6a1zg0H6Qn/X/X/X00QYuOGFmw bTyrIwS122YTlD//0+tY5pZ5f67v9f8AWsog/SVRhIME69/ij1knTj/X/X/X+cIK0hOBHdO5wYwu cYa0ST8EwA8j5pWbTW4O0bBk8psyRGRG4iUxAsNTJz8ekxY7Tlwke0fy1j3dX6c9pay3iJIEtl37 1n86z/R/zX6Jc5lPyLb3+4za87tfpa+z1P8ArfpqH2S12rWEk8nQaR+b7lnSxxnrklZb8YCG3zR+ a/8AuXuKgzIrZvcHb/bXsj0wB9FzX1fT/wBf0apY+DlUXe5rdlbt7bA1u98DbXTZt/kf+llU6Zkv xsCthmWvdIn6QO32/wDBsWi7MY2ypxG7e0OaBwHEe1r2/wDAqAkWa/Rlwyn/AFf313DMWAPRPi9P 91r9QpveHODQTr7TM/2drf8Az4h5dtjaA2sue2lrXOr9zGipg9+59Hvqtu9T9JZ6v+D9P/SImflV Cu0te8RJ1J5P0f5az6us/ZaAWNDrZcHtd+e3/N3sprYnY7JNaxQYHhB/S/d+V2+nXstpFj4Lqohx g7SW7/puRsiwiKwN7rf5usDv7rfVsXLYuTZVkVsbQW13vD6KgRZDH/zHpPp/R/q//gNX84tx+fYX FrTtsAEjxn878z/wRDJp6DfCf3f8Sa2MLPEPVX8oNum+yhtjcw7TwJdGkbvV9239H/6TTW5mOGSx 0MEFrgRD5WH1G82ENa5zsoEOY1oL/aP0tz3Vsb+5+k/9FrPxW5WQ0uaQMcaueNGkk/znt+nY/wBX 01IB+r/qj975kSj6r/e19Py/4r1Fl1WUGteXHbrtYQN2n0fz/wB7/wBSKFuMHAsqYK3OHsduLg4t HqMrey7Z79/85YqmFVD/AFLHB4EBjRqXO/O+mp5VtrbHV2AsI93uOm3+t/Nfo1GRHU0ZG0gyBAB4 Yj+XyocLCtLHW3ENc/RzHfTZr/J/RPQ+qOe3GfiUVEB+lhguc4R/JR2ZVTWubY6C8CO+n0/U3O9i EckbSLdHMJZPH9X6P56bxEES4WWiSb2eWtr2ktiLGuIcDo7j6P8Ar/22gVw20wYka+f7v+v+tl3q wJubY0+17S2T/JHs/wCgs+dSeT/q1aOM3EH94NTIOGdfutprg+1swANfiV02OW4FLZiXaPdqAC73 em9/0Pp/6/4NclW8tex4AdtcHbfHaWv2LqMixuQ0W0k34rpLQHFuwkfpGXVv/wDSfqV/8T+kUWYb fuqjLdsOyKbGkOtYzdGo0/lf6/63JG5xYWB4cI2yyQIP6N+z9z/z6s1mOwbQ6HPPGv0f3X/R/wBf /PmnW9ruACPAD+qoJabMkWrXiMxiLauHe2OYH0Wt/wDSaoZbvVkcmqC2D/K2bf8Arv8A6L/65X0D rKxGnA90cf6/6/6RYsb7X2lpDXOJa3jbXu9jE7FxGVnXh8UTIEdqtDW6zYBGwdx/r/r/AOjSNxfX Mn5QjsYwuEiPkr+NUB9E6FTiOuzHxOcOjbwZJg6K6+H+wA7uze7Po/msWoysOI8P9fZu/wBf+spU 41H2gur1e7Qu8AP5zaoOZgQIm+tQj/WZsOWr0cTMY+ttLmSHgmCOY+kp1ZtwABrG+dSDtH9la2ZU y2yprYhsw0fmyiN6ZW76Q1/ilhwyyQBrZE81HXq5LXOc4vfo5xkgf+ZIgrcRoJHj/r/r/wAWtYdK pbHIR2YTGjQT8Vajy8u4iwnKC4Ixnl8gHXgLTxKXDaSNf9f9f9alotxmN4AHw/6SIK2N1CkjhETf FawzJ6Nd8Mpc7aXQOB30/NT/AGZjwHRzr9/+v+v82j2V72OYHFm4EFzY3a/12vQ8Wp1FDaXP3msR uiPbP6P/AMDTjGzRHo4f+cgHS79VsRh0xBCduHQ0kwTPIJ9p/rMb7EdPKBw4zvGMvNXHLuVg0NEN AAHAGgTob7q2CXOAgTygPzqRoDuPgPJSgfRbbbTaLHyOtVVjV7WeR+l/mN3rPd9YWeq0B7iJ1ftO wD+r/PP/AO20tNrCqPZ//9TrcmoGHjtzHn/r/r/hIM3CROo0g+Z2/wCv+vp3SARrr4qs9hBj84GQ fEfS2u/tsRWs2vdOo5UiXEQ5sg6H5oDLAD7tAPn/AK/6/wDXbDbGuGhSrodVOCehmh1z6hvbbw0n UN3er6fvWdkNvrLWVNg6hwIk7f5LF1d7jt0WHmvJBB/2KhlxcMtDL/D9bbx5Sd6KC7GDKazvDy4S XD6Li785v/B/6+ogAXViQ0ODTzP0J9jn/wDXv5pP9raK/TtadNAW6z9J216rvzSNWvc3SDA7H3fQ cqvBK6psxyaUSPq239Kzc2GMHpMGpssOh1/Mp/n7PTVa76u5TNwZkMftECWPaXu/0e5u+uv/AMEX Q9MyXW4THAAuIH0u+38//oLPvtLI3XbQdYnbJ+lv2/13empDIwiBH8mHilKWp+Xs0+i2ZORi1VMl rgDVA42sP+G2/mUUenV/6lRb8W3HyCyRZa/s0xvn9z1P+EetTotNVWPZkDQ5VhcRxJaXVO9n/CW+ qoZ+O4OF1XvaCZO73s3f6NzfppuQAeqv5w8ch+5CTJiyerg04a4P7+RodPu+zdTcXMNjH1lrrOXV /Rv/APBdv/nlaYxaHQcVzaqiJ2tEtaSfd9mr/l/4X01m1UZAe4sAeHnWZBDXfQ37W2e9FpD6Hiuw 7X/SPnr9NRyyekR+aI/xl04DiMganX+N/guhVh1VWB5G1rI2O1/lbq/5DFV6xVZbT6o2EN3FzHGP YR6Vnub+exTbkPc4AOMeHbRAzMhpqs9SS1oMgBMEzYAB+Zj4TYJLz7n2eqaw3c4xtDfd7fzNra1s dNcWte7YfXb7h6g9mvt/1/wv/ozm35jvWaWnaAI42jX3e/6S2Ptxqpta3cH2iGEnc1jSNz/3Pz/9 J+k/TfzitziRWm6DO7HQK65RjGt59MsyS5vplgIZvH068n3el+losss9T/Sf9trNx+l7oJErSdZ6 lThad91kO8Nfof2P9f0Sv4lI2AnmOfL85S4LI4QOrBMjdym9IEcTol+yi0GJaDEwS2Y/e93+v/gi 6VtE6xr/AK/6/wDpL/BSONoBEgcD/vvtb/r/AOBKx7Jpj4w8j9nfiumsazOuuo/rf6/+e1o05NJG kh0ajaTBWnb08u1jTzQR08t4H+v+v+v+jgnhJ3H1XjJ4tZxLmQdB3Hjru3f6/wDquEDdr+E/2P8A X/W647GcPj/r/r/21/196+l5L49kN8ToP+l/r/6LEYEaAKMu5ajdkz2Gg/1/1/8ASdyg+AlW6eiu B/SPA+Eu/wDSav1YGPX23EePH+a1TRxm7NBYZBqVBxAjTj/zH/X/AFsMzCdJc1xrB7Ad/wA76aut Yxv0WhvwEKSfPDjnXFHi4UCchsatrV4dNeoHu/eOpRw0D+CkmT4xERURwx/qrSbNnVdJDdaxv0nA FBdm0gaawnUUW2ZSlZV/VW1t3uIqb2c8ho/6ayb/AKxY+obY+zzY3T/PfsSNDcq1L1Drq2mC4BV3 59LeJPyXH29cufOxm0fvPMuj/rexn+v/AFxVjn5Fn0rXCfD2j/wL/X/z0mmcRt6l3D3euv6uysHc Qzwnn/X/AF/4BZtvXmu1a5z44AbA/wCntXPtiZmSe/J/78iBoJ5/1/1/1/0TDlPSgkRDef1TJs+h +j51J3O/9FKs+/IeIfY4g/mj2j/wP/X/ANHQ2j/ZH+v+v+i/wiPtEf6/6/6/8Wwzkeq6kLokgDzn /wAy/wBf/SbbT8/wRNp57p9o4/3IIf/V7dQezdHiP4hETcorWqB7wRrJ1lS2MPI18e6a5hBaRoCf /MkzXff/ABRV0ZGmQYJ+BVW7De4ToVdaZUwhIA7oBI2cOzAdt9zB8QP/ACO7/X/Bqi/pjXeXkD/r /r/hP9D1UJFjTyJUZwwX8cnncJr8AFo3PpMw08tc78+p/wDX/wAD/wBt/wDCZmTa4ZJuDC8lu2S7 QD87Yz/BrrrMOtwhuiycrplh1aJ8xz/r/r+j/wC08GXBrY9S+GQ9WfRLpxK32DaXPe0N/Nd7tu6v /X/SqzkVOcRJ2n6QHZU2vbiYuOywTsL5ntr6rXf2N6tPyGPx9pre17mggcO/eY7d+ZvVGe8omo8M pcP95tRjL0zH6fVG99lLy/e2XAA8ucwf1Vl5mUab6n2y5rnPG4ax9BrVbryHw5jwA06kAy7T6PqO Wb1N5LGNkfSks7xCEIWaPj6f7zITwg7cVfN/VSnOxms3Nfu7wz6R/O9v+jWbm5d17dobsBmRPj+9 t/nH/wDGJmtLTLdQfjoiihzuAROo0ViGKMdfza8shLlPxnmANZVnGpyh7dHtB03SSAPzPbsWpTg2 OMHnw1C18Xplg1LSeDqI/wCr/wBf/RdmMTMeDAZUXFbTc47iNxPlpH/kFtYWPZtBdOk/6/6/9uVr SrwdupIHwEqy2lrfNSwxRibu6/RWmRPRCysNERp4IuzwRQAOElKZLOFGKvgE32ev84SipShZXUFm sY36LQPgITqJe1vJhAszaWDmT5IUq2ymlZtvUo4EDxP/AJksnJ+sWMzQ3bj+5V+k1/r1/ov/AARH TqVUTs9M6xjRq4CECzNpb3J+C4y36xB2rKSPN7o0/q0qnZ1TNtmLBW3/AIMbT/267fYgZRHQlXCe pe0yOpWNYTUAw9nWfR5/O91f5n/gn/bKysn6x4jSR63qHs2ubP7PqVfoP9f+urkrHF2r5e48FxLv +rQ+RB180OPwpIiHcu+sxI/RUknxsdA/7ao/9K/+ilmXdY6jdobixp/NrHp/9P8Anv8AwRVfTBOg +HwTtpLiAEOIpXDnPdveS89i6XO/d+k5EFg5Ijx8kwqeB9HTxCQ0g+HCFWpI1zT3+HZFa0n/AF/t KttCkNDoSAPkUDFTa2x2gfxRGh3adTxr/r/r/pP5ys214PYjtP8A5ijC5vBb8SIP/kP9f+2k0xKW wHEDX4/L/X/X/RreHO1H+v8AZTepW/2tIk+Ohn+0pspce0Dz1Qo9lWu0N8Z8wibBxpt58v8AX/X/ AIJJuOTEonpe7YPmNfD6P76PCVP/2Q== --=_wowlgpostcardsender102.10200000000105_=-- ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-nested3_decoded_1_5_1.txtapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-nested3_decoded_1_5_1.t0000644000000000000000000000007211702050534032066 0ustar rootrootPart 5 of the outer message is itself an RFC822 message! apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-2gifs.out0000644000000000000000000000460311702050534027550 0ustar rootrootReturn-Path: eryq@rhine.gsfc.nasa.gov Sender: john-bigboote Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Eryq Organization: Yoyodyne Propulsion Systems X-Mailer: Mozilla 2.0 (X11; I; Linux 1.1.18 i486) MIME-Version: 1.0 To: john-bigboote@eryq.pr.mcs.net Subject: Two images for you... Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE" This is a multi-part message in MIME format. --------------299A70B339B65A93542D2AE Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit When unpacked, this message should produce two GIF files: * The 1st should be called "3d-compress.gif" * The 2nd should be called "3d-eye.gif" Different ways of specifying the filenames have been used. -- ____ __ / __/__________/_/ Eryq (eryq@rhine.gsfc.nasa.gov) / __/ _/ / / , / Hughes STX Corporation, NASA/Goddard /___/_/ \ /\ /___ /_/ /_____/ http://selsvr.stx.com/~eryq/ --------------299A70B339B65A93542D2AE Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-compress.gif" R0lGODdhKAAoAOMAAAAAAAAAgB6Q/y9PT25ubnCAkKBSLb6+vufn5/Xes/+lAP/6zQAAAAAAAAAA AAAAACwAAAAAKAAoAAAE/hDJSau9eJLMOyYbcoxkaZ5oCkoH6L5wLMfiWqd4btZhmxbAoFCY47EI qMJgyWw2ATjj7aRkAq5YwDMl9VGtKO0SiuoiTVlscsxt9c4HgXxUIA0EAVOVfDKT8Hl1B3kDAYYl e202XnGGgoMHhYckiWVuR3+OTgCGeZRslotwgJ2lnYigfZdTjQULr7ALBZN0qTurjHgLKAu0B5Wq opm7J72etQN8t8Ijury+wMtvw8/Hv7Ylfs0BxCbGqMmK0yOOQ0GTCgrR2bhwJGlXJQYG6mMKoeNo WSbzCWIACe5JwxQm3AkDAbUAQCiQhDZEBeBl6afgCsOBrD45edIvQceGWSMevpOYhl6CkydBHhBZ QmGKjihVshypjB9ClAHZMTugzOU7mzhBPiSZ5uDNnA7b/aTZ0mhMnfl0pDBFa6bUElSPWb0qtYuH rxlwcR17YsWMs2jTql3LFkQEADs= --------------299A70B339B65A93542D2AE Content-Type: image/gif; name="3d-eye.gif" Content-Transfer-Encoding: base64 R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAAAAAA AAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7VujnC96I RVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7+3dCeRRjfAKH iImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatLrU8GaQdOBAQAB7+y XliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJvs7Y5ewH3d7Fxe3jB4rj 8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjwE0cdGxQ/gswosoKUkmuU2FnJ csSKGTBjypxJsyaICAA7 --------------299A70B339B65A93542D2AE-- That was a multi-part message in MIME format. ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-weirdspace_decoded_1_2.binapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-weirdspace_decoded_1_2.0000644000000000000000000000064311702050534032244 0ustar rootrootGIF87a((ã€ÿ/OOnnnp€ R-¾¾¾çççõÞ³ÿ¥ÿúÍ,((þÉI«½x’Ì;&rŒdižh Jè¾p,ÇâZ§xnÖa›À P˜ã±¨Â`Él68ãí¤d®XÀ3%õQ­(íŠê"MYlrÌmõÎ|T S•|2“ðyuy†%{m6^q†‚ƒ…‡$‰enGŽN†y”l–‹p€¥ˆ }—S ¯° “t©;«Œx ( ´•ª¢™»'½žµ|·Â#º¼¾ÀËoÃÏÇ¿¶%~ÍÄ&ƨɊÓ#ŽCA“ ÑÙ¸p$iW%êc ¡ãhY&ó b îIÃ&Ü µ@(„6Dàeé§à ì>9yÒ/AdžY#¾“˜†^‚“'AYBaŠŽ(U²©ŒB”Ù1; Ìå;›8A>$™æàÍœÛý¤ÙÒhLùt¤0Ek¦ÔTY½*µ‹‡¯pq{bÅŒ³hÓª]ËD;././@LongLink0000000000000000000000000000015700000000000011570 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/attachment-filename-encoding-Latin1.msgapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/attachment-filename-encoding-0000644000000000000000000000107011702050534032342 0ustar rootrootMIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------050706070100080203090004" This is a multi-part message in MIME format. --------------050706070100080203090004 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Attachment Test --------------050706070100080203090004 Content-Type: text/plain; name="=?ISO-8859-1?B?YXR0YWNobWVudC7k9vw=?=" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename*=ISO-8859-1''%61%74%74%61%63%68%6D%65%6E%74%2E%E4%F6%FC VGVzdAo= --------------050706070100080203090004-- apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/ticket-60931_decoded.xml0000644000000000000000000000120111702050534031000 0ustar rootroot
MIME-Version: 1.0 Received: by 10.220.78.157 with HTTP; Thu, 26 Aug 2010 21:33:17 -0700 (PDT) Content-Type: multipart/alternative; boundary=90e6ba4fc6ea25d329048ec69d99
Content-Type: text/plain; charset=ISO-8859-1
Content-Type: text/html; charset=ISO-8859-1
././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-nested_decoded_1_3_1.binapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-nested_decoded_1_3_1.bi0000644000000000000000000000064311702050534032134 0ustar rootrootGIF87a((ã€ÿ/OOnnnp€ R-¾¾¾çççõÞ³ÿ¥ÿúÍ,((þÉI«½x’Ì;&rŒdižh Jè¾p,ÇâZ§xnÖa›À P˜ã±¨Â`Él68ãí¤d®XÀ3%õQ­(íŠê"MYlrÌmõÎ|T S•|2“ðyuy†%{m6^q†‚ƒ…‡$‰enGŽN†y”l–‹p€¥ˆ }—S ¯° “t©;«Œx ( ´•ª¢™»'½žµ|·Â#º¼¾ÀËoÃÏÇ¿¶%~ÍÄ&ƨɊÓ#ŽCA“ ÑÙ¸p$iW%êc ¡ãhY&ó b îIÃ&Ü µ@(„6Dàeé§à ì>9yÒ/AdžY#¾“˜†^‚“'AYBaŠŽ(U²©ŒB”Ù1; Ìå;›8A>$™æàÍœÛý¤ÙÒhLùt¤0Ek¦ÔTY½*µ‹‡¯pq{bÅŒ³hÓª]ËD;apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/double-bound_decoded_1_1.txt0000644000000000000000000000000011702050534032067 0ustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/2002_06_12_doublebound.out0000644000000000000000000002665111702050534031171 0ustar rootrootFrom: Lars Hecking To: mutt-dev@mutt.org Subject: MIME handling bug demo Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="ReaqsoxgOBHFXBhH" Content-Disposition: inline Content-Transfer-Encoding: 8bit X-Mutt-Fcc: Status: RO Content-Length: 11138 Lines: 226 --ReaqsoxgOBHFXBhH Content-Type: text/plain; charset=us-ascii Content-Disposition: inline -- The plot was designed in a light vein that somehow became varicose. -- David Lardner --ReaqsoxgOBHFXBhH --ReaqsoxgOBHFXBhH Content-Type: text/html; charset=iso-8859-15 Content-Disposition: attachment; filename="The Mutt E-Mail Client.html" Content-Transfer-Encoding: 8bit The Mutt E-Mail Client

The Mutt E-Mail Client

"All mail clients suck. This one just sucks less." -me, circa 1995

mirrors


Latest News

Mutt 1.3.28 was released on March 13, 2002. This is a release candidate for 1.4.

Mutt 1.2.5.1 and 1.3.25 were released on January 1, 2002. These releases both fix a security hole which can be remotely exploited. For more information, see the release announcement.

Mutt 1.3.24 was released on November 30, 2001. This is a beta development release toward the next stable public release version. There have been several large changes since 1.2.x, so please check the recent changes page.

The Mutt CVS server has moved from ftp.guug.de to ftp.mutt.org.

more news


General Info

Mutt is a small but very powerful text-based mail client for Unix operating systems. The latest public release version is 1.3.28, which is a release candidate for 1.4. The current stable public release version is 1.2.5.1. For more information, see the following:

[Mutt Mail Agent Button]


Features

Some of Mutt's features include:

  • color support
  • message threading
  • MIME support (including RFC2047 support for encoded headers)
  • PGP/MIME (RFC2015)
  • various features to support mailing lists, including list-reply
  • active development community
  • POP3 support
  • IMAP support
  • full control of message headers when composing
  • support for multiple mailbox formats (mbox, MMDF, MH, maildir)
  • highly customizable, including keybindings and macros
  • change configuration automatically based on recipients, current folder, etc.
  • searches using regular expressions, including an internal pattern matching language
  • Delivery Status Notification (DSN) support
  • postpone message composition indefinetly for later recall
  • easily include attachments when composing, even from the command line
  • ability to specify alternate addresses for recognition of mail forwarded from other accounts, with ability to set the From: headers on replies/etc. accordingly
  • multiple message tagging
  • reply to or forward multiple messages at once
  • .mailrc style configuration files
  • easy to install (uses GNU autoconf)
  • compiles against either curses/ncurses or S-lang
  • translation into at least 20 languages
  • small and efficient
  • It's free! (no cost and GPL'ed)

Screenshots demonstrating some of Mutt's capabilities are available.

Though written from scratch, Mutt's initial interface was based largely on the ELM mail client. To a large extent, Mutt is still very ELM-like in presentation of information in menus (and in fact, ELM users will find it quite painless to switch as the default key bindings are identical). As development progressed, features found in other popular clients such as PINE and MUSH have been added, the result being a hybrid, or "mutt." At present, it most closely resembles the SLRN news client. Mutt was originally written by Michael Elkins but is now developed and maintained by the members of the Mutt development mailing list.

top


Mutt User Discussion

top


Press About Mutt

top


Last updated on March 13, 2002 by Jeremy Blosser.
URL:<http://www.mutt.org/index.html>
Copyright © 1996-9 Michael R. Elkins. All rights reserved.
Copyright © 1999-2002 Jeremy Blosser. All rights reserved.
GBNet/NetTek
hosted by
GBNet/NetTek
--ReaqsoxgOBHFXBhH-- apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/badfile.msg0000644000000000000000000000040511702050534026747 0ustar rootrootFrom: Michelle Holm To: imswww@rhine.gsfc.nasa.gov Mime-Version: 1.0 Subject: note the bogus filename Content-Type: text/plain; charset=iso-8859-1; name="/tmp/whoa" Content-Transfer-Encoding: 8bit This had better not end up in /tmp! apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/uu-junk.out0000644000000000000000000002103011702050534026775 0ustar rootrootReturn-Path: Received: from virtual.mrf.mail.rcn.net ([207.172.4.103]) by mta02.mrf.mail.rcn.net (InterMail vM.4.01.02.27 201-229-119-110) with ESMTP id <20000425112650.ZPUD516.mta02.mrf.mail.rcn.net@virtual.mrf.mail.rcn.net> for ; Tue, 25 Apr 2000 07:26:50 -0400 Received: from [205.139.141.226] (helo=webmail.uwohali.com ident=root) by virtual.mrf.mail.rcn.net with esmtp (Exim 2.12 #3) id 12k3VX-00012G-00 for eryq@zeegee.com; Tue, 25 Apr 2000 07:27:59 -0400 Received: from webmail.uwohali.com (nobody@localhost [127.0.0.1]) by webmail.uwohali.com (8.8.7/8.8.7) with SMTP id GAA10264 for ; Tue, 25 Apr 2000 06:34:43 -0500 Date: Tue, 25 Apr 2000 06:34:43 -0500 Message-Id: <200004251134.GAA10264@webmail.uwohali.com> From: "ADJE Webmail Tech Support" To: eryq@zeegee.com Subject: mime::parser Content-type: multipart/mixed; boundary="---------------------------7d033e3733c" Mime-Version: 1.0 X-Mozilla-Status: 8001 -----------------------------7d033e3733c Content-Type: text/plain Eryq - I occasionally receive an email (see below) like this one, which MIME::Parser does not parse. Any ideas? Is this a valid way to send an attachment, or is the problem on the "sender's" side? Thanks for your time! Mike -->> Promote YOUR web site! FREE Perl CGI scripts add WEB ACCESS to your -->> E-Mail accounts! Download today!! http://webmail.uwohali.com -----------------------------7d033e3733c Here's what he's talking about. I've uuencoded the ZeeGee logo and another GIF file below. begin 644 up.gif M1TE&.#=A$P`3`*$``/___P```("`@,#`P"P`````$P`3```"1X2/F<'MSTQ0 M%(@)YMB\;W%)@$<.(*:5W2F2@<=F8]>LH4P[7)P.T&NZI7Z,(&JF^@B121Y3 4Y4SNEJ"J]8JZ:JTH(K$"/A0``#L` ` end begin 644 zeegee.gif M1TE&.#=A6P!P`/<```````@("!`0$#D`(3D`*4(`*1@8&$H`*4H`,5(`,5(` M.5H`,2$A(5H`.5((,6,`.6,`0EH(.6L`0F,(.6,(0BDI*5H0.6L(0FL(2F,0 M.6,00G,(2C$Q,4(I,6L02GL(4G,04G,02FL80H0(4H0(6E(I.7,80HP(6CDY M.6LA0D(Y.90(6I0(8XP06G,A2H084H086I008U(Y0GLA4D)"0G,I2H0A2G,I M4H0A4H0A6H0I4I0A8TI*2FLY4GLQ6G,Y4I0I8U)24F-*4EI22I0Q8Y0Q:YPQ M:Y0Y6I0Y8X1"6I0Y:UI:6HQ"6H1*8Z4YV-C8WM: M8Z5"X1C:Y1:ZU2WM[>Y1S[UC>XQ[ M>YQS>[5K>[UCE)Q[>X2$A+UKA)Q[E*5[>[UKC*5[A*5[E)R$>[USC*5[G-YC MC(R,C*U[G*6$A,YKE+U[C*V$A+5[G,YSC*V$C+5[I=YKE)24E*V,C+6$I;V$ MI;6,C+6,E-9[G+V,C*V4C+V,E-Y[E-Y[G)R>$I;V^,I:VM MK<:EI>4O>^4M=:EI=:EK>>>EK?>>EM=ZMK>>EO=ZMM>^EK?^^EO?^MK>>MM>^ESO>EO?^E MO>^MO?^EQN>UM?^ESO>MQL;&QN^UM=Z]M>^UO?^MO?>UO>>]O>^]O?^USO^U MQO>]O<[.SN?&O?>]QO^]QO^]SO?&QO^]WO?&SM;6UO_&QO_&SO_&WO_&Y__. MSN_6SO_.UM[>WO_.WO_6UO_6WO_6Y^?GY__>WO_>Y__GWO_GY__G[__G]^_O M[__O[_?W]__W]__W_____RP`````6P!P``<(_P#_"1Q(L*#!@P@3*ES(L*'# MAQ`C2IQ(L:+%BQ@S:I08J:-'2"!#BAP9DI')1(12JES)LF6@ES!C^IE)L^9, M/3ASZE2XH:?/GAB"8KA`M"B%HT@A*(7PH('3IU`;*)BJ(('5JPBR:M5ZH&N! MKV#!$AA+8(#9LSQ__A0ZM"A1I$F7-HT:E6K5JUBW379 MU["/(]_0V3-SN:,=/_^&[/MW];YCL6>/C;S[7]U66H(+\-6C;;?&%)R%>U)U7 M@$(C*(CA=H9YQR&$$4;76XA]D5BBB?NAJ-Q[<.76HHL@9I5`!M.9=Z",,]*H M77LW(I9CA]#Q:)4-9#22R2:*".+"9'P1.4*1-&;8X'?./4?78PM$T8@K=4A1 M@P4U,*$($WN-F!`)6]9I9'9>!E7;BBQZJ(`5I6RBA@B1I7"(!7LI1`*==7+9 MI8UZJKADGXV]4`HQ9U@@759()+'5`8HNVJBC)N89J9*3BMG``W8\H\@,]('_ MB$,3>H6Z**-VWKG@9AJ"&:!3+\CBRA/B.6F5!F_4FM`)MXK:J*Z[$M8K@`%: M$4TC)M05JU6'*(O0"$>01)`(*@1NNN,_J M:NJ>H+VP##'$RL=;!F/D5:^]]SJ;ZYW[2GH4$>2$,!DDTBD`)G&&W,\*K0-NV4'.89XH-C)8RKP!*%XL8QPPAV3 M6RZ#21HB#AO4JDJ:&!D0F(#//[O\,L.0ZHG*-EB@FZK2#5R`!7T*L?!SU%)[ M_#'1&,BRC1(X/DAQ`Q'H@(48+@Q85=ABC]WRK5-3_[U=*MP4P>^DO]90BSWW MW*.+!G;CS<(*>MM;]I8P(W=U$>?ZVI0&M'S#3C_WL+/*`DY-Y3@+>4?.<="5 MJW6U$?V%[."#7[3B2S7L?).-+STCL$@#;Q81_K@P<`&RB,=QV!@.Q3X"S2` M8%IP:8(02C`$(0AA""5(P/\0(L`2IDYUXH*!';"A0/4UL('O4$<$7SC!=8`# M$!>47?0\4`49J."'*G!`5/_J94(!@@^%BWJ#-<[1PG:\,![Q>$<^@@'%>-!0 M@>C`QAF^!!B`$(>XK!.LH(@!)"`)@'"*;IP#'2U\(3SBD0YYS*** M5KSB.LX!CD_D`'IPT4(*(L`DC9T1C2?\612@X48FQI&&\CC&._`HQQJB@X_4 M4`(@*:"#)$CO5SY#9"+!E09&@N.-"EQ@`]NA#F2L@Y*53.4YSM$-:H3A2V(0 MP=8:`+5#HA%A>8"&-;HQ#E0^$A[M(`@P0;_X$`*?&(* MU,PH2E(F`QK:(*8QT^=$>&Q#&N!H9B6?&8H99O@$F47 M@*'_#&J$LYCC5!\WEH$-==*0G;.4IC:@`0Q-L@4'1T!57/`)+E\*T`FX``8T M_-F-4XYS'=R0QC#*6<55KB^5T$QH-Q::C%/H('9DT(##D*(H`EJ4!3$812TT MRE%P`!2.ZPB'-&SAQ'C0XQ[XN$<]Z(%,E&)QEN-0*#24`8Q+A(`[.V#"821* M@5`1\`0"Y`,M=KI1:X33HV\4QS-F<0XGU@,?_A#(/N[!5*=>4J7:>"=5:3&& MGIS!`YF#BZV^BKH=T&*L_!1F.#LZRW,TPQ8L;`<]\%&0?-0#'JE$QUWYV(V5 MZA48M/`$"(QPA!1)RE:+LBD@8G'8Q%+#K)T]93.:P0LX_\*C'OTP"#[B`LEQB'>\U@BN<`^KBDY<05KGTM)R$=:"3IC"%*I@K72_6=9BA((: ML06'=N-QCWV8>!]UY:,TQTM>:$`C&<`X;RQ,P0E$\"I)6AK!A,'E!$YXXL+0 MC2XP.$R,69Q"&TB.+1/+*<$]KGBE>4VPBV$,6O326!(^N+%R7C.J'<>!$YRP M<'V%#(Q>%.,0U'BM61?KT_!"=?_%2(ZR@I5!Y<.N0A6>X,0CFH`V/6%G7,L] M!)C#C&'61G<8R`"$,EQ<5FNL.JZ:?+MX*! M)"9Q"3#_.,.TR$4Q*)$+?BZ:T1M-% M0%T$21A;$J8N]"YF<0E<2U<9K[:UM%T,;6?7XM*9SC,G)%$(.,PO0\/NLA*. M;>QDLZ(8=3CL3IT-#&%`&]KN?KNNM\2M?5A=WYG7^O;U'[%YG_J`1]5V%HB-?"%\#PA#T97:%W&'QN\!Y7M0>++]3M^5/_?RE=?YA3W!]8P_0O!T<`,8JN`"(Y7= M(OQ(O>I7S_K6N_[UL(?]1A32>GW$_O:XSST_9D][U=M>]ZLO"/!?S_O>\^/W MPU_(\%5?_(',0Q\$\?WR$<(/=\SC^0))OD4&P8#N>]_[CG!'__2/O_S=%\08 M/!```-8?`!08XQ_`OT@;UD__^FO"_`,A__3S3X7Z&Z#^2X!\L8<1Y@`*!FB` MFA```,``YF`0YB=[^<=\V<<#Z\+!^CE`0 MW@`*FG"!U]=Z_U"`FJ`)&)AZ`U$&ZX<'$9AZMZ"`K]!ZT_""H`!]PG=]/9B" M0.@0\Z"`/#`/`^$.*%!_`!`$WA"#J><.%%A_/.`-0.@."K@%XZ=Z\V!]7F@, M'%!_`4`%^*'MQ"#YI"'=^B' MM[![(R@`^'=[\_`*"FB'>+A^%0!]_/]P@G7(`#S``.O'`&V($-.P?EOP@)3( M`=XP$--0`0#``<9@>Z*(`MZ@>MXPAA6`@11(!=D'?_`7@O"G#].@?CQ@#JIW MBT_8@L:`B^(G$(Z`BPPABA7PB0*A"788C,ZG?GC@#LIHB06A#_\W"/PPAGC@ MA>ZPC=RXC>;PA?V'`LRW>[>P?FG8?QP0@OPP@@#0@`GA""1($$$``#SP@O;X M@C0``#3@#?,8!/=HC_G(`_S0A&6@>J_@A/77!N9`B5OPCYK@")0X"+=`B53@ M"/\(D0`P"`FA#[BHA`,QA@A9?Q5@#B`9DA7(#V](`[]7CB;Y"MY@DO6W!0<) MD^M7!@G1?W'_6!!-6`$HL`14\)-`N01M,)`+&`1+<)1(>91#J8P!D(K'UXWN MD(;J]X7KQP-'"914<)6O,)-!@)59J968J(FTN`7T.`W,*'QDF8NL%WT<28\" MZ'OSZ('\0(GW1Q#Z,`_F-PW_IPG19PZ7:!!CR`%G*1`L"0K?.!#ZD)6ZF(D` M``K/9WZ)N00QJ(Q/B)>KIP]O*`"ZN(X+Z)'_<)>OX),"\8;2^)E1J0FB>1"@ M```!L(=0.0W3,(\!H)"I9PRG.!"RV08Q.)$`((ZJ-W]P6`:O8`Z:4`9Y&(BI M1XT+N(/\8`YXH(`V^)G_QP"EJ`_>T`;0B1#`&9*TF8^L:0"1Z)GZ_["&`0"> ME6B9JN<(B>B$##`-P=>'ZR<`!I"(2T`0=!B?\[E^L(@0$/E]WF<`=?D/@Y"' M<+@%E\@/;5"'!?J6J3$H-">LSB`.$VQB%([B'7QB" M:!A]*)I_M_""@3@/AQF%U@<*GYB!MNB#[O^H$.7H"%@H$-9'$*"@H`!0`;>@ MA.Q(?V19?PP0`"[*`Z"ZA`!@D_P`"@2ZG!#Z#WJ)`I28C1JXAO07!']IEP'@ MB<^G#VU(@T'0HO-P"Z+H"'YYA*TX#R?8?V4`"N6HD0*A#PH("@,!CZDX"*.8 MJ8?XJ=VWI?^WCW>9@P!Z?>XP@J6)$(@8`$N@@AY9CEP8?:)Z"]`G`.DX$,HH MA_]0`31@?DP9!-E'`PRPI?K(IZ+8K[\8`-"G#^[0?2[Z#R.XGPGAH)0H`&5@ M#@U(`TUI$,[*`^('K_AWD/3ZG,'(`Q6P!83X#UC:!OK@H7]YD&+ZBS0@J=1* MKP3A#A40`&=Z$*__0(F]J@^C.)@"$00&\'X&4`$;"P"O(*D92;(!@`=<^G[* M:`[N(`#Z:A#F$*;_<`L"4)];ZJ%."Y7A"@!ENJ)`.`]CZ`B9&`0\^P_S5Z5! M6X0'6;0"P0$""8_B%P";"+(D"P!MA#*.)SF5XXVR0$,F+#_((D"80`,(+G.A[WQ^N\CCA_#-M]^%>.D_L/ M\&B^`T&!4BH0%%@&OS<-3=A^4PH`Z7N^'2A^U:<)#&``LAM]\\BI!3%_Y9F? MFS@0;4H0Y0BS=UO`#>RB*/F=_R<`J&J^+VF3!(&(=FB>*'#!!G&"FL"X2]@& M61FQ!?$*7SL//_C#;:@/_SN'6_"3@P!]M_"EB.J`@_"36T#"5EK%5GS%6)S% 36KS%7-S%7OS%8!S&8IP1`<$`.P`` ` end -----------------------------7d033e3733c-- apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-igor_decoded.xml0000644000000000000000000000363311702050534031140 0ustar rootroot
Date: Thu, 6 Jun 1996 15:50:39 +0400 (MOW DST) From: Starovoitov Igor <igor@fripp.aic.synapse.ru> To: eryq@rhine.gsfc.nasa.gov Subject: Need help MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="-490585488-806670346-834061839=:2195"
This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. Send mail to mime@docserver.cac.washington.edu for more info.
Content-Type: TEXT/PLAIN; charset=US-ASCII
Content-Type: TEXT/PLAIN; charset=US-ASCII; name=Makefile Content-Transfer-Encoding: BASE64 Content-ID: <Pine.LNX.3.91.960606155039.2195B@fripp.aic.synapse.ru> Content-Description: Makefile
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="multi-nested.msg" Content-Transfer-Encoding: BASE64 Content-ID: <Pine.LNX.3.91.960606155039.2195C@fripp.aic.synapse.ru> Content-Description: test message
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="Parser.n.out" Content-Transfer-Encoding: BASE64 Content-ID: <Pine.LNX.3.91.960606155039.2195D@fripp.aic.synapse.ru> Content-Description: out from parser
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-2gifs_decoded_1_2.bin0000644000000000000000000000064311702050534031621 0ustar rootrootGIF87a((ã€ÿ/OOnnnp€ R-¾¾¾çççõÞ³ÿ¥ÿúÍ,((þÉI«½x’Ì;&rŒdižh Jè¾p,ÇâZ§xnÖa›À P˜ã±¨Â`Él68ãí¤d®XÀ3%õQ­(íŠê"MYlrÌmõÎ|T S•|2“ðyuy†%{m6^q†‚ƒ…‡$‰enGŽN†y”l–‹p€¥ˆ }—S ¯° “t©;«Œx ( ´•ª¢™»'½žµ|·Â#º¼¾ÀËoÃÏÇ¿¶%~ÍÄ&ƨɊÓ#ŽCA“ ÑÙ¸p$iW%êc ¡ãhY&ó b îIÃ&Ü µ@(„6Dàeé§à ì>9yÒ/AdžY#¾“˜†^‚“'AYBaŠŽ(U²©ŒB”Ù1; Ìå;›8A>$™æàÍœÛý¤ÙÒhLùt¤0Ek¦ÔTY½*µ‹‡¯pq{bÅŒ³hÓª]ËD;apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/jt-0498_decoded_1_1.txt0000644000000000000000000000246511702050534030550 0ustar rootrootHello to all, I purchased a tall windshield about two weeks ago from Waynesville Cycle Center in NC. The entire length and width of the windshield has optical waves or ripples which distort the view through it. It was very uncomfortable to ride with and I would be afraid to ride at night with it. I contacted the manager at WCC. He in turn contacted Honda Customer Service (310-532-9811). They replied to him that there were no bulletins concerning this problem and that they inspected several windshields. They claim that all the windshields had distortions. They have offered to give me a full refund. What bothers me is two things. First, the stock windshield has no optical distortion. Second, it appears that Honda knows that it is selling a less than perfect product and is apparently unconcerned about it (seems like a strange way to do business). Perhaps my windshield is the worst one ever made, but they made no offer to inspect mine and compare to others that they have in stock. I am going to call Honda on Monday and raise the issues of safety and quality. I will ask them if they have a problem with me forwarding their position to publications such as Cycle World, Rider, etc. Dennis Gaffney Marlboro, NY gaffneydp@aol.com 1994 PC800 Bought used in 1997 (2000 miles) Modifications: tall windshield? apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-2gifs.xml0000644000000000000000000000546411702050534027547 0ustar rootroot
Return-Path: eryq@rhine.gsfc.nasa.gov Sender: john-bigboote Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Eryq <eryq@rhine.gsfc.nasa.gov> Organization: Yoyodyne Propulsion Systems X-Mailer: Mozilla 2.0 (X11; I; Linux 1.1.18 i486) MIME-Version: 1.0 To: john-bigboote@eryq.pr.mcs.net Subject: Two images for you... Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE"
This is a multi-part message in MIME format.
Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit
When unpacked, this message should produce two GIF files: * The 1st should be called "3d-compress.gif" * The 2nd should be called "3d-eye.gif" Different ways of specifying the filenames have been used. -- ____ __ / __/__________/_/ Eryq (eryq@rhine.gsfc.nasa.gov) / __/ _/ / / , / Hughes STX Corporation, NASA/Goddard /___/_/ \ /\ /___ /_/ /_____/ http://selsvr.stx.com/~eryq/
Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-compress.gif"
R0lGODdhKAAoAOMAAAAAAAAAgB6Q/y9PT25ubnCAkKBSLb6+vufn5/Xes/+lAP/6zQAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJLMOyYbcoxkaZ5oCkoH6L5wLMfiWqd4btZhmxbA oFCY47EIqMJgyWw2ATjj7aRkAq5YwDMl9VGtKO0SiuoiTVlscsxt9c4HgXxUIA0EAVOVfDKT 8Hl1B3kDAYYle202XnGGgoMHhYckiWVuR3+OTgCGeZRslotwgJ2lnYigfZdTjQULr7ALBZN0 qTurjHgLKAu0B5Wqopm7J72etQN8t8Ijury+wMtvw8/Hv7Ylfs0BxCbGqMmK0yOOQ0GTCgrR 2bhwJGlXJQYG6mMKoeNoWSbzCWIACe5JwxQm3AkDAbUAQCiQhDZEBeBl6afgCsOBrD45edIv QceGWSMevpOYhl6CkydBHhBZQmGKjihVshypjB9ClAHZMTugzOU7mzhBPiSZ5uDNnA7b/aTZ 0mhMnfl0pDBFa6bUElSPWb0qtYuHrxlwcR17YsWMs2jTql3LFkQEADs=
Content-Type: image/gif; name="3d-eye.gif" Content-Transfer-Encoding: base64
R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7 VujnC96IRVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7 +3dCeRRjfAKHiImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatL rU8GaQdOBAQAB7+yXliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJ vs7Y5ewH3d7Fxe3jB4rj8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjw E0cdGxQ/gswosoKUkmuU2FnJcsSKGTBjypxJsyaICAA7
That was a multi-part message in MIME format.
././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-digest_decoded_1_1_1.txtapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-digest_decoded_1_1_1.tx0000644000000000000000000000010711702050534032163 0ustar rootrootThis is implicitly-typed ASCII text. It does NOT end with a linebreak.apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-bad_decoded_1_1.txt0000644000000000000000000000202011702050534031372 0ustar rootroot[[ERROR]] Error 600: Internal logic. Dying gasp: Bad mode: SEARCH/ (600). Recommended action to correct the situation: YIKES! IMS/www failed one of its internal consistency checks! Please SAVE THIS FILE, and contact IMS/www's developers immediately so they can fix the problem! If the parentheses at the end of this sentence are not blank, you can contact them here (imswww@rhine.gsfc.nasa.gov). ------------------------------------------------------------------------ Location of error Dying gasp: Package "main", file "/usr/app/people/imswww/v.b/lib/perl/imssearch.pl", line 753. Traceback: 1. Iw::Die: from "main", "/usr/app/people/imswww/v.b/lib/perl/imssearch.pl line 753 2. main::Main: from "main", "/usr/app/people/imswww/public_cgi/v.b/imssearch line 85 ------------------------------------------------------------------------ Basic state information Include path /usr/app/people/imswww/v.b/lib/perl /usr/app/people/imswww/v.b/lib/perl/Eg /usr/local/lib/perl5/sun4-sunos /usr/local/lib/perl5 apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/ticket-60931_decoded_1_1.txt0000644000000000000000000000000611702050534031461 0ustar rootrootHELLO apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/ARTISTIC-LICENSE.txt0000644000000000000000000001413611702050534027722 0ustar rootroot The "Artistic License" Preamble The intent of this document is to state the conditions under which a Package may be copied, such that the Copyright Holder maintains some semblance of artistic control over the development of the package, while giving the users of the package the right to use and distribute the Package in a more-or-less customary fashion, plus the right to make reasonable modifications. Definitions: "Package" refers to the collection of files distributed by the Copyright Holder, and derivatives of that collection of files created through textual modification. "Standard Version" refers to such a Package if it has not been modified, or has been modified in accordance with the wishes of the Copyright Holder as specified below. "Copyright Holder" is whoever is named in the copyright or copyrights for the package. "You" is you, if you're thinking about copying or distributing this Package. "Reasonable copying fee" is whatever you can justify on the basis of media cost, duplication charges, time of people involved, and so on. (You will not be required to justify it to the Copyright Holder, but only to the computing community at large as a market that must bear the fee.) "Freely Available" means that no fee is charged for the item itself, though there may be fees involved in handling the item. It also means that recipients of the item may redistribute it under the same conditions they received it. 1. You may make and give away verbatim copies of the source form of the Standard Version of this Package without restriction, provided that you duplicate all of the original copyright notices and associated disclaimers. 2. You may apply bug fixes, portability fixes and other modifications derived from the Public Domain or from the Copyright Holder. A Package modified in such a way shall still be considered the Standard Version. 3. You may otherwise modify your copy of this Package in any way, provided that you insert a prominent notice in each changed file stating how and when you changed that file, and provided that you do at least ONE of the following: a) place your modifications in the Public Domain or otherwise make them Freely Available, such as by posting said modifications to Usenet or an equivalent medium, or placing the modifications on a major archive site such as uunet.uu.net, or by allowing the Copyright Holder to include your modifications in the Standard Version of the Package. b) use the modified Package only within your corporation or organization. c) rename any non-standard executables so the names do not conflict with standard executables, which must also be provided, and provide a separate manual page for each non-standard executable that clearly documents how it differs from the Standard Version. d) make other distribution arrangements with the Copyright Holder. 4. You may distribute the programs of this Package in object code or executable form, provided that you do at least ONE of the following: a) distribute a Standard Version of the executables and library files, together with instructions (in the manual page or equivalent) on where to get the Standard Version. b) accompany the distribution with the machine-readable source of the Package with your modifications. c) give non-standard executables non-standard names, and clearly document the differences in manual pages (or equivalent), together with instructions on where to get the Standard Version. d) make other distribution arrangements with the Copyright Holder. 5. You may charge a reasonable copying fee for any distribution of this Package. You may charge any fee you choose for support of this Package. You may not charge a fee for this Package itself. However, you may distribute this Package in aggregate with other (possibly commercial) programs as part of a larger (possibly commercial) software distribution provided that you do not advertise this Package as a product of your own. You may embed this Package's interpreter within an executable of yours (by linking); this shall be construed as a mere form of aggregation, provided that the complete Standard Version of the interpreter is so embedded. 6. The scripts and library files supplied as input to or produced as output from the programs of this Package do not automatically fall under the copyright of this Package, but belong to whoever generated them, and may be sold commercially, and may be aggregated with this Package. If such scripts or library files are aggregated with this Package via the so-called "undump" or "unexec" methods of producing a binary executable image, then distribution of such an image shall neither be construed as a distribution of this Package nor shall it fall under the restrictions of Paragraphs 3 and 4, provided that you do not represent such an executable image as a Standard Version of this Package. 7. C subroutines (or comparably compiled subroutines in other languages) supplied by you and linked into this Package in order to emulate subroutines and variables of the language defined by this Package shall not be considered part of this Package, but are the equivalent of input as in Paragraph 6, provided these subroutines do not change the language in any way that would cause it to fail the regression tests for the language. 8. Aggregation of this Package with a commercial distribution is always permitted provided that the use of this Package is embedded; that is, when no overt attempt is made to make this Package's interfaces visible to the end user of the commercial distribution. Such use shall not be construed as a distribution of this Package. 9. The name of the Copyright Holder may not be used to endorse or promote products derived from this software without specific prior written permission. 10. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. The End apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/lennie_decoded_1_2.txt0000644000000000000000000000036711702050534031003 0ustar rootroot Client Pull Rolling Page Demo> This is Page 3 of my rolling web page demo. ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/mp-msg-rfc822_decoded_1_2_1.txtapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/mp-msg-rfc822_decoded_1_2_1.t0000644000000000000000000000432411702050534031576 0ustar rootrootHallo Herr Specht, entschuldigen Sie vorab, dass ich Ihnen nicht telefonisch zur Verfuegung stehe, ich Praesentationen gehalten/ noch zu halten und viele Kundennachfragen zu projektieren. Nach Informationen des Produkt-Managers Temme steht der POP schon zur Verfügung! Standort: voraussichtlich: Winterfeldstr. 21, 10781 Berlin. Der POP hat zur Zeit direkte 34M-Anbindungen zu folgenden Orten: Rostock, Hamburg, Hannover & Leipzig. 4 weitere werden in kuerze in Betrieb gehen. Damit haben Sie einen Besonderen Sicherheitsstandard verfuegbar! Kontakt muessen Sie ueber Ihre oerltliche Vertriebseinheit aufnehmen: entweder den Geschaefts-Kunden-Vertrieb oder das GrossKundenManagement. Diese Vertriebseinheiten greifen auf den oertlichen Technischen Vertriebs-Support zu. Die Informationen werden ueber TVS zur Vertriebseiheit gegeben und dann zu Ihnen. Sie benoetigen eine Standleitung von Ihrer Lokation zum Internet-POP Uebergabepunkt zu Ihrem Info-Server ist ein CISCO 1000-Router. Dann zahlen Sie neben den monatlichen Kosten fuer die Standleitung die Kosten fuer den Internet-Zugang: zB bei 64k: 1500DM bei 2GByte Freivolumen. 128K: 3000 DM bei 5 GB Freivolumen & 2M: 30.000 DM bei 50GB Freivolumen. Freundliche Gruesse Guenter Deuschle >Sehr geehrter Herr Deuschle, >Sie sind mir von Herrn Meyendriesch empfohlen worden. >Ich versuche Informationen ueber das T-eigene 34Mbit/s Netz und den >lokalen Pop-Berlin rauszufinden, bzw. was ein Anschluss kostet und >wo man ihn herbekommt. Laut Herrn Schnick in Berlin gibt es den >T-Pop nicht, laut Traceroute von Herrn Meyendriesch sehrwohl. Auch >ist dies Netz in der IX vom Mai 96 erwaehnt. >Koennen Sie mir helfen? > >MfG >-- >Juergen Specht - KULTURBOX > > =================================================== Dipl.-Ing. Guenter D E U S C H L E Deutsche Telekom AG Niederlassung 3 Hannover GrossKundenManagement - Techn. Vertriebs-Support: Team-Leiter Internet Online-Dienste --------------------------------------------------- GrKM-TVS-IOD Tel: +49-511-333-2772 Vahrenwalder-Str. 245 FAX: +49-511-333-2751 30179 Hannover eMail: deuschle@mnh.telekom.de =================================================== apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-weirdspace.out0000644000000000000000000000445411702050534030670 0ustar rootrootReturn-Path: eryq@rhine.gsfc.nasa.gov Sender: john-bigboote Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Eryq Organization: Yoyodyne Propulsion Systems X-Mailer: Mozilla 2.0 (X11; I; Linux 1.1.18 i486) MIME-Version: 1.0 To: john-bigboote@eryq.pr.mcs.net Subject: Two images for you... Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE" --------------299A70B339B65A93542D2AE Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit When unpacked, this message should produce two GIF files: * The 1st should be called "3d-compress.gif" * The 2nd should be called "3d-eye.gif" There is an empty preamble, and linear space after the bounds. -- ____ __ / __/__________/_/ Eryq (eryq@rhine.gsfc.nasa.gov) / __/ _/ / / , / Hughes STX Corporation, NASA/Goddard /___/_/ \ /\ /___ /_/ /_____/ http://selsvr.stx.com/~eryq/ --------------299A70B339B65A93542D2AE Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-compress.gif" R0lGODdhKAAoAOMAAAAAAAAAgB6Q/y9PT25ubnCAkKBSLb6+vufn5/Xes/+lAP/6zQAAAAAAAAAA AAAAACwAAAAAKAAoAAAE/hDJSau9eJLMOyYbcoxkaZ5oCkoH6L5wLMfiWqd4btZhmxbAoFCY47EI qMJgyWw2ATjj7aRkAq5YwDMl9VGtKO0SiuoiTVlscsxt9c4HgXxUIA0EAVOVfDKT8Hl1B3kDAYYl e202XnGGgoMHhYckiWVuR3+OTgCGeZRslotwgJ2lnYigfZdTjQULr7ALBZN0qTurjHgLKAu0B5Wq opm7J72etQN8t8Ijury+wMtvw8/Hv7Ylfs0BxCbGqMmK0yOOQ0GTCgrR2bhwJGlXJQYG6mMKoeNo WSbzCWIACe5JwxQm3AkDAbUAQCiQhDZEBeBl6afgCsOBrD45edIvQceGWSMevpOYhl6CkydBHhBZ QmGKjihVshypjB9ClAHZMTugzOU7mzhBPiSZ5uDNnA7b/aTZ0mhMnfl0pDBFa6bUElSPWb0qtYuH rxlwcR17YsWMs2jTql3LFkQEADs= --------------299A70B339B65A93542D2AE Content-Type: image/gif; name="3d-eye.gif" Content-Transfer-Encoding: base64 R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAAAAAA AAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7VujnC96I RVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7+3dCeRRjfAKH iImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatLrU8GaQdOBAQAB7+y XliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJvs7Y5ewH3d7Fxe3jB4rj 8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjwE0cdGxQ/gswosoKUkmuU2FnJ csSKGTBjypxJsyaICAA7 --------------299A70B339B65A93542D2AE-- apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/jt-0498.xml0000644000000000000000000001353411702050534026421 0ustar rootroot
Received: from farabi.hpc.uh.edu (farabi.hpc.uh.edu [129.7.102.2]) by sina.hpc.uh.edu (8.7.3/8.7.3) with ESMTP id OAA27026; Thu, 30 Apr 1998 14:27:51 -0500 (CDT) Received: from sina.hpc.uh.edu (lists@[10.1.1.1]) by farabi.hpc.uh.edu (8.7.3/8.7.3) with ESMTP id WAD14645; Mon, 27 Apr 1998 22:20:19 -0500 (CDT) Received: by sina.hpc.uh.edu (TLB v0.09a (1.20 tibbs 1996/10/09 22:03:07)); Thu, 30 Apr 1998 14:26:26 -0500 (CDT) Received: (from tibbs@localhost) by sina.hpc.uh.edu (8.7.3/8.7.3) id OAA26968 for pc800@hpc.uh.edu; Thu, 30 Apr 1998 14:26:17 -0500 (CDT) Received: from imo11.mx.aol.com (imo11.mx.aol.com [198.81.17.33]) by sina.hpc.uh.edu (8.7.3/8.7.3) with ESMTP id KAA22560 for <PC800@hpc.uh.edu>; Thu, 30 Apr 1998 10:29:47 -0500 (CDT) Received: from Gaffneydp@aol.com by imo11.mx.aol.com (IMOv14.1) id QICDa02864 for <PC800@hpc.uh.edu>; Thu, 30 Apr 1998 11:28:50 -0400 (EDT) From: Gaffneydp <Gaffneydp@aol.com> Message-ID: <c8384e50.354898b3@aol.com> Date: Thu, 30 Apr 1998 11:28:50 EDT To: PC800@hpc.uh.edu Mime-Version: 1.0 Subject: Fwd: PC800: Tall Hondaline Windshield Distortion Content-type: multipart/mixed; boundary="part0_893950130_boundary" X-Mailer: AOL 3.0 16-bit for Windows sub 41 Sender: owner-pc800@hpc.uh.edu Precedence: list X-Majordomo: 1.94.jlt7
This is a multi-part message in MIME format.
Content-ID: <0_893950130@inet_out.mail.aol.com.1> Content-type: text/plain; charset=US-ASCII
Hello to all, I purchased a tall windshield about two weeks ago from Waynesville Cycle Center in NC. The entire length and width of the windshield has optical waves or ripples which distort the view through it. It was very uncomfortable to ride with and I would be afraid to ride at night with it. I contacted the manager at WCC. He in turn contacted Honda Customer Service (310-532-9811). They replied to him that there were no bulletins concerning this problem and that they inspected several windshields. They claim that all the windshields had distortions. They have offered to give me a full refund. What bothers me is two things. First, the stock windshield has no optical distortion. Second, it appears that Honda knows that it is selling a less than perfect product and is apparently unconcerned about it (seems like a strange way to do business). Perhaps my windshield is the worst one ever made, but they made no offer to inspect mine and compare to others that they have in stock. I am going to call Honda on Monday and raise the issues of safety and quality. I will ask them if they have a problem with me forwarding their position to publications such as Cycle World, Rider, etc. Dennis Gaffney Marlboro, NY gaffneydp@aol.com 1994 PC800 Bought used in 1997 (2000 miles) Modifications: tall windshield?
Content-ID: <0_893950130@inet_out.mail.aol.com.2> Content-type: message/rfc822 Content-transfer-encoding: 7bit Content-disposition: inline
Return-Path: <owner-pc800@hpc.uh.edu> Received: from rly-za04.mx.aol.com (rly-za04.mail.aol.com [172.31.36.100]) by air-za04.mail.aol.com (v42.4) with SMTP; Wed, 29 Apr 1998 09:14:18 -0400 Received: from sina.hpc.uh.edu (Sina.HPC.UH.EDU [129.7.3.5]) by rly-za04.mx.aol.com (8.8.5/8.8.5/AOL-4.0.0) with ESMTP id JAA27623; Wed, 29 Apr 1998 09:14:08 -0400 (EDT) Received: from sina.hpc.uh.edu (lists@Sina.HPC.UH.EDU [129.7.3.5]) by sina.hpc.uh.edu (8.7.3/8.7.3) with ESMTP id IAA25294; Wed, 29 Apr 1998 08:14:23 -0500 (CDT) Received: by sina.hpc.uh.edu (TLB v0.09a (1.20 tibbs 1996/10/09 22:03:07)); Wed, 29 Apr 1998 08:14:20 -0500 (CDT) Received: from donald.cybercomm.nl (donald.cybercomm.nl [194.235.113.5]) by sina.hpc.uh.edu (8.7.3/8.7.3) with ESMTP id IAA25275 for <pc800@hpc.uh.edu>; Wed, 29 Apr 1998 08:14:11 -0500 (CDT) Received: from default (poort22-ip-x2.enertel.cybercomm.nl [194.235.118.22]) by donald.cybercomm.nl (8.8.6/8.8.6) with ESMTP id OAA25676 for <pc800@hpc.uh.edu>; Wed, 29 Apr 1998 14:12:10 -0100 (MET) Message-Id: <199804291512.OAA25676@donald.cybercomm.nl> From: "Emile Nossin" <Emile@CyberComm.nl> To: "PC800" <pc800@hpc.uh.edu> Subject: Re: PC800: Tall Hondaline Windshield Distortion Date: Wed, 29 Apr 1998 15:13:20 +0200 X-MSMail-Priority: Normal X-Priority: 3 X-Mailer: Microsoft Internet Mail 4.70.1155 Sender: owner-pc800@hpc.uh.edu Precedence: list X-Majordomo: 1.94.jlt7 Mime-Version: 1.0 Content-type: text/plain; charset=ISO-8859-1 Content-transfer-encoding: quoted-printable
Hi Pat, I don't see any distortion in my tall Honda screen, nor any maginfication= -- Visit the PC800 web page at <URL:http://members.aol.com/wwwpc800/> To unsubscribe from the list, send "unsubscribe pc800" in the body of a message to majordomo@hpc.uh.edu. To report problems, send mail to pc800-owner@hpc.uh.edu.
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-2gifs_decoded.xml0000644000000000000000000000270411702050534031210 0ustar rootroot
Return-Path: eryq@rhine.gsfc.nasa.gov Sender: john-bigboote Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Eryq <eryq@rhine.gsfc.nasa.gov> Organization: Yoyodyne Propulsion Systems X-Mailer: Mozilla 2.0 (X11; I; Linux 1.1.18 i486) MIME-Version: 1.0 To: john-bigboote@eryq.pr.mcs.net Subject: Two images for you... Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE"
This is a multi-part message in MIME format.
Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit
Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-compress.gif"
Content-Type: image/gif; name="3d-eye.gif" Content-Transfer-Encoding: base64
That was a multi-part message in MIME format.
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-igor_decoded_1_2.txt0000644000000000000000000000461211702050534031616 0ustar rootroot#------------------------------------------------------------ # Makefile for MIME:: #------------------------------------------------------------ # Where to install the libraries: SITE_PERL = /usr/lib/perl5 # What Perl5 is called on your system (no need to give entire path): PERL5 = perl # You probably won't need to change these... MODS = Decoder.pm Entity.pm Head.pm Parser.pm Base64.pm QuotedPrint.pm SHELL = /bin/sh #------------------------------------------------------------ # For installers... #------------------------------------------------------------ help: @echo "Valid targets: test clean install" clean: rm -f testout/* test: # @echo "TESTING Head.pm..." # ${PERL5} MIME/Head.pm < testin/first.hdr > testout/Head.out # @echo "TESTING Decoder.pm..." # ${PERL5} MIME/Decoder.pm < testin/quot-print.body > testout/Decoder.out # @echo "TESTING Parser.pm (simple)..." # ${PERL5} MIME/Parser.pm < testin/simple.msg > testout/Parser.s.out # @echo "TESTING Parser.pm (multipart)..." # ${PERL5} MIME/Parser.pm < testin/multi-2gifs.msg > testout/Parser.m.out @echo "TESTING Parser.pm (multi_nested.msg)..." ${PERL5} MIME/Parser.pm < testin/multi-nested.msg > testout/Parser.n.out @echo "All tests passed... see ./testout/MODULE*.out for output" install: @if [ ! -d ${SITE_PERL} ]; then \ echo "Please edit the SITE_PERL in your Makefile"; exit -1; \ fi @if [ ! -w ${SITE_PERL} ]; then \ echo "No permission... should you be root?"; exit -1; \ fi @if [ ! -d ${SITE_PERL}/MIME ]; then \ mkdir ${SITE_PERL}/MIME; \ fi install -m 0644 MIME/*.pm ${SITE_PERL}/MIME #------------------------------------------------------------ # For developer only... #------------------------------------------------------------ POD2HTML_FLAGS = --podpath=. --flush --htmlroot=.. HTMLS = ${MODS:.pm=.html} VPATH = MIME .SUFFIXES: .pm .pod .html # v.1.8 generated 30 Apr 96 # v.1.9 is only because 1.8 failed CPAN ingestion dist: documented VERSION=1.9 ; \ mkdist -tgz MIME-parser-$$VERSION ; \ cp MKDIST/MIME-parser-$$VERSION.tgz ${HOME}/public_html/cpan documented: ${HTMLS} ${MODS} .pm.html: pod2html ${POD2HTML_FLAGS} \ --title=MIME::$* \ --infile=$< \ --outfile=docs/$*.html #------------------------------------------------------------ apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/twopart.xml0000644000000000000000000012375011702050534027104 0ustar rootroot
Return-Path: <0647842285@uk.wowlg.com> Delivered-To: wowlgcard@cpostale.com Received: from WOWLG POSTCARD (unknown [57.67.194.147]) by lbn-int.qualimucho.com (Postfix) with SMTP id B33BE3F06 for <wowlgcard@cpostale.com>; Wed, 12 Jan 2005 08:08:12 +0100 (CET) MIME-Version: 1.0 From: 0647842285@uk.wowlg.com To: wowlgcard@cpostale.com Message-Id:102.10200000000105 Content-Type: multipart/mixed; boundary="=_wowlgpostcardsender102.10200000000105_=" Date: Wed, 12 Jan 2005 08:08:12 +0100 (CET)
This is a multi-part message in MIME format...
Content-Type: text/plain; charset="ISO-8859-1" Content-Disposition: inline Content-Transfer-Encoding: 8bit
JOY LEE;Batiment Le Rabelais 22 Ave. des Nations ZI PARIS NORD II; VILLEPINTE 93240;Greece#This is test message. Términos y Condiciones ¿Contraseña? Álbum êtes le propriétaire für geschäftliche
Content-Type:image/jpeg; name="/home1/eucyon/data/img_event/postcard/uk7200_110_6.jpg" Content-Disposition: attachment;filename="/home1/eucyon/data/img_event/postcard/uk7200_110_6.jpg" Content-transfer-encoding: base64
/9j/4AAQSkZJRgABAgEASABIAAD/7Ri2UGhvdG9zaG9wIDMuMAA4QklNA+0KUmVzb2x1dGlvbgAA AAAQAEgAAAABAAIASAAAAAEAAjhCSU0EDRhGWCBHbG9iYWwgTGlnaHRpbmcgQW5nbGUAAAAABAAA AHg4QklNBBkSRlggR2xvYmFsIEFsdGl0dWRlAAAAAAQAAAAeOEJJTQPzC1ByaW50IEZsYWdzAAAA CQAAAAAAAAAAAQA4QklNBAoOQ29weXJpZ2h0IEZsYWcAAAAAAQAAOEJJTScQFEphcGFuZXNlIFBy aW50IEZsYWdzAAAAAAoAAQAAAAAAAAACOEJJTQP1F0NvbG9yIEhhbGZ0b25lIFNldHRpbmdzAAAA SAAvZmYAAQBsZmYABgAAAAAAAQAvZmYAAQChmZoABgAAAAAAAQAyAAAAAQBaAAAABgAAAAAAAQA1 AAAAAQAtAAAABgAAAAAAAThCSU0D+BdDb2xvciBUcmFuc2ZlciBTZXR0aW5ncwAAAHAAAP////// //////////////////////8D6AAAAAD/////////////////////////////A+gAAAAA//////// /////////////////////wPoAAAAAP////////////////////////////8D6AAAOEJJTQQIBkd1 aWRlcwAAAAAQAAAAAQAAAkAAAAJAAAAAADhCSU0EHg1VUkwgb3ZlcnJpZGVzAAAABAAAAAA4QklN BBoGU2xpY2VzAAAAAHUAAAAGAAAAAAAAAAAAAADwAAABXgAAAAoAVQBuAHQAaQB0AGwAZQBkAC0A MgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABXgAAAPAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAOEJJTQQREUlDQyBVbnRhZ2dlZCBGbGFnAAAAAQEAOEJJTQQUF0xh eWVyIElEIEdlbmVyYXRvciBCYXNlAAAABAAAAAI4QklNBAwVTmV3IFdpbmRvd3MgVGh1bWJuYWls AAAVDQAAAAEAAABwAAAATQAAAVAAAGUQAAAU8QAYAAH/2P/gABBKRklGAAECAQBIAEgAAP/uAA5B ZG9iZQBkgAAAAAH/2wCEAAwICAgJCAwJCQwRCwoLERUPDAwPFRgTExUTExgRDAwMDAwMEQwMDAwM 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 IxoVFRojIhcXFxcXIhEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAEUExMWGRYb FxcbFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM /8AAEQgA8AFeAwEiAAIRAQMRAf/dAAQAFv/EAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkK CwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEF QVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKz hMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5/cRAAICAQIEBAME BQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcm NcLSRJNUoxdkRVU2dGXi8rOEw9N14/NGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dXZ3eH l6e3x//aAAwDAQACEQMRAD8A7bYFKAkkSAiigs5u5pbxPgsXLYytxG6VrvG9hBJY3ueNFzuSaxY5 tR36Fw/eLWfSe2tvvf8A+fFl/EIkygBH1fv8X/qNt8pqSb08v+6Q2WMAOvCgMq6v+be5p7wS1V3Z DCSBrGh00lDdZx+VVowIrcF0aBFbti7NybG7bLXOb4ElV2NN7y3dta0SXf8AfPzvzEGxxI+78idh aaN1d4bbWDupLfpH97fu/wCt+p/o1OISlrfr/rLZERG1Rv8ARDp2lux0z6RgAxLdoP0fas9zy93i OCeJktb6ntRLXSweEaQZ/t/nsQnktdPZ/wBIa/5vv/8ARajhGkg0EkwWhokyBPxPt9yiXPbuEQ4a OB51/eYovJAYeTE/eVVyMrbVO4usbMg66H+X/OP+knxiSxymALTt6rm4mSRTe4A+4Ncd9f7tn6F/ 8v8A4uxdV0frbc+arG7Mhokx9B4/er/cXn92ZvrFbQCJBPciPzmfuI+B1G7FvZfXBe3TaeCP3Vfg ZRA/50WjLhlf736M31BJc1jfW7GcIyKLKj+8yLWf+irv/AlsYvVunZZ20ZDXO/dMsd/23d6b1NY6 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 AIJJuOTEonpe7YPmNfD6P76PCVP/2Q==
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-badnames.msg0000644000000000000000000000142511702050534030266 0ustar rootrootFrom: Nathaniel Borenstein To: Ned Freed Subject: Sample message MIME-Version: 1.0 Content-type: multipart/mixed; boundary="simple boundary" This is the preamble. It is to be ignored, though it is a handy place for mail composers to include an explanatory note to non-MIME conformant readers. --simple boundary Content-type: text/plain; charset=us-ascii; name="/foo/bar" --simple boundary Content-type: text/plain; charset=us-ascii; name="foo bar" This is explicitly typed plain ASCII text. It DOES end with a linebreak. --simple boundary Content-type: text/plain; charset=us-ascii; name="foobar" This is explicitly typed plain ASCII text. It DOES end with a linebreak. --simple boundary-- This is the epilogue. It is also to be ignored. ././@LongLink0000000000000000000000000000015600000000000011567 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/2002_06_12_doublebound_decoded_1_3.txtapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/2002_06_12_doublebound_decode0000644000000000000000000002531511702050534031662 0ustar rootrootThe Mutt E-Mail Client

The Mutt E-Mail Client

"All mail clients suck. This one just sucks less." -me, circa 1995

mirrors


Latest News

Mutt 1.3.28 was released on March 13, 2002. This is a release candidate for 1.4.

Mutt 1.2.5.1 and 1.3.25 were released on January 1, 2002. These releases both fix a security hole which can be remotely exploited. For more information, see the release announcement.

Mutt 1.3.24 was released on November 30, 2001. This is a beta development release toward the next stable public release version. There have been several large changes since 1.2.x, so please check the recent changes page.

The Mutt CVS server has moved from ftp.guug.de to ftp.mutt.org.

more news


General Info

Mutt is a small but very powerful text-based mail client for Unix operating systems. The latest public release version is 1.3.28, which is a release candidate for 1.4. The current stable public release version is 1.2.5.1. For more information, see the following:

[Mutt Mail Agent Button]


Features

Some of Mutt's features include:

  • color support
  • message threading
  • MIME support (including RFC2047 support for encoded headers)
  • PGP/MIME (RFC2015)
  • various features to support mailing lists, including list-reply
  • active development community
  • POP3 support
  • IMAP support
  • full control of message headers when composing
  • support for multiple mailbox formats (mbox, MMDF, MH, maildir)
  • highly customizable, including keybindings and macros
  • change configuration automatically based on recipients, current folder, etc.
  • searches using regular expressions, including an internal pattern matching language
  • Delivery Status Notification (DSN) support
  • postpone message composition indefinetly for later recall
  • easily include attachments when composing, even from the command line
  • ability to specify alternate addresses for recognition of mail forwarded from other accounts, with ability to set the From: headers on replies/etc. accordingly
  • multiple message tagging
  • reply to or forward multiple messages at once
  • .mailrc style configuration files
  • easy to install (uses GNU autoconf)
  • compiles against either curses/ncurses or S-lang
  • translation into at least 20 languages
  • small and efficient
  • It's free! (no cost and GPL'ed)

Screenshots demonstrating some of Mutt's capabilities are available.

Though written from scratch, Mutt's initial interface was based largely on the ELM mail client. To a large extent, Mutt is still very ELM-like in presentation of information in menus (and in fact, ELM users will find it quite painless to switch as the default key bindings are identical). As development progressed, features found in other popular clients such as PINE and MUSH have been added, the result being a hybrid, or "mutt." At present, it most closely resembles the SLRN news client. Mutt was originally written by Michael Elkins but is now developed and maintained by the members of the Mutt development mailing list.

top


Mutt User Discussion

top


Press About Mutt

top


Last updated on March 13, 2002 by Jeremy Blosser.
URL:<http://www.mutt.org/index.html>
Copyright © 1996-9 Michael R. Elkins. All rights reserved.
Copyright © 1999-2002 Jeremy Blosser. All rights reserved.
GBNet/NetTek
hosted by
GBNet/NetTek
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/empty-preamble_decoded.xml0000644000000000000000000000141411702050534031766 0ustar rootroot
Content-Type: multipart/mixed; boundary="t0UkRYy7tHLRMCai" Content-Disposition: inline
Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable
Content-Type: image/png Content-Disposition: attachment; filename="dot.png" Content-Transfer-Encoding: base64
././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-weirdspace_decoded_1_1.txtapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-weirdspace_decoded_1_1.0000644000000000000000000000066211702050534032244 0ustar rootrootWhen unpacked, this message should produce two GIF files: * The 1st should be called "3d-compress.gif" * The 2nd should be called "3d-eye.gif" There is an empty preamble, and linear space after the bounds. -- ____ __ / __/__________/_/ Eryq (eryq@rhine.gsfc.nasa.gov) / __/ _/ / / , / Hughes STX Corporation, NASA/Goddard /___/_/ \ /\ /___ /_/ /_____/ http://selsvr.stx.com/~eryq/ ././@LongLink0000000000000000000000000000015600000000000011567 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/2002_06_12_doublebound_decoded_1_2.txtapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/2002_06_12_doublebound_decode0000644000000000000000000000000011702050534031642 0ustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/sig-uu.msg0000644000000000000000000000166311702050534026601 0ustar rootrootContent-type: text/plain Subject: Here's my UU'ed sig! Well, I don't know much about how these things are output, so here goes... first off, my .sig file: begin 644 .signature M("!?7U\@(%\@7R!?("`@7R`@7U]?(%\@("!%2\*("`@("`@("`@("!\7U]?+R`@("!\ M7U]?7U]?+R!O9B!T:&4@:&]M96QE+Z3Q4C@U3S$I@0XC#J?UFD2]3I.JU5O#+R4CLD4,;IK7I>%[EX[+M\, +C/A\<0=Y^J4)`#L` end Done! ././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/double-semicolon2_decoded_1_2.txtapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/double-semicolon2_decoded_1_20000644000000000000000000000001711702050534032225 0ustar rootrootThe worse part apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/infinite.msg0000644000000000000000000001255711702050534027201 0ustar rootrootContent-Type: TEXT/PLAIN; name=109f53c446c8882f4318316ecf4480ce Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: UmV0dXJuLVBhdGg6IDxvd25lci1jYWNvbXAtbEBsaW5mLnVuYi5icj4NClJl Y2VpdmVkOiBmcm9tIGVpZmZlbC5iYXNlLmNvbS5iciBieSBtYWlsYnIxLm1h aWxici5jb20uYnIgOyBUaHUsIDA1IE5vdiAxOTk4IDIyOjU4OjIzICswMDAN ClJlY2VpdmVkOiBmcm9tIG1hcmNvbmkuYmFzZS5jb20uYnIgKFsyMDAuMjQw LjEwLjU1XSkgYnkgZWlmZmVsLmJhc2UuY29tLmJyDQogICAgICAgICAgKE5l dHNjYXBlIE1haWwgU2VydmVyIHYyLjApIHdpdGggRVNNVFAgaWQgQURINDkx DQogICAgICAgICAgZm9yIDxhY2VjaWxpYUBtYWlsYnIuY29tLmJyPjsgVGh1 LCA1IE5vdiAxOTk4IDIxOjU1OjI0IC0wMjAwDQpSZWNlaXZlZDogZnJvbSBr ZXBsZXIuYmFzZS5jb20uYnIgKFsyMDAuMjQwLjEwLjEwNF0pIGJ5IG1hcmNv bmkuYmFzZS5jb20uYnINCiAgICAgICAgICAoTmV0c2NhcGUgTWFpbCBTZXJ2 ZXIgdjIuMCkgd2l0aCBFU01UUCBpZCBBQUU2ODY7DQogICAgICAgICAgV2Vk LCA0IE5vdiAxOTk4IDE0OjAwOjEwIC0wMjAwDQpSZWNlaXZlZDogZnJvbSBj eXJpdXMubGluZi51bmIuYnIgKFsxNjQuNDEuMTIuNF0pIGJ5IGtlcGxlci5i YXNlLmNvbS5icg0KICAgICAgICAgIChQb3N0Lk9mZmljZSBNVEEgdjMuNSBy ZWxlYXNlIDIxNSBJRCMgMC0wVTEwTDJTMTAwKSB3aXRoIFNNVFANCiAgICAg ICAgICBpZCBicjsgV2VkLCA0IE5vdiAxOTk4IDEzOjUzOjQ3IC0wMjAwDQpS ZWNlaXZlZDogZnJvbSBzZW5kbWFpbCBieSBjeXJpdXMubGluZi51bmIuYnIg d2l0aCBlc210cA0KCWlkIDB6YjVJOS0wMDAzb00tMDA7IFdlZCwgNCBOb3Yg MTk5OCAxMzo1NjoxNyAtMDIwMA0KUmVjZWl2ZWQ6IGZyb20gbG9jYWxob3N0 IChtYWpvcmRvbUBsb2NhbGhvc3QpDQoJYnkgY3lyaXVzLmxpbmYudW5iLmJy ICg4LjguNy84LjguNykgd2l0aCBTTVRQIGlkIE5BQTE0NjM5Ow0KCVdlZCwg NCBOb3YgMTk5OCAxMzo1NDo1NCAtMDIwMCAoRURUKQ0KUmVjZWl2ZWQ6IGJ5 IGxpbmYudW5iLmJyIChidWxrX21haWxlciB2MS42KTsgV2VkLCA0IE5vdiAx OTk4IDEzOjU0OjU0IC0wMjAwDQpSZWNlaXZlZDogKGZyb20gbWFqb3Jkb21A bG9jYWxob3N0KQ0KCWJ5IGN5cml1cy5saW5mLnVuYi5iciAoOC44LjcvOC44 LjcpIGlkIE5BQTE0NjMwDQoJZm9yIGNhY29tcC1sLW91dHRlcjsgV2VkLCA0 IE5vdiAxOTk4IDEzOjU0OjUzIC0wMjAwIChFRFQpDQpSZWNlaXZlZDogKGZy b20gc2VuZG1haWxAbG9jYWxob3N0KQ0KCWJ5IGN5cml1cy5saW5mLnVuYi5i ciAoOC44LjcvOC44LjcpIGlkIE5BQTE0NjIzDQoJZm9yIGNhY29tcC1sQGxp bmYudW5iLmJyOyBXZWQsIDQgTm92IDE5OTggMTM6NTQ6NTAgLTAyMDAgKEVE VCkNClJlY2VpdmVkOiBmcm9tIGJyYXNpbGlhLm1wZGZ0Lmdvdi5iciBbMjAw LjI1Mi44NS4yXSANCglieSBjeXJpdXMubGluZi51bmIuYnIgd2l0aCBlc210 cA0KCWlkIDB6YjVGei0wMDAzbEYtMDA7IFdlZCwgNCBOb3YgMTk5OCAxMzo1 NDoyOCAtMDIwMA0KUmVjZWl2ZWQ6IGZyb20gbG9jYWxob3N0IChsYmVja2Vy QGxvY2FsaG9zdCkNCglieSBicmFzaWxpYS5tcGRmdC5nb3YuYnIgKDguOC41 LzguOC44KSB3aXRoIEVTTVRQIGlkIE5BQTAyNTcxDQoJZm9yIDxjYWNvbXAt bEBsaW5mLnVuYi5icj47IFdlZCwgNCBOb3YgMTk5OCAxMzozNjoxNCAtMDIw MCAoRURUKQ0KCShlbnZlbG9wZS1mcm9tIGxiZWNrZXJAYnJhc2lsaWEubXBk ZnQuZ292LmJyKQ0KRGF0ZTogV2VkLCA0IE5vdiAxOTk4IDEzOjM2OjE0IC0w MjAwIChFRFQpDQpGcm9tOiBMdWxhIEJlY2tlciA8bGJlY2tlckBicmFzaWxp YS5tcGRmdC5nb3YuYnI+DQpUbzogY2Fjb21wLWxAbGluZi51bmIuYnINClN1 YmplY3Q6IFtjYWNvbXAtbF0gPT8/UT9SZT0zQV89NUJjYWNvbXAtbD01RF9F X249M0FfQnJhcz1FRGxpYV9jb2JyZT89DQpJbi1SZXBseS1UbzogPFBpbmUu U1VOLjMuOTEuOTgxMTAzMjM1OTQzLjIyNDFFLTEwMDAwMEBhbnRhcmVzLmxp bmYudW5iLmJyPg0KTWVzc2FnZS1JRDogPFBpbmUuQlNGLjMuOTYuOTgxMTA0 MTMzNTQ3LjI1MzJCLTEwMDAwMEBicmFzaWxpYS5tcGRmdC5nb3YuYnI+DQpN SU1FLVZlcnNpb246IDEuMA0KQ29udGVudC1UeXBlOiBURVhUL1BMQUlOOyBj aGFyc2V0PQ0KWC1NSU1FLUF1dG9jb252ZXJ0ZWQ6IGZyb20gOGJpdCB0byBx dW90ZWQtcHJpbnRhYmxlIGJ5IGJyYXNpbGlhLm1wZGZ0Lmdvdi5iciBpZCBO QUEwMjU3MQ0KQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdA0KWC1N SU1FLUF1dG9jb252ZXJ0ZWQ6IGZyb20gcXVvdGVkLXByaW50YWJsZSB0byA4 Yml0IGJ5IGN5cml1cy5saW5mLnVuYi5iciBpZCBOQUIxNDYyMw0KU2VuZGVy OiBvd25lci1jYWNvbXAtbEBsaW5mLnVuYi5icg0KUmVwbHktVG86IGNhY29t cC1sQGxpbmYudW5iLmJyDQpQcmVjZWRlbmNlOiBidWxrDQpYLVJjcHQtVG86 IDxhY2VjaWxpYUBtYWlsYnIuY29tLmJyDQpYLURQT1A6IERQT1AgVmVyc2lv biAyLjNkDQpYLVVJREw6IDkxMDM4NjgxNi4wMDQNClN0YXR1czogUk8NCg0K DQoNCglDb21vIGFzc2ltLCBkYWggdW0gZXhlbXBsby4gRGVpeGFuZG8gYSBj b250YSBhYmVydGEsIG5laCwgRnJlZC4uLg0KDQoJDQoNCk9uIFdlZCwgNCBO b3YgMTk5OCwgRnJlZGVyaWNvIE5hcmRvdHRvIHdyb3RlOg0KDQo+IFBvcnF1 ZSBldSBzb3UgZWggZm9kYS4uLi4gDQo+IFByZWdvIGVoIG8gY2FyYWxobywg VmMgbmFvIG1lIGNvbmhlY2UgcGFyYSBmaWNhciBmYWxhbmRvIGFzc2ltLi4u IE5hbyANCj4gc2FiZSBkZSBvbmRlIGV1IHZpbSwgcXVlbSBzb3UsIG91IHNl amEsIFBPUlJBIE5FTkhVTUEuLi4NCj4gDQo+IFZBSSBUT01BUiBOTyBDVSBF IE1FIERFSVhBIEVNIFBBWiEhISEhISENCj4gDQo+IE9uIFR1ZSwgMyBOb3Yg MTk5OCwgR3VpbGhlcm1lIE9saXZpZXJpIENhaXhldGEgQm9yZ2VzIHdyb3Rl Og0KPiANCj4gPiBT82NyYXRlcywNCj4gPiANCj4gPiAgICAgcG9ycXVlIHZv Y+ogZmF6IHRhbnRhIHF1ZXN0428gZGUgc2UgaW5kaXNwb3IgY29tIFRPRE8g TVVORE8hISEgSuEgbuNvIGJhc3Rhc3NlDQo+ID4gbWVpYSBjb21wdXRh5+Nv IHRlIGFjaGFyIHVtIHByZWdvLCB2b2PqIHJlc29sdmUgYW1wbGlhciBlc3Rl IHVuaXZlcnNvIHBhcmEgb3V0cmFzDQo+ID4gcGVzc29hcy4uLiBNYW7pIQ0K PiA+IA0KPiA+IFNvY3JhdGVzIEFyYW50ZXMgVGVpeGVpcmEgRmlsaG8gKDk3 LzE4NDQzKSB3cm90ZToNCj4gPiANCj4gPiA+ICAgICAgVm9j6iB0ZW0gcXVl IHZlciBxdWUgcGFjaepuY2lhIHRlbSBsaW1pdGUuIEV1IGFn/GVudGVpIG8g beF4aW1vDQo+ID4gPiBwb3Nz7XZlbCBlbGUgZmljYXIgZXNjcmV2ZW5kbyBl c3NhcyBidXJyaWNlcyBuYSBub3NzYSBzYWxhIGRlIGRpc2N1cnPjby4NCj4g PiA+IENvbSBnZW50ZSBpZ25vcmFudGUgY29tbyBlbGUsIHF1ZSB1bSByb3Jp emlzdGEgY2VnbywgbvNzIHPzIGNvbnNlZ3VpbW9zDQo+ID4gDQo+ID4gICAg IEVtIHNlIGZhbGFuZG8gZGUgaWdub3LibmNpYTog6SBiZW0gdmVyZGFkZSBx dWUgb3MgbWFpbHMgZGEgY2Fjb21wIGVzdONvIGF0aW5naW5kbw0KPiA+IHBy b3Bvcuf1ZXMgZGFudGVzY2FzLCBtYXMgbyBjZXJ0byDpIERJU0NVU1PDTy4N Cj4gPiANCj4gPiBTZW0gbWFpcywNCj4gPiANCj4gPiAtLQ0KPiA+IEd1aWxo ZXJtZSBPbGl2aWVyaSBDYWl4ZXRhIEJvcmdlcw0KPiA+ICoqKioqKioqKioq KioqKioqKioqKioqKioqDQo+ID4gV2ViIERlc2lnbiAtIFZpYSBJbnRlcm5l dA0KPiA+ICgwNjEpIDMxNS05NjU3IC8gOTY0LTkxOTkNCj4gPiBndWlib3Jn ZXNAYnJhc2lsaWEuY29tLmJyDQo+ID4gZ3VpYm9yZ2VzQHZpYS1uZXQuY29t LmJyDQo+ID4gKioqKioqKioqKioqKioqKioqKioqKioqKioNCj4gPiANCj4g PiANCj4gPiANCj4gPiANCj4gPiANCj4gDQo+IA0KDQoNCg== apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/badbound.xml0000644000000000000000000001515011702050534027154 0ustar rootroot
Received: from uriela.in-berlin.de by anna.in-berlin.de via SMTP (940816.SGI.8.6.9/940406.SGI) for <k@anna.in-berlin.de> id AAA04436; Mon, 23 Dec 1996 00:08:02 +0100 Resent-From: koenig@franz.ww.TU-Berlin.DE Received: by uriela.in-berlin.de (/\oo/\ Smail3.1.29.1 #29.8) id <m0vbx0j-000LsbC@uriela.in-berlin.de>; Mon, 23 Dec 96 00:08 MET Received: by methan.chemie.fu-berlin.de (Smail3.1.29.1) from franz.ww.TU-Berlin.DE (130.149.200.51) with smtp id <m0vbwzX-0009vcC>; Mon, 23 Dec 96 00:07 MET Received: (from koenig@localhost) by franz.ww.TU-Berlin.DE (8.7.3/8.7.3) id XAA01761 for k@anna.in-berlin.de; Sun, 22 Dec 1996 23:25:10 +0100 (CET) Resent-Date: Sun, 22 Dec 1996 23:25:10 +0100 (CET) Resent-Message-Id: <199612222225.XAA01761@franz.ww.TU-Berlin.DE> Resent-To: k Received: from mailgzrz.TU-Berlin.DE (mailgzrz.TU-Berlin.DE [130.149.4.10]) by franz.ww.TU-Berlin.DE (8.7.3/8.7.3) with ESMTP id XAA01754 for <koenig@franz.ww.TU-Berlin.DE>; Sun, 22 Dec 1996 23:24:32 +0100 (CET) Received: from challenge.uscom.com (actually mail.uscom.com) by mailgzrz.TU-Berlin.DE with SMTP (PP); Sun, 22 Dec 1996 23:19:35 +0100 To: koenig@franz.ww.tu-berlin.de From: Mail Administrator <Postmaster@challenge.uscom.com> Reply-To: Mail Administrator <Postmaster@challenge.uscom.com> Subject: Mail System Error - Returned Mail Date: Sun, 22 Dec 1996 17:21:12 -0500 Message-ID: <19961222222112.AAE16235@challenge.uscom.com> MIME-Version: 1.0 Content-Type: multipart/mixed; Boundary="===========================_ _= 2283630(16235)" Content-Transfer-Encoding: 7BIT X-Filter: mailagent [version 3.0 PL44] for koenig@franz.ww.tu-berlin.de X-Filter: mailagent [version 3.0 PL44] for k@.in-berlin.de
--===========================_ _= 2283630(16235) Content-type: text/plain; charset="us-ascii" This Message was undeliverable due to the following reason: The Program-Deliver module couldn't deliver the message to one or more of the intended recipients because their delivery program(s) failed. The following error messages provide the details about each failure: The delivery program "/pages/pnet/admin/mail_proc.pl" produced the following output while delivering the message to pnet@uscom.com Can't exec "/usr/sbin/sendmail -t": No such file or directory at /pages/pnet/admin/mail_proc.pl line 96, <> line 93. Broken pipe The program "/pages/pnet/admin/mail_proc.pl" exited with an unknown value of 141 while delivering the message to pnet@uscom.com The message was not delivered to: pnet@uscom.com Please reply to Postmaster@challenge.uscom.com if you feel this message to be in error. --===========================_ _= 2283630(16235) Content-type: message/rfc822 Content-Disposition: attachment Date: Sun, 22 Dec 1996 22:24:21 +0000 Message-ID: <"mailgzrz.T.061:22.12.96.22.24.21"@TU-Berlin.DE> Received: from franz.ww.TU-Berlin.DE ([130.149.200.51]) by challenge.uscom.com (Netscape Mail Server v2.02) with ESMTP id AAA685 for <pnet@uscom.com>; Wed, 18 Dec 1996 16:58:30 -0500 Received: from mailgzrz.TU-Berlin.DE (mailgzrz.TU-Berlin.DE [130.149.4.10]) by franz.ww.TU-Berlin.DE (8.7.3/8.7.3) with ESMTP id SAA23400 for <msqlperl@franz.ww.tu-berlin.de>; Wed, 18 Dec 1996 18:59:21 +0100 (CET) Received: from anna.in-berlin.de by mailgzrz.TU-Berlin.DE with SMTP (PP); Wed, 18 Dec 1996 18:59:11 +0100 Received: by anna.in-berlin.de (940816.SGI.8.6.9/940406.SGI) id SAA19491; Wed, 18 Dec 1996 18:55:21 +0100 Date: Wed, 18 Dec 1996 18:55:21 +0100 Message-Id: <199612181755.SAA19491@anna.in-berlin.de> From: Andreas Koenig <k@anna.in-berlin.de> To: michelle@eugene.net CC: msqlperl@franz.ww.tu-berlin.de In-reply-to: <v03007800aeddccd448d0@[206.100.174.203]> (message from Michelle Brownsworth on Wed, 18 Dec 1996 09:32:02 -0700) Subject: HOWTO (Was: unsubscribe) >>>>> On Wed, 18 Dec 1996 09:32:02 -0700, >>>>> Michelle Brownsworth >>>>> who can be reached at: michelle@eugene.net >>>>> (whose comments are cited below with " michelle> "), >>>>> sent the cited message concerning the subject of "unsubscribe" >>>>> twice to the whole list of subscribers michelle> unsubscribe michelle> ************************************************************ michelle> Michelle Brownsworth michelle> System Administrator michelle> Internet Marketing Services michelle@eugene.net michelle> 2300 Oakmont Way, #209 541-431-3374 michelle> Eugene, OR 97402 FAX 431-7345 michelle> ************************************************************ Welcome new subscriber! You've joined the mailing list of unsubscribers' collected wisdom of unsubscribe messages. Relax! You won't have to subscribe to any mailing list for the rest of your life. Better yet, you can't even unsubscribe! So just lean back and enjoy to watch your IO stream of millions of unsubscribe messages daily. Isn't that far more than everything you ever dared to dream of? andreas P.S. This was posted 12 days ago: Date: Fri, 6 Dec 1996 15:47:51 +0100 To: msqlperl@franz.ww.tu-berlin.de Subject: How To Unsubscribe (semi-regular posting) To get off this list, send mail to -------------------- majordomo@franz.ww.tu-berlin.de with the following words in the body of the message (subject line will be ignored): unsubscribe msqlperl <_insert_your_subscription_address_here_> To find out who you are subscribed as, send mail to ------------------------------------- majordomo@franz.ww.tu-berlin.de with only nothing but who msqlperl in the body of the message: If you encounter problems, ------------------------- please try sending the message "help" to majordomo@franz.ww.tu-berlin.de. Hope that help, andreas NOTE: if the above recipe does not work for you, ask me for assistance and do not spam the list with the request. Thank you! --===========================_ _= 2283630(16235)--
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/bluedot-simple.xml0000644000000000000000000001403511702050534030324 0ustar rootroot
Content-Type: image/jpeg; name="bluedot.jpg" Content-Disposition: inline; filename="bluedot.jpg" Content-Transfer-Encoding: base64 Content-Id: my-graphic
/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsL DBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/ 2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAEAAQADASIAAhEBAxEB/8QA HwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUF BAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkK FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1 dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXG x8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEB AQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAEC AxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRom JygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU 1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iiigAoo ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKjnnhtbeW4uJY4YIkLySSMF VFAySSeAAOc0ASUVw+p/E3TY1MeiW0uqzgkb8NBbjB6+ay/MCM4MauDgZIBB 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 KOGCJAkccahVRQMAADgADjFeFjM2veFD7/8AL/M+qy7h+zVXFf8AgP8An/l/ wxDp2nWmk6fDY2MCw20IwiAk9Tkkk8kkkkk5JJJJJNWqKK8I+r2CiiigAooo oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDlNY+H2iarcPdQef pd1I5eWawKp5pJJJZGVkLEnJfbvOAN2OK5O88AeJ7PJt5dN1ONV3kqXtZCf7 iod6k8cEyKCTg4AyfV6K6aOLr0dIS0OLEZdhcRrVgm++z+9HiU2j+IrWJprr wzqccK/edDDORngfJFI7nn0U46nABNVP9L/6A2uf+Ce6/wDjde8UV2RzjELd J/L/AIJ5suHMG3o5L5r9UeEJHfzSLHFomttI5CoraZPGCT0BZ0Cr9WIA7kCt GHwx4ruZViXw7JbFv+Wt3dwLEvf5jG7t7DCnkjOBkj2ailLN8Q9rL5f5lQ4d wcd7v1f+SR5xYfDK7lkR9Z1lTCQGe2sITGc8ZQzMxJXGRlVRjwQV6V2ukeH9 I0GN00rTra0MgUSvHGA8u3ODI/3nPJ5Yk5JOeTWlRXBVr1KrvUdz1aGFo4dW pRSCiiisjoCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA//Z
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-igor.msg0000644000000000000000000002502211702050534027453 0ustar rootrootDate: Thu, 6 Jun 1996 15:50:39 +0400 (MOW DST) From: Starovoitov Igor To: eryq@rhine.gsfc.nasa.gov Subject: Need help MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="-490585488-806670346-834061839=:2195" This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. Send mail to mime@docserver.cac.washington.edu for more info. ---490585488-806670346-834061839=:2195 Content-Type: TEXT/PLAIN; charset=US-ASCII Dear Sir, I have a problem with Your MIME-Parser-1.9 and multipart-nested messages. Not all parts are parsed. Here my Makefile, Your own multipart-nested.msg and its out after "make test". Some my messages not completely parsed too. Is this a bug? Thank You for help. Igor Starovoytov. ---490585488-806670346-834061839=:2195 Content-Type: TEXT/PLAIN; charset=US-ASCII; name=Makefile Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Makefile Iy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQ0KIyBNYWtlZmlsZSBmb3IgTUlNRTo6DQojLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tDQoNCiMgV2hlcmUgdG8gaW5zdGFsbCB0aGUgbGlicmFy aWVzOg0KU0lURV9QRVJMID0gL3Vzci9saWIvcGVybDUNCg0KIyBXaGF0IFBl cmw1IGlzIGNhbGxlZCBvbiB5b3VyIHN5c3RlbSAobm8gbmVlZCB0byBnaXZl IGVudGlyZSBwYXRoKToNClBFUkw1ICAgICA9IHBlcmwNCg0KIyBZb3UgcHJv YmFibHkgd29uJ3QgbmVlZCB0byBjaGFuZ2UgdGhlc2UuLi4NCk1PRFMgICAg ICA9IERlY29kZXIucG0gRW50aXR5LnBtIEhlYWQucG0gUGFyc2VyLnBtIEJh c2U2NC5wbSBRdW90ZWRQcmludC5wbQ0KU0hFTEwgICAgID0gL2Jpbi9zaA0K DQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tDQojIEZvciBpbnN0YWxsZXJzLi4uDQojLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tDQoNCmhlbHA6CQ0KCUBlY2hvICJWYWxpZCB0YXJnZXRz OiB0ZXN0IGNsZWFuIGluc3RhbGwiDQoNCmNsZWFuOg0KCXJtIC1mIHRlc3Rv dXQvKg0KDQp0ZXN0Og0KIwlAZWNobyAiVEVTVElORyBIZWFkLnBtLi4uIg0K Iwkke1BFUkw1fSBNSU1FL0hlYWQucG0gICA8IHRlc3Rpbi9maXJzdC5oZHIg ICAgICAgPiB0ZXN0b3V0L0hlYWQub3V0DQojCUBlY2hvICJURVNUSU5HIERl Y29kZXIucG0uLi4iDQojCSR7UEVSTDV9IE1JTUUvRGVjb2Rlci5wbSA8IHRl c3Rpbi9xdW90LXByaW50LmJvZHkgPiB0ZXN0b3V0L0RlY29kZXIub3V0DQoj CUBlY2hvICJURVNUSU5HIFBhcnNlci5wbSAoc2ltcGxlKS4uLiINCiMJJHtQ RVJMNX0gTUlNRS9QYXJzZXIucG0gPCB0ZXN0aW4vc2ltcGxlLm1zZyAgICAg ID4gdGVzdG91dC9QYXJzZXIucy5vdXQNCiMJQGVjaG8gIlRFU1RJTkcgUGFy c2VyLnBtIChtdWx0aXBhcnQpLi4uIg0KIwkke1BFUkw1fSBNSU1FL1BhcnNl ci5wbSA8IHRlc3Rpbi9tdWx0aS0yZ2lmcy5tc2cgPiB0ZXN0b3V0L1BhcnNl ci5tLm91dA0KCUBlY2hvICJURVNUSU5HIFBhcnNlci5wbSAobXVsdGlfbmVz dGVkLm1zZykuLi4iDQoJJHtQRVJMNX0gTUlNRS9QYXJzZXIucG0gPCB0ZXN0 aW4vbXVsdGktbmVzdGVkLm1zZyA+IHRlc3RvdXQvUGFyc2VyLm4ub3V0DQoJ QGVjaG8gIkFsbCB0ZXN0cyBwYXNzZWQuLi4gc2VlIC4vdGVzdG91dC9NT0RV TEUqLm91dCBmb3Igb3V0cHV0Ig0KDQppbnN0YWxsOg0KCUBpZiBbICEgLWQg JHtTSVRFX1BFUkx9IF07IHRoZW4gXA0KCSAgICBlY2hvICJQbGVhc2UgZWRp dCB0aGUgU0lURV9QRVJMIGluIHlvdXIgTWFrZWZpbGUiOyBleGl0IC0xOyBc DQogICAgICAgIGZpICAgICAgICAgIA0KCUBpZiBbICEgLXcgJHtTSVRFX1BF Ukx9IF07IHRoZW4gXA0KCSAgICBlY2hvICJObyBwZXJtaXNzaW9uLi4uIHNo b3VsZCB5b3UgYmUgcm9vdD8iOyBleGl0IC0xOyBcDQogICAgICAgIGZpICAg ICAgICAgIA0KCUBpZiBbICEgLWQgJHtTSVRFX1BFUkx9L01JTUUgXTsgdGhl biBcDQoJICAgIG1rZGlyICR7U0lURV9QRVJMfS9NSU1FOyBcDQogICAgICAg IGZpDQoJaW5zdGFsbCAtbSAwNjQ0IE1JTUUvKi5wbSAke1NJVEVfUEVSTH0v TUlNRQ0KDQoNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgRm9yIGRldmVsb3BlciBv bmx5Li4uDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNClBPRDJIVE1MX0ZMQUdTID0g LS1wb2RwYXRoPS4gLS1mbHVzaCAtLWh0bWxyb290PS4uDQpIVE1MUyAgICAg ICAgICA9ICR7TU9EUzoucG09Lmh0bWx9DQpWUEFUSCAgICAgICAgICA9IE1J TUUNCg0KLlNVRkZJWEVTOiAucG0gLnBvZCAuaHRtbA0KDQojIHYuMS44IGdl bmVyYXRlZCAzMCBBcHIgOTYNCiMgdi4xLjkgaXMgb25seSBiZWNhdXNlIDEu OCBmYWlsZWQgQ1BBTiBpbmdlc3Rpb24NCmRpc3Q6IGRvY3VtZW50ZWQJDQoJ VkVSU0lPTj0xLjkgOyBcDQoJbWtkaXN0IC10Z3ogTUlNRS1wYXJzZXItJCRW RVJTSU9OIDsgXA0KCWNwIE1LRElTVC9NSU1FLXBhcnNlci0kJFZFUlNJT04u dGd6ICR7SE9NRX0vcHVibGljX2h0bWwvY3Bhbg0KCQ0KZG9jdW1lbnRlZDog JHtIVE1MU30gJHtNT0RTfQ0KDQoucG0uaHRtbDoNCglwb2QyaHRtbCAke1BP RDJIVE1MX0ZMQUdTfSBcDQoJCS0tdGl0bGU9TUlNRTo6JCogXA0KCQktLWlu ZmlsZT0kPCBcDQoJCS0tb3V0ZmlsZT1kb2NzLyQqLmh0bWwNCg0KIy0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQ0K ---490585488-806670346-834061839=:2195 Content-Type: TEXT/PLAIN; charset=US-ASCII; name="multi-nested.msg" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: test message TUlNRS1WZXJzaW9uOiAxLjANCkZyb206IExvcmQgSm9obiBXaG9yZmluIDx3 aG9yZmluQHlveW9keW5lLmNvbT4NClRvOiA8am9obi15YXlhQHlveW9keW5l LmNvbT4NClN1YmplY3Q6IEEgY29tcGxleCBuZXN0ZWQgbXVsdGlwYXJ0IGV4 YW1wbGUNCkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOw0KICAgICBi b3VuZGFyeT11bmlxdWUtYm91bmRhcnktMQ0KDQpUaGUgcHJlYW1ibGUgb2Yg dGhlIG91dGVyIG11bHRpcGFydCBtZXNzYWdlLg0KTWFpbCByZWFkZXJzIHRo YXQgdW5kZXJzdGFuZCBtdWx0aXBhcnQgZm9ybWF0DQpzaG91bGQgaWdub3Jl IHRoaXMgcHJlYW1ibGUuDQpJZiB5b3UgYXJlIHJlYWRpbmcgdGhpcyB0ZXh0 LCB5b3UgbWlnaHQgd2FudCB0bw0KY29uc2lkZXIgY2hhbmdpbmcgdG8gYSBt YWlsIHJlYWRlciB0aGF0IHVuZGVyc3RhbmRzDQpob3cgdG8gcHJvcGVybHkg ZGlzcGxheSBtdWx0aXBhcnQgbWVzc2FnZXMuDQotLXVuaXF1ZS1ib3VuZGFy eS0xDQoNClBhcnQgMSBvZiB0aGUgb3V0ZXIgbWVzc2FnZS4NCltOb3RlIHRo YXQgdGhlIHByZWNlZGluZyBibGFuayBsaW5lIG1lYW5zDQpubyBoZWFkZXIg ZmllbGRzIHdlcmUgZ2l2ZW4gYW5kIHRoaXMgaXMgdGV4dCwNCndpdGggY2hh cnNldCBVUyBBU0NJSS4gIEl0IGNvdWxkIGhhdmUgYmVlbg0KZG9uZSB3aXRo IGV4cGxpY2l0IHR5cGluZyBhcyBpbiB0aGUgbmV4dCBwYXJ0Ll0NCg0KLS11 bmlxdWUtYm91bmRhcnktMQ0KQ29udGVudC10eXBlOiB0ZXh0L3BsYWluOyBj aGFyc2V0PVVTLUFTQ0lJDQoNClBhcnQgMiBvZiB0aGUgb3V0ZXIgbWVzc2Fn ZS4NClRoaXMgY291bGQgaGF2ZSBiZWVuIHBhcnQgb2YgdGhlIHByZXZpb3Vz IHBhcnQsDQpidXQgaWxsdXN0cmF0ZXMgZXhwbGljaXQgdmVyc3VzIGltcGxp Y2l0DQp0eXBpbmcgb2YgYm9keSBwYXJ0cy4NCg0KLS11bmlxdWUtYm91bmRh cnktMQ0KU3ViamVjdDogUGFydCAzIG9mIHRoZSBvdXRlciBtZXNzYWdlIGlz IG11bHRpcGFydCENCkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L3BhcmFsbGVs Ow0KICAgICBib3VuZGFyeT11bmlxdWUtYm91bmRhcnktMg0KDQpBIG9uZS1s aW5lIHByZWFtYmxlIGZvciB0aGUgaW5uZXIgbXVsdGlwYXJ0IG1lc3NhZ2Uu DQotLXVuaXF1ZS1ib3VuZGFyeS0yDQpDb250ZW50LVR5cGU6IGltYWdlL2dp Zg0KQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0DQpDb250ZW50 LURpc3Bvc2l0aW9uOiBpbmxpbmU7IGZpbGVuYW1lPSIzZC1jb21wcmVzcy5n aWYiDQpTdWJqZWN0OiBQYXJ0IDEgb2YgdGhlIGlubmVyIG1lc3NhZ2UgaXMg YSBHSUYsICIzZC1jb21wcmVzcy5naWYiDQoNClIwbEdPRGRoS0FBb0FPTUFB QUFBQUFBQWdCNlEveTlQVDI1dWJuQ0FrS0JTTGI2K3Z1Zm41L1hlcy8rbEFQ LzZ6UUFBQUFBQQ0KQUFBQUFBQUFBQ3dBQUFBQUtBQW9BQUFFL2hESlNhdTll SkxNT3lZYmNveGthWjVvQ2tvSDZMNXdMTWZpV3FkNGJ0WmhteGJBDQpvRkNZ NDdFSXFNSmd5V3cyQVRqajdhUmtBcTVZd0RNbDlWR3RLTzBTaXVvaVRWbHNj c3h0OWM0SGdYeFVJQTBFQVZPVmZES1QNCjhIbDFCM2tEQVlZbGUyMDJYbkdH Z29NSGhZY2tpV1Z1UjMrT1RnQ0dlWlJzbG90d2dKMmxuWWlnZlpkVGpRVUxy N0FMQlpOMA0KcVR1cmpIZ0xLQXUwQjVXcW9wbTdKNzJldFFOOHQ4SWp1cnkr d010dnc4L0h2N1lsZnMwQnhDYkdxTW1LMHlPT1EwR1RDZ3JSDQoyYmh3Skds WEpRWUc2bU1Lb2VOb1dTYnpDV0lBQ2U1Snd4UW0zQWtEQWJVQVFDaVFoRFpF QmVCbDZhZmdDc09CckQ0NWVkSXYNClFjZUdXU01ldnBPWWhsNkNreWRCSGhC WlFtR0tqaWhWc2h5cGpCOUNsQUhaTVR1Z3pPVTdtemhCUGlTWjV1RE5uQTdi L2FUWg0KMG1oTW5mbDBwREJGYTZiVUVsU1BXYjBxdFl1SHJ4bHdjUjE3WXNX TXMyalRxbDNMRmtRRUFEcz0NCi0tdW5pcXVlLWJvdW5kYXJ5LTINCkNvbnRl bnQtVHlwZTogaW1hZ2UvZ2lmDQpDb250ZW50LVRyYW5zZmVyLUVuY29kaW5n OiBiYXNlNjQNCkNvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsgZmlsZW5h bWU9IjNkLWV5ZS5naWYiDQpTdWJqZWN0OiBQYXJ0IDIgb2YgdGhlIGlubmVy IG1lc3NhZ2UgaXMgYW5vdGhlciBHSUYsICIzZC1leWUuZ2lmIg0KDQpSMGxH T0RkaEtBQW9BUE1BQUFBQUFBQUF6TjN1Lzc2K3ZvaUlpRzV1YnN6ZDd2Ly8v K2ZuNXdBQUFBQUFBQUFBQUFBQUFBQUENCkFBQUFBQUFBQUN3QUFBQUFLQUFv QUFBRS9oREpTYXU5ZUpiTU95NGJNb3hrYVo1b0Nrb0Q2TDV3TE1maVduczQx b1p0N2xNNw0KVnVqbkM5NklSVnNQV1FFNG54UGprdm1zUW11OG9jL0tCVVNW V2s3WGVwR0dMZU5yeG94Sk8xTWpJTGp0aGcva1dYUTZ3Ty83DQorM2RDZVJS amZBS0hpSW1KQVYrRENGMEJpVzVWQW8xQ0VsYVJoNU5qbGtlWW1weVRncGNU QUtHaWFhU2Zwd0twVlFheFZhdEwNCnJVOEdhUWRPQkFRQUI3K3lYbGlYVHJn QXhzVzR2RmFidjhCT3RCc0J0N2NHdndDSVQ5bk95TkVJeHVDNHpycUt6YzlY Yk9ESg0KdnM3WTVld0gzZDdGeGUzakI0cmo4dDZQdU5hNnIyYmhLUVhOMTdG WUNCTXFUR2lCelNOaHg1ZzBuRU1obHNTSmppUll2RGp3DQpFMGNkR3hRL2dz d29zb0tVa211VTJGbkpjc1NLR1RCanlweEpzeWFJQ0FBNw0KLS11bmlxdWUt Ym91bmRhcnktMi0tDQoNClRoZSBlcGlsb2d1ZSBmb3IgdGhlIGlubmVyIG11 bHRpcGFydCBtZXNzYWdlLg0KDQotLXVuaXF1ZS1ib3VuZGFyeS0xDQpDb250 ZW50LXR5cGU6IHRleHQvcmljaHRleHQNCg0KVGhpcyBpcyA8Ym9sZD5wYXJ0 IDQgb2YgdGhlIG91dGVyIG1lc3NhZ2U8L2JvbGQ+DQo8c21hbGxlcj5hcyBk ZWZpbmVkIGluIFJGQzEzNDE8L3NtYWxsZXI+PG5sPg0KPG5sPg0KSXNuJ3Qg aXQgPGJpZ2dlcj48YmlnZ2VyPmNvb2w/PC9iaWdnZXI+PC9iaWdnZXI+DQoN Ci0tdW5pcXVlLWJvdW5kYXJ5LTENCkNvbnRlbnQtVHlwZTogbWVzc2FnZS9y ZmM4MjINCg0KRnJvbTogKG1haWxib3ggaW4gVVMtQVNDSUkpDQpUbzogKGFk ZHJlc3MgaW4gVVMtQVNDSUkpDQpTdWJqZWN0OiBQYXJ0IDUgb2YgdGhlIG91 dGVyIG1lc3NhZ2UgaXMgaXRzZWxmIGFuIFJGQzgyMiBtZXNzYWdlIQ0KQ29u dGVudC1UeXBlOiBUZXh0L3BsYWluOyBjaGFyc2V0PUlTTy04ODU5LTENCkNv bnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IFF1b3RlZC1wcmludGFibGUNCg0K UGFydCA1IG9mIHRoZSBvdXRlciBtZXNzYWdlIGlzIGl0c2VsZiBhbiBSRkM4 MjIgbWVzc2FnZSENCg0KLS11bmlxdWUtYm91bmRhcnktMS0tDQoNClRoZSBl cGlsb2d1ZSBmb3IgdGhlIG91dGVyIG1lc3NhZ2UuDQo= ---490585488-806670346-834061839=:2195 Content-Type: TEXT/PLAIN; charset=US-ASCII; name="Parser.n.out" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: out from parser KiBXYWl0aW5nIGZvciBhIE1JTUUgbWVzc2FnZSBmcm9tIFNURElOLi4uDQo9 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT0NCkNvbnRlbnQtdHlwZTogbXVsdGlwYXJ0L21peGVk DQpCb2R5LWZpbGU6IE5PTkUNClN1YmplY3Q6IEEgY29tcGxleCBuZXN0ZWQg bXVsdGlwYXJ0IGV4YW1wbGUNCk51bS1wYXJ0czogMw0KLS0NCiAgICBDb250 ZW50LXR5cGU6IHRleHQvcGxhaW4NCiAgICBCb2R5LWZpbGU6IC4vdGVzdG91 dC9tc2ctMzUzOC0xLmRvYw0KICAgIC0tDQogICAgQ29udGVudC10eXBlOiB0 ZXh0L3BsYWluDQogICAgQm9keS1maWxlOiAuL3Rlc3RvdXQvbXNnLTM1Mzgt Mi5kb2MNCiAgICAtLQ0KICAgIENvbnRlbnQtdHlwZTogbXVsdGlwYXJ0L3Bh cmFsbGVsDQogICAgQm9keS1maWxlOiBOT05FDQogICAgU3ViamVjdDogUGFy dCAzIG9mIHRoZSBvdXRlciBtZXNzYWdlIGlzIG11bHRpcGFydCENCiAgICBO dW0tcGFydHM6IDINCiAgICAtLQ0KICAgICAgICBDb250ZW50LXR5cGU6IGlt YWdlL2dpZg0KICAgICAgICBCb2R5LWZpbGU6IC4vdGVzdG91dC8zZC1jb21w cmVzcy5naWYNCiAgICAgICAgU3ViamVjdDogUGFydCAxIG9mIHRoZSBpbm5l ciBtZXNzYWdlIGlzIGEgR0lGLCAiM2QtY29tcHJlc3MuZ2lmIg0KICAgICAg ICAtLQ0KICAgICAgICBDb250ZW50LXR5cGU6IGltYWdlL2dpZg0KICAgICAg ICBCb2R5LWZpbGU6IC4vdGVzdG91dC8zZC1leWUuZ2lmDQogICAgICAgIFN1 YmplY3Q6IFBhcnQgMiBvZiB0aGUgaW5uZXIgbWVzc2FnZSBpcyBhbm90aGVy IEdJRiwgIjNkLWV5ZS5naWYiDQogICAgICAgIC0tDQo9PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT0NCg0K ---490585488-806670346-834061839=:2195-- apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/mp-msg-rfc822.out0000644000000000000000000001137211702050534027613 0ustar rootrootDate: Thu, 20 Jun 1996 08:35:17 +0200 From: Juergen Specht Organization: KULTURBOX X-Mailer: Mozilla 2.02 (WinNT; I) MIME-Version: 1.0 To: andreas.koenig@mind.de, kun@pop.combox.de, 101762.2307@compuserve.com Subject: [Fwd: Re: 34Mbit/s Netz] Content-Type: multipart/mixed; boundary="------------70522FC73543" X-Filter: mailagent [version 3.0 PL44] for k@.in-berlin.de This is a multi-part message in MIME format. --------------70522FC73543 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit -- Juergen Specht - KULTURBOX --------------70522FC73543 Content-Type: message/rfc822 Content-Transfer-Encoding: 7bit Content-Disposition: inline X-POP3-Rcpt: specht@trachea Return-Path: hermes Received: (from hermes@localhost) by kulturbox.netmbx.de (8.7.1/8.7.1) id SAA04513 for specht; Wed, 19 Jun 1996 18:30:12 +0200 Received: by netmbx.netmbx.de (/\==/\ Smail3.1.28.1) from mail.cs.tu-berlin.de with smtp id ; Wed, 19 Jun 96 18:12 MES Received: (from nobody@localhost) by mail.cs.tu-berlin.de (8.6.12/8.6.12) id SAA12413; Wed, 19 Jun 1996 18:26:28 +0200 Resent-Date: Wed, 19 Jun 1996 18:26:28 +0200 Resent-Message-Id: <199606191626.SAA12413@mail.cs.tu-berlin.de> Resent-From: nobody@cs.tu-berlin.de Resent-To: kultur@kulturbox.netmbx.de Received: from gatekeeper.telekom.de ([194.25.15.11]) by mail.cs.tu-berlin.de (8.6.12/8.6.12) with SMTP id SAA11678 for ; Wed, 19 Jun 1996 18:11:29 +0200 Received: from ULM02.mnh.telekom.de by gatekeeper.telekom.de; (5.65v3.0/1.1.8.2/02Aug95-0132PM) id AA01376; Wed, 19 Jun 1996 18:11:27 +0200 Received: from ulm02.mnh.telekom.de (deuschle@mnh.telekom.de) by ULM02.mnh.telekom.de (8.6.10/3) with SMTP id SAA30680 for ; Wed, 19 Jun 1996 18:14:40 GMT Message-Id: <199606191814.SAA30680@ULM02.mnh.telekom.de> X-Sender: deuschle@ulm02.mnh.telekom.de X-Mailer: Windows Eudora Version 1.4.4 Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Date: Wed, 19 Jun 1996 18:12:02 +0200 To: Juergen Specht From: deuschle@mnh.telekom.de (Guenter Deuschle) Subject: Re: 34Mbit/s Netz X-Mozilla-Status: 0011 Hallo Herr Specht, entschuldigen Sie vorab, dass ich Ihnen nicht telefonisch zur Verfuegung stehe, ich Praesentationen gehalten/ noch zu halten und viele Kundennachfragen zu projektieren=2E Nach Informationen des Produkt-Manager= s Temme steht der POP schon zur Verf=FCgung! Standort: voraussichtlich: Winterfeldstr=2E 21, 10781 Berlin=2E Der POP hat zur Zeit direkte 34M-Anbindungen zu folgenden Orten: Rostock, Hamburg, Hannover & Leipzig=2E 4 weitere werden in kuerze in Betrieb gehen= =2E Damit haben Sie einen Besonderen Sicherheitsstandard verfuegbar! Kontakt muessen Sie ueber Ihre oerltliche Vertriebseinheit aufnehmen: entweder den Geschaefts-Kunden-Vertrieb oder das GrossKundenManagement=2E Diese Vertriebseinheiten greifen auf den oertlichen Technischen Vertriebs-Support zu=2E Die Informationen werden ueber TVS zur Vertriebsei= heit gegeben und dann zu Ihnen=2E Sie benoetigen eine Standleitung von Ihrer Lokation zum Internet-POP Uebergabepunkt zu Ihrem Info-Server ist ein CISCO 1000-Router=2E Dann zahl= en Sie neben den monatlichen Kosten fuer die Standleitung die Kosten fuer den Internet-Zugang: zB bei 64k: 1500DM bei 2GByte Freivolumen=2E 128K: 3000 D= M bei 5 GB Freivolumen & 2M: 30=2E000 DM bei 50GB Freivolumen=2E Freundliche Gruesse=20 Guenter Deuschle >Sehr geehrter Herr Deuschle, >Sie sind mir von Herrn Meyendriesch empfohlen worden=2E >Ich versuche Informationen ueber das T-eigene 34Mbit/s Netz und den=20 >lokalen Pop-Berlin rauszufinden, bzw=2E was ein Anschluss kostet und=20 >wo man ihn herbekommt=2E Laut Herrn Schnick in Berlin gibt es den=20 >T-Pop nicht, laut Traceroute von Herrn Meyendriesch sehrwohl=2E Auch=20 >ist dies Netz in der IX vom Mai 96 erwaehnt=2E >Koennen Sie mir helfen? > >MfG >--=20 >Juergen Specht - KULTURBOX > > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D Dipl=2E-Ing=2E Guenter D E U S C H L E Deutsche Telekom AG Niederlassung 3 Hannover GrossKundenManagement - Techn=2E Vertriebs-Support: Team-Leiter Internet Online-Dienste --------------------------------------------------- GrKM-TVS-IOD Tel: +49-511-333-2772 Vahrenwalder-Str=2E 245 FAX: +49-511-333-2751 30179 Hannover eMail: deuschle@mnh=2Etelekom=2Ede=20 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D --------------70522FC73543-- ././@LongLink0000000000000000000000000000017300000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/attachment-filename-encoding-Latin1_decoded_1_2.txtapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/attachment-filename-encoding-0000644000000000000000000000000511702050534032337 0ustar rootrootTest apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/dup-names.xml0000644000000000000000000001062211702050534027266 0ustar rootroot
Return-Path: eryq@rhine.gsfc.nasa.gov Sender: john-bigboote Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Eryq <eryq@rhine.gsfc.nasa.gov> Organization: Yoyodyne Propulsion Systems X-Mailer: Mozilla 2.0 (X11; I; Linux 1.1.18 i486) MIME-Version: 1.0 To: john-bigboote@eryq.pr.mcs.net Subject: Two images for you... Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE"
This is a multi-part message in MIME format.
Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="one.gif"
R0lGODdhKAAoAOMAAAAAAAAAgB6Q/y9PT25ubnCAkKBSLb6+vufn5/Xes/+lAP/6zQAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJLMOyYbcoxkaZ5oCkoH6L5wLMfiWqd4btZhmxbA oFCY47EIqMJgyWw2ATjj7aRkAq5YwDMl9VGtKO0SiuoiTVlscsxt9c4HgXxUIA0EAVOVfDKT 8Hl1B3kDAYYle202XnGGgoMHhYckiWVuR3+OTgCGeZRslotwgJ2lnYigfZdTjQULr7ALBZN0 qTurjHgLKAu0B5Wqopm7J72etQN8t8Ijury+wMtvw8/Hv7Ylfs0BxCbGqMmK0yOOQ0GTCgrR 2bhwJGlXJQYG6mMKoeNoWSbzCWIACe5JwxQm3AkDAbUAQCiQhDZEBeBl6afgCsOBrD45edIv QceGWSMevpOYhl6CkydBHhBZQmGKjihVshypjB9ClAHZMTugzOU7mzhBPiSZ5uDNnA7b/aTZ 0mhMnfl0pDBFa6bUElSPWb0qtYuHrxlwcR17YsWMs2jTql3LFkQEADs=
Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="one.gif"
R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7 VujnC96IRVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7 +3dCeRRjfAKHiImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatL rU8GaQdOBAQAB7+yXliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJ vs7Y5ewH3d7Fxe3jB4rj8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjw E0cdGxQ/gswosoKUkmuU2FnJcsSKGTBjypxJsyaICAA7
Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="two.nice.gif"
R0lGODdhKAAoAOMAAAAAAAAAgB6Q/y9PT25ubnCAkKBSLb6+vufn5/Xes/+lAP/6zQAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJLMOyYbcoxkaZ5oCkoH6L5wLMfiWqd4btZhmxbA oFCY47EIqMJgyWw2ATjj7aRkAq5YwDMl9VGtKO0SiuoiTVlscsxt9c4HgXxUIA0EAVOVfDKT 8Hl1B3kDAYYle202XnGGgoMHhYckiWVuR3+OTgCGeZRslotwgJ2lnYigfZdTjQULr7ALBZN0 qTurjHgLKAu0B5Wqopm7J72etQN8t8Ijury+wMtvw8/Hv7Ylfs0BxCbGqMmK0yOOQ0GTCgrR 2bhwJGlXJQYG6mMKoeNoWSbzCWIACe5JwxQm3AkDAbUAQCiQhDZEBeBl6afgCsOBrD45edIv QceGWSMevpOYhl6CkydBHhBZQmGKjihVshypjB9ClAHZMTugzOU7mzhBPiSZ5uDNnA7b/aTZ 0mhMnfl0pDBFa6bUElSPWb0qtYuHrxlwcR17YsWMs2jTql3LFkQEADs=
Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="two.nice.gif"
R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7 VujnC96IRVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7 +3dCeRRjfAKHiImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatL rU8GaQdOBAQAB7+yXliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJ vs7Y5ewH3d7Fxe3jB4rj8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjw E0cdGxQ/gswosoKUkmuU2FnJcsSKGTBjypxJsyaICAA7
Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="two.nice.gif"
R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7 VujnC96IRVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7 +3dCeRRjfAKHiImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatL rU8GaQdOBAQAB7+yXliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJ vs7Y5ewH3d7Fxe3jB4rj8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjw E0cdGxQ/gswosoKUkmuU2FnJcsSKGTBjypxJsyaICAA7
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/not-mime_decoded_1.txt0000644000000000000000000000043711702050534031033 0ustar rootroottry reading the LaTeX Companion for more details ignore the checksum error in lucida.dtx. i'll fix it sebastian Sebastian Rahtz s.rahtz@elsevier.co.uk Production Methods Group +44 1865 843662 Elsevier Science Ltd Kidlington Oxford, UK apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/dup-names.msg0000644000000000000000000000745111702050534027262 0ustar rootrootReturn-Path: eryq@rhine.gsfc.nasa.gov Sender: john-bigboote Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Eryq Organization: Yoyodyne Propulsion Systems X-Mailer: Mozilla 2.0 (X11; I; Linux 1.1.18 i486) MIME-Version: 1.0 To: john-bigboote@eryq.pr.mcs.net Subject: Two images for you... Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE" This is a multi-part message in MIME format. --------------299A70B339B65A93542D2AE Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="one.gif" R0lGODdhKAAoAOMAAAAAAAAAgB6Q/y9PT25ubnCAkKBSLb6+vufn5/Xes/+lAP/6zQAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJLMOyYbcoxkaZ5oCkoH6L5wLMfiWqd4btZhmxbA oFCY47EIqMJgyWw2ATjj7aRkAq5YwDMl9VGtKO0SiuoiTVlscsxt9c4HgXxUIA0EAVOVfDKT 8Hl1B3kDAYYle202XnGGgoMHhYckiWVuR3+OTgCGeZRslotwgJ2lnYigfZdTjQULr7ALBZN0 qTurjHgLKAu0B5Wqopm7J72etQN8t8Ijury+wMtvw8/Hv7Ylfs0BxCbGqMmK0yOOQ0GTCgrR 2bhwJGlXJQYG6mMKoeNoWSbzCWIACe5JwxQm3AkDAbUAQCiQhDZEBeBl6afgCsOBrD45edIv QceGWSMevpOYhl6CkydBHhBZQmGKjihVshypjB9ClAHZMTugzOU7mzhBPiSZ5uDNnA7b/aTZ 0mhMnfl0pDBFa6bUElSPWb0qtYuHrxlwcR17YsWMs2jTql3LFkQEADs= --------------299A70B339B65A93542D2AE Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="one.gif" R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7 VujnC96IRVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7 +3dCeRRjfAKHiImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatL rU8GaQdOBAQAB7+yXliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJ vs7Y5ewH3d7Fxe3jB4rj8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjw E0cdGxQ/gswosoKUkmuU2FnJcsSKGTBjypxJsyaICAA7 --------------299A70B339B65A93542D2AE Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="two.nice.gif" R0lGODdhKAAoAOMAAAAAAAAAgB6Q/y9PT25ubnCAkKBSLb6+vufn5/Xes/+lAP/6zQAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJLMOyYbcoxkaZ5oCkoH6L5wLMfiWqd4btZhmxbA oFCY47EIqMJgyWw2ATjj7aRkAq5YwDMl9VGtKO0SiuoiTVlscsxt9c4HgXxUIA0EAVOVfDKT 8Hl1B3kDAYYle202XnGGgoMHhYckiWVuR3+OTgCGeZRslotwgJ2lnYigfZdTjQULr7ALBZN0 qTurjHgLKAu0B5Wqopm7J72etQN8t8Ijury+wMtvw8/Hv7Ylfs0BxCbGqMmK0yOOQ0GTCgrR 2bhwJGlXJQYG6mMKoeNoWSbzCWIACe5JwxQm3AkDAbUAQCiQhDZEBeBl6afgCsOBrD45edIv QceGWSMevpOYhl6CkydBHhBZQmGKjihVshypjB9ClAHZMTugzOU7mzhBPiSZ5uDNnA7b/aTZ 0mhMnfl0pDBFa6bUElSPWb0qtYuHrxlwcR17YsWMs2jTql3LFkQEADs= --------------299A70B339B65A93542D2AE Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="two.nice.gif" R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7 VujnC96IRVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7 +3dCeRRjfAKHiImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatL rU8GaQdOBAQAB7+yXliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJ vs7Y5ewH3d7Fxe3jB4rj8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjw E0cdGxQ/gswosoKUkmuU2FnJcsSKGTBjypxJsyaICAA7 --------------299A70B339B65A93542D2AE Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="two.nice.gif" R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7 VujnC96IRVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7 +3dCeRRjfAKHiImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatL rU8GaQdOBAQAB7+yXliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJ vs7Y5ewH3d7Fxe3jB4rj8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjw E0cdGxQ/gswosoKUkmuU2FnJcsSKGTBjypxJsyaICAA7 --------------299A70B339B65A93542D2AE-- apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-digest_decoded.xml0000644000000000000000000000224111702050534031451 0ustar rootroot
From: Nathaniel Borenstein <nsb@bellcore.com> To: Ned Freed <ned@innosoft.com> Subject: Sample digest message MIME-Version: 1.0 Content-type: multipart/digest; boundary="simple boundary"
This is the preamble. It is to be ignored, though it is a handy place for mail composers to include an explanatory note to non-MIME conformant readers.
From: noone@nowhere.org Subject: embedded message 1
Content-type: message/rfc822; charset=us-ascii
From: noone@nowhere.org Subject: embedded message 2 Content-type: text
This is the epilogue. It is also to be ignored.
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-2gifs-base64.out0000644000000000000000000000657011702050534030637 0ustar rootrootContent-type: message/rfc822 Content-transfer-encoding: base64 Subject: a multipart message/rfc822 which has been base64-encoded UmV0dXJuLVBhdGg6IGVyeXFAcmhpbmUuZ3NmYy5uYXNhLmdvdg0KU2VuZGVyOiBqb2huLWJpZ2Jv b3RlDQpEYXRlOiBUaHUsIDExIEFwciAxOTk2IDAxOjEwOjMwIC0wNTAwDQpGcm9tOiBFcnlxIDxl cnlxQHJoaW5lLmdzZmMubmFzYS5nb3Y+DQpPcmdhbml6YXRpb246IFlveW9keW5lIFByb3B1bHNp b24gU3lzdGVtcw0KWC1NYWlsZXI6IE1vemlsbGEgMi4wIChYMTE7IEk7IExpbnV4IDEuMS4xOCBp NDg2KQ0KTUlNRS1WZXJzaW9uOiAxLjANClRvOiBqb2huLWJpZ2Jvb3RlQGVyeXEucHIubWNzLm5l dA0KU3ViamVjdDogVHdvIGltYWdlcyBmb3IgeW91Li4uDQpDb250ZW50LVR5cGU6IG11bHRpcGFy dC9taXhlZDsgYm91bmRhcnk9Ii0tLS0tLS0tLS0tLTI5OUE3MEIzMzlCNjVBOTM1NDJEMkFFIg0K DQpUaGlzIGlzIGEgbXVsdGktcGFydCBtZXNzYWdlIGluIE1JTUUgZm9ybWF0LgoNCi0tLS0tLS0t LS0tLS0tMjk5QTcwQjMzOUI2NUE5MzU0MkQyQUUNCkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsg Y2hhcnNldD11cy1hc2NpaQ0KQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdA0KDQpXaGVu IHVucGFja2VkLCB0aGlzIG1lc3NhZ2Ugc2hvdWxkIHByb2R1Y2UgdHdvIEdJRiBmaWxlczoKCgkq IFRoZSAxc3Qgc2hvdWxkIGJlIGNhbGxlZCAiM2QtY29tcHJlc3MuZ2lmIgoJKiBUaGUgMm5kIHNo b3VsZCBiZSBjYWxsZWQgIjNkLWV5ZS5naWYiCgpEaWZmZXJlbnQgd2F5cyBvZiBzcGVjaWZ5aW5n IHRoZSBmaWxlbmFtZXMgaGF2ZSBiZWVuIHVzZWQuCgotLSAKICAgX19fXyAgICAgICAgICAgX18K ICAvIF9fL19fX19fX19fX18vXy8gIEVyeXEgKGVyeXFAcmhpbmUuZ3NmYy5uYXNhLmdvdikKIC8g X18vIF8vIC8gLyAsIC8gICAgIEh1Z2hlcyBTVFggQ29ycG9yYXRpb24sIE5BU0EvR29kZGFyZAov X19fL18vIFwgIC9cICAvX19fIAogICAgICAgIC9fLyAvX19fX18vICAgaHR0cDovL3NlbHN2ci5z dHguY29tL35lcnlxLwoNCi0tLS0tLS0tLS0tLS0tMjk5QTcwQjMzOUI2NUE5MzU0MkQyQUUNCkNv bnRlbnQtVHlwZTogaW1hZ2UvZ2lmDQpDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNlNjQN CkNvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsgZmlsZW5hbWU9IjNkLWNvbXByZXNzLmdpZiIN Cg0KUjBsR09EZGhLQUFvQU9NQUFBQUFBQUFBZ0I2US95OVBUMjV1Ym5DQWtLQlNMYjYrdnVmbjUv WGVzLytsQVAvNnpRQUFBQUFBQUFBQQ0KQUFBQUFDd0FBQUFBS0FBb0FBQUUvaERKU2F1OWVKTE1P eVliY294a2FaNW9Da29INkw1d0xNZmlXcWQ0YnRaaG14YkFvRkNZNDdFSQ0KcU1KZ3lXdzJBVGpq N2FSa0FxNVl3RE1sOVZHdEtPMFNpdW9pVFZsc2NzeHQ5YzRIZ1h4VUlBMEVBVk9WZkRLVDhIbDFC M2tEQVlZbA0KZTIwMlhuR0dnb01IaFlja2lXVnVSMytPVGdDR2VaUnNsb3R3Z0oybG5ZaWdmWmRU alFVTHI3QUxCWk4wcVR1cmpIZ0xLQXUwQjVXcQ0Kb3BtN0o3MmV0UU44dDhJanVyeSt3TXR2dzgv SHY3WWxmczBCeENiR3FNbUsweU9PUTBHVENnclIyYmh3SkdsWEpRWUc2bU1Lb2VObw0KV1NiekNX SUFDZTVKd3hRbTNBa0RBYlVBUUNpUWhEWkVCZUJsNmFmZ0NzT0JyRDQ1ZWRJdlFjZUdXU01ldnBP WWhsNkNreWRCSGhCWg0KUW1HS2ppaFZzaHlwakI5Q2xBSFpNVHVnek9VN216aEJQaVNaNXVETm5B N2IvYVRaMG1oTW5mbDBwREJGYTZiVUVsU1BXYjBxdFl1SA0Kcnhsd2NSMTdZc1dNczJqVHFsM0xG a1FFQURzPQ0KDQotLS0tLS0tLS0tLS0tLTI5OUE3MEIzMzlCNjVBOTM1NDJEMkFFDQpDb250ZW50 LVR5cGU6IGltYWdlL2dpZjsgbmFtZT0iM2QtZXllLmdpZiINCkNvbnRlbnQtVHJhbnNmZXItRW5j b2Rpbmc6IGJhc2U2NA0KDQpSMGxHT0RkaEtBQW9BUE1BQUFBQUFBQUF6TjN1Lzc2K3ZvaUlpRzV1 YnN6ZDd2Ly8vK2ZuNXdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBDQpBQUFBQUN3QUFBQUFLQUFvQUFB RS9oREpTYXU5ZUpiTU95NGJNb3hrYVo1b0Nrb0Q2TDV3TE1maVduczQxb1p0N2xNN1Z1am5DOTZJ DQpSVnNQV1FFNG54UGprdm1zUW11OG9jL0tCVVNWV2s3WGVwR0dMZU5yeG94Sk8xTWpJTGp0aGcv a1dYUTZ3Ty83KzNkQ2VSUmpmQUtIDQppSW1KQVYrRENGMEJpVzVWQW8xQ0VsYVJoNU5qbGtlWW1w eVRncGNUQUtHaWFhU2Zwd0twVlFheFZhdExyVThHYVFkT0JBUUFCNyt5DQpYbGlYVHJnQXhzVzR2 RmFidjhCT3RCc0J0N2NHdndDSVQ5bk95TkVJeHVDNHpycUt6YzlYYk9ESnZzN1k1ZXdIM2Q3Rnhl M2pCNHJqDQo4dDZQdU5hNnIyYmhLUVhOMTdGWUNCTXFUR2lCelNOaHg1ZzBuRU1obHNTSmppUll2 RGp3RTBjZEd4US9nc3dvc29LVWttdVUyRm5KDQpjc1NLR1RCanlweEpzeWFJQ0FBNw0KDQotLS0t LS0tLS0tLS0tLTI5OUE3MEIzMzlCNjVBOTM1NDJEMkFFLS0NClRoYXQgd2FzIGEgbXVsdGktcGFy dCBtZXNzYWdlIGluIE1JTUUgZm9ybWF0Lgo= apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/uu-junk-target.msg0000644000000000000000000002207711702050534030254 0ustar rootrootReturn-Path: Received: from virtual.mrf.mail.rcn.net ([207.172.4.103]) by mta02.mrf.mail.rcn.net (InterMail vM.4.01.02.27 201-229-119-110) with ESMTP id <20000425112650.ZPUD516.mta02.mrf.mail.rcn.net@virtual.mrf.mail.rcn.net> for ; Tue, 25 Apr 2000 07:26:50 -0400 Received: from [205.139.141.226] (helo=webmail.uwohali.com ident=root) by virtual.mrf.mail.rcn.net with esmtp (Exim 2.12 #3) id 12k3VX-00012G-00 for eryq@zeegee.com; Tue, 25 Apr 2000 07:27:59 -0400 Received: from webmail.uwohali.com (nobody@localhost [127.0.0.1]) by webmail.uwohali.com (8.8.7/8.8.7) with SMTP id GAA10264 for ; Tue, 25 Apr 2000 06:34:43 -0500 Date: Tue, 25 Apr 2000 06:34:43 -0500 Message-Id: <200004251134.GAA10264@webmail.uwohali.com> From: "ADJE Webmail Tech Support" To: eryq@zeegee.com Subject: mime::parser Content-type: multipart/mixed; boundary="---------------------------7d033e3733c" Mime-Version: 1.0 X-Mozilla-Status: 8001 -----------------------------7d033e3733c Content-Type: text/plain Eryq - I occasionally receive an email (see below) like this one, which MIME::Parser does not parse. Any ideas? Is this a valid way to send an attachment, or is the problem on the "sender's" side? Thanks for your time! Mike -->> Promote YOUR web site! FREE Perl CGI scripts add WEB ACCESS to your -->> E-Mail accounts! Download today!! http://webmail.uwohali.com -----------------------------7d033e3733c Content-type: multipart/mixed; boundary="----------=_960622044-2175-0" The following is a multipart MIME message which was extracted from a uuencoded message. ------------=_960622044-2175-0 Here's what he's talking about. I've uuencoded the ZeeGee logo and another GIF file below. ------------=_960622044-2175-0 Content-Type: image/gif; name="up.gif"; x-unix-mode="0644" Content-Disposition: inline; filename="up.gif" Content-Transfer-Encoding: base64 Mime-Version: 1.0 X-Mailer: MIME-tools 5.208 (Entity 5.204) R0lGODdhEwATAKEAAP///wAAAICAgMDAwCwAAAAAEwATAAACR4SPmcHtz0xQ FIgJ5ti8b3FJgEcOIKaV3SmSgcdmY9esoUw7XJwO0Gu6pX6MIGqm+giRSR5T 5UzulqCq9Yq6aq0oIrECPhQAADs= ------------=_960622044-2175-0 Content-Type: image/gif; name="zeegee.gif"; x-unix-mode="0644" Content-Disposition: inline; filename="zeegee.gif" Content-Transfer-Encoding: base64 Mime-Version: 1.0 X-Mailer: MIME-tools 5.208 (Entity 5.204) R0lGODdhWwBwAPcAAAAAAAgICBAQEDkAITkAKUIAKRgYGEoAKUoAMVIAMVIA OVoAMSEhIVoAOVIIMWMAOWMAQloIOWsAQmMIOWMIQikpKVoQOWsIQmsISmMQ OWMQQnMISjExMUIpMWsQSnsIUnMQUnMQSmsYQoQIUoQIWlIpOXMYQowIWjk5 OWshQkI5OZQIWpQIY4wQWnMhSoQYUoQYWpQQY1I5QnshUkJCQnMpSoQhSnMp UoQhUoQhWoQpUpQhY0pKSms5UnsxWnM5UpQpY1JSUmNKUlpSSpQxY5Qxa5wx a5Q5WpQ5Y4RCWpQ5a1paWoxCWoRKY6U5c5xCY4xKa605a5RKY5xCe2NjY3ta Y6VCc5RSa6VKa3tjY61Ka2tra61Kc61Ke4Rja5Rac3tra6VSe61Sc6Vaa7VS c3Nzc4xra61ac61ahLVahK1jc4xzc61je3t7e5Rzc61jhJxzc61re71je4x7 e5xze7Vre71jlJx7e4SEhL1rhJx7lKV7e71rjKV7hKV7lJyEe71zjKV7nN5j jIyMjK17nKWEhM5rlL17jK2EhLV7nM5zjK2EjLV7pd5rlJSUlK2MjLWEpb2E pbWMjLWMlNZ7nL2MjK2UjL2MlN57lN57nJycnN6ElL2UlMaUlMaUnNaMnKWl peeEpb2cnM6UnNaUnO+ErcacnNaUpd6Mtd6Mvc6cnM6cpd6Upb2lpe+Mpa2t rcalpc6lpeeUve+UtdalpdalreecrbW1td6lrd6lpd6ltfecpeelrfecrdat reeltd6treelvd6tte+lrf+ctf+cvb29ve+lvf+cxuetreette+lzvelvf+l ve+tvf+lxue1tf+lzvetxsbGxu+1td69te+1vf+tvfe1vee9ve+9vf+1zv+1 xve9vc7OzufGvfe9xv+9xv+9zvfGxv+93vfGztbW1v/Gxv/Gzv/G3v/G5//O zu/Wzv/O1t7e3v/O3v/W1v/W3v/W5+fn5//e3v/e5//n3v/n5//n7//n9+/v 7//v7/f39//39//3/////ywAAAAAWwBwAAcI/wD/CRxIsKDBgwgTKlzIsKHD hxAjSpxIsaLFixgzapQYqaNHSCBDihwZkpHJRIRSqlzJsmWglzBj+plJs+ZM PThz6lS4oafPnhiCYrhAtCiFo0ghKIXwoIHTp1AbKJiqIIHVqwiyatV6oGuB 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 WrzFXNzFXvzFYBzGYpwRAcEAOw== ------------=_960622044-2175-0-- -----------------------------7d033e3733c-- apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/sig-uu.xml0000644000000000000000000000216411702050534026610 0ustar rootroot
Content-type: text/plain Subject: Here's my UU'ed sig!
Well, I don't know much about how these things are output, so here goes... first off, my .sig file: begin 644 .signature M("!?7U\@(%\@7R!?("`@7R`@7U]?(%\@("!%<GEQ("AE<GEQ0'IE96=E92YC M;VTI"B`O(%\@7'P@)U]\('P@?"!\+R!?("<@+R`@:'1T<#HO+W=W=RYE;G1E M<F%C="YC;VTO?F5R>7$*?"`@7U\O?"!\('P@?%]\('P@?%]\('P@("`*(%Q? M7U]\?%]\("!<7U\L('Q<7U\L('Q?7U\O7"`@5FES:70@4U1214545TE312P@ M0VAI8V%G;R=S(&YE=W-P87!E<B!B>2\*("`@("`@("`@("!\7U]?+R`@("!\ M7U]?7U]?+R!O9B!T:&4@:&]M96QE<W,Z(&AT='`Z+R]W=W<N<W1R965T=VES &92YO<F<* end And now, a little .gif icon: begin 644 M1TE&.#EA%``6`,(``/___\S__YF9F3,S,P```````````````"'^3E1H:7,@ M87)T(&ES(&EN('1H92!P=6)L:6,@9&]M86EN+B!+979I;B!(=6=H97,L(&ME M=FEN:$!E:70N8V]M+"!397!T96UB97(@,3DY-0`A^00!```!`"P`````%``6 M```#7SBZO/$P#$"KG2.^*8C_!#")V@2"8I5!9FA1(\P"YT</!(YO0%?3-=YK M*"AV>+Z3Q4C@U3S$I@0XC#J?UFD2]3I.JU5O#+R4CLD4,;IK7I>%[EX[+M\, +C/A\<0=Y^J4)`#L` end Done!
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/2002_06_12_doublebound.msg0000644000000000000000000002664511702050534031153 0ustar rootrootFrom: Lars Hecking To: mutt-dev@mutt.org Subject: MIME handling bug demo Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="ReaqsoxgOBHFXBhH" Content-Disposition: inline Content-Transfer-Encoding: 8bit X-Mutt-Fcc: Status: RO Content-Length: 11138 Lines: 226 --ReaqsoxgOBHFXBhH Content-Type: text/plain; charset=us-ascii Content-Disposition: inline -- The plot was designed in a light vein that somehow became varicose. -- David Lardner --ReaqsoxgOBHFXBhH --ReaqsoxgOBHFXBhH Content-Type: text/html; charset=iso-8859-15 Content-Disposition: attachment; filename="The Mutt E-Mail Client.html" Content-Transfer-Encoding: 8bit The Mutt E-Mail Client

The Mutt E-Mail Client

"All mail clients suck. This one just sucks less." -me, circa 1995

mirrors


Latest News

Mutt 1.3.28 was released on March 13, 2002. This is a release candidate for 1.4.

Mutt 1.2.5.1 and 1.3.25 were released on January 1, 2002. These releases both fix a security hole which can be remotely exploited. For more information, see the release announcement.

Mutt 1.3.24 was released on November 30, 2001. This is a beta development release toward the next stable public release version. There have been several large changes since 1.2.x, so please check the recent changes page.

The Mutt CVS server has moved from ftp.guug.de to ftp.mutt.org.

more news


General Info

Mutt is a small but very powerful text-based mail client for Unix operating systems. The latest public release version is 1.3.28, which is a release candidate for 1.4. The current stable public release version is 1.2.5.1. For more information, see the following:

[Mutt Mail Agent Button]


Features

Some of Mutt's features include:

  • color support
  • message threading
  • MIME support (including RFC2047 support for encoded headers)
  • PGP/MIME (RFC2015)
  • various features to support mailing lists, including list-reply
  • active development community
  • POP3 support
  • IMAP support
  • full control of message headers when composing
  • support for multiple mailbox formats (mbox, MMDF, MH, maildir)
  • highly customizable, including keybindings and macros
  • change configuration automatically based on recipients, current folder, etc.
  • searches using regular expressions, including an internal pattern matching language
  • Delivery Status Notification (DSN) support
  • postpone message composition indefinetly for later recall
  • easily include attachments when composing, even from the command line
  • ability to specify alternate addresses for recognition of mail forwarded from other accounts, with ability to set the From: headers on replies/etc. accordingly
  • multiple message tagging
  • reply to or forward multiple messages at once
  • .mailrc style configuration files
  • easy to install (uses GNU autoconf)
  • compiles against either curses/ncurses or S-lang
  • translation into at least 20 languages
  • small and efficient
  • It's free! (no cost and GPL'ed)

Screenshots demonstrating some of Mutt's capabilities are available.

Though written from scratch, Mutt's initial interface was based largely on the ELM mail client. To a large extent, Mutt is still very ELM-like in presentation of information in menus (and in fact, ELM users will find it quite painless to switch as the default key bindings are identical). As development progressed, features found in other popular clients such as PINE and MUSH have been added, the result being a hybrid, or "mutt." At present, it most closely resembles the SLRN news client. Mutt was originally written by Michael Elkins but is now developed and maintained by the members of the Mutt development mailing list.

top


Mutt User Discussion

top


Press About Mutt

top


Last updated on March 13, 2002 by Jeremy Blosser.
URL:<http://www.mutt.org/index.html>
Copyright © 1996-9 Michael R. Elkins. All rights reserved.
Copyright © 1999-2002 Jeremy Blosser. All rights reserved.
GBNet/NetTek
hosted by
GBNet/NetTek
--ReaqsoxgOBHFXBhH-- ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-nested2_decoded_1_3_1.binapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-nested2_decoded_1_3_1.b0000644000000000000000000000064311702050534032045 0ustar rootrootGIF87a((ã€ÿ/OOnnnp€ R-¾¾¾çççõÞ³ÿ¥ÿúÍ,((þÉI«½x’Ì;&rŒdižh Jè¾p,ÇâZ§xnÖa›À P˜ã±¨Â`Él68ãí¤d®XÀ3%õQ­(íŠê"MYlrÌmõÎ|T S•|2“ðyuy†%{m6^q†‚ƒ…‡$‰enGŽN†y”l–‹p€¥ˆ }—S ¯° “t©;«Œx ( ´•ª¢™»'½žµ|·Â#º¼¾ÀËoÃÏÇ¿¶%~ÍÄ&ƨɊÓ#ŽCA“ ÑÙ¸p$iW%êc ¡ãhY&ó b îIÃ&Ü µ@(„6Dàeé§à ì>9yÒ/AdžY#¾“˜†^‚“'AYBaŠŽ(U²©ŒB”Ù1; Ìå;›8A>$™æàÍœÛý¤ÙÒhLùt¤0Ek¦ÔTY½*µ‹‡¯pq{bÅŒ³hÓª]ËD;apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/ak-0696.out0000644000000000000000000001140311702050534026377 0ustar rootrootDate: Thu, 20 Jun 1996 08:35:17 +0200 From: Juergen Specht Organization: KULTURBOX X-Mailer: Mozilla 2.02 (WinNT; I) MIME-Version: 1.0 To: andreas.koenig@mind.de, kun@pop.combox.de, 101762.2307@compuserve.com Subject: [Fwd: Re: 34Mbit/s Netz] Content-Type: MULTIPART/MIXED; boundary="------------70522FC73543" X-Filter: mailagent [version 3.0 PL44] for k@.in-berlin.de This is a multi-part message in MIME format. --------------70522FC73543 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit -- Juergen Specht - KULTURBOX --------------70522FC73543 Content-Type: message/rfc822 Content-Transfer-Encoding: 7bit Content-Disposition: inline X-POP3-Rcpt: specht@trachea Return-Path: hermes Received: (from hermes@localhost) by kulturbox.netmbx.de (8.7.1/8.7.1) id SAA04513 for specht; Wed, 19 Jun 1996 18:30:12 +0200 Received: by netmbx.netmbx.de (/\==/\ Smail3.1.28.1) from mail.cs.tu-berlin.de with smtp id ; Wed, 19 Jun 96 18:12 MES Received: (from nobody@localhost) by mail.cs.tu-berlin.de (8.6.12/8.6.12) id SAA12413; Wed, 19 Jun 1996 18:26:28 +0200 Resent-Date: Wed, 19 Jun 1996 18:26:28 +0200 Resent-Message-Id: <199606191626.SAA12413@mail.cs.tu-berlin.de> Resent-From: nobody@cs.tu-berlin.de Resent-To: kultur@kulturbox.netmbx.de Received: from gatekeeper.telekom.de ([194.25.15.11]) by mail.cs.tu-berlin.de (8.6.12/8.6.12) with SMTP id SAA11678 for ; Wed, 19 Jun 1996 18:11:29 +0200 Received: from ULM02.mnh.telekom.de by gatekeeper.telekom.de; (5.65v3.0/1.1.8.2/02Aug95-0132PM) id AA01376; Wed, 19 Jun 1996 18:11:27 +0200 Received: from ulm02.mnh.telekom.de (deuschle@mnh.telekom.de) by ULM02.mnh.telekom.de (8.6.10/3) with SMTP id SAA30680 for ; Wed, 19 Jun 1996 18:14:40 GMT Message-Id: <199606191814.SAA30680@ULM02.mnh.telekom.de> X-Sender: deuschle@ulm02.mnh.telekom.de X-Mailer: Windows Eudora Version 1.4.4 Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Date: Wed, 19 Jun 1996 18:12:02 +0200 To: Juergen Specht From: deuschle@mnh.telekom.de (Guenter Deuschle) Subject: Re: 34Mbit/s Netz X-Mozilla-Status: 0011 Hallo Herr Specht, entschuldigen Sie vorab, dass ich Ihnen nicht telefonisch zur Verfuegung stehe, ich Praesentationen gehalten/ noch zu halten und viele Kundennachfragen zu projektieren=2E Nach Informationen des Produkt-Manager= s Temme steht der POP schon zur Verf=FCgung! Standort: voraussichtlich: Winterfeldstr=2E 21, 10781 Berlin=2E Der POP hat zur Zeit direkte 34M-Anbindungen zu folgenden Orten: Rostock, Hamburg, Hannover & Leipzig=2E 4 weitere werden in kuerze in Betrieb gehen= =2E Damit haben Sie einen Besonderen Sicherheitsstandard verfuegbar! Kontakt muessen Sie ueber Ihre oerltliche Vertriebseinheit aufnehmen: entweder den Geschaefts-Kunden-Vertrieb oder das GrossKundenManagement=2E Diese Vertriebseinheiten greifen auf den oertlichen Technischen Vertriebs-Support zu=2E Die Informationen werden ueber TVS zur Vertriebsei= heit gegeben und dann zu Ihnen=2E Sie benoetigen eine Standleitung von Ihrer Lokation zum Internet-POP Uebergabepunkt zu Ihrem Info-Server ist ein CISCO 1000-Router=2E Dann zahl= en Sie neben den monatlichen Kosten fuer die Standleitung die Kosten fuer den Internet-Zugang: zB bei 64k: 1500DM bei 2GByte Freivolumen=2E 128K: 3000 D= M bei 5 GB Freivolumen & 2M: 30=2E000 DM bei 50GB Freivolumen=2E Freundliche Gruesse=20 Guenter Deuschle >Sehr geehrter Herr Deuschle, >Sie sind mir von Herrn Meyendriesch empfohlen worden=2E >Ich versuche Informationen ueber das T-eigene 34Mbit/s Netz und den=20 >lokalen Pop-Berlin rauszufinden, bzw=2E was ein Anschluss kostet und=20 >wo man ihn herbekommt=2E Laut Herrn Schnick in Berlin gibt es den=20 >T-Pop nicht, laut Traceroute von Herrn Meyendriesch sehrwohl=2E Auch=20 >ist dies Netz in der IX vom Mai 96 erwaehnt=2E >Koennen Sie mir helfen? > >MfG >--=20 >Juergen Specht - KULTURBOX > > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D Dipl=2E-Ing=2E Guenter D E U S C H L E Deutsche Telekom AG Niederlassung 3 Hannover GrossKundenManagement - Techn=2E Vertriebs-Support: Team-Leiter Internet Online-Dienste --------------------------------------------------- GrKM-TVS-IOD Tel: +49-511-333-2772 Vahrenwalder-Str=2E 245 FAX: +49-511-333-2751 30179 Hannover eMail: deuschle@mnh=2Etelekom=2Ede=20 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D --------------70522FC73543-- ././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/attachment-filename-encoding-UTF8.xmlapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/attachment-filename-encoding-0000644000000000000000000000147011702050534032346 0ustar rootroot
MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------050706070100080203090004"
This is a multi-part message in MIME format.
Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit
Attachment Test
Content-Type: text/plain; name="=?UTF-8?B?YXR0YWNobWVudC7DpMO2w7w=?=" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename*=UTF-8''%61%74%74%61%63%68%6D%65%6E%74%2E%C3%A4%C3%B6%C3%BC
VGVzdAo=
././@LongLink0000000000000000000000000000015600000000000011567 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/2002_06_12_doublebound_decoded_1_1.txtapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/2002_06_12_doublebound_decode0000644000000000000000000000015611702050534031656 0ustar rootroot -- The plot was designed in a light vein that somehow became varicose. -- David Lardner apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-nested_decoded_1_1.txt0000644000000000000000000000032511702050534032134 0ustar rootrootPart 1 of the outer message. [Note that the preceding blank line means no header fields were given and this is text, with charset US ASCII. It could have been done with explicit typing as in the next part.] apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/simple_decoded_1.txt0000644000000000000000000000071011702050534030571 0ustar rootrootI will be taking vacation from Friday, 12/22/95, through 12/26/95. I will be back on Wednesday, 12/27/95. Advance notice: I may take a second stretch of vacation after that, around New Year's. Thanks, ____ __ | _/__________/_/ Eryq (eryq@rhine.gsfc.nasa.gov) | _| _/ | | . | Hughes STX Corporation, NASA/Goddard Space Flight Cntr. |___|_|\_ |_ |___ | | |____/ http://selsvr.stx.com/~eryq/ `-' ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-2gifs-base64_decoded.xmlapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-2gifs-base64_decoded.xm0000644000000000000000000000330011702050534032107 0ustar rootroot
Content-type: message/rfc822 Content-transfer-encoding: base64 Subject: a multipart message/rfc822 which has been base64-encoded
Return-Path: eryq@rhine.gsfc.nasa.gov Sender: john-bigboote Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Eryq <eryq@rhine.gsfc.nasa.gov> Organization: Yoyodyne Propulsion Systems X-Mailer: Mozilla 2.0 (X11; I; Linux 1.1.18 i486) MIME-Version: 1.0 To: john-bigboote@eryq.pr.mcs.net Subject: Two images for you... Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE"
This is a multi-part message in MIME format.
Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit
Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-compress.gif"
Content-Type: image/gif; name="3d-eye.gif" Content-Transfer-Encoding: base64
That was a multi-part message in MIME format.
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-simple_decoded.xml0000644000000000000000000000154411702050534031470 0ustar rootroot
From: Nathaniel Borenstein <nsb@bellcore.com> To: Ned Freed <ned@innosoft.com> Subject: Sample message MIME-Version: 1.0 Content-type: multipart/mixed; boundary="simple boundary"
This is the preamble. It is to be ignored, though it is a handy place for mail composers to include an explanatory note to non-MIME conformant readers.
Content-type: text/plain; charset=us-ascii
This is the epilogue. It is also to be ignored.
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-clen_decoded_1_3.txt0000644000000000000000000000114211702050534031573 0ustar rootrootABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/sig-uu_decoded.xml0000644000000000000000000000026111702050534030253 0ustar rootroot
Content-type: text/plain Subject: Here's my UU'ed sig!
././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/double-semicolon_decoded_1_1.txtapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/double-semicolon_decoded_1_1.0000644000000000000000000000002011702050534032212 0ustar rootrootThe better part apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-nested3.out0000644000000000000000000000633111702050534030103 0ustar rootrootMIME-Version: 1.0 From: Lord John Whorfin To: Subject: A complex nested multipart example Content-Type: multipart/mixed; boundary=unique-boundary-1 The preamble of the outer multipart message. Mail readers that understand multipart format should ignore this preamble. If you are reading this text, you might want to consider changing to a mail reader that understands how to properly display multipart messages. --unique-boundary-1 Part 1 of the outer message. [Note that the preceding blank line means no header fields were given and this is text, with charset US ASCII. It could have been done with explicit typing as in the next part.] --unique-boundary-1 Content-type: text/plain; charset=US-ASCII Part 2 of the outer message. This could have been part of the previous part, but illustrates explicit versus implicit typing of body parts. --unique-boundary-1 Subject: Part 3 of the outer message is multipart! Content-Type: multipart/parallel; boundary=unique-boundary-2 A one-line preamble for the inner multipart message. --unique-boundary-2 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-vise.gif" Subject: Part 1 of the inner message is a GIF, "3d-vise.gif" R0lGODdhKAAoAOMAAAAAAAAAgB6Q/y9PT25ubnCAkKBSLb6+vufn5/Xes/+lAP/6zQAAAAAAAAAA AAAAACwAAAAAKAAoAAAE/hDJSau9eJLMOyYbcoxkaZ5oCkoH6L5wLMfiWqd4btZhmxbAoFCY47EI qMJgyWw2ATjj7aRkAq5YwDMl9VGtKO0SiuoiTVlscsxt9c4HgXxUIA0EAVOVfDKT8Hl1B3kDAYYl e202XnGGgoMHhYckiWVuR3+OTgCGeZRslotwgJ2lnYigfZdTjQULr7ALBZN0qTurjHgLKAu0B5Wq opm7J72etQN8t8Ijury+wMtvw8/Hv7Ylfs0BxCbGqMmK0yOOQ0GTCgrR2bhwJGlXJQYG6mMKoeNo WSbzCWIACe5JwxQm3AkDAbUAQCiQhDZEBeBl6afgCsOBrD45edIvQceGWSMevpOYhl6CkydBHhBZ QmGKjihVshypjB9ClAHZMTugzOU7mzhBPiSZ5uDNnA7b/aTZ0mhMnfl0pDBFa6bUElSPWb0qtYuH rxlwcR17YsWMs2jTql3LFkQEADs= --unique-boundary-2 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-eye.gif" Subject: Part 2 of the inner message is another GIF, "3d-eye.gif" R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAAAAAA AAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7VujnC96I RVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7+3dCeRRjfAKH iImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatLrU8GaQdOBAQAB7+y XliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJvs7Y5ewH3d7Fxe3jB4rj 8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjwE0cdGxQ/gswosoKUkmuU2FnJ csSKGTBjypxJsyaICAA7 --unique-boundary-2-- The epilogue for the inner multipart message. --unique-boundary-1 Content-type: text/richtext This is part 4 of the outer message as defined in RFC1341 Isn't it cool? --unique-boundary-1 Content-Type: message/rfc822; name="nice.name"; From: (mailbox in US-ASCII) To: (address in US-ASCII) Subject: Part 5 of the outer message is itself an RFC822 message! Content-Type: Text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: Quoted-printable Part 5 of the outer message is itself an RFC822 message! --unique-boundary-1-- The epilogue for the outer message. apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/uu-zeegee_decoded_1.txt0000644000000000000000000001561311702050534031203 0ustar rootrootI've uuencoded the ZeeGee logo and another GIF file below. begin 644 up.gif M1TE&.#=A$P`3`*$``/___P```("`@,#`P"P`````$P`3```"1X2/F<'MSTQ0 M%(@)YMB\;W%)@$<.(*:5W2F2@<=F8]>LH4P[7)P.T&NZI7Z,(&JF^@B121Y3 4Y4SNEJ"J]8JZ:JTH(K$"/A0``#L` ` end begin 644 zeegee.gif M1TE&.#=A6P!P`/<```````@("!`0$#D`(3D`*4(`*1@8&$H`*4H`,5(`,5(` M.5H`,2$A(5H`.5((,6,`.6,`0EH(.6L`0F,(.6,(0BDI*5H0.6L(0FL(2F,0 M.6,00G,(2C$Q,4(I,6L02GL(4G,04G,02FL80H0(4H0(6E(I.7,80HP(6CDY M.6LA0D(Y.90(6I0(8XP06G,A2H084H086I008U(Y0GLA4D)"0G,I2H0A2G,I M4H0A4H0A6H0I4I0A8TI*2FLY4GLQ6G,Y4I0I8U)24F-*4EI22I0Q8Y0Q:YPQ M:Y0Y6I0Y8X1"6I0Y:UI:6HQ"6H1*8Z4YV-C8WM: M8Z5"X1C:Y1:ZU2WM[>Y1S[UC>XQ[ M>YQS>[5K>[UCE)Q[>X2$A+UKA)Q[E*5[>[UKC*5[A*5[E)R$>[USC*5[G-YC MC(R,C*U[G*6$A,YKE+U[C*V$A+5[G,YSC*V$C+5[I=YKE)24E*V,C+6$I;V$ MI;6,C+6,E-9[G+V,C*V4C+V,E-Y[E-Y[G)R>$I;V^,I:VM MK<:EI>4O>^4M=:EI=:EK>>>EK?>>EM=ZMK>>EO=ZMM>^EK?^^EO?^MK>>MM>^ESO>EO?^E MO>^MO?^EQN>UM?^ESO>MQL;&QN^UM=Z]M>^UO?^MO?>UO>>]O>^]O?^USO^U MQO>]O<[.SN?&O?>]QO^]QO^]SO?&QO^]WO?&SM;6UO_&QO_&SO_&WO_&Y__. MSN_6SO_.UM[>WO_.WO_6UO_6WO_6Y^?GY__>WO_>Y__GWO_GY__G[__G]^_O M[__O[_?W]__W]__W_____RP`````6P!P``<(_P#_"1Q(L*#!@P@3*ES(L*'# MAQ`C2IQ(L:+%BQ@S:I08J:-'2"!#BAP9DI')1(12JES)LF6@ES!C^IE)L^9, M/3ASZE2XH:?/GAB"8KA`M"B%HT@A*(7PH('3IU`;*)BJ(('5JPBR:M5ZH&N! MKV#!$AA+8(#9LSQ__A0ZM"A1I$F7-HT:E6K5JUBW379 MU["/(]_0V3-SN:,=/_^&[/MW];YCL6>/C;S[7]U66H(+\-6C;;?&%)R%>U)U7 M@$(C*(CA=H9YQR&$$4;76XA]D5BBB?NAJ-Q[<.76HHL@9I5`!M.9=Z",,]*H M77LW(I9CA]#Q:)4-9#22R2:*".+"9'P1.4*1-&;8X'?./4?78PM$T8@K=4A1 M@P4U,*$($WN-F!`)6]9I9'9>!E7;BBQZJ(`5I6RBA@B1I7"(!7LI1`*==7+9 MI8UZJKADGXV]4`HQ9U@@759()+'5`8HNVJBC)N89J9*3BMG``W8\H\@,]('_ MB$,3>H6Z**-VWKG@9AJ"&:!3+\CBRA/B.6F5!F_4FM`)MXK:J*Z[$M8K@`%: M$4TC)M05JU6'*(O0"$>01)`(*@1NNN,_J M:NJ>H+VP##'$RL=;!F/D5:^]]SJ;ZYW[2GH4$>2$,!DDTBD`)G&&W,\*K0-NV4'.89XH-C)8RKP!*%XL8QPPAV3 M6RZ#21HB#AO4JDJ:&!D0F(#//[O\,L.0ZHG*-EB@FZK2#5R`!7T*L?!SU%)[ M_#'1&,BRC1(X/DAQ`Q'H@(48+@Q85=ABC]WRK5-3_[U=*MP4P>^DO]90BSWW MW*.+!G;CS<(*>MM;]I8P(W=U$>?ZVI0&M'S#3C_WL+/*`DY-Y3@+>4?.<="5 MJW6U$?V%[."#7[3B2S7L?).-+STCL$@#;Q81_K@P<`&RB,=QV!@.Q3X"S2` M8%IP:8(02C`$(0AA""5(P/\0(L`2IDYUXH*!';"A0/4UL('O4$<$7SC!=8`# M$!>47?0\4`49J."'*G!`5/_J94(!@@^%BWJ#-<[1PG:\,![Q>$<^@@'%>-!0 M@>C`QAF^!!B`$(>XK!.LH(@!)"`)@'"*;IP#'2U\(3SBD0YYS*** M5KSB.LX!CD_D`'IPT4(*(L`DC9T1C2?\612@X48FQI&&\CC&._`HQQJB@X_4 M4`(@*:"#)$CO5SY#9"+!E09&@N.-"EQ@`]NA#F2L@Y*53.4YSM$-:H3A2V(0 MP=8:`+5#HA%A>8"&-;HQ#E0^$A[M(`@P0;_X$`*?&(* MU,PH2E(F`QK:(*8QT^=$>&Q#&N!H9B6?&8H99O@$F47 M@*'_#&J$LYCC5!\WEH$-==*0G;.4IC:@`0Q-L@4'1T!57/`)+E\*T`FX``8T M_-F-4XYS'=R0QC#*6<55KB^5T$QH-Q::C%/H('9DT(##D*(H`EJ4!3$812TT MRE%P`!2.ZPB'-&SAQ'C0XQ[XN$<]Z(%,E&)QEN-0*#24`8Q+A(`[.V#"821* M@5`1\`0"Y`,M=KI1:X33HV\4QS-F<0XGU@,?_A#(/N[!5*=>4J7:>"=5:3&& MGIS!`YF#BZV^BKH=T&*L_!1F.#LZRW,TPQ8L;`<]\%&0?-0#'JE$QUWYV(V5 MZA48M/`$"(QPA!1)RE:+LBD@8G'8Q%+#K)T]93.:P0LX_\*C'OTP"#[B`LEQB'>\U@BN<`^KBDY<05KGTM)R$=:"3IC"%*I@K72_6=9BA((: ML06'=N-QCWV8>!]UY:,TQTM>:$`C&<`X;RQ,P0E$\"I)6AK!A,'E!$YXXL+0 MC2XP.$R,69Q"&TB.+1/+*<$]KGBE>4VPBV$,6O326!(^N+%R7C.J'<>!$YRP M<'V%#(Q>%.,0U'BM61?KT_!"=?_%2(ZR@I5!Y<.N0A6>X,0CFH`V/6%G7,L] M!)C#C&'61G<8R`"$,EQ<5FNL.JZ:?+MX*! M)"9Q"3#_.,.TR$4Q*)$+?BZ:T1M-% M0%T$21A;$J8N]"YF<0E<2U<9K[:UM%T,;6?7XM*9SC,G)%$(.,PO0\/NLA*. M;>QDLZ(8=3CL3IT-#&%`&]KN?KNNM\2M?5A=WYG7^O;U'[%YG_J`1]5V%HB-?"%\#PA#T97:%W&'QN\!Y7M0>++]3M^5/_?RE=?YA3W!]8P_0O!T<`,8JN`"(Y7= M(OQ(O>I7S_K6N_[UL(?]1A32>GW$_O:XSST_9D][U=M>]ZLO"/!?S_O>\^/W MPU_(\%5?_(',0Q\$\?WR$<(/=\SC^0))OD4&P8#N>]_[CG!'__2/O_S=%\08 M/!```-8?`!08XQ_`OT@;UD__^FO"_`,A__3S3X7Z&Z#^2X!\L8<1Y@`*!FB` MFA```,``YF`0YB=[^<=\V<<#Z\+!^CE`0 MW@`*FG"!U]=Z_U"`FJ`)&)AZ`U$&ZX<'$9AZMZ"`K]!ZT_""H`!]PG=]/9B" M0.@0\Z"`/#`/`^$.*%!_`!`$WA"#J><.%%A_/.`-0.@."K@%XZ=Z\V!]7F@, M'%!_`4`%^*'MQ"#YI"'=^B' MM[![(R@`^'=[\_`*"FB'>+A^%0!]_/]P@G7(`#S``.O'`&V($-.P?EOP@)3( M`=XP$--0`0#``<9@>Z*(`MZ@>MXPAA6`@11(!=D'?_`7@O"G#].@?CQ@#JIW MBT_8@L:`B^(G$(Z`BPPABA7PB0*A"788C,ZG?GC@#LIHB06A#_\W"/PPAGC@ MA>ZPC=RXC>;PA?V'`LRW>[>P?FG8?QP0@OPP@@#0@`GA""1($$$``#SP@O;X M@C0``#3@#?,8!/=HC_G(`_S0A&6@>J_@A/77!N9`B5OPCYK@")0X"+=`B53@ M"/\(D0`P"`FA#[BHA`,QA@A9?Q5@#B`9DA7(#V](`[]7CB;Y"MY@DO6W!0<) MD^M7!@G1?W'_6!!-6`$HL`14\)-`N01M,)`+&`1+<)1(>91#J8P!D(K'UXWN MD(;J]X7KQP-'"914<)6O,)-!@)59J968J(FTN`7T.`W,*'QDF8NL%WT<28\" MZ'OSZ('\0(GW1Q#Z,`_F-PW_IPG19PZ7:!!CR`%G*1`L"0K?.!#ZD)6ZF(D` M``K/9WZ)N00QJ(Q/B)>KIP]O*`"ZN(X+Z)'_<)>OX),"\8;2^)E1J0FB>1"@ M```!L(=0.0W3,(\!H)"I9PRG.!"RV08Q.)$`((ZJ-W]P6`:O8`Z:4`9Y&(BI M1XT+N(/\8`YXH(`V^)G_QP"EJ`_>T`;0B1#`&9*TF8^L:0"1Z)GZ_["&`0"> ME6B9JN<(B>B$##`-P=>'ZR<`!I"(2T`0=!B?\[E^L(@0$/E]WF<`=?D/@Y"' M<+@%E\@/;5"'!?J6J3$H-">LSB`.$VQB%([B'7QB" M:!A]*)I_M_""@3@/AQF%U@<*GYB!MNB#[O^H$.7H"%@H$-9'$*"@H`!0`;>@ MA.Q(?V19?PP0`"[*`Z"ZA`!@D_P`"@2ZG!#Z#WJ)`I28C1JXAO07!']IEP'@ MB<^G#VU(@T'0HO-P"Z+H"'YYA*TX#R?8?V4`"N6HD0*A#PH("@,!CZDX"*.8 MJ8?XJ=VWI?^WCW>9@P!Z?>XP@J6)$(@8`$N@@AY9CEP8?:)Z"]`G`.DX$,HH MA_]0`31@?DP9!-E'`PRPI?K(IZ+8K[\8`-"G#^[0?2[Z#R.XGPGAH)0H`&5@ M#@U(`TUI$,[*`^('K_AWD/3ZG,'(`Q6P!83X#UC:!OK@H7]YD&+ZBS0@J=1* MKP3A#A40`&=Z$*__0(F]J@^C.)@"$00&\'X&4`$;"P"O(*D92;(!@`=<^G[* M:`[N(`#Z:A#F$*;_<`L"4)];ZJ%."Y7A"@!ENJ)`.`]CZ`B9&`0\^P_S5Z5! M6X0'6;0"P0$""8_B%P";"+(D"P!MA#*.)SF5XXVR0$,F+#_((D"80`,(+G.A[WQ^N\CCA_#-M]^%>.D_L/ M\&B^`T&!4BH0%%@&OS<-3=A^4PH`Z7N^'2A^U:<)#&``LAM]\\BI!3%_Y9F? MFS@0;4H0Y0BS=UO`#>RB*/F=_R<`J&J^+VF3!(&(=FB>*'#!!G&"FL"X2]@& M61FQ!?$*7SL//_C#;:@/_SN'6_"3@P!]M_"EB.J`@_"36T#"5EK%5GS%6)S% 36KS%7-S%7OS%8!S&8IP1`<$`.P`` ` end apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/frag_decoded_1_2_1_2_1_1.txt0000644000000000000000000000000211702050534031533 0ustar rootroot apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-clen_decoded_1_2.txt0000644000000000000000000000004111702050534031567 0ustar rootroot123456789 123456789 123456789 apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/mp-msg-rfc822_decoded_1_1.txt0000644000000000000000000000003711702050534031726 0ustar rootroot-- Juergen Specht - KULTURBOX apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-weirdspace_decoded.xml0000644000000000000000000000254111702050534032323 0ustar rootroot
Return-Path: eryq@rhine.gsfc.nasa.gov Sender: john-bigboote Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Eryq <eryq@rhine.gsfc.nasa.gov> Organization: Yoyodyne Propulsion Systems X-Mailer: Mozilla 2.0 (X11; I; Linux 1.1.18 i486) MIME-Version: 1.0 To: john-bigboote@eryq.pr.mcs.net Subject: Two images for you... Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE"
Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit
Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-compress.gif"
Content-Type: image/gif; name="3d-eye.gif" Content-Transfer-Encoding: base64
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/re-fwd.xml0000644000000000000000000000262711702050534026567 0ustar rootroot
Content-Disposition: inline Content-Transfer-Encoding: binary Content-Type: message/rfc822 MIME-Version: 1.0 X-Mailer: MIME::Lite 1.147 (B2.09; Q2.03) Date: Tue, 6 Jun 2000 03:20:11 UT From: user2 To: user0 Subject: Re: Fwd: hello world
Content-Disposition: inline Content-Transfer-Encoding: binary Content-Type: message/rfc822 MIME-Version: 1.0 X-Mailer: MIME::Lite 1.147 (B2.09; Q2.03) Date: Tue, 6 Jun 2000 03:20:11 UT From: user1 To: user2 Subject: Fwd: hello world
Content-Disposition: inline Content-Length: 60 Content-Transfer-Encoding: binary Content-Type: text/plain MIME-Version: 1.0 X-Mailer: MIME::Lite 1.147 (B2.09; Q2.03) Date: Tue, 6 Jun 2000 03:20:11 UT From: user0 To: user1 Subject: hello world
This is the original message. Let's see if we can embed it!
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/x-gzip64_decoded_1.txt0000644000000000000000000000043111702050534030670 0ustar rootrootH4sIAJ+A5jIAA0VPTWvDMAy9+1e8nbpCsS877bRS1vayXdJDDwURbJEEEqez VdKC6W+fnQ0iwdN7ktAHQEQAzV7irAv9DI8fvHLGD/bCobai7TisFUyuXxJW lDB70aucxfHWtBxRnc4bfG+rrTmMztXBobrWlrHvu6YV7LwErVLZZP4n0IJA K3J9N2aaJj3YqD2LeZYzFC75tlTaCtsg/SGRwmJZklnI1wOxa3wtt8Dgu2V2 EdIyAudnBvaOHd7Qd57ji/oFWju6Pg4BAAA= apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-igor.xml0000644000000000000000000002576311702050534027501 0ustar rootroot
Date: Thu, 6 Jun 1996 15:50:39 +0400 (MOW DST) From: Starovoitov Igor <igor@fripp.aic.synapse.ru> To: eryq@rhine.gsfc.nasa.gov Subject: Need help MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="-490585488-806670346-834061839=:2195"
This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. Send mail to mime@docserver.cac.washington.edu for more info.
Content-Type: TEXT/PLAIN; charset=US-ASCII
Dear Sir, I have a problem with Your MIME-Parser-1.9 and multipart-nested messages. Not all parts are parsed. Here my Makefile, Your own multipart-nested.msg and its out after "make test". Some my messages not completely parsed too. Is this a bug? Thank You for help. Igor Starovoytov.
Content-Type: TEXT/PLAIN; charset=US-ASCII; name=Makefile Content-Transfer-Encoding: BASE64 Content-ID: <Pine.LNX.3.91.960606155039.2195B@fripp.aic.synapse.ru> Content-Description: Makefile
Iy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQ0KIyBNYWtlZmlsZSBmb3IgTUlNRTo6DQojLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tDQoNCiMgV2hlcmUgdG8gaW5zdGFsbCB0aGUgbGlicmFy aWVzOg0KU0lURV9QRVJMID0gL3Vzci9saWIvcGVybDUNCg0KIyBXaGF0IFBl cmw1IGlzIGNhbGxlZCBvbiB5b3VyIHN5c3RlbSAobm8gbmVlZCB0byBnaXZl IGVudGlyZSBwYXRoKToNClBFUkw1ICAgICA9IHBlcmwNCg0KIyBZb3UgcHJv YmFibHkgd29uJ3QgbmVlZCB0byBjaGFuZ2UgdGhlc2UuLi4NCk1PRFMgICAg ICA9IERlY29kZXIucG0gRW50aXR5LnBtIEhlYWQucG0gUGFyc2VyLnBtIEJh c2U2NC5wbSBRdW90ZWRQcmludC5wbQ0KU0hFTEwgICAgID0gL2Jpbi9zaA0K DQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tDQojIEZvciBpbnN0YWxsZXJzLi4uDQojLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tDQoNCmhlbHA6CQ0KCUBlY2hvICJWYWxpZCB0YXJnZXRz OiB0ZXN0IGNsZWFuIGluc3RhbGwiDQoNCmNsZWFuOg0KCXJtIC1mIHRlc3Rv dXQvKg0KDQp0ZXN0Og0KIwlAZWNobyAiVEVTVElORyBIZWFkLnBtLi4uIg0K Iwkke1BFUkw1fSBNSU1FL0hlYWQucG0gICA8IHRlc3Rpbi9maXJzdC5oZHIg ICAgICAgPiB0ZXN0b3V0L0hlYWQub3V0DQojCUBlY2hvICJURVNUSU5HIERl Y29kZXIucG0uLi4iDQojCSR7UEVSTDV9IE1JTUUvRGVjb2Rlci5wbSA8IHRl c3Rpbi9xdW90LXByaW50LmJvZHkgPiB0ZXN0b3V0L0RlY29kZXIub3V0DQoj CUBlY2hvICJURVNUSU5HIFBhcnNlci5wbSAoc2ltcGxlKS4uLiINCiMJJHtQ RVJMNX0gTUlNRS9QYXJzZXIucG0gPCB0ZXN0aW4vc2ltcGxlLm1zZyAgICAg ID4gdGVzdG91dC9QYXJzZXIucy5vdXQNCiMJQGVjaG8gIlRFU1RJTkcgUGFy c2VyLnBtIChtdWx0aXBhcnQpLi4uIg0KIwkke1BFUkw1fSBNSU1FL1BhcnNl ci5wbSA8IHRlc3Rpbi9tdWx0aS0yZ2lmcy5tc2cgPiB0ZXN0b3V0L1BhcnNl ci5tLm91dA0KCUBlY2hvICJURVNUSU5HIFBhcnNlci5wbSAobXVsdGlfbmVz dGVkLm1zZykuLi4iDQoJJHtQRVJMNX0gTUlNRS9QYXJzZXIucG0gPCB0ZXN0 aW4vbXVsdGktbmVzdGVkLm1zZyA+IHRlc3RvdXQvUGFyc2VyLm4ub3V0DQoJ QGVjaG8gIkFsbCB0ZXN0cyBwYXNzZWQuLi4gc2VlIC4vdGVzdG91dC9NT0RV TEUqLm91dCBmb3Igb3V0cHV0Ig0KDQppbnN0YWxsOg0KCUBpZiBbICEgLWQg JHtTSVRFX1BFUkx9IF07IHRoZW4gXA0KCSAgICBlY2hvICJQbGVhc2UgZWRp dCB0aGUgU0lURV9QRVJMIGluIHlvdXIgTWFrZWZpbGUiOyBleGl0IC0xOyBc DQogICAgICAgIGZpICAgICAgICAgIA0KCUBpZiBbICEgLXcgJHtTSVRFX1BF Ukx9IF07IHRoZW4gXA0KCSAgICBlY2hvICJObyBwZXJtaXNzaW9uLi4uIHNo b3VsZCB5b3UgYmUgcm9vdD8iOyBleGl0IC0xOyBcDQogICAgICAgIGZpICAg ICAgICAgIA0KCUBpZiBbICEgLWQgJHtTSVRFX1BFUkx9L01JTUUgXTsgdGhl biBcDQoJICAgIG1rZGlyICR7U0lURV9QRVJMfS9NSU1FOyBcDQogICAgICAg IGZpDQoJaW5zdGFsbCAtbSAwNjQ0IE1JTUUvKi5wbSAke1NJVEVfUEVSTH0v TUlNRQ0KDQoNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgRm9yIGRldmVsb3BlciBv bmx5Li4uDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNClBPRDJIVE1MX0ZMQUdTID0g LS1wb2RwYXRoPS4gLS1mbHVzaCAtLWh0bWxyb290PS4uDQpIVE1MUyAgICAg ICAgICA9ICR7TU9EUzoucG09Lmh0bWx9DQpWUEFUSCAgICAgICAgICA9IE1J TUUNCg0KLlNVRkZJWEVTOiAucG0gLnBvZCAuaHRtbA0KDQojIHYuMS44IGdl bmVyYXRlZCAzMCBBcHIgOTYNCiMgdi4xLjkgaXMgb25seSBiZWNhdXNlIDEu OCBmYWlsZWQgQ1BBTiBpbmdlc3Rpb24NCmRpc3Q6IGRvY3VtZW50ZWQJDQoJ VkVSU0lPTj0xLjkgOyBcDQoJbWtkaXN0IC10Z3ogTUlNRS1wYXJzZXItJCRW RVJTSU9OIDsgXA0KCWNwIE1LRElTVC9NSU1FLXBhcnNlci0kJFZFUlNJT04u dGd6ICR7SE9NRX0vcHVibGljX2h0bWwvY3Bhbg0KCQ0KZG9jdW1lbnRlZDog JHtIVE1MU30gJHtNT0RTfQ0KDQoucG0uaHRtbDoNCglwb2QyaHRtbCAke1BP RDJIVE1MX0ZMQUdTfSBcDQoJCS0tdGl0bGU9TUlNRTo6JCogXA0KCQktLWlu ZmlsZT0kPCBcDQoJCS0tb3V0ZmlsZT1kb2NzLyQqLmh0bWwNCg0KIy0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQ0K
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="multi-nested.msg" Content-Transfer-Encoding: BASE64 Content-ID: <Pine.LNX.3.91.960606155039.2195C@fripp.aic.synapse.ru> Content-Description: test message
TUlNRS1WZXJzaW9uOiAxLjANCkZyb206IExvcmQgSm9obiBXaG9yZmluIDx3 aG9yZmluQHlveW9keW5lLmNvbT4NClRvOiA8am9obi15YXlhQHlveW9keW5l LmNvbT4NClN1YmplY3Q6IEEgY29tcGxleCBuZXN0ZWQgbXVsdGlwYXJ0IGV4 YW1wbGUNCkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOw0KICAgICBi b3VuZGFyeT11bmlxdWUtYm91bmRhcnktMQ0KDQpUaGUgcHJlYW1ibGUgb2Yg dGhlIG91dGVyIG11bHRpcGFydCBtZXNzYWdlLg0KTWFpbCByZWFkZXJzIHRo YXQgdW5kZXJzdGFuZCBtdWx0aXBhcnQgZm9ybWF0DQpzaG91bGQgaWdub3Jl IHRoaXMgcHJlYW1ibGUuDQpJZiB5b3UgYXJlIHJlYWRpbmcgdGhpcyB0ZXh0 LCB5b3UgbWlnaHQgd2FudCB0bw0KY29uc2lkZXIgY2hhbmdpbmcgdG8gYSBt YWlsIHJlYWRlciB0aGF0IHVuZGVyc3RhbmRzDQpob3cgdG8gcHJvcGVybHkg ZGlzcGxheSBtdWx0aXBhcnQgbWVzc2FnZXMuDQotLXVuaXF1ZS1ib3VuZGFy eS0xDQoNClBhcnQgMSBvZiB0aGUgb3V0ZXIgbWVzc2FnZS4NCltOb3RlIHRo YXQgdGhlIHByZWNlZGluZyBibGFuayBsaW5lIG1lYW5zDQpubyBoZWFkZXIg ZmllbGRzIHdlcmUgZ2l2ZW4gYW5kIHRoaXMgaXMgdGV4dCwNCndpdGggY2hh cnNldCBVUyBBU0NJSS4gIEl0IGNvdWxkIGhhdmUgYmVlbg0KZG9uZSB3aXRo IGV4cGxpY2l0IHR5cGluZyBhcyBpbiB0aGUgbmV4dCBwYXJ0Ll0NCg0KLS11 bmlxdWUtYm91bmRhcnktMQ0KQ29udGVudC10eXBlOiB0ZXh0L3BsYWluOyBj aGFyc2V0PVVTLUFTQ0lJDQoNClBhcnQgMiBvZiB0aGUgb3V0ZXIgbWVzc2Fn ZS4NClRoaXMgY291bGQgaGF2ZSBiZWVuIHBhcnQgb2YgdGhlIHByZXZpb3Vz IHBhcnQsDQpidXQgaWxsdXN0cmF0ZXMgZXhwbGljaXQgdmVyc3VzIGltcGxp Y2l0DQp0eXBpbmcgb2YgYm9keSBwYXJ0cy4NCg0KLS11bmlxdWUtYm91bmRh cnktMQ0KU3ViamVjdDogUGFydCAzIG9mIHRoZSBvdXRlciBtZXNzYWdlIGlz IG11bHRpcGFydCENCkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L3BhcmFsbGVs Ow0KICAgICBib3VuZGFyeT11bmlxdWUtYm91bmRhcnktMg0KDQpBIG9uZS1s aW5lIHByZWFtYmxlIGZvciB0aGUgaW5uZXIgbXVsdGlwYXJ0IG1lc3NhZ2Uu DQotLXVuaXF1ZS1ib3VuZGFyeS0yDQpDb250ZW50LVR5cGU6IGltYWdlL2dp Zg0KQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0DQpDb250ZW50 LURpc3Bvc2l0aW9uOiBpbmxpbmU7IGZpbGVuYW1lPSIzZC1jb21wcmVzcy5n aWYiDQpTdWJqZWN0OiBQYXJ0IDEgb2YgdGhlIGlubmVyIG1lc3NhZ2UgaXMg YSBHSUYsICIzZC1jb21wcmVzcy5naWYiDQoNClIwbEdPRGRoS0FBb0FPTUFB QUFBQUFBQWdCNlEveTlQVDI1dWJuQ0FrS0JTTGI2K3Z1Zm41L1hlcy8rbEFQ LzZ6UUFBQUFBQQ0KQUFBQUFBQUFBQ3dBQUFBQUtBQW9BQUFFL2hESlNhdTll SkxNT3lZYmNveGthWjVvQ2tvSDZMNXdMTWZpV3FkNGJ0WmhteGJBDQpvRkNZ NDdFSXFNSmd5V3cyQVRqajdhUmtBcTVZd0RNbDlWR3RLTzBTaXVvaVRWbHNj c3h0OWM0SGdYeFVJQTBFQVZPVmZES1QNCjhIbDFCM2tEQVlZbGUyMDJYbkdH Z29NSGhZY2tpV1Z1UjMrT1RnQ0dlWlJzbG90d2dKMmxuWWlnZlpkVGpRVUxy N0FMQlpOMA0KcVR1cmpIZ0xLQXUwQjVXcW9wbTdKNzJldFFOOHQ4SWp1cnkr d010dnc4L0h2N1lsZnMwQnhDYkdxTW1LMHlPT1EwR1RDZ3JSDQoyYmh3Skds WEpRWUc2bU1Lb2VOb1dTYnpDV0lBQ2U1Snd4UW0zQWtEQWJVQVFDaVFoRFpF QmVCbDZhZmdDc09CckQ0NWVkSXYNClFjZUdXU01ldnBPWWhsNkNreWRCSGhC WlFtR0tqaWhWc2h5cGpCOUNsQUhaTVR1Z3pPVTdtemhCUGlTWjV1RE5uQTdi L2FUWg0KMG1oTW5mbDBwREJGYTZiVUVsU1BXYjBxdFl1SHJ4bHdjUjE3WXNX TXMyalRxbDNMRmtRRUFEcz0NCi0tdW5pcXVlLWJvdW5kYXJ5LTINCkNvbnRl bnQtVHlwZTogaW1hZ2UvZ2lmDQpDb250ZW50LVRyYW5zZmVyLUVuY29kaW5n OiBiYXNlNjQNCkNvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsgZmlsZW5h bWU9IjNkLWV5ZS5naWYiDQpTdWJqZWN0OiBQYXJ0IDIgb2YgdGhlIGlubmVy IG1lc3NhZ2UgaXMgYW5vdGhlciBHSUYsICIzZC1leWUuZ2lmIg0KDQpSMGxH T0RkaEtBQW9BUE1BQUFBQUFBQUF6TjN1Lzc2K3ZvaUlpRzV1YnN6ZDd2Ly8v K2ZuNXdBQUFBQUFBQUFBQUFBQUFBQUENCkFBQUFBQUFBQUN3QUFBQUFLQUFv QUFBRS9oREpTYXU5ZUpiTU95NGJNb3hrYVo1b0Nrb0Q2TDV3TE1maVduczQx b1p0N2xNNw0KVnVqbkM5NklSVnNQV1FFNG54UGprdm1zUW11OG9jL0tCVVNW V2s3WGVwR0dMZU5yeG94Sk8xTWpJTGp0aGcva1dYUTZ3Ty83DQorM2RDZVJS amZBS0hpSW1KQVYrRENGMEJpVzVWQW8xQ0VsYVJoNU5qbGtlWW1weVRncGNU QUtHaWFhU2Zwd0twVlFheFZhdEwNCnJVOEdhUWRPQkFRQUI3K3lYbGlYVHJn QXhzVzR2RmFidjhCT3RCc0J0N2NHdndDSVQ5bk95TkVJeHVDNHpycUt6YzlY Yk9ESg0KdnM3WTVld0gzZDdGeGUzakI0cmo4dDZQdU5hNnIyYmhLUVhOMTdG WUNCTXFUR2lCelNOaHg1ZzBuRU1obHNTSmppUll2RGp3DQpFMGNkR3hRL2dz d29zb0tVa211VTJGbkpjc1NLR1RCanlweEpzeWFJQ0FBNw0KLS11bmlxdWUt Ym91bmRhcnktMi0tDQoNClRoZSBlcGlsb2d1ZSBmb3IgdGhlIGlubmVyIG11 bHRpcGFydCBtZXNzYWdlLg0KDQotLXVuaXF1ZS1ib3VuZGFyeS0xDQpDb250 ZW50LXR5cGU6IHRleHQvcmljaHRleHQNCg0KVGhpcyBpcyA8Ym9sZD5wYXJ0 IDQgb2YgdGhlIG91dGVyIG1lc3NhZ2U8L2JvbGQ+DQo8c21hbGxlcj5hcyBk ZWZpbmVkIGluIFJGQzEzNDE8L3NtYWxsZXI+PG5sPg0KPG5sPg0KSXNuJ3Qg aXQgPGJpZ2dlcj48YmlnZ2VyPmNvb2w/PC9iaWdnZXI+PC9iaWdnZXI+DQoN Ci0tdW5pcXVlLWJvdW5kYXJ5LTENCkNvbnRlbnQtVHlwZTogbWVzc2FnZS9y ZmM4MjINCg0KRnJvbTogKG1haWxib3ggaW4gVVMtQVNDSUkpDQpUbzogKGFk ZHJlc3MgaW4gVVMtQVNDSUkpDQpTdWJqZWN0OiBQYXJ0IDUgb2YgdGhlIG91 dGVyIG1lc3NhZ2UgaXMgaXRzZWxmIGFuIFJGQzgyMiBtZXNzYWdlIQ0KQ29u dGVudC1UeXBlOiBUZXh0L3BsYWluOyBjaGFyc2V0PUlTTy04ODU5LTENCkNv bnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IFF1b3RlZC1wcmludGFibGUNCg0K UGFydCA1IG9mIHRoZSBvdXRlciBtZXNzYWdlIGlzIGl0c2VsZiBhbiBSRkM4 MjIgbWVzc2FnZSENCg0KLS11bmlxdWUtYm91bmRhcnktMS0tDQoNClRoZSBl cGlsb2d1ZSBmb3IgdGhlIG91dGVyIG1lc3NhZ2UuDQo=
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="Parser.n.out" Content-Transfer-Encoding: BASE64 Content-ID: <Pine.LNX.3.91.960606155039.2195D@fripp.aic.synapse.ru> Content-Description: out from parser
KiBXYWl0aW5nIGZvciBhIE1JTUUgbWVzc2FnZSBmcm9tIFNURElOLi4uDQo9 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT0NCkNvbnRlbnQtdHlwZTogbXVsdGlwYXJ0L21peGVk DQpCb2R5LWZpbGU6IE5PTkUNClN1YmplY3Q6IEEgY29tcGxleCBuZXN0ZWQg bXVsdGlwYXJ0IGV4YW1wbGUNCk51bS1wYXJ0czogMw0KLS0NCiAgICBDb250 ZW50LXR5cGU6IHRleHQvcGxhaW4NCiAgICBCb2R5LWZpbGU6IC4vdGVzdG91 dC9tc2ctMzUzOC0xLmRvYw0KICAgIC0tDQogICAgQ29udGVudC10eXBlOiB0 ZXh0L3BsYWluDQogICAgQm9keS1maWxlOiAuL3Rlc3RvdXQvbXNnLTM1Mzgt Mi5kb2MNCiAgICAtLQ0KICAgIENvbnRlbnQtdHlwZTogbXVsdGlwYXJ0L3Bh cmFsbGVsDQogICAgQm9keS1maWxlOiBOT05FDQogICAgU3ViamVjdDogUGFy dCAzIG9mIHRoZSBvdXRlciBtZXNzYWdlIGlzIG11bHRpcGFydCENCiAgICBO dW0tcGFydHM6IDINCiAgICAtLQ0KICAgICAgICBDb250ZW50LXR5cGU6IGlt YWdlL2dpZg0KICAgICAgICBCb2R5LWZpbGU6IC4vdGVzdG91dC8zZC1jb21w cmVzcy5naWYNCiAgICAgICAgU3ViamVjdDogUGFydCAxIG9mIHRoZSBpbm5l ciBtZXNzYWdlIGlzIGEgR0lGLCAiM2QtY29tcHJlc3MuZ2lmIg0KICAgICAg ICAtLQ0KICAgICAgICBDb250ZW50LXR5cGU6IGltYWdlL2dpZg0KICAgICAg ICBCb2R5LWZpbGU6IC4vdGVzdG91dC8zZC1leWUuZ2lmDQogICAgICAgIFN1 YmplY3Q6IFBhcnQgMiBvZiB0aGUgaW5uZXIgbWVzc2FnZSBpcyBhbm90aGVy IEdJRiwgIjNkLWV5ZS5naWYiDQogICAgICAgIC0tDQo9PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT0NCg0K
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-igor2_decoded_1_1.txt0000644000000000000000000000046411702050534031700 0ustar rootrootDear Sir, I have a problem with Your MIME-Parser-1.9 and multipart-nested messages. Not all parts are parsed. Here my Makefile, Your own multipart-nested.msg and its out after "make test". Some my messages not completely parsed too. Is this a bug? Thank You for help. Igor Starovoytov.apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/dup-names_decoded_1_5.bin0000644000000000000000000000054511702050534031354 0ustar rootrootGIF87a((óÌÝîÿ¾¾¾ˆˆˆnnnÌÝîÿÿÿççç,((þÉI«½x–Ì;.2Œdižh Jè¾p,ÇâZ{8Ö†mîS;Vèç ÞˆE[Y8Ÿã’ù¬Bk¼¡ÏÊD•ZN×z‘†-ãkÆŒI;S# ¸í†äYt:ÀïûûwByc|‡ˆ‰‰_ƒ]‰nUBV‘‡“c–G˜šœ“‚—¡¢i¤Ÿ§©U±U«K­OiN¿²^X—N¸ÆÅ¸¼V›¿ÀN´··¿ˆOÙÎÈÑÆà¸ÎºŠÍÏWlàÉ¾ÎØåìÝÞÅÅíãŠãòÞ¸Öº¯fá)Í×±X*LhÍ#aǘ4œC!–ĉŽ$X¼8ðG?‚Ì(²‚”’k”ØYÉrÄŠ0cÊœI³&ˆ;apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-igor2_decoded_1_2.txt0000644000000000000000000000461211702050534031700 0ustar rootroot#------------------------------------------------------------ # Makefile for MIME:: #------------------------------------------------------------ # Where to install the libraries: SITE_PERL = /usr/lib/perl5 # What Perl5 is called on your system (no need to give entire path): PERL5 = perl # You probably won't need to change these... MODS = Decoder.pm Entity.pm Head.pm Parser.pm Base64.pm QuotedPrint.pm SHELL = /bin/sh #------------------------------------------------------------ # For installers... #------------------------------------------------------------ help: @echo "Valid targets: test clean install" clean: rm -f testout/* test: # @echo "TESTING Head.pm..." # ${PERL5} MIME/Head.pm < testin/first.hdr > testout/Head.out # @echo "TESTING Decoder.pm..." # ${PERL5} MIME/Decoder.pm < testin/quot-print.body > testout/Decoder.out # @echo "TESTING Parser.pm (simple)..." # ${PERL5} MIME/Parser.pm < testin/simple.msg > testout/Parser.s.out # @echo "TESTING Parser.pm (multipart)..." # ${PERL5} MIME/Parser.pm < testin/multi-2gifs.msg > testout/Parser.m.out @echo "TESTING Parser.pm (multi_nested.msg)..." ${PERL5} MIME/Parser.pm < testin/multi-nested.msg > testout/Parser.n.out @echo "All tests passed... see ./testout/MODULE*.out for output" install: @if [ ! -d ${SITE_PERL} ]; then \ echo "Please edit the SITE_PERL in your Makefile"; exit -1; \ fi @if [ ! -w ${SITE_PERL} ]; then \ echo "No permission... should you be root?"; exit -1; \ fi @if [ ! -d ${SITE_PERL}/MIME ]; then \ mkdir ${SITE_PERL}/MIME; \ fi install -m 0644 MIME/*.pm ${SITE_PERL}/MIME #------------------------------------------------------------ # For developer only... #------------------------------------------------------------ POD2HTML_FLAGS = --podpath=. --flush --htmlroot=.. HTMLS = ${MODS:.pm=.html} VPATH = MIME .SUFFIXES: .pm .pod .html # v.1.8 generated 30 Apr 96 # v.1.9 is only because 1.8 failed CPAN ingestion dist: documented VERSION=1.9 ; \ mkdist -tgz MIME-parser-$$VERSION ; \ cp MKDIST/MIME-parser-$$VERSION.tgz ${HOME}/public_html/cpan documented: ${HTMLS} ${MODS} .pm.html: pod2html ${POD2HTML_FLAGS} \ --title=MIME::$* \ --infile=$< \ --outfile=docs/$*.html #------------------------------------------------------------ apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/hdr-fakeout.xml0000644000000000000000000000127611702050534027613 0ustar rootroot
Received: (qmail 24486 invoked by uid 501); 20 May 2000 01:55:02 -0000 Date: Fri, 19 May 2000 21:55:02 -0400 From: "Russell P. Sutherland" <russ@quist.on.ca> To: "Russell P. Sutherland" <russ@quist.on.ca> Subject: test message 1 Message-ID: <20000519215502.A24482@quist.on.ca> Mime-Version: 1.0 Content-transfer-encoding: 7BIT Content-Type: text/plain; charset=us-ascii X-Mailer: Mutt 1.0us Organization: Quist Consulting
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-frag_decoded_1_4.txt0000644000000000000000000000023011702050534031567 0ustar rootrootThis is part 4 of the outer message as defined in RFC1341 Isn't it cool? apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/uu-junk_decoded_1_2.txt0000644000000000000000000001566111702050534031132 0ustar rootrootHere's what he's talking about. I've uuencoded the ZeeGee logo and another GIF file below. begin 644 up.gif M1TE&.#=A$P`3`*$``/___P```("`@,#`P"P`````$P`3```"1X2/F<'MSTQ0 M%(@)YMB\;W%)@$<.(*:5W2F2@<=F8]>LH4P[7)P.T&NZI7Z,(&JF^@B121Y3 4Y4SNEJ"J]8JZ:JTH(K$"/A0``#L` ` end begin 644 zeegee.gif M1TE&.#=A6P!P`/<```````@("!`0$#D`(3D`*4(`*1@8&$H`*4H`,5(`,5(` M.5H`,2$A(5H`.5((,6,`.6,`0EH(.6L`0F,(.6,(0BDI*5H0.6L(0FL(2F,0 M.6,00G,(2C$Q,4(I,6L02GL(4G,04G,02FL80H0(4H0(6E(I.7,80HP(6CDY M.6LA0D(Y.90(6I0(8XP06G,A2H084H086I008U(Y0GLA4D)"0G,I2H0A2G,I M4H0A4H0A6H0I4I0A8TI*2FLY4GLQ6G,Y4I0I8U)24F-*4EI22I0Q8Y0Q:YPQ M:Y0Y6I0Y8X1"6I0Y:UI:6HQ"6H1*8Z4YV-C8WM: M8Z5"X1C:Y1:ZU2WM[>Y1S[UC>XQ[ M>YQS>[5K>[UCE)Q[>X2$A+UKA)Q[E*5[>[UKC*5[A*5[E)R$>[USC*5[G-YC MC(R,C*U[G*6$A,YKE+U[C*V$A+5[G,YSC*V$C+5[I=YKE)24E*V,C+6$I;V$ MI;6,C+6,E-9[G+V,C*V4C+V,E-Y[E-Y[G)R>$I;V^,I:VM MK<:EI>4O>^4M=:EI=:EK>>>EK?>>EM=ZMK>>EO=ZMM>^EK?^^EO?^MK>>MM>^ESO>EO?^E MO>^MO?^EQN>UM?^ESO>MQL;&QN^UM=Z]M>^UO?^MO?>UO>>]O>^]O?^USO^U MQO>]O<[.SN?&O?>]QO^]QO^]SO?&QO^]WO?&SM;6UO_&QO_&SO_&WO_&Y__. MSN_6SO_.UM[>WO_.WO_6UO_6WO_6Y^?GY__>WO_>Y__GWO_GY__G[__G]^_O M[__O[_?W]__W]__W_____RP`````6P!P``<(_P#_"1Q(L*#!@P@3*ES(L*'# MAQ`C2IQ(L:+%BQ@S:I08J:-'2"!#BAP9DI')1(12JES)LF6@ES!C^IE)L^9, M/3ASZE2XH:?/GAB"8KA`M"B%HT@A*(7PH('3IU`;*)BJ(('5JPBR:M5ZH&N! MKV#!$AA+8(#9LSQ__A0ZM"A1I$F7-HT:E6K5JUBW379 MU["/(]_0V3-SN:,=/_^&[/MW];YCL6>/C;S[7]U66H(+\-6C;;?&%)R%>U)U7 M@$(C*(CA=H9YQR&$$4;76XA]D5BBB?NAJ-Q[<.76HHL@9I5`!M.9=Z",,]*H M77LW(I9CA]#Q:)4-9#22R2:*".+"9'P1.4*1-&;8X'?./4?78PM$T8@K=4A1 M@P4U,*$($WN-F!`)6]9I9'9>!E7;BBQZJ(`5I6RBA@B1I7"(!7LI1`*==7+9 MI8UZJKADGXV]4`HQ9U@@759()+'5`8HNVJBC)N89J9*3BMG``W8\H\@,]('_ MB$,3>H6Z**-VWKG@9AJ"&:!3+\CBRA/B.6F5!F_4FM`)MXK:J*Z[$M8K@`%: M$4TC)M05JU6'*(O0"$>01)`(*@1NNN,_J M:NJ>H+VP##'$RL=;!F/D5:^]]SJ;ZYW[2GH4$>2$,!DDTBD`)G&&W,\*K0-NV4'.89XH-C)8RKP!*%XL8QPPAV3 M6RZ#21HB#AO4JDJ:&!D0F(#//[O\,L.0ZHG*-EB@FZK2#5R`!7T*L?!SU%)[ M_#'1&,BRC1(X/DAQ`Q'H@(48+@Q85=ABC]WRK5-3_[U=*MP4P>^DO]90BSWW MW*.+!G;CS<(*>MM;]I8P(W=U$>?ZVI0&M'S#3C_WL+/*`DY-Y3@+>4?.<="5 MJW6U$?V%[."#7[3B2S7L?).-+STCL$@#;Q81_K@P<`&RB,=QV!@.Q3X"S2` M8%IP:8(02C`$(0AA""5(P/\0(L`2IDYUXH*!';"A0/4UL('O4$<$7SC!=8`# M$!>47?0\4`49J."'*G!`5/_J94(!@@^%BWJ#-<[1PG:\,![Q>$<^@@'%>-!0 M@>C`QAF^!!B`$(>XK!.LH(@!)"`)@'"*;IP#'2U\(3SBD0YYS*** M5KSB.LX!CD_D`'IPT4(*(L`DC9T1C2?\612@X48FQI&&\CC&._`HQQJB@X_4 M4`(@*:"#)$CO5SY#9"+!E09&@N.-"EQ@`]NA#F2L@Y*53.4YSM$-:H3A2V(0 MP=8:`+5#HA%A>8"&-;HQ#E0^$A[M(`@P0;_X$`*?&(* MU,PH2E(F`QK:(*8QT^=$>&Q#&N!H9B6?&8H99O@$F47 M@*'_#&J$LYCC5!\WEH$-==*0G;.4IC:@`0Q-L@4'1T!57/`)+E\*T`FX``8T M_-F-4XYS'=R0QC#*6<55KB^5T$QH-Q::C%/H('9DT(##D*(H`EJ4!3$812TT MRE%P`!2.ZPB'-&SAQ'C0XQ[XN$<]Z(%,E&)QEN-0*#24`8Q+A(`[.V#"821* M@5`1\`0"Y`,M=KI1:X33HV\4QS-F<0XGU@,?_A#(/N[!5*=>4J7:>"=5:3&& MGIS!`YF#BZV^BKH=T&*L_!1F.#LZRW,TPQ8L;`<]\%&0?-0#'JE$QUWYV(V5 MZA48M/`$"(QPA!1)RE:+LBD@8G'8Q%+#K)T]93.:P0LX_\*C'OTP"#[B`LEQB'>\U@BN<`^KBDY<05KGTM)R$=:"3IC"%*I@K72_6=9BA((: ML06'=N-QCWV8>!]UY:,TQTM>:$`C&<`X;RQ,P0E$\"I)6AK!A,'E!$YXXL+0 MC2XP.$R,69Q"&TB.+1/+*<$]KGBE>4VPBV$,6O326!(^N+%R7C.J'<>!$YRP M<'V%#(Q>%.,0U'BM61?KT_!"=?_%2(ZR@I5!Y<.N0A6>X,0CFH`V/6%G7,L] M!)C#C&'61G<8R`"$,EQ<5FNL.JZ:?+MX*! M)"9Q"3#_.,.TR$4Q*)$+?BZ:T1M-% M0%T$21A;$J8N]"YF<0E<2U<9K[:UM%T,;6?7XM*9SC,G)%$(.,PO0\/NLA*. M;>QDLZ(8=3CL3IT-#&%`&]KN?KNNM\2M?5A=WYG7^O;U'[%YG_J`1]5V%HB-?"%\#PA#T97:%W&'QN\!Y7M0>++]3M^5/_?RE=?YA3W!]8P_0O!T<`,8JN`"(Y7= M(OQ(O>I7S_K6N_[UL(?]1A32>GW$_O:XSST_9D][U=M>]ZLO"/!?S_O>\^/W MPU_(\%5?_(',0Q\$\?WR$<(/=\SC^0))OD4&P8#N>]_[CG!'__2/O_S=%\08 M/!```-8?`!08XQ_`OT@;UD__^FO"_`,A__3S3X7Z&Z#^2X!\L8<1Y@`*!FB` MFA```,``YF`0YB=[^<=\V<<#Z\+!^CE`0 MW@`*FG"!U]=Z_U"`FJ`)&)AZ`U$&ZX<'$9AZMZ"`K]!ZT_""H`!]PG=]/9B" M0.@0\Z"`/#`/`^$.*%!_`!`$WA"#J><.%%A_/.`-0.@."K@%XZ=Z\V!]7F@, M'%!_`4`%^*'MQ"#YI"'=^B' MM[![(R@`^'=[\_`*"FB'>+A^%0!]_/]P@G7(`#S``.O'`&V($-.P?EOP@)3( M`=XP$--0`0#``<9@>Z*(`MZ@>MXPAA6`@11(!=D'?_`7@O"G#].@?CQ@#JIW MBT_8@L:`B^(G$(Z`BPPABA7PB0*A"788C,ZG?GC@#LIHB06A#_\W"/PPAGC@ MA>ZPC=RXC>;PA?V'`LRW>[>P?FG8?QP0@OPP@@#0@`GA""1($$$``#SP@O;X M@C0``#3@#?,8!/=HC_G(`_S0A&6@>J_@A/77!N9`B5OPCYK@")0X"+=`B53@ M"/\(D0`P"`FA#[BHA`,QA@A9?Q5@#B`9DA7(#V](`[]7CB;Y"MY@DO6W!0<) MD^M7!@G1?W'_6!!-6`$HL`14\)-`N01M,)`+&`1+<)1(>91#J8P!D(K'UXWN MD(;J]X7KQP-'"914<)6O,)-!@)59J968J(FTN`7T.`W,*'QDF8NL%WT<28\" MZ'OSZ('\0(GW1Q#Z,`_F-PW_IPG19PZ7:!!CR`%G*1`L"0K?.!#ZD)6ZF(D` M``K/9WZ)N00QJ(Q/B)>KIP]O*`"ZN(X+Z)'_<)>OX),"\8;2^)E1J0FB>1"@ M```!L(=0.0W3,(\!H)"I9PRG.!"RV08Q.)$`((ZJ-W]P6`:O8`Z:4`9Y&(BI M1XT+N(/\8`YXH(`V^)G_QP"EJ`_>T`;0B1#`&9*TF8^L:0"1Z)GZ_["&`0"> ME6B9JN<(B>B$##`-P=>'ZR<`!I"(2T`0=!B?\[E^L(@0$/E]WF<`=?D/@Y"' M<+@%E\@/;5"'!?J6J3$H-">LSB`.$VQB%([B'7QB" M:!A]*)I_M_""@3@/AQF%U@<*GYB!MNB#[O^H$.7H"%@H$-9'$*"@H`!0`;>@ MA.Q(?V19?PP0`"[*`Z"ZA`!@D_P`"@2ZG!#Z#WJ)`I28C1JXAO07!']IEP'@ MB<^G#VU(@T'0HO-P"Z+H"'YYA*TX#R?8?V4`"N6HD0*A#PH("@,!CZDX"*.8 MJ8?XJ=VWI?^WCW>9@P!Z?>XP@J6)$(@8`$N@@AY9CEP8?:)Z"]`G`.DX$,HH MA_]0`31@?DP9!-E'`PRPI?K(IZ+8K[\8`-"G#^[0?2[Z#R.XGPGAH)0H`&5@ M#@U(`TUI$,[*`^('K_AWD/3ZG,'(`Q6P!83X#UC:!OK@H7]YD&+ZBS0@J=1* MKP3A#A40`&=Z$*__0(F]J@^C.)@"$00&\'X&4`$;"P"O(*D92;(!@`=<^G[* M:`[N(`#Z:A#F$*;_<`L"4)];ZJ%."Y7A"@!ENJ)`.`]CZ`B9&`0\^P_S5Z5! M6X0'6;0"P0$""8_B%P";"+(D"P!MA#*.)SF5XXVR0$,F+#_((D"80`,(+G.A[WQ^N\CCA_#-M]^%>.D_L/ M\&B^`T&!4BH0%%@&OS<-3=A^4PH`Z7N^'2A^U:<)#&``LAM]\\BI!3%_Y9F? MFS@0;4H0Y0BS=UO`#>RB*/F=_R<`J&J^+VF3!(&(=FB>*'#!!G&"FL"X2]@& M61FQ!?$*7SL//_C#;:@/_SN'6_"3@P!]M_"EB.J`@_"36T#"5EK%5GS%6)S% 36KS%7-S%7OS%8!S&8IP1`<$`.P`` ` end apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/uu-junk-target.out0000644000000000000000000002201711702050534030267 0ustar rootrootReturn-Path: Received: from virtual.mrf.mail.rcn.net ([207.172.4.103]) by mta02.mrf.mail.rcn.net (InterMail vM.4.01.02.27 201-229-119-110) with ESMTP id <20000425112650.ZPUD516.mta02.mrf.mail.rcn.net@virtual.mrf.mail.rcn.net> for ; Tue, 25 Apr 2000 07:26:50 -0400 Received: from [205.139.141.226] (helo=webmail.uwohali.com ident=root) by virtual.mrf.mail.rcn.net with esmtp (Exim 2.12 #3) id 12k3VX-00012G-00 for eryq@zeegee.com; Tue, 25 Apr 2000 07:27:59 -0400 Received: from webmail.uwohali.com (nobody@localhost [127.0.0.1]) by webmail.uwohali.com (8.8.7/8.8.7) with SMTP id GAA10264 for ; Tue, 25 Apr 2000 06:34:43 -0500 Date: Tue, 25 Apr 2000 06:34:43 -0500 Message-Id: <200004251134.GAA10264@webmail.uwohali.com> From: "ADJE Webmail Tech Support" To: eryq@zeegee.com Subject: mime::parser Content-type: multipart/mixed; boundary="---------------------------7d033e3733c" Mime-Version: 1.0 X-Mozilla-Status: 8001 -----------------------------7d033e3733c Content-Type: text/plain Eryq - I occasionally receive an email (see below) like this one, which MIME::Parser does not parse. Any ideas? Is this a valid way to send an attachment, or is the problem on the "sender's" side? Thanks for your time! Mike -->> Promote YOUR web site! FREE Perl CGI scripts add WEB ACCESS to your -->> E-Mail accounts! Download today!! http://webmail.uwohali.com -----------------------------7d033e3733c Content-type: multipart/mixed; boundary="----------=_960622044-2175-0" The following is a multipart MIME message which was extracted from a uuencoded message. ------------=_960622044-2175-0 Here's what he's talking about. I've uuencoded the ZeeGee logo and another GIF file below. ------------=_960622044-2175-0 Content-Type: image/gif; name="up.gif"; x-unix-mode="0644" Content-Disposition: inline; filename="up.gif" Content-Transfer-Encoding: base64 Mime-Version: 1.0 X-Mailer: MIME-tools 5.208 (Entity 5.204) R0lGODdhEwATAKEAAP///wAAAICAgMDAwCwAAAAAEwATAAACR4SPmcHtz0xQFIgJ5ti8b3FJgEcO IKaV3SmSgcdmY9esoUw7XJwO0Gu6pX6MIGqm+giRSR5T5UzulqCq9Yq6aq0oIrECPhQAADs= ------------=_960622044-2175-0 Content-Type: image/gif; name="zeegee.gif"; x-unix-mode="0644" Content-Disposition: inline; filename="zeegee.gif" Content-Transfer-Encoding: base64 Mime-Version: 1.0 X-Mailer: MIME-tools 5.208 (Entity 5.204) R0lGODdhWwBwAPcAAAAAAAgICBAQEDkAITkAKUIAKRgYGEoAKUoAMVIAMVIAOVoAMSEhIVoAOVII MWMAOWMAQloIOWsAQmMIOWMIQikpKVoQOWsIQmsISmMQOWMQQnMISjExMUIpMWsQSnsIUnMQUnMQ SmsYQoQIUoQIWlIpOXMYQowIWjk5OWshQkI5OZQIWpQIY4wQWnMhSoQYUoQYWpQQY1I5QnshUkJC QnMpSoQhSnMpUoQhUoQhWoQpUpQhY0pKSms5UnsxWnM5UpQpY1JSUmNKUlpSSpQxY5Qxa5wxa5Q5 WpQ5Y4RCWpQ5a1paWoxCWoRKY6U5c5xCY4xKa605a5RKY5xCe2NjY3taY6VCc5RSa6VKa3tjY61K a2tra61Kc61Ke4Rja5Rac3tra6VSe61Sc6Vaa7VSc3Nzc4xra61ac61ahLVahK1jc4xzc61je3t7 e5Rzc61jhJxzc61re71je4x7e5xze7Vre71jlJx7e4SEhL1rhJx7lKV7e71rjKV7hKV7lJyEe71z jKV7nN5jjIyMjK17nKWEhM5rlL17jK2EhLV7nM5zjK2EjLV7pd5rlJSUlK2MjLWEpb2EpbWMjLWM lNZ7nL2MjK2UjL2MlN57lN57nJycnN6ElL2UlMaUlMaUnNaMnKWlpeeEpb2cnM6UnNaUnO+Ercac nNaUpd6Mtd6Mvc6cnM6cpd6Upb2lpe+Mpa2trcalpc6lpeeUve+UtdalpdalreecrbW1td6lrd6l pd6ltfecpeelrfecrdatreeltd6treelvd6tte+lrf+ctf+cvb29ve+lvf+cxuetreette+lzvel vf+lve+tvf+lxue1tf+lzvetxsbGxu+1td69te+1vf+tvfe1vee9ve+9vf+1zv+1xve9vc7OzufG vfe9xv+9xv+9zvfGxv+93vfGztbW1v/Gxv/Gzv/G3v/G5//Ozu/Wzv/O1t7e3v/O3v/W1v/W3v/W 5+fn5//e3v/e5//n3v/n5//n7//n9+/v7//v7/f39//39//3/////ywAAAAAWwBwAAcI/wD/CRxI sKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzapQYqaNHSCBDihwZkpHJRIRSqlzJsmWglzBj+plJs+ZM PThz6lS4oafPnhiCYrhAtCiFo0ghKIXwoIHTp1AbKJiqIIHVqwiyatV6oGuBr2DBEhhLYIDZszx/ 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 ------------=_960622044-2175-0-- -----------------------------7d033e3733c-- apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/dup-names_decoded.xml0000644000000000000000000000377611702050534030751 0ustar rootroot
Return-Path: eryq@rhine.gsfc.nasa.gov Sender: john-bigboote Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Eryq <eryq@rhine.gsfc.nasa.gov> Organization: Yoyodyne Propulsion Systems X-Mailer: Mozilla 2.0 (X11; I; Linux 1.1.18 i486) MIME-Version: 1.0 To: john-bigboote@eryq.pr.mcs.net Subject: Two images for you... Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE"
This is a multi-part message in MIME format.
Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="one.gif"
Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="one.gif"
Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="two.nice.gif"
Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="two.nice.gif"
Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="two.nice.gif"
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/german.xml0000644000000000000000000001075011702050534026650 0ustar rootroot
X-POP3-Rcpt: specht@trachea Return-Path: hermes Received: (from hermes@localhost) by kulturbox.netmbx.de (8.7.1/8.7.1) id SAA04513 for specht; Wed, 19 Jun 1996 18:30:12 +0200 Received: by netmbx.netmbx.de (/\==/\ Smail3.1.28.1) from mail.cs.tu-berlin.de with smtp id <m0uWPrO-0004wpC>; Wed, 19 Jun 96 18:12 MES Received: (from nobody@localhost) by mail.cs.tu-berlin.de (8.6.12/8.6.12) id SAA12413; Wed, 19 Jun 1996 18:26:28 +0200 Resent-Date: Wed, 19 Jun 1996 18:26:28 +0200 Resent-Message-Id: <199606191626.SAA12413@mail.cs.tu-berlin.de> Resent-From: nobody@cs.tu-berlin.de Resent-To: kultur@kulturbox.netmbx.de Received: from gatekeeper.telekom.de ([194.25.15.11]) by mail.cs.tu-berlin.de (8.6.12/8.6.12) with SMTP id SAA11678 for <specht@kulturbox.de>; Wed, 19 Jun 1996 18:11:29 +0200 Received: from ULM02.mnh.telekom.de by gatekeeper.telekom.de; (5.65v3.0/1.1.8.2/02Aug95-0132PM) id AA01376; Wed, 19 Jun 1996 18:11:27 +0200 Received: from ulm02.mnh.telekom.de (deuschle@mnh.telekom.de) by ULM02.mnh.telekom.de (8.6.10/3) with SMTP id SAA30680 for <specht@kulturbox.de>; Wed, 19 Jun 1996 18:14:40 GMT Message-Id: <199606191814.SAA30680@ULM02.mnh.telekom.de> X-Sender: deuschle@ulm02.mnh.telekom.de X-Mailer: Windows Eudora Version 1.4.4 Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Date: Wed, 19 Jun 1996 18:12:02 +0200 To: Juergen Specht <specht@kulturbox.de> From: deuschle@mnh.telekom.de (Guenter Deuschle) Subject: Re: 34Mbit/s Netz X-Mozilla-Status: 0011
Hallo Herr Specht, entschuldigen Sie vorab, dass ich Ihnen nicht telefonisch zur Verfuegung stehe, ich Praesentationen gehalten/ noch zu halten und viele Kundennachfragen zu projektieren. Nach Informationen des Produkt-Managers Temme steht der POP schon zur Verf=FCgung! Standort: voraussichtlich: Winterfeldstr. 21, 10781 Berlin. Der POP hat zur Zeit direkte 34M-Anbindungen zu folgenden Orten: Rostock, Hamburg, Hannover & Leipzig. 4 weitere werden in kuerze in Betrieb gehen. Damit haben Sie einen Besonderen Sicherheitsstandard verfuegbar! Kontakt muessen Sie ueber Ihre oerltliche Vertriebseinheit aufnehmen: entweder den Geschaefts-Kunden-Vertrieb oder das GrossKundenManagement. Diese Vertriebseinheiten greifen auf den oertlichen Technischen Vertriebs-Support zu. Die Informationen werden ueber TVS zur Vertriebseiheit gegeben und dann zu Ihnen. Sie benoetigen eine Standleitung von Ihrer Lokation zum Internet-POP Uebergabepunkt zu Ihrem Info-Server ist ein CISCO 1000-Router. Dann zahlen Sie neben den monatlichen Kosten fuer die Standleitung die Kosten fuer den Internet-Zugang: zB bei 64k: 1500DM bei 2GByte Freivolumen. 128K: 3000 DM bei 5 GB Freivolumen & 2M: 30.000 DM bei 50GB Freivolumen. Freundliche Gruesse=20 Guenter Deuschle >Sehr geehrter Herr Deuschle, >Sie sind mir von Herrn Meyendriesch empfohlen worden. >Ich versuche Informationen ueber das T-eigene 34Mbit/s Netz und den=20 >lokalen Pop-Berlin rauszufinden, bzw. was ein Anschluss kostet und=20 >wo man ihn herbekommt. Laut Herrn Schnick in Berlin gibt es den=20 >T-Pop nicht, laut Traceroute von Herrn Meyendriesch sehrwohl. Auch=20 >ist dies Netz in der IX vom Mai 96 erwaehnt. >Koennen Sie mir helfen? > >MfG >--=20 >Juergen Specht - KULTURBOX > > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D Dipl.-Ing. Guenter D E U S C H L E Deutsche Telekom AG Niederlassung 3 Hannover GrossKundenManagement - Techn. Vertriebs-Support: Team-Leiter Internet Online-Dienste --------------------------------------------------- GrKM-TVS-IOD Tel: +49-511-333-2772 Vahrenwalder-Str. 245 FAX: +49-511-333-2751 30179 Hannover eMail: deuschle@mnh.telekom.de=20 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/double-bound_decoded_1_9.txt0000644000000000000000000000000011702050534032077 0ustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-badnames_decoded.xml0000644000000000000000000000216111702050534031745 0ustar rootroot
From: Nathaniel Borenstein <nsb@bellcore.com> To: Ned Freed <ned@innosoft.com> Subject: Sample message MIME-Version: 1.0 Content-type: multipart/mixed; boundary="simple boundary"
This is the preamble. It is to be ignored, though it is a handy place for mail composers to include an explanatory note to non-MIME conformant readers.
Content-type: text/plain; charset=us-ascii; name="/foo/bar"
Content-type: text/plain; charset=us-ascii; name="foo bar"
Content-type: text/plain; charset=us-ascii; name="foobar"
This is the epilogue. It is also to be ignored.
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/intl.msg0000644000000000000000000000063611702050534026335 0ustar rootrootFrom: =?US-ASCII?Q?Keith_Moore?= To: =?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?= CC: =?ISO-8859-1?Q?Andr=E9_?= Pirard BCC: =?ISO-8859-1?Q?Patrik_F=E4ltstr=F6m?= Subject: =?ISO-8859-1?B?SWYgeW91IGNhbiByZWFkIHRoaXMgeW8=?= =?ISO-8859-2?B?dSB1bmRlcnN0YW5kIHRoZSBleGFtcGxlLg==?= =?US-ASCII?Q?.._so,_cool!?= Content-type: text/plain How's this? apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/double-bound_decoded_1_7.txt0000644000000000000000000000000011702050534032075 0ustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-2evil.msg0000644000000000000000000000507611702050534027543 0ustar rootrootReturn-Path: eryq@rhine.gsfc.nasa.gov Sender: john-bigboote Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Eryq Organization: Yoyodyne Propulsion Systems X-Mailer: Mozilla 2.0 (X11; I; Linux 1.1.18 i486) MIME-Version: 1.0 To: john-bigboote@eryq.pr.mcs.net Subject: Two images for you... Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE" This is a multi-part message in MIME format. --------------299A70B339B65A93542D2AE Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit When unpacked, this message should produce two GIF files: * The 1st should be called "3d-compress.gif" * The 2nd should be called "3d-eye.gif" Different ways of specifying the filenames have been used. -- ____ __ / __/__________/_/ Eryq (eryq@rhine.gsfc.nasa.gov) / __/ _/ / / , / Hughes STX Corporation, NASA/Goddard /___/_/ \ /\ /___ /_/ /_____/ http://selsvr.stx.com/~eryq/ --------------299A70B339B65A93542D2AE Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="/evil/because:of\path\3d-=?ISO-8859-1?Q?=63?=om=?US-ASCII*EN?Q?pr?=ess.gif" R0lGODdhKAAoAOMAAAAAAAAAgB6Q/y9PT25ubnCAkKBSLb6+vufn5/Xes/+lAP/6zQAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJLMOyYbcoxkaZ5oCkoH6L5wLMfiWqd4btZhmxbA oFCY47EIqMJgyWw2ATjj7aRkAq5YwDMl9VGtKO0SiuoiTVlscsxt9c4HgXxUIA0EAVOVfDKT 8Hl1B3kDAYYle202XnGGgoMHhYckiWVuR3+OTgCGeZRslotwgJ2lnYigfZdTjQULr7ALBZN0 qTurjHgLKAu0B5Wqopm7J72etQN8t8Ijury+wMtvw8/Hv7Ylfs0BxCbGqMmK0yOOQ0GTCgrR 2bhwJGlXJQYG6mMKoeNoWSbzCWIACe5JwxQm3AkDAbUAQCiQhDZEBeBl6afgCsOBrD45edIv QceGWSMevpOYhl6CkydBHhBZQmGKjihVshypjB9ClAHZMTugzOU7mzhBPiSZ5uDNnA7b/aTZ 0mhMnfl0pDBFa6bUElSPWb0qtYuHrxlwcR17YsWMs2jTql3LFkQEADs= --------------299A70B339B65A93542D2AE Content-Type: image/gif; name="3d-eye-is-an-evil-filename because of excessive length and verbosity. Unfortunately what can we do given an idiotic situation such as this?" Content-Transfer-Encoding: base64 R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7 VujnC96IRVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7 +3dCeRRjfAKHiImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatL rU8GaQdOBAQAB7+yXliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJ vs7Y5ewH3d7Fxe3jB4rj8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjw E0cdGxQ/gswosoKUkmuU2FnJcsSKGTBjypxJsyaICAA7 --------------299A70B339B65A93542D2AE-- That was a multi-part message in MIME format. apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/frag.out0000644000000000000000000025532511702050534026336 0ustar rootrootReturn-Path: Received: from virtual.mrf.mail.rcn.net ([207.172.4.103]) by mta05.mrf.mail.rcn.net (InterMail vM.4.01.02.27 201-229-119-110) with ESMTP id <20000524184032.XKFS1688.mta05.mrf.mail.rcn.net@virtual.mrf.mail.rcn.net> for ; Wed, 24 May 2000 14:40:32 -0400 Received: from mail.desktop.com ([166.90.128.242]) by virtual.mrf.mail.rcn.net with esmtp (Exim 2.12 #3) id 12ug50-00059f-00 for eryq@zeegee.com; Wed, 24 May 2000 14:40:30 -0400 Received: from mailandnews.com (jumpgate.desktop.com [166.90.128.243]) by mail.desktop.com (8.9.2/8.9.2) with ESMTP id LAA31102 for ; Wed, 24 May 2000 11:40:29 -0700 (PDT) (envelope-from omrec@mailandnews.com) Message-ID: <392C2385.4C402C55@mailandnews.com> Date: Wed, 24 May 2000 11:46:29 -0700 From: Sven Reply-To: omrec@mailandnews.com X-Mailer: Mozilla 4.7 [en] (WinNT; I) X-Accept-Language: en MIME-Version: 1.0 To: Eryq Subject: [Fwd: [Fwd: [Fwd: FW: Another Priceless Moment]]] Content-Type: multipart/mixed; boundary="------------ABE49921AF9E83E8F9A7667E" X-Mozilla-Status: 8001 This is a multi-part message in MIME format. --------------ABE49921AF9E83E8F9A7667E Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit --------------ABE49921AF9E83E8F9A7667E Content-Type: message/rfc822 Content-Transfer-Encoding: 7bit Content-Disposition: inline Received: from mail.vynce.org [63.198.43.13] (vynce@vynce.org); Tue, 23 May 2000 22:00:16 -0400 X-Envelope-To: omrec Received: from vynce.org (166.90.128.243) by mail.vynce.org with ESMTP (Eudora Internet Mail Server 1.3.1); Tue, 23 May 2000 19:05:52 -0700 Message-ID: <392B389A.1968998B@vynce.org> Date: Tue, 23 May 2000 19:04:10 -0700 From: Vynce Organization: Desktop.com X-Mailer: Mozilla 4.61 [en] (Win98; U) X-Accept-Language: en MIME-Version: 1.0 To: omrec@mailandnews.com Subject: [Fwd: [Fwd: FW: Another Priceless Moment]] Content-Type: multipart/mixed; boundary="------------4CEB5E448DC077F35050C4BE" X-Mozilla-Status2: 00000000 This is a multi-part message in MIME format. --------------4CEB5E448DC077F35050C4BE Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit just to add to your personal hell. --------------4CEB5E448DC077F35050C4BE Content-Type: message/rfc822 Content-Transfer-Encoding: 7bit Content-Disposition: inline Return-Path: Received: from iglou.com (192.107.41.3) by mail.vynce.org with SMTP (Eudora Internet Mail Server 1.3.1); Thu, 18 May 2000 16:10:02 -0700 Received: from [204.255.234.19] (helo=ntserver2.snesystems.com) by iglou.com with esmtp (8.9.3/8.9.3) id 12sZKw-0007JK-00; Thu, 18 May 2000 19:04:15 -0400 Received: from snesystems.com (sne-30.snesystems.com [204.255.234.30]) by ntserver2.snesystems.com with SMTP (Microsoft Exchange Internet Mail Service Version 5.5.2650.21) id LGJH8AYQ; Thu, 18 May 2000 19:03:40 -0400 Sender: root@mail.vynce.org Message-ID: <39247724.AF25EF83@snesystems.com> Date: Thu, 18 May 2000 19:05:08 -0400 From: root Reply-To: jasonc@snesystems.com Organization: SNE Systems, Inc. X-Mailer: Mozilla 4.72 [en] (X11; I; Linux 2.2.12-20 i686) X-Accept-Language: ja, en MIME-Version: 1.0 To: vynce@vynce.org Subject: [Fwd: FW: Another Priceless Moment] Content-Type: multipart/mixed; boundary="------------8B533A82922407D7C3D35A99" X-Mozilla-Status2: 00000000 This is a multi-part message in MIME format. --------------8B533A82922407D7C3D35A99 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit --------------8B533A82922407D7C3D35A99 Content-Type: message/rfc822 Content-Transfer-Encoding: 7bit Content-Disposition: inline Received: by ntserver2 id <01BFC0CA.C31F7A10@ntserver2>; Thu, 18 May 2000 09:12:47 -0400 Message-ID: <01D476341BDBD211B7C500A0CC209BA03DF5C6@ntserver2> From: Shawn Morgan To: Wayne Price , Tim Spayner , Gary Jones , Jason Chelliah Subject: FW: Another Priceless Moment Date: Thu, 18 May 2000 09:12:47 -0400 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----_=_NextPart_000_01BFC0CA.C32A4450" This message is in MIME format. Since your mail reader does not understand this format, some or all of this message may not be legible. ------_=_NextPart_000_01BFC0CA.C32A4450 Content-Type: text/plain; charset="iso-8859-1" -----Original Message----- From: Shawn Morgan [mailto:cephalos@home.com] Sent: Wednesday, May 17, 2000 8:18 PM To: Shawn Morgan Subject: Fw: Another Priceless Moment ----- Original Message ----- From: Michele Morgan To: Sent: Tuesday, May 16, 2000 10:31 PM Subject: Fw: Another Priceless Moment > > ------_=_NextPart_000_01BFC0CA.C32A4450 Content-Type: image/jpeg; name="aprilfools.jpg" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="aprilfools.jpg" /9j/4AAQSkZJRgABAgEASABIAAD/7Q4uUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQABOEJJTQQNAAAAAAAEAAAAeDhCSU0D8wAAAAAACAAAAAAAAAAAOEJJTQQKAAAAAAAB AAA4QklNJxAAAAAAAAoAAQAAAAAAAAACOEJJTQP1AAAAAABIAC9mZgABAGxmZgAGAAAAAAABAC9m ZgABAKGZmgAGAAAAAAABADIAAAABAFoAAAAGAAAAAAABADUAAAABAC0AAAAGAAAAAAABOEJJTQP4 AAAAAABwAAD/////////////////////////////A+gAAAAA//////////////////////////// /wPoAAAAAP////////////////////////////8D6AAAAAD///////////////////////////// A+gAADhCSU0EAAAAAAAAAgACOEJJTQQCAAAAAAAGAAAAAAAAOEJJTQQIAAAAAAAQAAAAAQAAAkAA AAJAAAAAADhCSU0EFAAAAAAABAAAAAQ4QklNBAwAAAAADH4AAAABAAAAcAAAAFQAAAFQAABuQAAA DGIAGAAB/9j/4AAQSkZJRgABAgEASABIAAD/7gAOQWRvYmUAZIAAAAAB/9sAhAAMCAgICQgMCQkM EQsKCxEVDwwMDxUYExMVExMYEQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQ0L Cw0ODRAODhAUDg4OFBQODg4OFBEMDAwMDBERDAwMDAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM DAwMDAz/wAARCABUAHADASIAAhEBAxEB/90ABAAH/8QBPwAAAQUBAQEBAQEAAAAAAAAAAwABAgQF BgcICQoLAQABBQEBAQEBAQAAAAAAAAABAAIDBAUGBwgJCgsQAAEEAQMCBAIFBwYIBQMMMwEAAhED BCESMQVBUWETInGBMgYUkaGxQiMkFVLBYjM0coLRQwclklPw4fFjczUWorKDJkSTVGRFwqN0NhfS VeJl8rOEw9N14/NGJ5SkhbSVxNTk9KW1xdXl9VZmdoaWprbG1ub2N0dXZ3eHl6e3x9fn9xEAAgIB AgQEAwQFBgcHBgU1AQACEQMhMRIEQVFhcSITBTKBkRShsUIjwVLR8DMkYuFygpJDUxVjczTxJQYW orKDByY1wtJEk1SjF2RFVTZ0ZeLys4TD03Xj80aUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9ic3 R1dnd4eXp7fH/9oADAMBAAIRAxEAPwDmKMugbneoza8yDuAmAA6Fu9M/5vW65mbkMdE7aqAW/wDb vqX7v+261yRxLPszAW6te77iG/3K59X8K2/qrKK2y91dhiJ4G5TCNrTJ627I+qDGFlNXUL39rS+t n/R+j/n0rOfdQXzS1zK+zbHB7v7T2spb/wCBqWT0XqbH6VEjxRMbonV3EOGKXj4Ej8iPAm1qnbuy d7JkEaFbXTulvdWy2+k1se1rmmGtEEbgZIT5WNiNfDXAjx3NP5EuAK4nAOJW5paKaodof0bNf63t UH4uVXWSwAsaCYB1AGv5y3gems+m9o8fc3/vm5KzK6V6Fzd24mt4aGyZJa7by1rUDjjSeIvIHLsP ZRN9pSDfaJ5hNtVLjky0FG2091Amw91PamhDjl3TQRODu5Q3NKOWoFtga70wJf3HYSjEyJA76IJA 3f/QzRjs9QaaFp+8Ef8AklqfVXGrq+smNcB+Zc0wJ+lW4f8AVLHr6n0+0D0rg94J9rWvJLSB7mt2 bnfRUr87qePjuyumU5rL2NmnJqxrYG7a0/pLK9m2yt+3+2pL31YAJXHQ/Y9z9ZKbaWiSWknlumny XNsbY6wS95k+J/vWJ6/106jWHZnU8pjTqKnNfOv7zKq62sciVfVz603NlmTmPB4cA9v/AFT2o+7E blscJ7PQY2Mz7KbbZZVRWx1thbO1rj6bIn6fv/dWgeg2nR9bmuHI2ws/o31c+sAqbjX1ZBp2kPuc 8S4j3sY+p9nvbuWu36udZNjzZ6hAG4WutBc935w2b/b/AFtyacgP+8qujkZfSnVdiPiqDmBgcD+6 fyLpquj9dr1OK0juDcDP/mSIPtlbXV2YbzYQ5ro4kgt9vtd+8gMsfH6ghXCfPyfOw0wPgm2O8F0g +q2UGw2u1xZ7TIazUf1iUQ/VmDDmZAPkGH/vqq8MmSj2P2PC9Sfkty66q7X1NdVuIadoncRuMqs5 97Wlz8m3gERZzrGm0LtM76n4tz/tV1uVQ2msh7jWzYGtJe573OXLdRpda5tdMOquBZjCwVtyLBDX VvtqZHoV3vd+i3fpE/UAImSBtr4hhg5DhW5lj3uLtxFjiXQ0geP7jk9eRXVUBkECNGuI1Bd73Ncf 3fUdZ7lUsdd6ldbS/HNVp9gAIZaezG1t93s/fRXvaXVtur9ZgBfU5ojeR7bHH6TPZtS9QIkB4mt2 E2Tq/wD/0bGL9fej41jbq+g41GQBHq0uZW7jadk4zXN/z1fq/wAZtAG13TyKxo1rLWQG8bfcGtXB hp8U+z4JUe67R9Ab/jE6SQS7CvqkRDW1Oaf68WM3K7j/AFvrzHNGNiXPhzWndsYYId+iY31B+nc1 vqs2fo/SXCjruQG7HY9LmgRwh9OfaHvsbskktJdIhnLm+0sc3luz03f9t/4VuoXQjxSo6PpR61jt rLrmWVvq2m0E6Q47a3Mu2srsc7c1z217/YnZ1TFsbaaS8VY7DZY/Y4nbEub6ftf6n8hcVV17PrbW PWcaGyBuc1hr4f8ATe2yt7bf8I6x/q/6Kz9KiVfWHLrZVW+tjjUfU9b2AuLXO3usbtdS1jvZ+f8A v/pfUStsjD6drl4S/ZJ7E5tDi0i0167CHNJJJDX72MaN3ub7WKFmYWO23vDC0Bz3DTawzsf9J37q 5d31qNlz5ro3XtLXW2Q2GyNN0n1f5N//AIEnt6rUbPXe+ppse9zL9xc6A0l7NjrfZ9JjXM/wu9K0 iAj82mj0js1glwcTWR7TtLZMeL3fnt96hZk1+k6wuLm1NNj4IkkS327HbvUd7lxeV1HKc19LmUWv bA/Tte1vtdy6mi33+7Z/wTP7aFd1vJpayXCyW+kysssa1tZcQG+l7KW2b2fnfpP3Lf0iVrjHQGG/ iOje+sGZ03NdXVcM21p9wpcHNqBA91rmO9Oh30ffZfv/AJz9FWuT6nns+ytw8XBGNhybDsdY+2ot cwW3Mtdt2faf0db2WNt/74pvyzucXM9xJLod3Pu5+aQzSODYPgf/ADJCj2ak5Ek61f8ALd5/17K3 Mc13oBgDqS36QE7fUG3/AAn0ne5GzWip9bAIeTBrDhoPzA1v5rXtf+b/ADq2HZjT9LefiJ/imGVU Pz5PjYzcdPo62Md9H6KOvZi4fF//0uf2FLajbUtqKUO1WME+lbvcJadJAkgH6Y/k79v9tQ2omOCH ODQdRqYlo7e90+32ppZcH84B3sfgvoSQIcxwABc5oEO+iT6kutcyNmz+b/7bTbWuaCG7mBzdW+wu Mbm3ep7d257rH+z/AEisGtu70y/0wXE1cFp0+idw3eps+hZ+Yme11TvUsDWNcNxft2t19m887vZs b7PZ7010AURJHtEuaT7rA0zDw572te7d7G2f4Nn6SpM1zi+plQJvJ2H2hz3gO/Sb7D9J73ufda7+ p/OImzIgOuJJO02WEgASG7vScWt/Qt+kxn7/AOirUH2tLW+oGbgWgDc5tU7g+9m+prrHbHu9yStD SEVl1u8EFrQBWWggncALP5x2/wDRfuf+fFBz7LG0mlrL7DLy46Me2Y9Nn0212/4T/R1I49NzZILQ AXeoQC0Hc32ljv55rf5v2b7FB1bxtqsiCA+6kvPtBG2q1pj6Dnf8X6Vb/wDMQUXNeSbn9/d/AKJn iOO8KZaBYYAgcDnsOEipB0aEZaEGZjvQ9X/eozPhPyUHb48uOEU/P71B0Ef3lJJmNayHy9X/AHr/ AP/TytqRapwkQnFKPaiY7CXOEAiNSZA+9pbtTQi45Yxzt+rXgTEzI8B+cmnZkwmskfNnZWduwSyX NaHACRr7Nrd7WNZp9NzN/wD4Gma6Q0tcQ1xlm72TuO36Lh6v+az/AAac2NsOzTc4lzW7hvLWfTd/ Iayf6+9SdWAXOZDQ4+puJkAACuZeHV/m+7Z/hEx0NCgYQ4GC5o7ja8GZLnN3+72tYf5t3s2fzaib a6HOB41dqZDWs93sdX+Y1n+ERrKw4gAy0ANA9xLRO5rWt3fT/c/PQybGTydo3ExIaTOm12ytm2z9 L7/+3UksLKzOkbnctLxuklvpte1u5zud7bPU9X/BoVnquqEFxLdrmtaIDXE7ffS3a9vp/nXf8V6n qKwHuDnFp2uElp7iNGE2ep6jvcfobWKvl1BtX6cNc2loJeWnc+1vs2W1btl3qu/8ERQdmg5pFjp5 k/3KJaiRLiQI1II85TEJ7nwmBYPXzr/moiP9YUHDT+EIpCg4IgL5ZRVXd31n/wB3J//UzmTrPy4T ledJJ66W/T/B2fRDyi4s+uNsTsfzHH530v5O5ebJJp2XYvnj5h9Mv2bm+vsnYz09v0pn3b/+H3fT 9P8AQeh/MqsfT/QzMaen6nO6WzH+D37/AE154kmOgH0f9J7dm3ZLYmd3J9bf/h9v09n/AAf82pHf v+Y27vpfSd9H1P5P0/T/ADP53/ArzZJJL6R+kn3epumzbPG/c/1ufzdu/wD6z/NoTvR9OyNsRrHP Dv531vd9LZ/6LXniSSTs9i3gzzud+VyZ0Lj0lIHL6vWlDcuWSRU//9k4QklNBAYAAAAAAAcABAAA AAEBAP/iDFhJQ0NfUFJPRklMRQABAQAADEhMaW5vAhAAAG1udHJSR0IgWFlaIAfOAAIACQAGADEA AGFjc3BNU0ZUAAAAAElFQyBzUkdCAAAAAAAAAAAAAAAAAAD21gABAAAAANMtSFAgIAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEWNwcnQAAAFQAAAAM2Rlc2MA AAGEAAAAbHd0cHQAAAHwAAAAFGJrcHQAAAIEAAAAFHJYWVoAAAIYAAAAFGdYWVoAAAIsAAAAFGJY WVoAAAJAAAAAFGRtbmQAAAJUAAAAcGRtZGQAAALEAAAAiHZ1ZWQAAANMAAAAhnZpZXcAAAPUAAAA JGx1bWkAAAP4AAAAFG1lYXMAAAQMAAAAJHRlY2gAAAQwAAAADHJUUkMAAAQ8AAAIDGdUUkMAAAQ8 AAAIDGJUUkMAAAQ8AAAIDHRleHQAAAAAQ29weXJpZ2h0IChjKSAxOTk4IEhld2xldHQtUGFja2Fy ZCBDb21wYW55AABkZXNjAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAEnNSR0Ig SUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAABYWVogAAAAAAAA81EAAQAAAAEWzFhZWiAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAG+i AAA49QAAA5BYWVogAAAAAAAAYpkAALeFAAAY2lhZWiAAAAAAAAAkoAAAD4QAALbPZGVzYwAAAAAA AAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNo AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRlc2MAAAAAAAAA LklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAA LklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAA AAAAAAAAAAAAAABkZXNjAAAAAAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVD NjE5NjYtMi4xAAAAAAAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYx OTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdmlldwAAAAAAE6T+ABRfLgAQzxQAA+3M AAQTCwADXJ4AAAABWFlaIAAAAAAATAlWAFAAAABXH+dtZWFzAAAAAAAAAAEAAAAAAAAAAAAAAAAA AAAAAAACjwAAAAJzaWcgAAAAAENSVCBjdXJ2AAAAAAAABAAAAAAFAAoADwAUABkAHgAjACgALQAy ADcAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8AIEAhgCLAJAAlQCaAJ8ApACpAK4AsgC3ALwA wQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEHAQ0BEwEZAR8BJQErATIBOAE+AUUBTAFSAVkBYAFn AW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB0QHZAeEB6QHyAfoCAwIMAhQCHQImAi8COAJBAksC VAJdAmcCcQJ6AoQCjgKYAqICrAK2AsECywLVAuAC6wL1AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+ A4oDlgOiA64DugPHA9MD4APsA/kEBgQTBCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE0wThBPAE /gUNBRwFKwU6BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZBmoGewaMBp0GrwbA BtEG4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8IMghGCFoIbgiCCJYIqgi+CNII 5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9ClQKagqBCpgKrgrFCtwK8wsLCyILOQtR C2kLgAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4MpwzADNkM8w0NDSYNQA1aDXQNjg2pDcMN3g34DhMO Lg5JDmQOfw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MPzw/sEAkQJhBDEGEQfhCbELkQ1xD1ERMRMRFP EW0RjBGqEckR6BIHEiYSRRJkEoQSoxLDEuMTAxMjE0MTYxODE6QTxRPlFAYUJxRJFGoUixStFM4U 8BUSFTQVVhV4FZsVvRXgFgMWJhZJFmwWjxayFtYW+hcdF0EXZReJF64X0hf3GBsYQBhlGIoYrxjV GPoZIBlFGWsZkRm3Gd0aBBoqGlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4d Rx1wHZkdwx3sHhYeQB5qHpQevh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7 IiciVSKCIq8i3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgllyXHJfcmJyZXJocmtyboJxgn SSd6J6sn3CgNKD8ocSiiKNQpBik4KWspnSnQKgIqNSpoKpsqzysCKzYraSudK9EsBSw5LG4soizX LQwtQS12Last4S4WLkwugi63Lu4vJC9aL5Evxy/+MDUwbDCkMNsxEjFKMYIxujHyMioyYzKbMtQz DTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9Njc2cjauNuk3JDdgN5w31zgUOFA4jDjIOQU5Qjl/ Obw5+To2OnQ6sjrvOy07azuqO+g8JzxlPKQ84z0iPWE9oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRA pkDnQSlBakGsQe5CMEJyQrVC90M6Q31DwEQDREdEikTORRJFVUWaRd5GIkZnRqtG8Ec1R3tHwEgF SEtIkUjXSR1JY0mpSfBKN0p9SsRLDEtTS5pL4kwqTHJMuk0CTUpNk03cTiVObk63TwBPSU+TT91Q J1BxULtRBlFQUZtR5lIxUnxSx1MTU19TqlP2VEJUj1TbVShVdVXCVg9WXFapVvdXRFeSV+BYL1h9 WMtZGllpWbhaB1pWWqZa9VtFW5Vb5Vw1XIZc1l0nXXhdyV4aXmxevV8PX2Ffs2AFYFdgqmD8YU9h omH1YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1mkmboZz1nk2fpaD9olmjsaUNpmmnxakhqn2r3 a09rp2v/bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6cZVx8HJLcqZzAXNdc7h0FHRwdMx1 KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF84X1BfaF+AX5ifsJ/I3+E f+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZyhteHO4efiASIaYjOiTOJmYn+imSK yoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q1pE/kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0 lp+XCpd1l+CYTJi4mSSZkJn8mmia1ZtCm6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNihR6G2oiai lqMGo3aj5qRWpMelOKWpphqmi6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2uoa8W r4uwALB1sOqxYLHWskuywrM4s660JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7urW7LrunvCG8 m70VvY++Cr6Evv+/er/1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dBx7/IPci8yTrJuco4 yrfLNsu2zDXMtc01zbXONs62zzfPuNA50LrRPNG+0j/SwdNE08bUSdTL1U7V0dZV1tjXXNfg2GTY 6Nls2fHadtr724DcBdyK3RDdlt4c3qLfKd+v4DbgveFE4cziU+Lb42Pj6+Rz5PzlhOYN5pbnH+ep 6DLovOlG6dDqW+rl63Dr++yG7RHtnO4o7rTvQO/M8Fjw5fFy8f/yjPMZ86f0NPTC9VD13vZt9vv3 ivgZ+Kj5OPnH+lf65/t3/Af8mP0p/br+S/7c/23////uAA5BZG9iZQBkAAAAAAH/2wCEAAYEBAQF BAYFBQYJBgUGCQsIBgYICwwKCgsKCgwQDAwMDAwMEAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM DAwBBwcHDQwNGBAQGBQODg4UFA4ODg4UEQwMDAwMEREMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwM DAwMDAwMDAwMDP/AABEIAeACgAMBEQACEQEDEQH/3QAEAFD/xAGiAAAABwEBAQEBAAAAAAAAAAAE BQMCBgEABwgJCgsBAAICAwEBAQEBAAAAAAAAAAEAAgMEBQYHCAkKCxAAAgEDAwIEAgYHAwQCBgJz AQIDEQQABSESMUFRBhNhInGBFDKRoQcVsUIjwVLR4TMWYvAkcoLxJUM0U5KismNzwjVEJ5OjszYX VGR0w9LiCCaDCQoYGYSURUaktFbTVSga8uPzxNTk9GV1hZWltcXV5fVmdoaWprbG1ub2N0dXZ3eH l6e3x9fn9zhIWGh4iJiouMjY6PgpOUlZaXmJmam5ydnp+So6SlpqeoqaqrrK2ur6EQACAgECAwUF BAUGBAgDA20BAAIRAwQhEjFBBVETYSIGcYGRMqGx8BTB0eEjQhVSYnLxMyQ0Q4IWklMlomOywgdz 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 q4g+/wBOKrh0r3HTFVhDDqevhirVCHJ6bde+KtToWhNW2FT94xVbHVYIjy+P4eP0ZFtx8050pX1o zAcrJIF5xTyitZP99oRuvPsWwF22I0LRFvJLPKsdpEPWY8JpH2o7Ap8R8aimRbweJL7meWe3kjSO UvaExvyO5OKeClkl7cRWkcYqsZCgIdmr3APfFqlFM7DTF1O9Vbw8oYlqig05HwIxboZKRd/La6be W1jZIvqXFUdPskBlNfiwo+opNqVu73sUssKehH8MdtuSVU0K/NsDbE0jrTT71XJkkWJJBzSMmirT 7KqT+1kSmMt1trolrqv1u5aVXjtVHqK7GNUJH2zx3ffwwLOW6hNNM9otvLKtrKKRMXJU8gPhovU/ CcHCw4lDTvLWnwalZ3P6QNybct60YQqAT0JPsclEKSmEdhY/pPULm3kAiaNISUbYS8qlqftfD8OS Qp2OlST6tE87LPb2tJfTc8RV24Vp/qiuQRki7VJ5RexWkYItxLxZx/LyNA2GmyI2TjV7HTU0e4CR rGgjY8kFGFCKke+PCwjzWW19oT2SpAoeqEUNCWNMkESviSyGzt20uS6IaOW93EYruD9lae2LOORB 2ltqWlre2shKX1+EFjcH4yp2oK9sWUpWmd7o+qzzSSXrrLa3VuLa5h5lVDruZBX4a1xYjmgLCcLq S6dptuOUcPKYqQFb09uS02rizmo65BqepwTQWyvGaDkDxUU9hinYBlunaDaDSoUuwkzMimVpO527 9sBcMzNsb1prWaxS2QWz28CGKEsT6sbgn4dvtZFyNOLKF0qe3k0eS1nSnH+7+L4yxYfEoO/wqCuL dOA4il811c2T+jayFTUFX7jfo2LLw9l2tprss9p9ZijkkJohQ0oxFV38MWojhR2swxDg6SNb3USK 4eNvhSUAcipyJZjITAphqWiX0yW2pS3jzRafAtzJcn+5mc/7qiVeh/yssi4cJEFLtcv7SzeB76wW C8YJNHJQOOD9myLeBTa2ljqV4kt7cRSiMBo7cLWqnooAxZSyUuutEM90hsZPqkinZo6A8fkMWPjI fU9AtrSSDU74tdurUZpPiI49NsmEylxBqbWLOe1Z7cKxXiaKu9V37YWsR6Kia9pOqXltNf2EaSsw SW4XmgbagDKNmwJ8FEzeYdTewljs4WF3YzqZRAnOMwA9qdOS9sLXOFFj0t1BfeZnNvI9pb3ClpQP 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 Ec7jlsTUD2I8cWUrR9zpt9di ------_=_NextPart_000_01BFC0CA.C32A4450-- --------------8B533A82922407D7C3D35A99-- --------------4CEB5E448DC077F35050C4BE-- --------------ABE49921AF9E83E8F9A7667E-- apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/russian_decoded.xml0000644000000000000000000000047111702050534030531 0ustar rootroot
Content-Type: text/plain; charset="US-ASCII"; name==?koi8-r?B?89DJ08/LLmRvYw==?= Content-Disposition: attachment; filename==?koi8-r?B?89DJ08/LLmRvYw==?= Subject: Greetings
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-2evil.xml0000644000000000000000000000576311702050534027560 0ustar rootroot
Return-Path: eryq@rhine.gsfc.nasa.gov Sender: john-bigboote Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Eryq <eryq@rhine.gsfc.nasa.gov> Organization: Yoyodyne Propulsion Systems X-Mailer: Mozilla 2.0 (X11; I; Linux 1.1.18 i486) MIME-Version: 1.0 To: john-bigboote@eryq.pr.mcs.net Subject: Two images for you... Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE"
This is a multi-part message in MIME format.
Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit
When unpacked, this message should produce two GIF files: * The 1st should be called "3d-compress.gif" * The 2nd should be called "3d-eye.gif" Different ways of specifying the filenames have been used. -- ____ __ / __/__________/_/ Eryq (eryq@rhine.gsfc.nasa.gov) / __/ _/ / / , / Hughes STX Corporation, NASA/Goddard /___/_/ \ /\ /___ /_/ /_____/ http://selsvr.stx.com/~eryq/
Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="/evil/because:of\path\3d-=?ISO-8859-1?Q?=63?=om=?US-ASCII*EN?Q?pr?=ess.gif"
R0lGODdhKAAoAOMAAAAAAAAAgB6Q/y9PT25ubnCAkKBSLb6+vufn5/Xes/+lAP/6zQAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJLMOyYbcoxkaZ5oCkoH6L5wLMfiWqd4btZhmxbA oFCY47EIqMJgyWw2ATjj7aRkAq5YwDMl9VGtKO0SiuoiTVlscsxt9c4HgXxUIA0EAVOVfDKT 8Hl1B3kDAYYle202XnGGgoMHhYckiWVuR3+OTgCGeZRslotwgJ2lnYigfZdTjQULr7ALBZN0 qTurjHgLKAu0B5Wqopm7J72etQN8t8Ijury+wMtvw8/Hv7Ylfs0BxCbGqMmK0yOOQ0GTCgrR 2bhwJGlXJQYG6mMKoeNoWSbzCWIACe5JwxQm3AkDAbUAQCiQhDZEBeBl6afgCsOBrD45edIv QceGWSMevpOYhl6CkydBHhBZQmGKjihVshypjB9ClAHZMTugzOU7mzhBPiSZ5uDNnA7b/aTZ 0mhMnfl0pDBFa6bUElSPWb0qtYuHrxlwcR17YsWMs2jTql3LFkQEADs=
Content-Type: image/gif; name="3d-eye-is-an-evil-filename because of excessive length and verbosity. Unfortunately what can we do given an idiotic situation such as this?" Content-Transfer-Encoding: base64
R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7 VujnC96IRVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7 +3dCeRRjfAKHiImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatL rU8GaQdOBAQAB7+yXliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJ vs7Y5ewH3d7Fxe3jB4rj8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjw E0cdGxQ/gswosoKUkmuU2FnJcsSKGTBjypxJsyaICAA7
That was a multi-part message in MIME format.
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/mp-msg-rfc822.xml0000644000000000000000000001303211702050534027577 0ustar rootroot
Date: Thu, 20 Jun 1996 08:35:17 +0200 From: Juergen Specht <specht@kulturbox.de> Organization: KULTURBOX X-Mailer: Mozilla 2.02 (WinNT; I) MIME-Version: 1.0 To: andreas.koenig@mind.de, kun@pop.combox.de, 101762.2307@compuserve.com Subject: [Fwd: Re: 34Mbit/s Netz] Content-Type: multipart/mixed; boundary="------------70522FC73543" X-Filter: mailagent [version 3.0 PL44] for k@.in-berlin.de
This is a multi-part message in MIME format.
Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit
-- Juergen Specht - KULTURBOX
Content-Type: message/rfc822 Content-Transfer-Encoding: 7bit Content-Disposition: inline
X-POP3-Rcpt: specht@trachea Return-Path: hermes Received: (from hermes@localhost) by kulturbox.netmbx.de (8.7.1/8.7.1) id SAA04513 for specht; Wed, 19 Jun 1996 18:30:12 +0200 Received: by netmbx.netmbx.de (/\==/\ Smail3.1.28.1) from mail.cs.tu-berlin.de with smtp id <m0uWPrO-0004wpC>; Wed, 19 Jun 96 18:12 MES Received: (from nobody@localhost) by mail.cs.tu-berlin.de (8.6.12/8.6.12) id SAA12413; Wed, 19 Jun 1996 18:26:28 +0200 Resent-Date: Wed, 19 Jun 1996 18:26:28 +0200 Resent-Message-Id: <199606191626.SAA12413@mail.cs.tu-berlin.de> Resent-From: nobody@cs.tu-berlin.de Resent-To: kultur@kulturbox.netmbx.de Received: from gatekeeper.telekom.de ([194.25.15.11]) by mail.cs.tu-berlin.de (8.6.12/8.6.12) with SMTP id SAA11678 for <specht@kulturbox.de>; Wed, 19 Jun 1996 18:11:29 +0200 Received: from ULM02.mnh.telekom.de by gatekeeper.telekom.de; (5.65v3.0/1.1.8.2/02Aug95-0132PM) id AA01376; Wed, 19 Jun 1996 18:11:27 +0200 Received: from ulm02.mnh.telekom.de (deuschle@mnh.telekom.de) by ULM02.mnh.telekom.de (8.6.10/3) with SMTP id SAA30680 for <specht@kulturbox.de>; Wed, 19 Jun 1996 18:14:40 GMT Message-Id: <199606191814.SAA30680@ULM02.mnh.telekom.de> X-Sender: deuschle@ulm02.mnh.telekom.de X-Mailer: Windows Eudora Version 1.4.4 Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Date: Wed, 19 Jun 1996 18:12:02 +0200 To: Juergen Specht <specht@kulturbox.de> From: deuschle@mnh.telekom.de (Guenter Deuschle) Subject: Re: 34Mbit/s Netz X-Mozilla-Status: 0011
Hallo Herr Specht, entschuldigen Sie vorab, dass ich Ihnen nicht telefonisch zur Verfuegung stehe, ich Praesentationen gehalten/ noch zu halten und viele Kundennachfragen zu projektieren. Nach Informationen des Produkt-Managers Temme steht der POP schon zur Verf=FCgung! Standort: voraussichtlich: Winterfeldstr. 21, 10781 Berlin. Der POP hat zur Zeit direkte 34M-Anbindungen zu folgenden Orten: Rostock, Hamburg, Hannover & Leipzig. 4 weitere werden in kuerze in Betrieb gehen. Damit haben Sie einen Besonderen Sicherheitsstandard verfuegbar! Kontakt muessen Sie ueber Ihre oerltliche Vertriebseinheit aufnehmen: entweder den Geschaefts-Kunden-Vertrieb oder das GrossKundenManagement. Diese Vertriebseinheiten greifen auf den oertlichen Technischen Vertriebs-Support zu. Die Informationen werden ueber TVS zur Vertriebseiheit gegeben und dann zu Ihnen. Sie benoetigen eine Standleitung von Ihrer Lokation zum Internet-POP Uebergabepunkt zu Ihrem Info-Server ist ein CISCO 1000-Router. Dann zahlen Sie neben den monatlichen Kosten fuer die Standleitung die Kosten fuer den Internet-Zugang: zB bei 64k: 1500DM bei 2GByte Freivolumen. 128K: 3000 DM bei 5 GB Freivolumen & 2M: 30.000 DM bei 50GB Freivolumen. Freundliche Gruesse=20 Guenter Deuschle >Sehr geehrter Herr Deuschle, >Sie sind mir von Herrn Meyendriesch empfohlen worden. >Ich versuche Informationen ueber das T-eigene 34Mbit/s Netz und den=20 >lokalen Pop-Berlin rauszufinden, bzw. was ein Anschluss kostet und=20 >wo man ihn herbekommt. Laut Herrn Schnick in Berlin gibt es den=20 >T-Pop nicht, laut Traceroute von Herrn Meyendriesch sehrwohl. Auch=20 >ist dies Netz in der IX vom Mai 96 erwaehnt. >Koennen Sie mir helfen? > >MfG >--=20 >Juergen Specht - KULTURBOX > > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D Dipl.-Ing. Guenter D E U S C H L E Deutsche Telekom AG Niederlassung 3 Hannover GrossKundenManagement - Techn. Vertriebs-Support: Team-Leiter Internet Online-Dienste --------------------------------------------------- GrKM-TVS-IOD Tel: +49-511-333-2772 Vahrenwalder-Str. 245 FAX: +49-511-333-2751 30179 Hannover eMail: deuschle@mnh.telekom.de=20 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/uu-junk.xml0000644000000000000000000002401611702050534026775 0ustar rootroot
Return-Path: <support@webmail.uwohali.com> Received: from virtual.mrf.mail.rcn.net ([207.172.4.103]) by mta02.mrf.mail.rcn.net (InterMail vM.4.01.02.27 201-229-119-110) with ESMTP id <20000425112650.ZPUD516.mta02.mrf.mail.rcn.net@virtual.mrf.mail.rcn.net> for <eryq@mta.mrf.mail.rcn.net>; Tue, 25 Apr 2000 07:26:50 -0400 Received: from [205.139.141.226] (helo=webmail.uwohali.com ident=root) by virtual.mrf.mail.rcn.net with esmtp (Exim 2.12 #3) id 12k3VX-00012G-00 for eryq@zeegee.com; Tue, 25 Apr 2000 07:27:59 -0400 Received: from webmail.uwohali.com (nobody@localhost [127.0.0.1]) by webmail.uwohali.com (8.8.7/8.8.7) with SMTP id GAA10264 for <eryq@zeegee.com>; Tue, 25 Apr 2000 06:34:43 -0500 Date: Tue, 25 Apr 2000 06:34:43 -0500 Message-Id: <200004251134.GAA10264@webmail.uwohali.com> From: "ADJE Webmail Tech Support" <support@webmail.uwohali.com> To: eryq@zeegee.com Subject: mime::parser Content-type: multipart/mixed; boundary="---------------------------7d033e3733c" Mime-Version: 1.0 X-Mozilla-Status: 8001
Content-Type: text/plain
Eryq - I occasionally receive an email (see below) like this one, which MIME::Parser does not parse. Any ideas? Is this a valid way to send an attachment, or is the problem on the "sender's" side? Thanks for your time! Mike -->> Promote YOUR web site! FREE Perl CGI scripts add WEB ACCESS to your -->> E-Mail accounts! Download today!! http://webmail.uwohali.com
Here's what he's talking about. I've uuencoded the ZeeGee logo and another GIF file below. begin 644 up.gif M1TE&.#=A$P`3`*$``/___P```("`@,#`P"P`````$P`3```"1X2/F<'MSTQ0 M%(@)YMB\;W%)@$<.(*:5W2F2@<=F8]>LH4P[7)P.T&NZI7Z,(&JF^@B121Y3 4Y4SNEJ"J]8JZ:JTH(K$"/A0``#L` ` end begin 644 zeegee.gif M1TE&.#=A6P!P`/<```````@("!`0$#D`(3D`*4(`*1@8&$H`*4H`,5(`,5(` M.5H`,2$A(5H`.5((,6,`.6,`0EH(.6L`0F,(.6,(0BDI*5H0.6L(0FL(2F,0 M.6,00G,(2C$Q,4(I,6L02GL(4G,04G,02FL80H0(4H0(6E(I.7,80HP(6CDY M.6LA0D(Y.90(6I0(8XP06G,A2H084H086I008U(Y0GLA4D)"0G,I2H0A2G,I M4H0A4H0A6H0I4I0A8TI*2FLY4GLQ6G,Y4I0I8U)24F-*4EI22I0Q8Y0Q:YPQ M:Y0Y6I0Y8X1"6I0Y:UI:6HQ"6H1*8Z4Y<YQ"8XQ*:ZTY:Y1*8YQ">V-C8WM: M8Z5"<Y12:Z5*:WMC8ZU*:VMK:ZU*<ZU*>X1C:Y1:<WMK:Z52>ZU2<Z5::[52 M<W-S<XQK:ZU:<ZU:A+5:A*UC<XQS<ZUC>WM[>Y1S<ZUCA)QS<ZUK>[UC>XQ[ M>YQS>[5K>[UCE)Q[>X2$A+UKA)Q[E*5[>[UKC*5[A*5[E)R$>[USC*5[G-YC MC(R,C*U[G*6$A,YKE+U[C*V$A+5[G,YSC*V$C+5[I=YKE)24E*V,C+6$I;V$ MI;6,C+6,E-9[G+V,C*V4C+V,E-Y[E-Y[G)R<G-Z$E+V4E,:4E,:4G-:,G*6E MI>>$I;V<G,Z4G-:4G.^$K<:<G-:4I=Z,M=Z,O<Z<G,Z<I=Z4I;VEI>^,I:VM MK<:EI<ZEI>>4O>^4M=:EI=:EK>><K;6UM=ZEK=ZEI=ZEM?><I>>EK?><K=:M MK>>EM=ZMK>>EO=ZMM>^EK?^<M?^<O;V]O>^EO?^<QN>MK>>MM>^ESO>EO?^E MO>^MO?^EQN>UM?^ESO>MQL;&QN^UM=Z]M>^UO?^MO?>UO>>]O>^]O?^USO^U MQO>]O<[.SN?&O?>]QO^]QO^]SO?&QO^]WO?&SM;6UO_&QO_&SO_&WO_&Y__. MSN_6SO_.UM[>WO_.WO_6UO_6WO_6Y^?GY__>WO_>Y__GWO_GY__G[__G]^_O M[__O[_?W]__W]__W_____RP`````6P!P``<(_P#_"1Q(L*#!@P@3*ES(L*'# MAQ`C2IQ(L:+%BQ@S:I08J:-'2"!#BAP9DI')1(12JES)LF6@ES!C^IE)L^9, M/3ASZE2XH:?/GAB"8KA`M"B%HT@A*(7PH('3IU`;*)BJ(('5JPBR:M5ZH&N! MKV#!$AA+8(#9LSQ__A0ZM"A1I$F7-HT:E6K5JUBW<O4:-BS9LF<'I%7KDVU; MHW"/RIU+]RE5O'GU9N7;5RQ9M`D_$%;+UNW;Q$N9-H9J%W("R7L/5+8\UJS" M#YHW%Q;J^4)B"J$9CRYM&C6"KJI7%_@K.#-LV;-IN[V-6ZGNW5--G_9->379 MU["/(]_0V3-SN:,=/_^&[/MW];YCL6>/C;S[<M#@PTL=3QXU<.'#U:_?SMW] M9_BBR3??7?79%]QJ^JW'GFS^_1>7<P+R5J!>]U66H(+\-6C;;?&%)R%>U)U7 M@$(C*(CA=H9YQR&$$4;76XA]D5BBB?NAJ-Q[<.76HHL@9I5`!M.9=Z",,]*H M77LW(I9CA]#Q:)4-9#22R2:*".+"9'P1.4*1-&;8X'?./4?78PM$T8@K=4A1 M@P4U,*$($WN-F!`)6]9I9'9>!E7;BBQZJ(`5I6RBA@B1I7"(!7LI1`*==7+9 MI8UZJKADGXV]4`HQ9U@@759()+'5`8HNVJBC)N89J9*3BMG``W8\H\@,]('_ MB$,3>H6Z**-VWKG@9AJ"&:!3+\CBRA/B.6F5!F_4FM`)MXK:J*Z[$M8K@`%: M$4TC)M05JU6'*(O0"<PV.RJI-2*9Y(8`2F!(-'),T"1>$>01)`(*@1NNN,_J M:NJ>H+VP##'$RL=;!F/D5:^]]SJ;ZYW[2GH4$>2$<L.O35;E`A,@'HQPL[@N M_*BYI_XW!3F8>,!DDTBD`)G&&W,\*K0-NV4'.89XH-C)8RKP!*%XL8QPPAV3 M6RZ#21HB#AO4JDJ:&!D0F(#//[O\,L.0ZHG*-EB@FZK2#5R`!7T*L?!SU%)[ M_#'1&,BRC1(X/DAQ`Q'H@(48+@Q85=ABC]WRK5-3_[U=*MP4P>^DO]90BSWW MW*.+!G;CS<(*>MM;]I8P(W=U$>?ZVI0&M'S#3C_WL+/*`DY-Y3@+>4?.<="5 MJW6U$?V%[."#7[3B2S7L?).-+S<X=CKJD4N.K]GKP0`$%UQT@3PJZ<`.U+E: MWPS!&G]8(@HLL+1BR0]0_8XZY,%/3CEL.Z3!BC7KM*.^^NJD$XPSGZ"10^RR M?^=%%F"L,<?^8)30?4*H"Z``@P>TCL$@#;Q81_K@P<`&RB,=QV!@.Q3X"S2` M8%IP:8(02C`$(0AA""5(P/\0(L`2IDYUXH*!';"A0/4UL('O4$<$7SC!=8`# M$!>47?0\4`49J."'*G!`5/_J94(!@@^%BWJ#-<[1PG:\,![Q>$<^@@'%>-!0 M@>C`QAF^!!</_$`&'>B`$(>XK!.LH(@!)"`)@'"*;IP#'2U\(3SBD0YYS*** M5KSB.LX!CD_D`'IPT4(*(L`DC9T1C2?\612@X48FQI&&\CC&._`HQQJB@X_4 M4`(@*:"#)$CO5SY#9"+!E09&@N.-"EQ@`]NA#F2L@Y*53.4YSM$-:H3A2V(0 MP=8:`+5#HA%A>8"&-;HQ#E0^$A[M(`<SRB''9M9P'9<$1S>@P0;_X$`*?&(* MU,PH2E(F`QK:(*8QT^=$>&Q#&N!H9B6?&<UN6`,:M[P1&4(0O>8H99O@$F47 M@*'_#&J$LYCC5!\WEH$-==*0G;.4IC:@`0Q-L@4'1T!57/`)+E\*T`FX``8T M_-F-4XYS'=R0QC#*6<55KB^5T$QH-Q::C%/H('9DT(##D*(H`EJ4!3$812TT MRE%P`!2.ZPB'-&SAQ'C0XQ[XN$<]Z(%,E&)QEN-0*#24`8Q+A(`[.V#"821* M@5`1\`0"Y`,M=KI1:X33HV\4QS-F<0XGU@,?_A#(/N[!5*=>4J7:>"=5:3&& MGIS!`YF#BZV^BKH=T&*L_!1F.#LZRW,TPQ8L;`<]\%&0?-0#'JE$QUWYV(V5 MZA48M/`$"(QPA!1)RE:+LBD@8G'8Q%+#K)T]93.:P0LX_\*C'OTP"#[B`<W- M<M:SU&`H:%41!SDD9ZN?(1''@K<#5:QB%;0`AFMAVXUK/(,5LT2'9'-;D'M@ MMK'GB&IG\QI<JN*"%JK@Q$N/B]RN)J1.S8K<&U3A7,1JM*S:P,8S/@$.C[[R M'G$=2#Z8>LEQB'>\U@BN<`^KBDY<05KGTM)R$=:"3IC"%*I@K72_6=9BA((: ML06'=N-QCWV8>!]UY:,TQTM>:$`C&<`X;RQ,P0E$\"I)6AK!A,'E!$YXXL+0 MC2XP.$R,69Q"&TB.+1/+*<$]KGBE>4VPBV$,6O326!(^N+%R7C.J'<>!$YRP M<'V%#(Q>%.,0U'BM61?KT_!"=?_%2(ZR@I5!Y<.N0A6>X,0CFH`V/6%G7,L] M!)C#C&'61G<8R`"$,EQ<5FNL.<Z0CK*4&4U5Z1XV%JJ@,2<6`8>JZ:?+MX*! M)"9Q"3#_.,.TR$4Q*)$+?BZ:T1M-<W!E+6M83U6ZEJ8%IDV19TD@`@Y7-=>% M0%T$21A;$J8N]"YF<0E<2U<9K[:UM%T,;6?7XM*9SC,G)%$(.,PO0\/NLA*. M;>QDLZ(8=3CL3IT-#&%`&]KN?K<RA,%N8%S;SMD&LR06L0<X^.!(LKD0;$9U MA4<\8A&+*#<G1E&,/*!:W>NNM\2M?5A=WYG7^O;U'<SP;X`31N`#KU/!%X&( MDI>[%YG_J`1]5V%HB-?"%\#PA<QACNM:V+SB%J<OQK?MZSW0P0P]&)I:0)Z= M+8V\$'TH1,))40PS^!C#SF4YSJ=.]8K'(A9WSK0I.I%Q1!3B#F[P0M!/-/2$ M]$17(X#"P??`]D)(HAEUF`28._%CJ#_WZGB?.MZQGO4+[_P2QO9ZO\V0A;&3 MW2>#T97:%W&'QN\!Y7M0>++]3M^5/_?RE=?YA3W!]8P_0O!T<`,8JN`"(Y7= M(OQ(O>I7S_K6N_[UL(?]1A32>GW$_O:XSST_9D][U=M>]ZLO"/!?S_O>\^/W MPU_(\%5?_(',0Q\$\?WR$<(/=\SC^0))OD4&P8#N>]_[CG!'__2/O_S=%\08 M/!```-8?`!08XQ_`OT@;UD__^FO"_`,A__3S3X7Z&Z#^2X!\L8<1Y@`*!FB` MFA```,``YF`0YB=[^<=\V<<#Z\<!H.`._#`/T]!_`+`$Q)=]^+<1>+!^CE`0 MW@`*FG"!U]=Z_U"`FJ`)&)AZ`U$&ZX<'$9AZMZ"`K]!ZT_""H`!]PG=]/9B" M0.@0\Z"`/#`/`^$.*%!_`!`$WA"#J><.%%A_/.`-0.@."K@%XZ=Z\V!]7F@, M'%!_`4`%^*</YF`,30B`1;@02P```G`+`^$-Z@<`!L`#_V>'MQ"#YI"'=^B' MM[![(R@`^'=[\_`*"FB'>+A^%0!]_/]P@G7(`#S``.O'`&V($-.P?EOP@)3( M`=XP$--0`0#``<9@>Z*(`MZ@>MXPAA6`@11(!=D'?_`7@O"G#].@?CQ@#JIW MBT_8@L:`B^(G$(Z`BPPABA7PB0*A"788C,ZG?GC@#LIHB06A#_\W"/PPAGC@ MA>ZPC=RXC>;PA?V'`LRW>[>P?FG8?QP0@OPP@@#0@`GA""1($$$``#SP@O;X M@C0``#3@#?,8!/=HC_G(`_S0A&6@>J_@A/77!N9`B5OPCYK@")0X"+=`B53@ M"/\(D0`P"`FA#[BHA`,QA@A9?Q5@#B`9DA7(#V](`[]7CB;Y"MY@DO6W!0<) MD^M7!@G1?W'_6!!-6`$HL`14\)-`N01M,)`+&`1+<)1(>91#J8P!D(K'UXWN MD(;J]X7KQP-'"914<)6O,)-!@)59J968J(FTN`7T.`W,*'QDF8NL%WT<28\" MZ'OSZ('\0(GW1Q#Z,`_F-PW_IPG19PZ7:!!CR`%G*1`L"0K?.!#ZD)6ZF(D` M``K/9WZ)N00QJ(Q/B)>KIP]O*`"ZN(X+Z)'_<)>OX),"\8;2^)E1J0FB>1"@ M```!L(=0.0W3,(\!H)"I9PRG.!"RV08Q.)$`((ZJ-W]P6`:O8`Z:4`9Y&(BI M1XT+N(/\8`YXH(`V^)G_QP"EJ`_>T`;0B1#`&9*TF8^L:0"1Z)GZ_["&`0"> ME6B9JN<(B>B$##`-P=>'ZR<`!I"(2T`0=!B?\[E^L(@0$/E]WF<`=?D/@Y"' M<+@%E\@/;5"'!?J6J3</;8`"!A"A0?"#P2<0\[`$ZUD!?%D0\Q`$&;JA$J&. M&HB7"=&<QN`.#*I[!W&7T^"9*^H.+1H1OX=]$G%]-ZBBS;<0&-E^QN"7$-$& M_Z>$H-">LSB`.<H09(D"FH"=`G"B#T&#/%""_Z",TW"D&#$/"UBE_V`,`$`% M[^<0`E`!!*&,7SI[M)A_$7&09<",%<`!;<@/K_""U;E[U?>$VQB%([B'7QB" M:!A]*)I_M_""@3@/AQF%U@<*GYB!MNB#[O^H$.7H"%@H$-9'$*"@H`!0`;>@ MA.Q(?V19?PP0`"[*`Z"ZA`!@D_P`"@2ZG!#Z#WJ)`I28C1JXAO07!']IEP'@ MB<^G#VU(@T'0HO-P"Z+H"'YYA*TX#R?8?V4`"N6HD0*A#PH("@,!CZDX"*.8 MJ8?XJ=VWI?^WCW>9@P!Z?>XP@J6)$(@8`$N@@AY9CEP8?:)Z"]`G`.DX$,HH MA_]0`31@?DP9!-E'`PRPI?K(IZ+8K[\8`-"G#^[0?2[Z#R.XGPGAH)0H`&5@ M#@U(`TUI$,[*`^('K_AWD/3ZG,'(`Q6P!83X#UC:!OK@H7]YD&+ZBS0@J=1* MKP3A#A40`&=Z$*__0(F]J@^C.)@"$00&\'X&4`$;"P"O(*D92;(!@`=<^G[* M:`[N(`#Z:A#F$*;_<`L"4)];ZJ%."Y7A"@!ENJ)`.`]CZ`B9&`0\^P_S5Z5! M6X0'6;0"P0$""8_B%P";"+(D"P!M<!#SP`!B:K58RYLT":T'X0V:X*0"L9I! M@*5+T*@$L04T^P]!.[1N*Z`!8`X\P`&CV8I)*Q!EN*(,@+F(N)][RP#75[K7 M%X4D>A#*.)SF5XXVR0$,F+#_((D"80`,(+G.A[<!P*P'.7_!2`,&X("9B+F@ MT+D"T7\)^X7;F!#NT*5.NWMD*7YJ"H8#\;*U.ZYM2Q`H,)79%P#P.A"KQ\FL MLZ@/8X@"_U"\ZXJT6`M_7^@-!A"U"/&&6Q"%\Y>WQ^N\CCA_#-M]^%>.D_L/ M\&B^`T&!4BH0%%@&OS<-3=A^4PH`Z7N^'2A^U:<)#&``LAM]\\BI!3%_Y9F? MFS@0;4H0Y0BS=UO`#>RB*/F=_R<`J&J^+VF3!(&(=FB>*'#!!G&"FL"X2]@& M61FQ!?$*7SL//_C#;:@/_SN'6_"3@P!]M_"EB.J`@_"36T#"5EK%5GS%6)S% 36KS%7-S%7OS%8!S&8IP1`<$`.P`` ` end
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/intl_decoded.xml0000644000000000000000000000114711702050534030014 0ustar rootroot
From: =?US-ASCII?Q?Keith_Moore?= <moore@cs.utk.edu> To: =?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?= <keld@dkuug.dk> CC: =?ISO-8859-1?Q?Andr=E9_?= Pirard <PIRARD@vm1.ulg.ac.be> BCC: =?ISO-8859-1?Q?Patrik_F=E4ltstr=F6m?= <paf@nada.kth.se> Subject: =?ISO-8859-1?B?SWYgeW91IGNhbiByZWFkIHRoaXMgeW8=?= =?ISO-8859-2?B?dSB1bmRlcnN0YW5kIHRoZSBleGFtcGxlLg==?= =?US-ASCII?Q?.._so,_cool!?= Content-type: text/plain
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-igor2_decoded_1_4.txt0000644000000000000000000000161211702050534031677 0ustar rootroot* Waiting for a MIME message from STDIN... ============================================================ Content-type: multipart/mixed Body-file: NONE Subject: A complex nested multipart example Num-parts: 3 -- Content-type: text/plain Body-file: ./testout/msg-3538-1.doc -- Content-type: text/plain Body-file: ./testout/msg-3538-2.doc -- Content-type: multipart/parallel Body-file: NONE Subject: Part 3 of the outer message is multipart! Num-parts: 2 -- Content-type: image/gif Body-file: ./testout/3d-compress.gif Subject: Part 1 of the inner message is a GIF, "3d-compress.gif" -- Content-type: image/gif Body-file: ./testout/3d-eye.gif Subject: Part 2 of the inner message is another GIF, "3d-eye.gif" -- ============================================================ apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/infinite_decoded.xml0000644000000000000000000000054511702050534030654 0ustar rootroot
Content-Type: TEXT/PLAIN; name=109f53c446c8882f4318316ecf4480ce Content-Transfer-Encoding: BASE64 Content-ID: <Pine.LNX.3.96.981121145143.30463I@linux2.americasnet.com> Content-Description:
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/frag_decoded.xml0000644000000000000000000001540311702050534027765 0ustar rootroot
Return-Path: <omrec@mailandnews.com> Received: from virtual.mrf.mail.rcn.net ([207.172.4.103]) by mta05.mrf.mail.rcn.net (InterMail vM.4.01.02.27 201-229-119-110) with ESMTP id <20000524184032.XKFS1688.mta05.mrf.mail.rcn.net@virtual.mrf.mail.rcn.net> for <eryq@mta.mrf.mail.rcn.net>; Wed, 24 May 2000 14:40:32 -0400 Received: from mail.desktop.com ([166.90.128.242]) by virtual.mrf.mail.rcn.net with esmtp (Exim 2.12 #3) id 12ug50-00059f-00 for eryq@zeegee.com; Wed, 24 May 2000 14:40:30 -0400 Received: from mailandnews.com (jumpgate.desktop.com [166.90.128.243]) by mail.desktop.com (8.9.2/8.9.2) with ESMTP id LAA31102 for <eryq@zeegee.com>; Wed, 24 May 2000 11:40:29 -0700 (PDT) (envelope-from omrec@mailandnews.com) Message-ID: <392C2385.4C402C55@mailandnews.com> Date: Wed, 24 May 2000 11:46:29 -0700 From: Sven <omrec@mailandnews.com> Reply-To: omrec@mailandnews.com X-Mailer: Mozilla 4.7 [en] (WinNT; I) X-Accept-Language: en MIME-Version: 1.0 To: Eryq <eryq@zeegee.com> Subject: [Fwd: [Fwd: [Fwd: FW: Another Priceless Moment]]] Content-Type: multipart/mixed; boundary="------------ABE49921AF9E83E8F9A7667E" X-Mozilla-Status: 8001
This is a multi-part message in MIME format.
Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit
Content-Type: message/rfc822 Content-Transfer-Encoding: 7bit Content-Disposition: inline
Received: from mail.vynce.org [63.198.43.13] (vynce@vynce.org); Tue, 23 May 2000 22:00:16 -0400 X-Envelope-To: omrec Received: from vynce.org (166.90.128.243) by mail.vynce.org with ESMTP (Eudora Internet Mail Server 1.3.1); Tue, 23 May 2000 19:05:52 -0700 Message-ID: <392B389A.1968998B@vynce.org> Date: Tue, 23 May 2000 19:04:10 -0700 From: Vynce <vynce@vynce.org> Organization: Desktop.com X-Mailer: Mozilla 4.61 [en] (Win98; U) X-Accept-Language: en MIME-Version: 1.0 To: omrec@mailandnews.com Subject: [Fwd: [Fwd: FW: Another Priceless Moment]] Content-Type: multipart/mixed; boundary="------------4CEB5E448DC077F35050C4BE" X-Mozilla-Status2: 00000000
This is a multi-part message in MIME format.
Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit
Content-Type: message/rfc822 Content-Transfer-Encoding: 7bit Content-Disposition: inline
Return-Path: <jasonc@snesystems.com> Received: from iglou.com (192.107.41.3) by mail.vynce.org with SMTP (Eudora Internet Mail Server 1.3.1); Thu, 18 May 2000 16:10:02 -0700 Received: from [204.255.234.19] (helo=ntserver2.snesystems.com) by iglou.com with esmtp (8.9.3/8.9.3) id 12sZKw-0007JK-00; Thu, 18 May 2000 19:04:15 -0400 Received: from snesystems.com (sne-30.snesystems.com [204.255.234.30]) by ntserver2.snesystems.com with SMTP (Microsoft Exchange Internet Mail Service Version 5.5.2650.21) id LGJH8AYQ; Thu, 18 May 2000 19:03:40 -0400 Sender: root@mail.vynce.org Message-ID: <39247724.AF25EF83@snesystems.com> Date: Thu, 18 May 2000 19:05:08 -0400 From: root <jasonc@snesystems.com> Reply-To: jasonc@snesystems.com Organization: SNE Systems, Inc. X-Mailer: Mozilla 4.72 [en] (X11; I; Linux 2.2.12-20 i686) X-Accept-Language: ja, en MIME-Version: 1.0 To: vynce@vynce.org Subject: [Fwd: FW: Another Priceless Moment] Content-Type: multipart/mixed; boundary="------------8B533A82922407D7C3D35A99" X-Mozilla-Status2: 00000000
This is a multi-part message in MIME format.
Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit
Content-Type: message/rfc822 Content-Transfer-Encoding: 7bit Content-Disposition: inline
Received: by ntserver2 id <01BFC0CA.C31F7A10@ntserver2>; Thu, 18 May 2000 09:12:47 -0400 Message-ID: <01D476341BDBD211B7C500A0CC209BA03DF5C6@ntserver2> From: Shawn Morgan <ShawnM@snesystems.com> To: Wayne Price <WayneP@snesystems.com>, Tim Spayner <TimS@snesystems.com>, Gary Jones <Garyj@snesystems.com>, Jason Chelliah <JasonC@snesystems.com> Subject: FW: Another Priceless Moment Date: Thu, 18 May 2000 09:12:47 -0400 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----_=_NextPart_000_01BFC0CA.C32A4450"
This message is in MIME format. Since your mail reader does not understand this format, some or all of this message may not be legible.
Content-Type: text/plain; charset="iso-8859-1"
Content-Type: image/jpeg; name="aprilfools.jpg" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="aprilfools.jpg"
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/double-bound_decoded_1_10.bin0000644000000000000000000000054511702050534032116 0ustar rootrootGIF87a((óÌÝîÿ¾¾¾ˆˆˆnnnÌÝîÿÿÿççç,((þÉI«½x–Ì;.2Œdižh Jè¾p,ÇâZ{8Ö†mîS;Vèç ÞˆE[Y8Ÿã’ù¬Bk¼¡ÏÊD•ZN×z‘†-ãkÆŒI;S# ¸í†äYt:ÀïûûwByc|‡ˆ‰‰_ƒ]‰nUBV‘‡“c–G˜šœ“‚—¡¢i¤Ÿ§©U±U«K­OiN¿²^X—N¸ÆÅ¸¼V›¿ÀN´··¿ˆOÙÎÈÑÆà¸ÎºŠÍÏWlàÉ¾ÎØåìÝÞÅÅíãŠãòÞ¸Öº¯fá)Í×±X*LhÍ#aǘ4œC!–ĉŽ$X¼8ðG?‚Ì(²‚”’k”ØYÉrÄŠ0cÊœI³&ˆ;apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-clen.xml0000644000000000000000000000330411702050534027445 0ustar rootroot
From: Nathaniel Borenstein <nsb@bellcore.com> To: Ned Freed <ned@innosoft.com> Subject: Sample message MIME-Version: 1.0 Content-type: multipart/mixed; boundary="simple boundary"
This is the preamble. It is to be ignored, though it is a handy place for mail composers to include an explanatory note to non-MIME conformant readers.
This is implicitly typed plain ASCII text. It does NOT end with a linebreak.
Content-type: text/x-numbers; charset=us-ascii Content-length: 30
123456789 123456789 123456789
Content-type: text/x-alphabet; charset=us-ascii Content-length: 600
ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012
This is the epilogue. It is also to be ignored.
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-igor2.msg0000644000000000000000000002502211702050534027535 0ustar rootrootDate: Thu, 6 Jun 1996 15:50:39 +0400 (MOW DST) From: Starovoitov Igor To: eryq@rhine.gsfc.nasa.gov Subject: Need help MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="-490585488-806670346-834061839=:2195" This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. Send mail to mime@docserver.cac.washington.edu for more info. ---490585488-806670346-834061839=:2195 Content-Type: TEXT/PLAIN; charset=US-ASCII Dear Sir, I have a problem with Your MIME-Parser-1.9 and multipart-nested messages. Not all parts are parsed. Here my Makefile, Your own multipart-nested.msg and its out after "make test". Some my messages not completely parsed too. Is this a bug? Thank You for help. Igor Starovoytov. ---490585488-806670346-834061839=:2195 Content-Type: TEXT/PLAIN; charset=US-ASCII; name=Makefile Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Makefile Iy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQ0KIyBNYWtlZmlsZSBmb3IgTUlNRTo6DQojLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tDQoNCiMgV2hlcmUgdG8gaW5zdGFsbCB0aGUgbGlicmFy aWVzOg0KU0lURV9QRVJMID0gL3Vzci9saWIvcGVybDUNCg0KIyBXaGF0IFBl cmw1IGlzIGNhbGxlZCBvbiB5b3VyIHN5c3RlbSAobm8gbmVlZCB0byBnaXZl IGVudGlyZSBwYXRoKToNClBFUkw1ICAgICA9IHBlcmwNCg0KIyBZb3UgcHJv YmFibHkgd29uJ3QgbmVlZCB0byBjaGFuZ2UgdGhlc2UuLi4NCk1PRFMgICAg ICA9IERlY29kZXIucG0gRW50aXR5LnBtIEhlYWQucG0gUGFyc2VyLnBtIEJh c2U2NC5wbSBRdW90ZWRQcmludC5wbQ0KU0hFTEwgICAgID0gL2Jpbi9zaA0K DQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tDQojIEZvciBpbnN0YWxsZXJzLi4uDQojLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tDQoNCmhlbHA6CQ0KCUBlY2hvICJWYWxpZCB0YXJnZXRz OiB0ZXN0IGNsZWFuIGluc3RhbGwiDQoNCmNsZWFuOg0KCXJtIC1mIHRlc3Rv dXQvKg0KDQp0ZXN0Og0KIwlAZWNobyAiVEVTVElORyBIZWFkLnBtLi4uIg0K Iwkke1BFUkw1fSBNSU1FL0hlYWQucG0gICA8IHRlc3Rpbi9maXJzdC5oZHIg ICAgICAgPiB0ZXN0b3V0L0hlYWQub3V0DQojCUBlY2hvICJURVNUSU5HIERl Y29kZXIucG0uLi4iDQojCSR7UEVSTDV9IE1JTUUvRGVjb2Rlci5wbSA8IHRl c3Rpbi9xdW90LXByaW50LmJvZHkgPiB0ZXN0b3V0L0RlY29kZXIub3V0DQoj CUBlY2hvICJURVNUSU5HIFBhcnNlci5wbSAoc2ltcGxlKS4uLiINCiMJJHtQ RVJMNX0gTUlNRS9QYXJzZXIucG0gPCB0ZXN0aW4vc2ltcGxlLm1zZyAgICAg ID4gdGVzdG91dC9QYXJzZXIucy5vdXQNCiMJQGVjaG8gIlRFU1RJTkcgUGFy c2VyLnBtIChtdWx0aXBhcnQpLi4uIg0KIwkke1BFUkw1fSBNSU1FL1BhcnNl ci5wbSA8IHRlc3Rpbi9tdWx0aS0yZ2lmcy5tc2cgPiB0ZXN0b3V0L1BhcnNl ci5tLm91dA0KCUBlY2hvICJURVNUSU5HIFBhcnNlci5wbSAobXVsdGlfbmVz dGVkLm1zZykuLi4iDQoJJHtQRVJMNX0gTUlNRS9QYXJzZXIucG0gPCB0ZXN0 aW4vbXVsdGktbmVzdGVkLm1zZyA+IHRlc3RvdXQvUGFyc2VyLm4ub3V0DQoJ QGVjaG8gIkFsbCB0ZXN0cyBwYXNzZWQuLi4gc2VlIC4vdGVzdG91dC9NT0RV TEUqLm91dCBmb3Igb3V0cHV0Ig0KDQppbnN0YWxsOg0KCUBpZiBbICEgLWQg JHtTSVRFX1BFUkx9IF07IHRoZW4gXA0KCSAgICBlY2hvICJQbGVhc2UgZWRp dCB0aGUgU0lURV9QRVJMIGluIHlvdXIgTWFrZWZpbGUiOyBleGl0IC0xOyBc DQogICAgICAgIGZpICAgICAgICAgIA0KCUBpZiBbICEgLXcgJHtTSVRFX1BF Ukx9IF07IHRoZW4gXA0KCSAgICBlY2hvICJObyBwZXJtaXNzaW9uLi4uIHNo b3VsZCB5b3UgYmUgcm9vdD8iOyBleGl0IC0xOyBcDQogICAgICAgIGZpICAg ICAgICAgIA0KCUBpZiBbICEgLWQgJHtTSVRFX1BFUkx9L01JTUUgXTsgdGhl biBcDQoJICAgIG1rZGlyICR7U0lURV9QRVJMfS9NSU1FOyBcDQogICAgICAg IGZpDQoJaW5zdGFsbCAtbSAwNjQ0IE1JTUUvKi5wbSAke1NJVEVfUEVSTH0v TUlNRQ0KDQoNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgRm9yIGRldmVsb3BlciBv bmx5Li4uDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNClBPRDJIVE1MX0ZMQUdTID0g LS1wb2RwYXRoPS4gLS1mbHVzaCAtLWh0bWxyb290PS4uDQpIVE1MUyAgICAg ICAgICA9ICR7TU9EUzoucG09Lmh0bWx9DQpWUEFUSCAgICAgICAgICA9IE1J TUUNCg0KLlNVRkZJWEVTOiAucG0gLnBvZCAuaHRtbA0KDQojIHYuMS44IGdl bmVyYXRlZCAzMCBBcHIgOTYNCiMgdi4xLjkgaXMgb25seSBiZWNhdXNlIDEu OCBmYWlsZWQgQ1BBTiBpbmdlc3Rpb24NCmRpc3Q6IGRvY3VtZW50ZWQJDQoJ VkVSU0lPTj0xLjkgOyBcDQoJbWtkaXN0IC10Z3ogTUlNRS1wYXJzZXItJCRW RVJTSU9OIDsgXA0KCWNwIE1LRElTVC9NSU1FLXBhcnNlci0kJFZFUlNJT04u dGd6ICR7SE9NRX0vcHVibGljX2h0bWwvY3Bhbg0KCQ0KZG9jdW1lbnRlZDog JHtIVE1MU30gJHtNT0RTfQ0KDQoucG0uaHRtbDoNCglwb2QyaHRtbCAke1BP RDJIVE1MX0ZMQUdTfSBcDQoJCS0tdGl0bGU9TUlNRTo6JCogXA0KCQktLWlu ZmlsZT0kPCBcDQoJCS0tb3V0ZmlsZT1kb2NzLyQqLmh0bWwNCg0KIy0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQ0K ---490585488-806670346-834061839=:2195 Content-Type: TEXT/PLAIN; charset=US-ASCII; name="multi-nested.msg" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: test message TUlNRS1WZXJzaW9uOiAxLjANCkZyb206IExvcmQgSm9obiBXaG9yZmluIDx3 aG9yZmluQHlveW9keW5lLmNvbT4NClRvOiA8am9obi15YXlhQHlveW9keW5l LmNvbT4NClN1YmplY3Q6IEEgY29tcGxleCBuZXN0ZWQgbXVsdGlwYXJ0IGV4 YW1wbGUNCkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOw0KICAgICBi b3VuZGFyeT11bmlxdWUtYm91bmRhcnktMQ0KDQpUaGUgcHJlYW1ibGUgb2Yg dGhlIG91dGVyIG11bHRpcGFydCBtZXNzYWdlLg0KTWFpbCByZWFkZXJzIHRo YXQgdW5kZXJzdGFuZCBtdWx0aXBhcnQgZm9ybWF0DQpzaG91bGQgaWdub3Jl IHRoaXMgcHJlYW1ibGUuDQpJZiB5b3UgYXJlIHJlYWRpbmcgdGhpcyB0ZXh0 LCB5b3UgbWlnaHQgd2FudCB0bw0KY29uc2lkZXIgY2hhbmdpbmcgdG8gYSBt YWlsIHJlYWRlciB0aGF0IHVuZGVyc3RhbmRzDQpob3cgdG8gcHJvcGVybHkg ZGlzcGxheSBtdWx0aXBhcnQgbWVzc2FnZXMuDQotLXVuaXF1ZS1ib3VuZGFy eS0xDQoNClBhcnQgMSBvZiB0aGUgb3V0ZXIgbWVzc2FnZS4NCltOb3RlIHRo YXQgdGhlIHByZWNlZGluZyBibGFuayBsaW5lIG1lYW5zDQpubyBoZWFkZXIg ZmllbGRzIHdlcmUgZ2l2ZW4gYW5kIHRoaXMgaXMgdGV4dCwNCndpdGggY2hh cnNldCBVUyBBU0NJSS4gIEl0IGNvdWxkIGhhdmUgYmVlbg0KZG9uZSB3aXRo IGV4cGxpY2l0IHR5cGluZyBhcyBpbiB0aGUgbmV4dCBwYXJ0Ll0NCg0KLS11 bmlxdWUtYm91bmRhcnktMQ0KQ29udGVudC10eXBlOiB0ZXh0L3BsYWluOyBj aGFyc2V0PVVTLUFTQ0lJDQoNClBhcnQgMiBvZiB0aGUgb3V0ZXIgbWVzc2Fn ZS4NClRoaXMgY291bGQgaGF2ZSBiZWVuIHBhcnQgb2YgdGhlIHByZXZpb3Vz IHBhcnQsDQpidXQgaWxsdXN0cmF0ZXMgZXhwbGljaXQgdmVyc3VzIGltcGxp Y2l0DQp0eXBpbmcgb2YgYm9keSBwYXJ0cy4NCg0KLS11bmlxdWUtYm91bmRh cnktMQ0KU3ViamVjdDogUGFydCAzIG9mIHRoZSBvdXRlciBtZXNzYWdlIGlz IG11bHRpcGFydCENCkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L3BhcmFsbGVs Ow0KICAgICBib3VuZGFyeT11bmlxdWUtYm91bmRhcnktMg0KDQpBIG9uZS1s aW5lIHByZWFtYmxlIGZvciB0aGUgaW5uZXIgbXVsdGlwYXJ0IG1lc3NhZ2Uu DQotLXVuaXF1ZS1ib3VuZGFyeS0yDQpDb250ZW50LVR5cGU6IGltYWdlL2dp Zg0KQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0DQpDb250ZW50 LURpc3Bvc2l0aW9uOiBpbmxpbmU7IGZpbGVuYW1lPSIzZC1jb21wcmVzcy5n aWYiDQpTdWJqZWN0OiBQYXJ0IDEgb2YgdGhlIGlubmVyIG1lc3NhZ2UgaXMg YSBHSUYsICIzZC1jb21wcmVzcy5naWYiDQoNClIwbEdPRGRoS0FBb0FPTUFB QUFBQUFBQWdCNlEveTlQVDI1dWJuQ0FrS0JTTGI2K3Z1Zm41L1hlcy8rbEFQ LzZ6UUFBQUFBQQ0KQUFBQUFBQUFBQ3dBQUFBQUtBQW9BQUFFL2hESlNhdTll SkxNT3lZYmNveGthWjVvQ2tvSDZMNXdMTWZpV3FkNGJ0WmhteGJBDQpvRkNZ NDdFSXFNSmd5V3cyQVRqajdhUmtBcTVZd0RNbDlWR3RLTzBTaXVvaVRWbHNj c3h0OWM0SGdYeFVJQTBFQVZPVmZES1QNCjhIbDFCM2tEQVlZbGUyMDJYbkdH Z29NSGhZY2tpV1Z1UjMrT1RnQ0dlWlJzbG90d2dKMmxuWWlnZlpkVGpRVUxy N0FMQlpOMA0KcVR1cmpIZ0xLQXUwQjVXcW9wbTdKNzJldFFOOHQ4SWp1cnkr d010dnc4L0h2N1lsZnMwQnhDYkdxTW1LMHlPT1EwR1RDZ3JSDQoyYmh3Skds WEpRWUc2bU1Lb2VOb1dTYnpDV0lBQ2U1Snd4UW0zQWtEQWJVQVFDaVFoRFpF QmVCbDZhZmdDc09CckQ0NWVkSXYNClFjZUdXU01ldnBPWWhsNkNreWRCSGhC WlFtR0tqaWhWc2h5cGpCOUNsQUhaTVR1Z3pPVTdtemhCUGlTWjV1RE5uQTdi L2FUWg0KMG1oTW5mbDBwREJGYTZiVUVsU1BXYjBxdFl1SHJ4bHdjUjE3WXNX TXMyalRxbDNMRmtRRUFEcz0NCi0tdW5pcXVlLWJvdW5kYXJ5LTINCkNvbnRl bnQtVHlwZTogaW1hZ2UvZ2lmDQpDb250ZW50LVRyYW5zZmVyLUVuY29kaW5n OiBiYXNlNjQNCkNvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsgZmlsZW5h bWU9IjNkLWV5ZS5naWYiDQpTdWJqZWN0OiBQYXJ0IDIgb2YgdGhlIGlubmVy IG1lc3NhZ2UgaXMgYW5vdGhlciBHSUYsICIzZC1leWUuZ2lmIg0KDQpSMGxH T0RkaEtBQW9BUE1BQUFBQUFBQUF6TjN1Lzc2K3ZvaUlpRzV1YnN6ZDd2Ly8v K2ZuNXdBQUFBQUFBQUFBQUFBQUFBQUENCkFBQUFBQUFBQUN3QUFBQUFLQUFv QUFBRS9oREpTYXU5ZUpiTU95NGJNb3hrYVo1b0Nrb0Q2TDV3TE1maVduczQx b1p0N2xNNw0KVnVqbkM5NklSVnNQV1FFNG54UGprdm1zUW11OG9jL0tCVVNW V2s3WGVwR0dMZU5yeG94Sk8xTWpJTGp0aGcva1dYUTZ3Ty83DQorM2RDZVJS amZBS0hpSW1KQVYrRENGMEJpVzVWQW8xQ0VsYVJoNU5qbGtlWW1weVRncGNU QUtHaWFhU2Zwd0twVlFheFZhdEwNCnJVOEdhUWRPQkFRQUI3K3lYbGlYVHJn QXhzVzR2RmFidjhCT3RCc0J0N2NHdndDSVQ5bk95TkVJeHVDNHpycUt6YzlY Yk9ESg0KdnM3WTVld0gzZDdGeGUzakI0cmo4dDZQdU5hNnIyYmhLUVhOMTdG WUNCTXFUR2lCelNOaHg1ZzBuRU1obHNTSmppUll2RGp3DQpFMGNkR3hRL2dz d29zb0tVa211VTJGbkpjc1NLR1RCanlweEpzeWFJQ0FBNw0KLS11bmlxdWUt Ym91bmRhcnktMi0tDQoNClRoZSBlcGlsb2d1ZSBmb3IgdGhlIGlubmVyIG11 bHRpcGFydCBtZXNzYWdlLg0KDQotLXVuaXF1ZS1ib3VuZGFyeS0xDQpDb250 ZW50LXR5cGU6IHRleHQvcmljaHRleHQNCg0KVGhpcyBpcyA8Ym9sZD5wYXJ0 IDQgb2YgdGhlIG91dGVyIG1lc3NhZ2U8L2JvbGQ+DQo8c21hbGxlcj5hcyBk ZWZpbmVkIGluIFJGQzEzNDE8L3NtYWxsZXI+PG5sPg0KPG5sPg0KSXNuJ3Qg aXQgPGJpZ2dlcj48YmlnZ2VyPmNvb2w/PC9iaWdnZXI+PC9iaWdnZXI+DQoN Ci0tdW5pcXVlLWJvdW5kYXJ5LTENCkNvbnRlbnQtVHlwZTogbWVzc2FnZS9y ZmM4MjINCg0KRnJvbTogKG1haWxib3ggaW4gVVMtQVNDSUkpDQpUbzogKGFk ZHJlc3MgaW4gVVMtQVNDSUkpDQpTdWJqZWN0OiBQYXJ0IDUgb2YgdGhlIG91 dGVyIG1lc3NhZ2UgaXMgaXRzZWxmIGFuIFJGQzgyMiBtZXNzYWdlIQ0KQ29u dGVudC1UeXBlOiBUZXh0L3BsYWluOyBjaGFyc2V0PUlTTy04ODU5LTENCkNv bnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IFF1b3RlZC1wcmludGFibGUNCg0K UGFydCA1IG9mIHRoZSBvdXRlciBtZXNzYWdlIGlzIGl0c2VsZiBhbiBSRkM4 MjIgbWVzc2FnZSENCg0KLS11bmlxdWUtYm91bmRhcnktMS0tDQoNClRoZSBl cGlsb2d1ZSBmb3IgdGhlIG91dGVyIG1lc3NhZ2UuDQo= ---490585488-806670346-834061839=:2195 Content-Type: TEXT/PLAIN; charset=US-ASCII; name="Parser.n.out" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: out from parser KiBXYWl0aW5nIGZvciBhIE1JTUUgbWVzc2FnZSBmcm9tIFNURElOLi4uDQo9 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT0NCkNvbnRlbnQtdHlwZTogbXVsdGlwYXJ0L21peGVk DQpCb2R5LWZpbGU6IE5PTkUNClN1YmplY3Q6IEEgY29tcGxleCBuZXN0ZWQg bXVsdGlwYXJ0IGV4YW1wbGUNCk51bS1wYXJ0czogMw0KLS0NCiAgICBDb250 ZW50LXR5cGU6IHRleHQvcGxhaW4NCiAgICBCb2R5LWZpbGU6IC4vdGVzdG91 dC9tc2ctMzUzOC0xLmRvYw0KICAgIC0tDQogICAgQ29udGVudC10eXBlOiB0 ZXh0L3BsYWluDQogICAgQm9keS1maWxlOiAuL3Rlc3RvdXQvbXNnLTM1Mzgt Mi5kb2MNCiAgICAtLQ0KICAgIENvbnRlbnQtdHlwZTogbXVsdGlwYXJ0L3Bh cmFsbGVsDQogICAgQm9keS1maWxlOiBOT05FDQogICAgU3ViamVjdDogUGFy dCAzIG9mIHRoZSBvdXRlciBtZXNzYWdlIGlzIG11bHRpcGFydCENCiAgICBO dW0tcGFydHM6IDINCiAgICAtLQ0KICAgICAgICBDb250ZW50LXR5cGU6IGlt YWdlL2dpZg0KICAgICAgICBCb2R5LWZpbGU6IC4vdGVzdG91dC8zZC1jb21w cmVzcy5naWYNCiAgICAgICAgU3ViamVjdDogUGFydCAxIG9mIHRoZSBpbm5l ciBtZXNzYWdlIGlzIGEgR0lGLCAiM2QtY29tcHJlc3MuZ2lmIg0KICAgICAg ICAtLQ0KICAgICAgICBDb250ZW50LXR5cGU6IGltYWdlL2dpZg0KICAgICAg ICBCb2R5LWZpbGU6IC4vdGVzdG91dC8zZC1leWUuZ2lmDQogICAgICAgIFN1 YmplY3Q6IFBhcnQgMiBvZiB0aGUgaW5uZXIgbWVzc2FnZSBpcyBhbm90aGVy IEdJRiwgIjNkLWV5ZS5naWYiDQogICAgICAgIC0tDQo9PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT0NCg0K ---490585488-806670346-834061839=:2195-- apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/infinite_decoded_1.txt0000644000000000000000000000750011702050534031111 0ustar rootrootReturn-Path: Received: from eiffel.base.com.br by mailbr1.mailbr.com.br ; Thu, 05 Nov 1998 22:58:23 +000 Received: from marconi.base.com.br ([200.240.10.55]) by eiffel.base.com.br (Netscape Mail Server v2.0) with ESMTP id ADH491 for ; Thu, 5 Nov 1998 21:55:24 -0200 Received: from kepler.base.com.br ([200.240.10.104]) by marconi.base.com.br (Netscape Mail Server v2.0) with ESMTP id AAE686; Wed, 4 Nov 1998 14:00:10 -0200 Received: from cyrius.linf.unb.br ([164.41.12.4]) by kepler.base.com.br (Post.Office MTA v3.5 release 215 ID# 0-0U10L2S100) with SMTP id br; Wed, 4 Nov 1998 13:53:47 -0200 Received: from sendmail by cyrius.linf.unb.br with esmtp id 0zb5I9-0003oM-00; Wed, 4 Nov 1998 13:56:17 -0200 Received: from localhost (majordom@localhost) by cyrius.linf.unb.br (8.8.7/8.8.7) with SMTP id NAA14639; Wed, 4 Nov 1998 13:54:54 -0200 (EDT) Received: by linf.unb.br (bulk_mailer v1.6); Wed, 4 Nov 1998 13:54:54 -0200 Received: (from majordom@localhost) by cyrius.linf.unb.br (8.8.7/8.8.7) id NAA14630 for cacomp-l-outter; Wed, 4 Nov 1998 13:54:53 -0200 (EDT) Received: (from sendmail@localhost) by cyrius.linf.unb.br (8.8.7/8.8.7) id NAA14623 for cacomp-l@linf.unb.br; Wed, 4 Nov 1998 13:54:50 -0200 (EDT) Received: from brasilia.mpdft.gov.br [200.252.85.2] by cyrius.linf.unb.br with esmtp id 0zb5Fz-0003lF-00; Wed, 4 Nov 1998 13:54:28 -0200 Received: from localhost (lbecker@localhost) by brasilia.mpdft.gov.br (8.8.5/8.8.8) with ESMTP id NAA02571 for ; Wed, 4 Nov 1998 13:36:14 -0200 (EDT) (envelope-from lbecker@brasilia.mpdft.gov.br) Date: Wed, 4 Nov 1998 13:36:14 -0200 (EDT) From: Lula Becker To: cacomp-l@linf.unb.br Subject: [cacomp-l] =??Q?Re=3A_=5Bcacomp-l=5D_E_n=3A_Bras=EDlia_cobre?= In-Reply-To: Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset= X-MIME-Autoconverted: from 8bit to quoted-printable by brasilia.mpdft.gov.br id NAA02571 Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by cyrius.linf.unb.br id NAB14623 Sender: owner-cacomp-l@linf.unb.br Reply-To: cacomp-l@linf.unb.br Precedence: bulk X-Rcpt-To: Porque eu sou eh foda.... > Prego eh o caralho, Vc nao me conhece para ficar falando assim... Nao > sabe de onde eu vim, quem sou, ou seja, PORRA NENHUMA... > > VAI TOMAR NO CU E ME DEIXA EM PAZ!!!!!!! > > On Tue, 3 Nov 1998, Guilherme Olivieri Caixeta Borges wrote: > > > Sócrates, > > > > porque você faz tanta questão de se indispor com TODO MUNDO!!! Já não bastasse > > meia computação te achar um prego, você resolve ampliar este universo para outras > > pessoas... Mané! > > > > Socrates Arantes Teixeira Filho (97/18443) wrote: > > > > > Você tem que ver que paciência tem limite. Eu agüentei o máximo > > > possível ele ficar escrevendo essas burrices na nossa sala de discursão. > > > Com gente ignorante como ele, que um rorizista cego, nós só conseguimos > > > > Em se falando de ignorância: é bem verdade que os mails da cacomp estão atingindo > > proporções dantescas, mas o certo é DISCUSSÃO. > > > > Sem mais, > > > > -- > > Guilherme Olivieri Caixeta Borges > > ************************** > > Web Design - Via Internet > > (061) 315-9657 / 964-9199 > > guiborges@brasilia.com.br > > guiborges@via-net.com.br > > ************************** > > > > > > > > > > > > apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-nested_decoded_1_4.txt0000644000000000000000000000023011702050534032132 0ustar rootrootThis is part 4 of the outer message as defined in RFC1341 Isn't it cool? ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/uu-junk-target_decoded_1_2_1.txtapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/uu-junk-target_decoded_1_2_1.0000644000000000000000000000014011702050534032060 0ustar rootrootHere's what he's talking about. I've uuencoded the ZeeGee logo and another GIF file below. apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-frag_decoded_1_3_2.bin0000644000000000000000000000061711702050534031751 0ustar rootrootGIF87a((óÌÝîÿ¾¾¾ˆˆˆnnnÌÝîÿÿÿççç,((þÉI«½x–Ì;.2Œdižh Jè¾p,ÇâZ{8Ö†mîS;Vèç ÞˆE[Y8Ÿã’ù¬Bk¼¡ÏÊD•ZN×z‘†-ãkÆŒI;S# ¸í†äYt:ÀïûûwByc|‡ˆ‰‰_ƒ]‰nUBV‘‡“c–G˜šœ“‚—¡¢i¤Ÿ§©U±U«K­OiN¿²^X—N¸ÆÅ¸¼V›¿ÀN´··¿ˆOÙÎÈÑÆà¸ÎºŠÍÏWlàÉ¾ÎØåìÝÞÅÅíãŠãòÞ¸Öº¯fá)Í×±X*LhÍ#aǘ4œC!–ĉŽ$X¼8ðG?‚Ì(²‚”’k”ØYÉrÄŠ0cÊœI³&ˆ;]u×]{§Š«žn‹§uªòÙ8^z˜¥¢ ž~Ší…è§êæº[b¥ªí™ë,apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/frag.xml0000644000000000000000000026067211702050534026330 0ustar rootroot
Return-Path: <omrec@mailandnews.com> Received: from virtual.mrf.mail.rcn.net ([207.172.4.103]) by mta05.mrf.mail.rcn.net (InterMail vM.4.01.02.27 201-229-119-110) with ESMTP id <20000524184032.XKFS1688.mta05.mrf.mail.rcn.net@virtual.mrf.mail.rcn.net> for <eryq@mta.mrf.mail.rcn.net>; Wed, 24 May 2000 14:40:32 -0400 Received: from mail.desktop.com ([166.90.128.242]) by virtual.mrf.mail.rcn.net with esmtp (Exim 2.12 #3) id 12ug50-00059f-00 for eryq@zeegee.com; Wed, 24 May 2000 14:40:30 -0400 Received: from mailandnews.com (jumpgate.desktop.com [166.90.128.243]) by mail.desktop.com (8.9.2/8.9.2) with ESMTP id LAA31102 for <eryq@zeegee.com>; Wed, 24 May 2000 11:40:29 -0700 (PDT) (envelope-from omrec@mailandnews.com) Message-ID: <392C2385.4C402C55@mailandnews.com> Date: Wed, 24 May 2000 11:46:29 -0700 From: Sven <omrec@mailandnews.com> Reply-To: omrec@mailandnews.com X-Mailer: Mozilla 4.7 [en] (WinNT; I) X-Accept-Language: en MIME-Version: 1.0 To: Eryq <eryq@zeegee.com> Subject: [Fwd: [Fwd: [Fwd: FW: Another Priceless Moment]]] Content-Type: multipart/mixed; boundary="------------ABE49921AF9E83E8F9A7667E" X-Mozilla-Status: 8001
This is a multi-part message in MIME format.
Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit
Content-Type: message/rfc822 Content-Transfer-Encoding: 7bit Content-Disposition: inline
Received: from mail.vynce.org [63.198.43.13] (vynce@vynce.org); Tue, 23 May 2000 22:00:16 -0400 X-Envelope-To: omrec Received: from vynce.org (166.90.128.243) by mail.vynce.org with ESMTP (Eudora Internet Mail Server 1.3.1); Tue, 23 May 2000 19:05:52 -0700 Message-ID: <392B389A.1968998B@vynce.org> Date: Tue, 23 May 2000 19:04:10 -0700 From: Vynce <vynce@vynce.org> Organization: Desktop.com X-Mailer: Mozilla 4.61 [en] (Win98; U) X-Accept-Language: en MIME-Version: 1.0 To: omrec@mailandnews.com Subject: [Fwd: [Fwd: FW: Another Priceless Moment]] Content-Type: multipart/mixed; boundary="------------4CEB5E448DC077F35050C4BE" X-Mozilla-Status2: 00000000
This is a multi-part message in MIME format.
Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit
just to add to your personal hell.
Content-Type: message/rfc822 Content-Transfer-Encoding: 7bit Content-Disposition: inline
Return-Path: <jasonc@snesystems.com> Received: from iglou.com (192.107.41.3) by mail.vynce.org with SMTP (Eudora Internet Mail Server 1.3.1); Thu, 18 May 2000 16:10:02 -0700 Received: from [204.255.234.19] (helo=ntserver2.snesystems.com) by iglou.com with esmtp (8.9.3/8.9.3) id 12sZKw-0007JK-00; Thu, 18 May 2000 19:04:15 -0400 Received: from snesystems.com (sne-30.snesystems.com [204.255.234.30]) by ntserver2.snesystems.com with SMTP (Microsoft Exchange Internet Mail Service Version 5.5.2650.21) id LGJH8AYQ; Thu, 18 May 2000 19:03:40 -0400 Sender: root@mail.vynce.org Message-ID: <39247724.AF25EF83@snesystems.com> Date: Thu, 18 May 2000 19:05:08 -0400 From: root <jasonc@snesystems.com> Reply-To: jasonc@snesystems.com Organization: SNE Systems, Inc. X-Mailer: Mozilla 4.72 [en] (X11; I; Linux 2.2.12-20 i686) X-Accept-Language: ja, en MIME-Version: 1.0 To: vynce@vynce.org Subject: [Fwd: FW: Another Priceless Moment] Content-Type: multipart/mixed; boundary="------------8B533A82922407D7C3D35A99" X-Mozilla-Status2: 00000000
This is a multi-part message in MIME format.
Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit
Content-Type: message/rfc822 Content-Transfer-Encoding: 7bit Content-Disposition: inline
Received: by ntserver2 id <01BFC0CA.C31F7A10@ntserver2>; Thu, 18 May 2000 09:12:47 -0400 Message-ID: <01D476341BDBD211B7C500A0CC209BA03DF5C6@ntserver2> From: Shawn Morgan <ShawnM@snesystems.com> To: Wayne Price <WayneP@snesystems.com>, Tim Spayner <TimS@snesystems.com>, Gary Jones <Garyj@snesystems.com>, Jason Chelliah <JasonC@snesystems.com> Subject: FW: Another Priceless Moment Date: Thu, 18 May 2000 09:12:47 -0400 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----_=_NextPart_000_01BFC0CA.C32A4450"
This message is in MIME format. Since your mail reader does not understand this format, some or all of this message may not be legible.
Content-Type: text/plain; charset="iso-8859-1"
-----Original Message----- From: Shawn Morgan [mailto:cephalos@home.com] Sent: Wednesday, May 17, 2000 8:18 PM To: Shawn Morgan Subject: Fw: Another Priceless Moment ----- Original Message ----- From: Michele Morgan <Ailinn@bellsouth.net> To: <mailto:Undisclosed-Recipient:@mail0.mco.bellsouth.net> Sent: Tuesday, May 16, 2000 10:31 PM Subject: Fw: Another Priceless Moment > >
Content-Type: image/jpeg; name="aprilfools.jpg" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="aprilfools.jpg"
/9j/4AAQSkZJRgABAgEASABIAAD/7Q4uUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQABOEJJTQQNAAAAAAAEAAAAeDhCSU0D8wAAAAAACAAAAAAAAAAAOEJJTQQKAAAAAAAB AAA4QklNJxAAAAAAAAoAAQAAAAAAAAACOEJJTQP1AAAAAABIAC9mZgABAGxmZgAGAAAAAAABAC9m ZgABAKGZmgAGAAAAAAABADIAAAABAFoAAAAGAAAAAAABADUAAAABAC0AAAAGAAAAAAABOEJJTQP4 AAAAAABwAAD/////////////////////////////A+gAAAAA//////////////////////////// /wPoAAAAAP////////////////////////////8D6AAAAAD///////////////////////////// A+gAADhCSU0EAAAAAAAAAgACOEJJTQQCAAAAAAAGAAAAAAAAOEJJTQQIAAAAAAAQAAAAAQAAAkAA AAJAAAAAADhCSU0EFAAAAAAABAAAAAQ4QklNBAwAAAAADH4AAAABAAAAcAAAAFQAAAFQAABuQAAA DGIAGAAB/9j/4AAQSkZJRgABAgEASABIAAD/7gAOQWRvYmUAZIAAAAAB/9sAhAAMCAgICQgMCQkM EQsKCxEVDwwMDxUYExMVExMYEQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQ0L Cw0ODRAODhAUDg4OFBQODg4OFBEMDAwMDBERDAwMDAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM DAwMDAz/wAARCABUAHADASIAAhEBAxEB/90ABAAH/8QBPwAAAQUBAQEBAQEAAAAAAAAAAwABAgQF BgcICQoLAQABBQEBAQEBAQAAAAAAAAABAAIDBAUGBwgJCgsQAAEEAQMCBAIFBwYIBQMMMwEAAhED BCESMQVBUWETInGBMgYUkaGxQiMkFVLBYjM0coLRQwclklPw4fFjczUWorKDJkSTVGRFwqN0NhfS VeJl8rOEw9N14/NGJ5SkhbSVxNTk9KW1xdXl9VZmdoaWprbG1ub2N0dXZ3eHl6e3x9fn9xEAAgIB AgQEAwQFBgcHBgU1AQACEQMhMRIEQVFhcSITBTKBkRShsUIjwVLR8DMkYuFygpJDUxVjczTxJQYW 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 AAEBAP/iDFhJQ0NfUFJPRklMRQABAQAADEhMaW5vAhAAAG1udHJSR0IgWFlaIAfOAAIACQAGADEA AGFjc3BNU0ZUAAAAAElFQyBzUkdCAAAAAAAAAAAAAAAAAAD21gABAAAAANMtSFAgIAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEWNwcnQAAAFQAAAAM2Rlc2MA AAGEAAAAbHd0cHQAAAHwAAAAFGJrcHQAAAIEAAAAFHJYWVoAAAIYAAAAFGdYWVoAAAIsAAAAFGJY WVoAAAJAAAAAFGRtbmQAAAJUAAAAcGRtZGQAAALEAAAAiHZ1ZWQAAANMAAAAhnZpZXcAAAPUAAAA JGx1bWkAAAP4AAAAFG1lYXMAAAQMAAAAJHRlY2gAAAQwAAAADHJUUkMAAAQ8AAAIDGdUUkMAAAQ8 AAAIDGJUUkMAAAQ8AAAIDHRleHQAAAAAQ29weXJpZ2h0IChjKSAxOTk4IEhld2xldHQtUGFja2Fy ZCBDb21wYW55AABkZXNjAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAEnNSR0Ig SUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAABYWVogAAAAAAAA81EAAQAAAAEWzFhZWiAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAG+i AAA49QAAA5BYWVogAAAAAAAAYpkAALeFAAAY2lhZWiAAAAAAAAAkoAAAD4QAALbPZGVzYwAAAAAA AAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNo AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRlc2MAAAAAAAAA LklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAA LklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAA AAAAAAAAAAAAAABkZXNjAAAAAAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVD NjE5NjYtMi4xAAAAAAAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYx OTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdmlldwAAAAAAE6T+ABRfLgAQzxQAA+3M AAQTCwADXJ4AAAABWFlaIAAAAAAATAlWAFAAAABXH+dtZWFzAAAAAAAAAAEAAAAAAAAAAAAAAAAA AAAAAAACjwAAAAJzaWcgAAAAAENSVCBjdXJ2AAAAAAAABAAAAAAFAAoADwAUABkAHgAjACgALQAy ADcAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8AIEAhgCLAJAAlQCaAJ8ApACpAK4AsgC3ALwA wQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEHAQ0BEwEZAR8BJQErATIBOAE+AUUBTAFSAVkBYAFn AW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB0QHZAeEB6QHyAfoCAwIMAhQCHQImAi8COAJBAksC VAJdAmcCcQJ6AoQCjgKYAqICrAK2AsECywLVAuAC6wL1AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+ A4oDlgOiA64DugPHA9MD4APsA/kEBgQTBCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE0wThBPAE /gUNBRwFKwU6BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZBmoGewaMBp0GrwbA BtEG4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8IMghGCFoIbgiCCJYIqgi+CNII 5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9ClQKagqBCpgKrgrFCtwK8wsLCyILOQtR C2kLgAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4MpwzADNkM8w0NDSYNQA1aDXQNjg2pDcMN3g34DhMO Lg5JDmQOfw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MPzw/sEAkQJhBDEGEQfhCbELkQ1xD1ERMRMRFP EW0RjBGqEckR6BIHEiYSRRJkEoQSoxLDEuMTAxMjE0MTYxODE6QTxRPlFAYUJxRJFGoUixStFM4U 8BUSFTQVVhV4FZsVvRXgFgMWJhZJFmwWjxayFtYW+hcdF0EXZReJF64X0hf3GBsYQBhlGIoYrxjV GPoZIBlFGWsZkRm3Gd0aBBoqGlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4d Rx1wHZkdwx3sHhYeQB5qHpQevh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7 IiciVSKCIq8i3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgllyXHJfcmJyZXJocmtyboJxgn SSd6J6sn3CgNKD8ocSiiKNQpBik4KWspnSnQKgIqNSpoKpsqzysCKzYraSudK9EsBSw5LG4soizX LQwtQS12Last4S4WLkwugi63Lu4vJC9aL5Evxy/+MDUwbDCkMNsxEjFKMYIxujHyMioyYzKbMtQz DTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9Njc2cjauNuk3JDdgN5w31zgUOFA4jDjIOQU5Qjl/ Obw5+To2OnQ6sjrvOy07azuqO+g8JzxlPKQ84z0iPWE9oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRA pkDnQSlBakGsQe5CMEJyQrVC90M6Q31DwEQDREdEikTORRJFVUWaRd5GIkZnRqtG8Ec1R3tHwEgF SEtIkUjXSR1JY0mpSfBKN0p9SsRLDEtTS5pL4kwqTHJMuk0CTUpNk03cTiVObk63TwBPSU+TT91Q J1BxULtRBlFQUZtR5lIxUnxSx1MTU19TqlP2VEJUj1TbVShVdVXCVg9WXFapVvdXRFeSV+BYL1h9 WMtZGllpWbhaB1pWWqZa9VtFW5Vb5Vw1XIZc1l0nXXhdyV4aXmxevV8PX2Ffs2AFYFdgqmD8YU9h omH1YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1mkmboZz1nk2fpaD9olmjsaUNpmmnxakhqn2r3 a09rp2v/bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6cZVx8HJLcqZzAXNdc7h0FHRwdMx1 KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF84X1BfaF+AX5ifsJ/I3+E f+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZyhteHO4efiASIaYjOiTOJmYn+imSK yoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q1pE/kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0 lp+XCpd1l+CYTJi4mSSZkJn8mmia1ZtCm6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNihR6G2oiai lqMGo3aj5qRWpMelOKWpphqmi6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2uoa8W r4uwALB1sOqxYLHWskuywrM4s660JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7urW7LrunvCG8 m70VvY++Cr6Evv+/er/1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dBx7/IPci8yTrJuco4 yrfLNsu2zDXMtc01zbXONs62zzfPuNA50LrRPNG+0j/SwdNE08bUSdTL1U7V0dZV1tjXXNfg2GTY 6Nls2fHadtr724DcBdyK3RDdlt4c3qLfKd+v4DbgveFE4cziU+Lb42Pj6+Rz5PzlhOYN5pbnH+ep 6DLovOlG6dDqW+rl63Dr++yG7RHtnO4o7rTvQO/M8Fjw5fFy8f/yjPMZ86f0NPTC9VD13vZt9vv3 ivgZ+Kj5OPnH+lf65/t3/Af8mP0p/br+S/7c/23////uAA5BZG9iZQBkAAAAAAH/2wCEAAYEBAQF BAYFBQYJBgUGCQsIBgYICwwKCgsKCgwQDAwMDAwMEAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM DAwBBwcHDQwNGBAQGBQODg4UFA4ODg4UEQwMDAwMEREMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwM DAwMDAwMDAwMDP/AABEIAeACgAMBEQACEQEDEQH/3QAEAFD/xAGiAAAABwEBAQEBAAAAAAAAAAAE BQMCBgEABwgJCgsBAAICAwEBAQEBAAAAAAAAAAEAAgMEBQYHCAkKCxAAAgEDAwIEAgYHAwQCBgJz AQIDEQQABSESMUFRBhNhInGBFDKRoQcVsUIjwVLR4TMWYvAkcoLxJUM0U5KismNzwjVEJ5OjszYX VGR0w9LiCCaDCQoYGYSURUaktFbTVSga8uPzxNTk9GV1hZWltcXV5fVmdoaWprbG1ub2N0dXZ3eH l6e3x9fn9zhIWGh4iJiouMjY6PgpOUlZaXmJmam5ydnp+So6SlpqeoqaqrrK2ur6EQACAgECAwUF BAUGBAgDA20BAAIRAwQhEjFBBVETYSIGcYGRMqGx8BTB0eEjQhVSYnLxMyQ0Q4IWklMlomOywgdz 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 q4g+/wBOKrh0r3HTFVhDDqevhirVCHJ6bde+KtToWhNW2FT94xVbHVYIjy+P4eP0ZFtx8050pX1o zAcrJIF5xTyitZP99oRuvPsWwF22I0LRFvJLPKsdpEPWY8JpH2o7Ap8R8aimRbweJL7meWe3kjSO UvaExvyO5OKeClkl7cRWkcYqsZCgIdmr3APfFqlFM7DTF1O9Vbw8oYlqig05HwIxboZKRd/La6be W1jZIvqXFUdPskBlNfiwo+opNqVu73sUssKehH8MdtuSVU0K/NsDbE0jrTT71XJkkWJJBzSMmirT 7KqT+1kSmMt1trolrqv1u5aVXjtVHqK7GNUJH2zx3ffwwLOW6hNNM9otvLKtrKKRMXJU8gPhovU/ CcHCw4lDTvLWnwalZ3P6QNybct60YQqAT0JPsclEKSmEdhY/pPULm3kAiaNISUbYS8qlqftfD8OS Qp2OlST6tE87LPb2tJfTc8RV24Vp/qiuQRki7VJ5RexWkYItxLxZx/LyNA2GmyI2TjV7HTU0e4CR rGgjY8kFGFCKke+PCwjzWW19oT2SpAoeqEUNCWNMkESviSyGzt20uS6IaOW93EYruD9lae2LOORB 2ltqWlre2shKX1+EFjcH4yp2oK9sWUpWmd7o+qzzSSXrrLa3VuLa5h5lVDruZBX4a1xYjmgLCcLq S6dptuOUcPKYqQFb09uS02rizmo65BqepwTQWyvGaDkDxUU9hinYBlunaDaDSoUuwkzMimVpO527 9sBcMzNsb1prWaxS2QWz28CGKEsT6sbgn4dvtZFyNOLKF0qe3k0eS1nSnH+7+L4yxYfEoO/wqCuL dOA4il811c2T+jayFTUFX7jfo2LLw9l2tprss9p9ZijkkJohQ0oxFV38MWojhR2swxDg6SNb3USK 4eNvhSUAcipyJZjITAphqWiX0yW2pS3jzRafAtzJcn+5mc/7qiVeh/yssi4cJEFLtcv7SzeB76wW C8YJNHJQOOD9myLeBTa2ljqV4kt7cRSiMBo7cLWqnooAxZSyUuutEM90hsZPqkinZo6A8fkMWPjI fU9AtrSSDU74tdurUZpPiI49NsmEylxBqbWLOe1Z7cKxXiaKu9V37YWsR6Kia9pOqXltNf2EaSsw SW4XmgbagDKNmwJ8FEzeYdTewljs4WF3YzqZRAnOMwA9qdOS9sLXOFFj0t1BfeZnNvI9pb3ClpQP gYMorSh6YEg0itXglWzluIr+ZZooiok+zULuK5NgZUGPeVLy7uzPLdSGWUcBzY1O++Qk6rLMk006 11q7J3UcajLsbjyVdloSSBkjzYNKg9QfLAqq0fxAjqv04quZnI6b/KmNOZ+bkcYhtUDcf53q+r1L kNKDYAdPH6MHC5OLtTLjjER4R4f0+n/T/wCn/iaVzTagp0qMeFR2xlAEQMfDHi9PAP8AKfWs9aQg qSDXCIhZ9s6iQIJj67/hj9MvVwf1Fxdg5YHcdclwiqa/5Uz+N4wIGSuH0xH9X8f5rQJpTqDvQiuR I3asOuyQgYemcDLj4ckeP1/zlqs4qwAHscBCNPrZ4pGUeG5+mXpj/F/N/mf5rlYgHp8XUHEhlptd PDGUYiNZPr4o8XE0Zm6EAL0PTHhcj+V8tVUK4PC+j/JfzGjOaneo9wO2PCs+2M0iTLgldS4eAcPH D6Z/1uH0f1XGd1amx3qxA/Vjwhjj7XzxJNiRlPxfVGMv3n86LhcPyIUALWoJG+PCyxdsZochD6jk +gf3kv4lpmlWtDUVqKDHha8XamWERGPDUZ+JH0x9P/HXSOSenQAKRtSmEBp1GsyZZiRNGAEYcPo4 Iw+nhaMsgJNADSvKgrXBwt/8qZeLi9Hif6rwR8T+t/X/AKf1LDI7QlKA71NcaaTrZnEcRrhMuPl6 +P8An8SwkhiQQO22Fw2qL4qffFX/0ITTr75Jk4JXriq0DwxVd4Ab+IxVwNT0xV1d6Yq0y18DirYB AAp0NcVbKr0HXBatAbnElVpoWrSuBW+PLYDfDSu4+ONK1QVFBgVxoKin3Yq0OmKtsTsopiqyRSCG 7dCMVXqqOCrV+X0YqpKgFqtdippv88iWzEd09Grqlu91ZsHheMpwkaoSQDYBVFTxwO5whqy1Sf8A R0Llog03qSOQCp9NHrQ17itcgS5Jx7WERqds0GoxPE7TNc1IWJaRLDSqlj4j9rEG2GOW26jdPJGk rG3JtgjBXpy2YbkVHw/5OFJCVW630skUDSPGSRSY/CwB+WFlkiF+u6c3qRSrO7XWwj2POqnqvjgT CQ5IMT67a6lHJqKiS4VhRWpyYN0JGKZBHx68Z5byOWkMKAcXdeYND8W37J/ysBDXHYq3lSS3K3Et tcFLmZWVy4HEqu6jgfh7Y0kiynC3vl+aUW0sEFzO/o8JpKhmkb/eh+fYLtwUDGwgwKlTRoBqUsBa a0WQBnZCeK1I5KajnxoOXL+ZcbQDRpjr69FzW3t4ZJfWkPDhQtSld9h9nvjbMikw0iLUGvrqR0WO J4YgscxI5IzGhrkWUzaZRpcQaqGuJo4kmVgkCjnz26VPTxwg0y4tkj1PzJqjf6NBbI4esajryH2e mS4gx4K3Y3PZahpka3N7DJHGzGgQ8Rv22wcTbExLI/JutXEizR3G8UHH6qGFSnIfEK4205BSa6ld RSxsGelPiDA/ZI71ONsIBBafc6jIgvWlNzaOHQwOocsPFQwONtnIqPlaFYr+TUhygiZjamKSgoT8 RO1B0xtMjafyXMc0kws4zcSFRV1I4Bq8as5IphaYiQ5pbNrXmSytjbXdsCX/AHUckDh6MdgDiQzx gEoezhtLrR1tLxVg1S3LqrybIC5qTJxB3/lOCmYxkHYq5trYaVBdW1tFefA4a4LGJ1KHj8IPXfIs eM8RCCh0NngMk0MqTuBVmlRR1+9vuxbSTTI7jRbtorcvMheMAupWoI/1v7MXHGYXRYbdW97dXc1h EVqSwDlgKjuN8BDmgCMbTHSbDznppS1geMWpHIrJIrotP8mrdPlkgXHyEVdLNX03W7i8hu78xz2s xCG5hPJeJHw022xpj4oKvd2dtb6XG1qvG4tDsgALSL4E4kKBaD0zVtY+uTXX1SsKxAlUIYqakb98 CeAOn8wDV2a1aAvIlKAVUqclaIwINrbXyoIFa4aRoXYcnIpSnuOmNspHdR0q4s77SrqzdgJraRnj boSVNVI+eFbKm/mD9H+nClYYWuEmuhESGLr+yT/K3hhpFWitYis9VNtqEkUEWoNKzRRjlT0SKUuC tdycaackaRB0fSb14ApjMtvD/pQhLFDJLvTc9vlhthCPelo0i20++nEKhVfiTQdx0yMi4eqiANkg IZtUvtwPiXc5djdfJVI/Z7dskebByV5BiKbU3wJRKhaVA6nc5Ayek0GhxZMUJShxcU/DyS45R4If 6p/NaKnltuMkC6PUY4wySEDxwjI8M/6KxRTp9oeO4xtqiepFhzqobxHhjE25vaenhizcMPp4YS/0 8RJpo6VIAr7ZOLiZ8EscuE1f9E8X1NKqkENXkdsLHHilOQjEXI/wtiMA8div7XXIEuTp8PDnjDIL 9QhKN/zv6UG5FQA0p1oN8iC7DtHRwxifDGMeDL4cTDJ4k/8AKfXj4p8P0fxcEv8AeogeAock6ThN 11cykivce2KKaKjqR1xSYkNsU6Hr3OLFdGkZUlRzYfs1ptkSXddn6OGTDKYj42WMv7ni4P3P8+PD 6pu2CkgVBNBXCC4WfTjhOWFjF4nhw4/r/nLVVCVWvwnx64Sx0mIHLATFxnID+b9TTqPVZaVAPTxx C6vBwZpwj9MJyj/mxkpioqKEDsMlTigEtcdxXvgIQ1v2pT5YFf/RhJ2NMkyb3qMVcBua7DFW+P0H FXAGvTFXcRyOKtEUxVrfuaDFWwtaN9wyKtb8jtTFXcRirqAbqN++SCuqCB13xKtCnLau2RVdQGpx VZQnfFWyO/cYqtZjT4htiq9VBowND3HfFVi28twPRWiuXoORpkS24xab+XNFt9Lnuri7eNp3oI4z QAA9TQ9zgdnixSW6jDLLGKhEjjiZ1WnZ2p2AFa5XJzccuhUvLxvbyO7aZ3/R7ExRw12LgAtv9qhx g2ZQAdkfqRSXR5YfTLhV2QHiap+zXJNaS6LIL/UEErtElii/AG+Nm8d+i4s5pvqiSXEsNw92VMMi KokBVVBbZmcdgcXFNorzr5Ym0poZLqNIXnKm0eL94spfdpPWWqH2wpw5t6KWx2sVvwghYMG+KaRx UAe+Bypjq7WdDT6h9ZtC0ZH2n22p3oAMS0iW6SQQxPGFkLSu4p6o24vUdB2yDKUk2nhSC3maN3Le kU9FyeIBAqaDrWmLUDus0ywt7OOC+jjl+tP+85oAVBNQaexxb5clbWbnV2iDQ3ioLdkj9PgK8QtA CSTsMU4hxKq3CQaa968vO6SMiOoHEsSK02xYE70w+31u6tdVie7iDSBuTEdAOuw8cW+XJndzeWWr 2fomP1mmXaOnUDFxdwbQUGgDToS3Eq/UsN1xcmMhIJXaRzXE93Z3KvPGo5xOoorbbg4qY0jo76FN IDwO8K09M8FqyUND8sWBV7G0u4rKDgUuESQyniQ5ZmFPi96YoSy3ur69kudH06FZHUOZOZEfCr7N y26ZNskQmlqda029lk1m1A9Vg6yR7oDxC70NO22LST3Ipm0htRheXgDNyWGSU0j9Vh8Bk/mWuKN1 HV9FSwtJ3Nus0VqVMLStwEsjkGX0+Pw8U/1ciWUCLSO889WkVY3j2qKoIxUH54GRiSU1h842EsQJ mKLtu2wHti1y05u0LBpYt9Wtbu4k9V7l3IhI2UEVBOLZIHgV547aXWJBbu3quvp1VuMa/wAwP9mL IkDHuq2t5DZvb2jXcNxbPH9Wt4rdmKMS1OUgIHB46dMm45jSMGgwS24ikupOZB9Rl+Bup23GAr4l JI3l2SHWmjtZWW3SMOGY1JYnYE9+hyLbA2l31y0svMJuCBWNSnWnIt0+nFtKdtqA1hkitGAtY/iv a9eP8g+eENMkvu/Lln+kYrrTYwkisJHt+RClV6A++SY8SnquveW7YO+qW9xFdvdLcNVFahH7G1Bx 2yQa55KVvLmu2+ryXQtLX0bdZDIee32vsj6MLET40fdQRWlw1xbUE0opOoNNgNtumQbI8kkTUHvL ubnGY3SikVrgLgapIONdQvSTSrKBTxy/G6+SrIFJWoP+UckebBuIgNRmJ98BSFViOG5OxrkOrtcm bGdLHGD64zM+X8/0/UvjNFG/zwEOx7O7SwYccYkmP1+LHhlPjlP0xl9XD9P9D/ilpcUBB2pQ400T 18DjjGM5Y4xx+DPHwcWOf+2/V/H9X8+H8LuasBQnb8TjEOTre1MGXHwRlkx8IH0D+99Ih+8jxf0I 8P8AR/pOZ6EmpAIoNu+SIoJPa2LjnKM5x8THCH0/5SH+U+r8cbXKvJ1qakDbIt8dSJyzZ8Inl8Qw jwY/3eaH9PijxS4fTwelpgBNyrsaVGSHJ1uvMYa4TkeEEwzTj/Fj/i8KX9NqoEtezAkHwrjWzXDW 4oaueUE8OTxOGfD68Msv8XD/ALW36sZAIqWHwg+NcHCXNh2ngAAJlLLCBjHUSB/jl9PDx8fDGHoi 2XHJ9+JO3vUY8LOfauLxMkozlHxYRj9J/vY/5T6v6P8AW9S2WRWQgEmtKD5YiNNfaPamLNjnETke MwlCPD9Phx9f/KyXqUeYG3AFj365KnTQ1cYw4Rjxk19c+Kc/631eH/V9C5eIoxqrg9R4Yls0k8MY gmUsWaE+LjiOL93t6fq+qPq/rcS8zArXdfjrx8R4ZHhdrl7Zx5IG+Mfv/F8L+DJi9P7ue/8AFLjy fxeuTjJHXqW+KtTTbGmUu0sMieKc58WWOaPFH+4jD1cMfV/F/d+n0O9RfiABBLcq7/wIx4Syh2rh jx0eEzzeNx1P1Rl/BLwsmKXo/rcElq3SDZuQNSSKbUOEwLZp+2sYA4pGPrySlCMPRwZI8MY/VL+P 95woZmUbA1r275YXkTzaqTvxIyKH/9KGUGSZOoMVdQHYdetMVdU1BPQ9sVbqcVaxVxApirVAaBth 44q3+z8O9TQn2xpWuFDU40rjjSrdwdh9OKtnqArfLEq4Amp+jwyKtDv/AFriq4big2oMVaUGlTkq Va32QfapwFXLuK+I/DAq2SRo4mlA5em1eJ7jIEt2I7tXOp22sXUEVnHJEyhPVMlCFKn4uJH2lb9n AHcYshrmn2oXFpb2rWUgeqIjAjk6lS3U+H0YJBuDdlA8VrLBbenBbwOJJWc1cBwCW4H49h3wRZSK xrHTHu1jiuTdTThvVkViEC/5CnqcLIBqewh01aRqsUY3MxHxPQdycjbWCSgby9jgspFluGnW4UNG BTgCN+2NtkYBPPLOv6pohTS76OPVdBuEVzYSlqQ892aEivE/zL9nG2jLhA3HNM9T0DRJ9Lu9U8uT NLHC3q3VgxX1YgO4/wAnwrxV/wCdskGqGSQ2JSG3aCedPrUziBERnj2Qc5RVEofj5L+3XFvuJG31 IiU6e119SgobniSTH1X3xpmMdDdS1uzjtdOCRXXK7K1eCaM8nB68WX4fvxpriAgbG90s6XG0rPE0 a8JTG/IBq917Y0z3Q0FteXt2RFIl1ZsQSxADgfMY0wnl4fp2TiCCxWw+rTwzwNEzLHIUWWMg9+Ne XXGmAkTulkel6KdSmM00U8iisMe6MCRRi6np0xptjM9VZ9JVCtylw8UAVozFEpeq+IZd1xps441R Syz1HWdR1KXTYD6kSR8jzPGir0b/AGWNJjKIOwRelW1/Bqwtp/Uh+FmD0rv2A+nGmUppdc6Dew66 0UsssenXMtPWY8Aysf3g+jIliBYTOysNEji9GwE0TpJLzk9R2o6r+6B24/H7YEQieqE0Tyvq13NN etOtnEytDJDIpMkm9eQ3+HfJsMvkj9TOoW0s9mZmlgvI41iJI4rw2YU7NiuMIGxkjsLZbLUx6ysx Ec7jlsTUD2I8cWUrR9zpt9diNbG
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-digest.msg0000644000000000000000000000143611702050534027775 0ustar rootrootFrom: Nathaniel Borenstein To: Ned Freed Subject: Sample digest message MIME-Version: 1.0 Content-type: multipart/digest; boundary="simple boundary" This is the preamble. It is to be ignored, though it is a handy place for mail composers to include an explanatory note to non-MIME conformant readers. --simple boundary From: noone@nowhere.org Subject: embedded message 1 This is implicitly-typed ASCII text. It does NOT end with a linebreak. --simple boundary Content-type: message/rfc822; charset=us-ascii From: noone@nowhere.org Subject: embedded message 2 Content-type: text This is explicitly typed plain ASCII text. It DOES end with a linebreak. --simple boundary-- This is the epilogue. It is also to be ignored. apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-badnames.xml0000644000000000000000000000223311702050534030276 0ustar rootroot
From: Nathaniel Borenstein <nsb@bellcore.com> To: Ned Freed <ned@innosoft.com> Subject: Sample message MIME-Version: 1.0 Content-type: multipart/mixed; boundary="simple boundary"
This is the preamble. It is to be ignored, though it is a handy place for mail composers to include an explanatory note to non-MIME conformant readers.
Content-type: text/plain; charset=us-ascii; name="/foo/bar"
Content-type: text/plain; charset=us-ascii; name="foo bar"
This is explicitly typed plain ASCII text. It DOES end with a linebreak.
Content-type: text/plain; charset=us-ascii; name="foobar"
This is explicitly typed plain ASCII text. It DOES end with a linebreak.
This is the epilogue. It is also to be ignored.
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/sig-uu.out0000644000000000000000000000166611702050534026625 0ustar rootrootContent-type: text/plain Subject: Here's my UU'ed sig! Well, I don't know much about how these things are output, so here goes... first off, my .sig file: begin 644 .signature M("!?7U\@(%\@7R!?("`@7R`@7U]?(%\@("!%2\*("`@("`@("`@("!\7U]?+R`@("!\ M7U]?7U]?+R!O9B!T:&4@:&]M96QE+Z3Q4C@U3S$I@0XC#J?UFD2]3I.JU5O#+R4CLD4,;IK7I>%[EX[+M\, +C/A\<0=Y^J4)`#L` end Done! apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/ak-0696_decoded.xml0000644000000000000000000000620511702050534030043 0ustar rootroot
Date: Thu, 20 Jun 1996 08:35:17 +0200 From: Juergen Specht <specht@kulturbox.de> Organization: KULTURBOX X-Mailer: Mozilla 2.02 (WinNT; I) MIME-Version: 1.0 To: andreas.koenig@mind.de, kun@pop.combox.de, 101762.2307@compuserve.com Subject: [Fwd: Re: 34Mbit/s Netz] Content-Type: MULTIPART/MIXED; boundary="------------70522FC73543" X-Filter: mailagent [version 3.0 PL44] for k@.in-berlin.de
This is a multi-part message in MIME format.
Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit
Content-Type: message/rfc822 Content-Transfer-Encoding: 7bit Content-Disposition: inline
X-POP3-Rcpt: specht@trachea Return-Path: hermes Received: (from hermes@localhost) by kulturbox.netmbx.de (8.7.1/8.7.1) id SAA04513 for specht; Wed, 19 Jun 1996 18:30:12 +0200 Received: by netmbx.netmbx.de (/\==/\ Smail3.1.28.1) from mail.cs.tu-berlin.de with smtp id <m0uWPrO-0004wpC>; Wed, 19 Jun 96 18:12 MES Received: (from nobody@localhost) by mail.cs.tu-berlin.de (8.6.12/8.6.12) id SAA12413; Wed, 19 Jun 1996 18:26:28 +0200 Resent-Date: Wed, 19 Jun 1996 18:26:28 +0200 Resent-Message-Id: <199606191626.SAA12413@mail.cs.tu-berlin.de> Resent-From: nobody@cs.tu-berlin.de Resent-To: kultur@kulturbox.netmbx.de Received: from gatekeeper.telekom.de ([194.25.15.11]) by mail.cs.tu-berlin.de (8.6.12/8.6.12) with SMTP id SAA11678 for <specht@kulturbox.de>; Wed, 19 Jun 1996 18:11:29 +0200 Received: from ULM02.mnh.telekom.de by gatekeeper.telekom.de; (5.65v3.0/1.1.8.2/02Aug95-0132PM) id AA01376; Wed, 19 Jun 1996 18:11:27 +0200 Received: from ulm02.mnh.telekom.de (deuschle@mnh.telekom.de) by ULM02.mnh.telekom.de (8.6.10/3) with SMTP id SAA30680 for <specht@kulturbox.de>; Wed, 19 Jun 1996 18:14:40 GMT Message-Id: <199606191814.SAA30680@ULM02.mnh.telekom.de> X-Sender: deuschle@ulm02.mnh.telekom.de X-Mailer: Windows Eudora Version 1.4.4 Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Date: Wed, 19 Jun 1996 18:12:02 +0200 To: Juergen Specht <specht@kulturbox.de> From: deuschle@mnh.telekom.de (Guenter Deuschle) Subject: Re: 34Mbit/s Netz X-Mozilla-Status: 0011
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-bad.msg0000644000000000000000000001254411702050534027246 0ustar rootrootFrom: Michelle Holm Date: Mon, 21 Aug 95 13:30:57 -600 Sender: holm@sitka.colorado.edu To: imswww@rhine.gsfc.nasa.gov Mime-Version: 1.0 X-Mailer: Mozilla/1.0N (X11; IRIX 5.2 IP20) Content-Type: multipart/mixed; boundary="-------------------------------147881770724098" Subject: http://rhine.gsfc.nasa.gov:8080/ims-bin/v.b/imssearch X-Url: http://rhine.gsfc.nasa.gov:8080/ims-bin/v.b/imssearch Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit > [[ERROR]] Error 600: Internal logic. > > Dying gasp: > Bad mode: SEARCH/ (600). > > Recommended action to correct the situation: > YIKES! IMS/www failed one of its internal consistency checks! Please SAVE > THIS FILE, and contact IMS/www's developers immediately so they can fix the > problem! If the parentheses at the end of this sentence are not blank, you > can contact them here (imswww@rhine.gsfc.nasa.gov). > > ------------------------------------------------------------------------ > > > Location of error > > Dying gasp: > Package "main", file "/usr/app/people/imswww/v.b/lib/perl/imssearch.pl", line > 753. > > Traceback: > > 1. Iw::Die: from "main", "/usr/app/people/imswww/v.b/lib/perl/imssearch.pl > line 753 > 2. main::Main: from "main", > "/usr/app/people/imswww/public_cgi/v.b/imssearch line 85 > > ------------------------------------------------------------------------ > > > Basic state information > > Include path > > /usr/app/people/imswww/v.b/lib/perl > /usr/app/people/imswww/v.b/lib/perl/Eg > /usr/local/lib/perl5/sun4-sunos > /usr/local/lib/perl5 > . > > Environment variables > > CONTENT_LENGTH = "281" > CONTENT_TYPE = "application/x-www-form-urlencoded" > DOCUMENT_ROOT = "/usr/local/etc/httpd/htdocs" > GAEADATA_DIR = "/home/rhine/ims/lib/gaea_data" > GAEATMP_DIR = "/usr/app/people/imswww/v.b/tmp/imswww-usr/809033436-10153" > GATEWAY_INTERFACE = "CGI/1.1" > HTTP_ACCEPT = "*/*, image/gif, image/x-xbitmap, image/jpeg" > HTTP_REFERER = "http://rhine.gsfc.nasa.gov:8080/ims-bin/v.b/imssearch" > HTTP_USER_AGENT = "Mozilla/1.0N (X11; IRIX 5.2 IP20)" > IMS_STAFF = "1" > IW_CGI_DIR = "/usr/app/people/imswww/v.b/cgi-bin" > IW_DOCS_DIR = "/usr/app/people/imswww/v.b/docs" > IW_LIB_DIR = "/usr/app/people/imswww/v.b/lib" > IW_SESSION_DIR = "/usr/app/people/imswww/v.b/tmp/imswww-usr/809033436-10153" > IW_SESSION_ID = "809033436-10153" > IW_TMP_DIR = "/usr/app/people/imswww/v.b/tmp" > PATH = "/bin:/usr/bin:/usr/etc:/usr/ucb:/usr/local/bin:/usr/ucb" > QUERY_STRING = "" > REMOTE_ADDR = "128.138.135.33" > REMOTE_HOST = "sitka.colorado.edu" > REQUEST_METHOD = "POST" > SCRIPT_NAME = "/ims-bin/v.b/imssearch" > SERVER_NAME = "rhine.gsfc.nasa.gov" > SERVER_PORT = "8080" > SERVER_PROTOCOL = "HTTP/1.0" > SERVER_SOFTWARE = "NCSA/1.4.2" > SYSLOG_LEVEL = "7" > USRDATA_DIR = "/usr/app/people/imswww/v.b/tmp/imswww-usr/809033436-10153" > > Tags > > pmap-geo-opt = "map" > pparam-param = "Sea Ice Concentration" > pparam-param = "Snow Cover" > pparam-param = "Total Sea Ice Concentration" > s-east-long = "-40.0" > s-north-lat = "75.3" > s-south-lat = "66.0" > s-start-date = "01-01-1990" > s-start-time = "" > s-stop-date = "31-12-1994" > s-stop-time = "" > s-west-long = "-176.0" > sid = "809033436-10153" > > Permissions > > Real user id = 65534 > Real group ids = 65534 65534 > Effective user id = 65534 > Effective group ids = 65534 65534 > > ------------------------------------------------------------------------ > > > Log file /usr/app/people/imswww/v.b/tmp/imswww-usr/10184.clog > > II 1995/08/21 15:33:50 IwLog 94 > Logging begun > WWW 1995/08/21 15:33:50 Iw 263 > Perl: Use of uninitialized value at /usr/app/people/imswww/v.b/lib/perl/ims ; > search.pl line 82. > | > EEEE 1995/08/21 15:33:51 Iw 95 > Bad mode: SEARCH/ (600). > > ------------------------------------------------------------------------ > > > Session information > > [Session Directory] > > ------------------------------------------------------------------------ > > Generated by EOSDIS IMS/www version 0.3b / imswww@rhine.gsfc.nasa.gov > NASA/GSFC Task Representative: Yonsook Enloe, yonsook@killians.gsfc.nasa.gov > > A joint project of NASA/GSFC, A/WWW Enterprises, and Hughes STX Corporation. > Full contact information is available. ---------------------------------147881770724098 Content-Type: text/plain Content-Transfer-Encoding: 8bit [[ERROR]] Error 600: Internal logic. Dying gasp: Bad mode: SEARCH/ (600). Recommended action to correct the situation: YIKES! IMS/www failed one of its internal consistency checks! Please SAVE THIS FILE, and contact IMS/www's developers immediately so they can fix the problem! If the parentheses at the end of this sentence are not blank, you can contact them here (imswww@rhine.gsfc.nasa.gov). ------------------------------------------------------------------------ Location of error Dying gasp: Package "main", file "/usr/app/people/imswww/v.b/lib/perl/imssearch.pl", line 753. Traceback: 1. Iw::Die: from "main", "/usr/app/people/imswww/v.b/lib/perl/imssearch.pl line 753 2. main::Main: from "main", "/usr/app/people/imswww/public_cgi/v.b/imssearch line 85 ------------------------------------------------------------------------ Basic state information Include path /usr/app/people/imswww/v.b/lib/perl /usr/app/people/imswww/v.b/lib/perl/Eg /usr/local/lib/perl5/sun4-sunos /usr/local/lib/perl5 apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/double-semicolon.xml0000644000000000000000000000101111702050534030625 0ustar rootroot
Mime-Version: 1.0 Content-Type: multipart/alternative;; boundary="foo"
Preamble
Content-Type: text/plain; charset=us-ascii
The better part
Content-Type: text/plain; charset=us-ascii
The worse part
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/dup-names.out0000644000000000000000000000746311702050534027306 0ustar rootrootReturn-Path: eryq@rhine.gsfc.nasa.gov Sender: john-bigboote Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Eryq Organization: Yoyodyne Propulsion Systems X-Mailer: Mozilla 2.0 (X11; I; Linux 1.1.18 i486) MIME-Version: 1.0 To: john-bigboote@eryq.pr.mcs.net Subject: Two images for you... Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE" This is a multi-part message in MIME format. --------------299A70B339B65A93542D2AE Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="one.gif" R0lGODdhKAAoAOMAAAAAAAAAgB6Q/y9PT25ubnCAkKBSLb6+vufn5/Xes/+lAP/6zQAAAAAAAAAA AAAAACwAAAAAKAAoAAAE/hDJSau9eJLMOyYbcoxkaZ5oCkoH6L5wLMfiWqd4btZhmxbAoFCY47EI qMJgyWw2ATjj7aRkAq5YwDMl9VGtKO0SiuoiTVlscsxt9c4HgXxUIA0EAVOVfDKT8Hl1B3kDAYYl e202XnGGgoMHhYckiWVuR3+OTgCGeZRslotwgJ2lnYigfZdTjQULr7ALBZN0qTurjHgLKAu0B5Wq opm7J72etQN8t8Ijury+wMtvw8/Hv7Ylfs0BxCbGqMmK0yOOQ0GTCgrR2bhwJGlXJQYG6mMKoeNo WSbzCWIACe5JwxQm3AkDAbUAQCiQhDZEBeBl6afgCsOBrD45edIvQceGWSMevpOYhl6CkydBHhBZ QmGKjihVshypjB9ClAHZMTugzOU7mzhBPiSZ5uDNnA7b/aTZ0mhMnfl0pDBFa6bUElSPWb0qtYuH rxlwcR17YsWMs2jTql3LFkQEADs= --------------299A70B339B65A93542D2AE Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="one.gif" R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAAAAAA AAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7VujnC96I RVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7+3dCeRRjfAKH iImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatLrU8GaQdOBAQAB7+y XliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJvs7Y5ewH3d7Fxe3jB4rj 8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjwE0cdGxQ/gswosoKUkmuU2FnJ csSKGTBjypxJsyaICAA7 --------------299A70B339B65A93542D2AE Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="two.nice.gif" R0lGODdhKAAoAOMAAAAAAAAAgB6Q/y9PT25ubnCAkKBSLb6+vufn5/Xes/+lAP/6zQAAAAAAAAAA AAAAACwAAAAAKAAoAAAE/hDJSau9eJLMOyYbcoxkaZ5oCkoH6L5wLMfiWqd4btZhmxbAoFCY47EI qMJgyWw2ATjj7aRkAq5YwDMl9VGtKO0SiuoiTVlscsxt9c4HgXxUIA0EAVOVfDKT8Hl1B3kDAYYl e202XnGGgoMHhYckiWVuR3+OTgCGeZRslotwgJ2lnYigfZdTjQULr7ALBZN0qTurjHgLKAu0B5Wq opm7J72etQN8t8Ijury+wMtvw8/Hv7Ylfs0BxCbGqMmK0yOOQ0GTCgrR2bhwJGlXJQYG6mMKoeNo WSbzCWIACe5JwxQm3AkDAbUAQCiQhDZEBeBl6afgCsOBrD45edIvQceGWSMevpOYhl6CkydBHhBZ QmGKjihVshypjB9ClAHZMTugzOU7mzhBPiSZ5uDNnA7b/aTZ0mhMnfl0pDBFa6bUElSPWb0qtYuH rxlwcR17YsWMs2jTql3LFkQEADs= --------------299A70B339B65A93542D2AE Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="two.nice.gif" R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAAAAAA AAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7VujnC96I RVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7+3dCeRRjfAKH iImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatLrU8GaQdOBAQAB7+y XliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJvs7Y5ewH3d7Fxe3jB4rj 8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjwE0cdGxQ/gswosoKUkmuU2FnJ csSKGTBjypxJsyaICAA7 --------------299A70B339B65A93542D2AE Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="two.nice.gif" R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAAAAAA AAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7VujnC96I RVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7+3dCeRRjfAKH iImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatLrU8GaQdOBAQAB7+y XliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJvs7Y5ewH3d7Fxe3jB4rj 8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjwE0cdGxQ/gswosoKUkmuU2FnJ csSKGTBjypxJsyaICAA7 --------------299A70B339B65A93542D2AE-- apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-frag.xml0000644000000000000000000001022611702050534027444 0ustar rootroot
MIME-Version: 1.0 From: Lord John Whorfin <whorfin@yoyodyne.com> To: <john-yaya@yoyodyne.com> Subject: A complex nested multipart example Content-Type: multipart/mixed; boundary=unique-boundary-1
The preamble of the outer multipart message. Mail readers that understand multipart format should ignore this preamble. If you are reading this text, you might want to consider changing to a mail reader that understands how to properly display multipart messages.
Part 1 of the outer message. [Note that the preceding blank line means no header fields were given and this is text, with charset US ASCII. It could have been done with explicit typing as in the next part.]
Content-type: text/plain; charset=US-ASCII
Part 2 of the outer message. This could have been part of the previous part, but illustrates explicit versus implicit typing of body parts.
Subject: Part 3 of the outer message is multipart! Content-Type: multipart/parallel; boundary=unique-boundary-2
A one-line preamble for the inner multipart message.
Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-vise.gif" Subject: Part 1 of the inner message is a GIF, "3d-vise.gif"
R0lGODdhKAAoAOMAAAAAAAAAgB6Q/y9PT25ubnCAkKBSLb6+vufn5/Xes/+lAP/6zQAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJLMOyYbcoxkaZ5oCkoH6L5wLMfiWqd4btZhmxbA oFCY47EIqMJgyWw2ATjj7aRkAq5YwDMl9VGtKO0SiuoiTVlscsxt9c4HgXxUIA0EAVOVfDKT 8Hl1B3kDAYYle202XnGGgoMHhYckiWVuR3+OTgCGeZRslotwgJ2lnYigfZdTjQULr7ALBZN0 qTurjHgLKAu0B5Wqopm7J72etQN8t8Ijury+wMtvw8/Hv7Ylfs0BxCbGqMmK0yOOQ0GTCgrR 2bhwJGlXJQYG6mMKoeNoWSbzCWIACe5JwxQm3AkDAbUAQCiQhDZEBeBl6afgCsOBrD45edIv QceGWSMevpOYhl6CkydBHhBZQmGKjihVshypjB9ClAHZMTugzOU7mzhBPiSZ5uDNnA7b/aTZ 0mhMnfl0pDBFa6bUElSPWb0qtYuHrxlwcR17YsWMs2jTql3LFkQEADs=
Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-eye.gif" Subject: Part 2 of the inner message is another GIF, "3d-eye.gif", but the terminating boundary is bad!
R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7 VujnC96IRVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7 +3dCeRRjfAKHiImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatL rU8GaQdOBAQAB7+yXliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJ vs7Y5ewH3d7Fxe3jB4rj8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjw E0cdGxQ/gswosoKUkmuU2FnJcsSKGTBjypxJsyaICAA7 XXXXXX--unique-boundary-2-- The epilogue for the inner multipart message.
Content-type: text/richtext
This is <bold>part 4 of the outer message</bold> <smaller>as defined in RFC1341</smaller><nl> <nl> Isn't it <bigger><bigger>cool?</bigger></bigger>
Content-Type: message/rfc822; name="nice.name";
From: (mailbox in US-ASCII) To: (address in US-ASCII) Subject: Part 5 of the outer message is itself an RFC822 message! Content-Type: Text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: Quoted-printable
Part 5 of the outer message is itself an RFC822 message!
The epilogue for the outer message.
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-simple_decoded_1_1.txt0000644000000000000000000000011511702050534032140 0ustar rootrootThis is implicitly typed plain ASCII text. It does NOT end with a linebreak.apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/not-mime.xml0000644000000000000000000000122511702050534027121 0ustar rootroot
Return-Path: <s.rahtz@elsevier.co.uk> To: Eryq <eryq@rhine.stx.com> From: s.rahtz@elsevier.co.uk (Sebastian Rahtz) Subject: Re: HELP! Problems installing PSNFSS, and other querys Date: Wed, 15 Feb 1995 09:38:18
try reading the LaTeX Companion for more details ignore the checksum error in lucida.dtx. i'll fix it sebastian Sebastian Rahtz s.rahtz@elsevier.co.uk Production Methods Group +44 1865 843662 Elsevier Science Ltd Kidlington Oxford, UK
././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/uu-junk-target_decoded_1_2_3.binapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/uu-junk-target_decoded_1_2_3.0000644000000000000000000001134211702050534032070 0ustar rootrootGIF87a[p÷9!9)B)J)J1R1R9Z1!!!Z9R1c9cBZ9kBc9cB)))Z9kBkJc9cBsJ111B)1kJ{RsRsJkB„R„ZR)9sBŒZ999k!BB99”Z”cŒZs!J„R„Z”cR9B{!RBBBs)J„!Js)R„!R„!Z„)R”!cJJJk9R{1Zs9R”)cRRRcJRZRJ”1c”1kœ1k”9Z”9c„BZ”9kZZZŒBZ„Jc¥9sœBcŒJk­9k”JcœB{ccc{Zc¥Bs”Rk¥Jk{cc­Jkkkk­Js­J{„ck”Zs{kk¥R{­Rs¥ZkµRssssŒkk­Zs­Z„µZ„­csŒss­c{{{{”ss­c„œss­k{½c{Œ{{œs{µk{½c”œ{{„„„½k„œ{”¥{{½kŒ¥{„¥{”œ„{½sŒ¥{œÞcŒŒŒŒ­{œ¥„„Îk”½{Œ­„„µ{œÎsŒ­„Œµ{¥Þk””””­ŒŒµ„¥½„¥µŒŒµŒ”Ö{œ½ŒŒ­”Œ½Œ”Þ{”Þ{œœœœÞ„”½””Æ””Æ”œÖŒœ¥¥¥ç„¥½œœÎ”œÖ”œï„­ÆœœÖ”¥ÞŒµÞŒ½ÎœœÎœ¥Þ”¥½¥¥ïŒ¥­­­Æ¥¥Î¥¥ç”½ï”µÖ¥¥Ö¥­çœ­µµµÞ¥­Þ¥¥Þ¥µ÷œ¥ç¥­÷œ­Ö­­ç¥µÞ­­ç¥½Þ­µï¥­ÿœµÿœ½½½½ï¥½ÿœÆç­­ç­µï¥Î÷¥½ÿ¥½ï­½ÿ¥Æçµµÿ¥Î÷­ÆÆÆÆïµµÞ½µïµ½ÿ­½÷µ½ç½½ï½½ÿµÎÿµÆ÷½½ÎÎÎçÆ½÷½Æÿ½Æÿ½Î÷ÆÆÿ½Þ÷ÆÎÖÖÖÿÆÆÿÆÎÿÆÞÿÆçÿÎÎïÖÎÿÎÖÞÞÞÿÎÞÿÖÖÿÖÞÿÖççççÿÞÞÿÞçÿçÞÿççÿçïÿç÷ïïïÿïï÷÷÷ÿ÷÷ÿ÷ÿÿÿÿ,[pÿÿ H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3j”©£GH CŠ’‘ÉD„Rª\ɲe —0cú™I³æL=8sêT¸¡§Ïž‚b¸@´(…£H!(…ð Ó§P(˜ª Õ«²jÕz k¯`ÁK`€Ù³<þ:´(Q¤I—6•jÕ«X·rõ6,Ù²g¤Uë“m[£pÊK÷)U¼yõfåÛW,Y´ ?VËÖíÛÄK™6†jrÉ{T¶<֬š7êùBb ¡.m5‚®ªWø+83lÙ³i»½[©îÝSMŸöMy5Ù×°#ßÐÙ3s¹£?ÿ†ìûwõ¾c±g¼ûrÐàÃKO5páÃÕ¯ßÎÝýgø¢É7ß]õÙÜjú­Çžlþý—sòV ^÷U– ‚ü5hÛmñ…'!^ÔW€B#(ˆáv†yÇ!„F×[ˆ}‘X¢‰û¡¨Ü{påÖ¢‹ f•@Ó™w Œ3Ò¨]{7"–c‡Ðñh• d4’É&ŠâÂd|9B‘4fØàwÎ=G×c Dш+uHQƒ50¡{˜ [Öidv^UÛŠ,z¨€¥l¢†‘¥pˆ{)DurÙ¥zª¸dŸ½P 1gX ]VH$±ÕŠ.Ú¨£&æ©’“ŠÙÀv<£È ôÿˆCz…º(£vÞ¹àf‚ S/ÈâÊâ9i•oԚР·ŠÚ¨®»Ö+€ZM#&Ô«U‡(‹Ð Ì6;*©5"™ä†J`H4rLÐ$^ä$ ®¸Ïêjêž ½° 1ÄÊÇ[cäU¯½÷:›ëûJzä„rïMVå Œp³¸.ü¨¹§þ79˜xÀd“H¤™Æs<*´ »e9†x ØÉc*ð¡x±Œp“[.ƒI"ÔªJš˜€Ï?»ü2Ãê‰Ê6X ›ªÒ \€} ±ðsÔR{ü1ÑȲ8>Hq者. XUØbÝò­SSÿ½]*ÜÁ錄ÖP‹=÷Ü£‹vãÍ zÛ[ö–0#wuçúÚ”´|ÃN?÷°³ÊNMå8 yGÎqЕ«uµý…ìàƒ_´âK5ì|“/78v:ê‘KޝÙëÁ\t<*éÀÔ¹Zß ÁX" ,°´bÉPýŽ:äÁON9l;¤ÁŠ5ë´£¾úꤌ3Ÿ ‘Cì²çE`¬1Çþ`”Ð}B¨  ƒ´ŽÁ ¼XGúàÁÀÊ#Ç``;ø 4€`Zpi‚J0!a%HÀÿ"À¦Nuâ‚°¡@õ5°ïPG_8Áu€”]ô‚ÅxÐPèÀƾü@耇¸¬¬ ˆ$ €pŠnœ-|!<â‘yÌ¢ŠV¼â:ÎŽOäzpÑB "À$'üY áF&Æ‘†ò8Æ;ð(Ç¢ƒÔP ) ƒ$HïW>Cd"Á•F‚ã \`Û¡d¬ƒ’•Lå9ÎÑ j„áKbÁÖµC¢ay€†5º1T>í 3Ê!ÇfÖp—G7 Áÿà@ |b ÔÌ(JR&Ú ¦1ÓçDxlCàhf%ŸÍnX·¼B½æ(e›àe€¡ÿ j„³˜ãT7– uÒ³”¦6  M²G@U\ð ._ Ð ¸4üÙSŽsÜÆ0ÊYÅU®/•ÐLh7šŒSè vdЀâ(Z”1E-4ÊQpŽë‡4láÄxÐãø¸G=èL”bq–ãP(4”ŒK„€;;`Âa$JPðä-vºQk„Ó£oÇ3fq'ÖþÈ>îÁT§^R¥Úx'Ui1†žœÁ™ƒ‹­¾ŠºÐb¬üf8;:Ës4Ã,l=ðQ|Ô©DÇ]ùØ•ê´ðŒp„IÊV‹²) bqØÄRì=e3šÁ 8ÿ£ý0>âÍÍrÖ³Ô`(hU9$g«Ÿ!Ç‚·U¬b´†kaÛk<ƒ³D‡ds[{`¶±çˆjgó\ªâ‚ªàÄK‹Ü®&¤NÍŠÜTá\Äj´¬ÚÀÆ3>¾òqH>˜zÉqˆw¼Ö®p«ŠN\AZçÒÒrÖ‚N˜Âª`­t¿YÖb„‚±‡vãq}˜xuå£4ÇK^h@#À8o,LÁ Dð*IZÁ„ÁåNxâÂÐ.08LŒYœBHŽ-Ë)Á=®x¥yM°‹a ZôÒX>¸±r^3ªÇœ°p}… Œ^ãÔx­YëÓðBuÿÅH޲‚•AåîBžàÄ#š€6=ag\Ë=˜ÃŒaÖFwÈ„2\\Vk¬9ÎŽ²”MUé6ª 1'‡ªé§Ë·‚$&q 0ÿ8ôÈE1(‘ ~.šÑMspe-kXOUº–¦¦M‘gI W5×…@]I[¦.ô.fq \KW¯¶µ´] mg×âÒ™Î3'$Q8Ì/CÃmìd³¢u8ìN a@Úî~·2„Án`\ÛÎÙ³$±8øàH²¹lFu…G Organization: Yoyodyne Propulsion Systems X-Mailer: Mozilla 2.0 (X11; I; Linux 1.1.18 i486) MIME-Version: 1.0 To: john-bigboote@eryq.pr.mcs.net Subject: test of double-boundary behavior Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE" This is a multi-part message in MIME format. --------------299A70B339B65A93542D2AE --------------299A70B339B65A93542D2AE Content-Type: text/html; charset=us-ascii Content-Transfer-Encoding: 7bit Subject: [2] this should be text/html, but double-bound may mess it up

This message contains double boundaries all over the place. We want to make sure that bad things don't happen.

One bad thing is that the doubled-boundary above can be mistaken for a single boundary plus a bogus premature end of headers. --------------299A70B339B65A93542D2AE --------------299A70B339B65A93542D2AE Content-Type: text/html; charset=us-ascii Subject: [4] this should be text/html, but double-bound may mess it up

Hello? Am I here? --------------299A70B339B65A93542D2AE --------------299A70B339B65A93542D2AE Content-Type: text/html; charset=us-ascii Subject: [6] this should be text/html, but double-bound may mess it up

Hello? Am I here? --------------299A70B339B65A93542D2AE Content-Type: text/html; charset=us-ascii Subject: [7] this header is improperly terminated --------------299A70B339B65A93542D2AE Content-Type: text/html; charset=us-ascii Subject: [8] this body is empty --------------299A70B339B65A93542D2AE Content-Type: text/html; charset=us-ascii Subject: [9] this body also empty --------------299A70B339B65A93542D2AE Content-Type: image/gif; name="3d-eye.gif" Content-Transfer-Encoding: base64 Subject: [10] just an image R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7 VujnC96IRVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7 +3dCeRRjfAKHiImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatL rU8GaQdOBAQAB7+yXliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJ vs7Y5ewH3d7Fxe3jB4rj8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjw E0cdGxQ/gswosoKUkmuU2FnJcsSKGTBjypxJsyaICAA7 --------------299A70B339B65A93542D2AE-- ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-nested3_decoded_1_3_2.binapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-nested3_decoded_1_3_2.b0000644000000000000000000000054511702050534032050 0ustar rootrootGIF87a((óÌÝîÿ¾¾¾ˆˆˆnnnÌÝîÿÿÿççç,((þÉI«½x–Ì;.2Œdižh Jè¾p,ÇâZ{8Ö†mîS;Vèç ÞˆE[Y8Ÿã’ù¬Bk¼¡ÏÊD•ZN×z‘†-ãkÆŒI;S# ¸í†äYt:ÀïûûwByc|‡ˆ‰‰_ƒ]‰nUBV‘‡“c–G˜šœ“‚—¡¢i¤Ÿ§©U±U«K­OiN¿²^X—N¸ÆÅ¸¼V›¿ÀN´··¿ˆOÙÎÈÑÆà¸ÎºŠÍÏWlàÉ¾ÎØåìÝÞÅÅíãŠãòÞ¸Öº¯fá)Í×±X*LhÍ#aǘ4œC!–ĉŽ$X¼8ðG?‚Ì(²‚”’k”ØYÉrÄŠ0cÊœI³&ˆ;apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/german-qp.msg0000644000000000000000000000123111702050534027246 0ustar rootrootContent-Type: text/plain; charset="iso-8859-15" Content-Disposition: inline Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Mailer: JaM - Just A Mailer Subject: Testnachricht Return-Path: Date: Wed, 21 Dec 2005 22:02:44 +0100 To: joern@zyn.de From: =?ISO-8859-15?Q?J=F6rn?= Reder =0A= Hallo,=0A= =0A= das ist eine Testnachricht mit 8 Bit S=F6nderz=E4ichen, und obendrein noch= =20=0A= quoted-printable kodiert.=0A= =0A= Gr=FC=DFe,=0A= =0A= J=F6rn=0A= --=20=0A= .''`. J=F6rn Reder =0A= : :' : http://www.exit1.org/ http://www.zyn.de/=0A= `. `'=0A= `- Debian GNU/Linux -- The power of freedom=0A= apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/simple.out0000644000000000000000000000126111702050534026674 0ustar rootrootReturn-Path: eryq@rhine.gsfc.nasa.gov Date: Wed, 20 Dec 95 19:59 CST From: eryq@rhine.gsfc.nasa.gov To: sitaram@selsvr.stx.com Cc: johnson@killians.gsfc.nasa.gov,harvel@killians.gsfc.nasa.gov, eryq Subject: Request for Leave I will be taking vacation from Friday, 12/22/95, through 12/26/95. I will be back on Wednesday, 12/27/95. Advance notice: I may take a second stretch of vacation after that, around New Year's. Thanks, ____ __ | _/__________/_/ Eryq (eryq@rhine.gsfc.nasa.gov) | _| _/ | | . | Hughes STX Corporation, NASA/Goddard Space Flight Cntr. |___|_|\_ |_ |___ | | |____/ http://selsvr.stx.com/~eryq/ `-' apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-nested.msg0000644000000000000000000000633211702050534030000 0ustar rootrootMIME-Version: 1.0 From: Lord John Whorfin To: Subject: A complex nested multipart example Content-Type: multipart/mixed; boundary=unique-boundary-1 The preamble of the outer multipart message. Mail readers that understand multipart format should ignore this preamble. If you are reading this text, you might want to consider changing to a mail reader that understands how to properly display multipart messages. --unique-boundary-1 Part 1 of the outer message. [Note that the preceding blank line means no header fields were given and this is text, with charset US ASCII. It could have been done with explicit typing as in the next part.] --unique-boundary-1 Content-type: text/plain; charset=US-ASCII Part 2 of the outer message. This could have been part of the previous part, but illustrates explicit versus implicit typing of body parts. --unique-boundary-1 Subject: Part 3 of the outer message is multipart! Content-Type: multipart/parallel; boundary=unique-boundary-2 A one-line preamble for the inner multipart message. --unique-boundary-2 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-vise.gif" Subject: Part 1 of the inner message is a GIF, "3d-vise.gif" R0lGODdhKAAoAOMAAAAAAAAAgB6Q/y9PT25ubnCAkKBSLb6+vufn5/Xes/+lAP/6zQAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJLMOyYbcoxkaZ5oCkoH6L5wLMfiWqd4btZhmxbA oFCY47EIqMJgyWw2ATjj7aRkAq5YwDMl9VGtKO0SiuoiTVlscsxt9c4HgXxUIA0EAVOVfDKT 8Hl1B3kDAYYle202XnGGgoMHhYckiWVuR3+OTgCGeZRslotwgJ2lnYigfZdTjQULr7ALBZN0 qTurjHgLKAu0B5Wqopm7J72etQN8t8Ijury+wMtvw8/Hv7Ylfs0BxCbGqMmK0yOOQ0GTCgrR 2bhwJGlXJQYG6mMKoeNoWSbzCWIACe5JwxQm3AkDAbUAQCiQhDZEBeBl6afgCsOBrD45edIv QceGWSMevpOYhl6CkydBHhBZQmGKjihVshypjB9ClAHZMTugzOU7mzhBPiSZ5uDNnA7b/aTZ 0mhMnfl0pDBFa6bUElSPWb0qtYuHrxlwcR17YsWMs2jTql3LFkQEADs= --unique-boundary-2 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-eye.gif" Subject: Part 2 of the inner message is another GIF, "3d-eye.gif" R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7 VujnC96IRVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7 +3dCeRRjfAKHiImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatL rU8GaQdOBAQAB7+yXliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJ vs7Y5ewH3d7Fxe3jB4rj8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjw E0cdGxQ/gswosoKUkmuU2FnJcsSKGTBjypxJsyaICAA7 --unique-boundary-2-- The epilogue for the inner multipart message. --unique-boundary-1 Content-type: text/richtext This is part 4 of the outer message as defined in RFC1341 Isn't it cool? --unique-boundary-1 Content-Type: message/rfc822; name="/evil/filename"; From: (mailbox in US-ASCII) To: (address in US-ASCII) Subject: Part 5 of the outer message is itself an RFC822 message! Content-Type: Text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: Quoted-printable Part 5 of the outer message is itself an RFC822 message! --unique-boundary-1-- The epilogue for the outer message. ././@LongLink0000000000000000000000000000017100000000000011564 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/attachment-filename-encoding-UTF8_decoded_1_1.txtapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/attachment-filename-encoding-0000644000000000000000000000002011702050534032334 0ustar rootrootAttachment Test apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/badfile_decoded_1.txt0000644000000000000000000000004411702050534030666 0ustar rootrootThis had better not end up in /tmp! apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/lennie.out0000644000000000000000000000704611702050534026664 0ustar rootrootReturn-Path: Received: from brickbat8.mindspring.com (brickbat8.mindspring.com [207.69.200.11]) by camel10.mindspring.com (8.8.5/8.8.5) with ESMTP id GAA27894 for ; Fri, 25 Jul 1997 06:58:07 -0400 (EDT) Received: from lennie (user-2k7i8oq.dialup.mindspring.com [168.121.35.26]) by brickbat8.mindspring.com (8.8.5/8.8.5) with SMTP id GAA22488 for ; Fri, 25 Jul 1997 06:58:05 -0400 (EDT) Message-ID: <33D89532.29EA@atl.mindspring.com> Date: Fri, 25 Jul 1997 06:59:46 -0500 From: Lennie Jarratt Reply-To: lbj_ccsi@mindspring.com Organization: Custom Computer Services Inc. X-Mailer: Mozilla 3.01Gold (Win95; I) MIME-Version: 1.0 To: lbj_ccsi@atl.mindspring.com Subject: Test Mail Again Content-Type: multipart/mixed; boundary="------------52E03A8932B4" This is a multi-part message in MIME format. --------------52E03A8932B4 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit This is the message body. A picture should also be displayed. --------------52E03A8932B4 Content-Type: text/html; charset=us-ascii; name="Pull3.html" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="Pull3.html" Content-Base: "file:///E|/ChckFree/Html/Pull3.html" Client Pull Rolling Page Demo> This is Page 3 of my rolling web page demo. --------------52E03A8932B4 Content-Type: image/gif; name="WWWIcon.gif" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="WWWIcon.gif" R0lGODdhPAA8AOYAAP///+/v7+fv7+/39/f//9be3r3O1rXGzsbW3qW1va29xoyltXOMnGuElClS a4ScrXuUpUJje1p7lFJzjEprhDlacxhCYylScyFKaxA5WggxUgApSt7n773GzpytvZSltWuEnM7W 3sbO1q29zqW1xoycrYSUpWN7lFpzjFJrhEJjhDlaezFScylKayFCYwgxWgApUtbe5yFCaxg5YxAx WggpUpSlvXOEnFpzlFJrjEpjhEJaezlSc3uMpYyctYSUrb3G1sbO3qWtvbW9zq21xufn79bW3t7e 5wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwA AAAAPAA8AAAH/4AAgoOEhYaHiImKi4yNjo+QkZKTlJWWl5iZmpucnZ6foKGinSIfJxEtMzMtEScf IqOKRwsUMy4YLQ4sLA4tGC4zFAtHsYQBCysWLSwrKhQ5Eyg5FCorLC0WKwsBxUAoyhU6KA0MEA8l JQ8QDCcoOhXYKECjQhUyLDo4DA8fQkRDAIcQEfLhAQMcOljIqCAklI0WLVZMAPHAA5EDBoKE2BgC gYEDRDw8ADFhBUQbnzxgwLACBQMfCYYAQRCiQIybMYx0NDAkgQ8GKFas9NCpAwsLLChQ9KAAowia HDcGEfFRgUgQFI6y6LBJQA4aLnjkAPHjgwcSRBSMGLI24AgFRP9IePjwA0SOCi5o5BCgqQQMsEkl 3Ohh4seDc+gSJz5sAsKNE1nzwiiRKUYLGBoy3Nuhg0KKHNAmiB6NYjRoCjp2KMygAUaLGJj8woDx IoMFGRBz6drFu7eDXhAxWMjwYvZkTCuMY35BI4Pz59CjR6fxorXxFZg4bNgxCIYMQydqwALwQ0OC QkVgROjuQtOGE4NccBc0/gcMDoKEwBg/HgAM+ILIpwkLJgyyA4AAjCDICBsMYsAG+CU4CIEGInjJ DkQJckKBABjAoQHtCaKdgQZmCMCGmphgwCAmKNghgvMJwoKBEarIoouYmBDCIAusCMACMaZAiJCC 0OCjjjz6iIn/j/gpaQINDgIQoZIbLCAIkx1usmOWWwKQQoOC7OjjliFswOGWK3a5iYUA7LCBkj+q +WCMGoJCJwA0bIAjADbyuMGMhNypyYOFbGBmoBwKYoKhhBDqyQgwDDAIB7PdQAgLlg5ywmySLhjp IASkuN8gIsy2XnenChLBbP3ZB+clshlXgwYvMEcDdbXmquutuGpQg3LHXWKZcbRmMIMFFriA7LLM LqusBTMQZ51rsMU2Ww21WYBLb7v89hu318gw3Au/BouJABRgRoO2LFSwQwTwxiuvvDtUwIJwNLRG AV+adNCCBjTMgAEzEajQGQUIJ5ywDipEYC8GM+TbAleceDBDkmbKtPuuDgcrzHEEO1iDDWszmMjJ Bxcb68IyzKyww7sgh2zNNcCQ/EEoHvxb27G4QbQbcC2IG211LZj8SQcpYEZrc6ocC60qGVCnQWsp UDyKACVcIOvUXHNdLgwXlMBvMQDEUMIOwKYNww4lVEt2IQaUgAILM8w2AwsolPDq23z37fffgAcu +OCEF2744YgnXnggADs= --------------52E03A8932B4-- apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/empty-preamble.msg0000644000000000000000000000164211702050534030310 0ustar rootrootContent-Type: multipart/mixed; boundary="t0UkRYy7tHLRMCai" Content-Disposition: inline --t0UkRYy7tHLRMCai Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Das ist ein Test. --=20 sub i($){print$_[0]}*j=3D*ENV;sub w($){sleep$_[0]}sub _($){i"$p:$c> ",w+01 ,$_=3D$_[0],tr;i-za-h,;a-hi-z ;,i$_,w+01,i"\n"}$|=3D1;$f=3D'HO';($c=3D$j{PW= D})=3D~ s+$j{$f."ME"}+~+;$p.=3D"$j{USER}\@".`hostname`;chop$p;_"kl",$c=3D'~',_"zu,". "-zn,*",_"#,epg,lw,gwc,mfmkcbm,cvsvwev,uiqt,kwvbmvb?",i"$p:$c> ";w+1<<07 --t0UkRYy7tHLRMCai Content-Type: image/png Content-Disposition: attachment; filename="dot.png" Content-Transfer-Encoding: base64 iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAIAAAD91JpzAAAACXBIWXMAAAsTAAALEwEAmpwY AAAAB3RJTUUH1AUbFQQ0Vbb7XQAAAB10RVh0Q29tbWVudABDcmVhdGVkIHdpdGggVGhlIEdJ TVDvZCVuAAAAFklEQVR42mP8//8/AwMDEwMDAwMDAwAkBgMB/umWrAAAAABJRU5ErkJggg== --t0UkRYy7tHLRMCai-- apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/uu-zeegee.xml0000644000000000000000000002026411702050534027273 0ustar rootroot

From: me To: you Subject: uudecoding
I've uuencoded the ZeeGee logo and another GIF file below. begin 644 up.gif M1TE&.#=A$P`3`*$``/___P```("`@,#`P"P`````$P`3```"1X2/F<'MSTQ0 M%(@)YMB\;W%)@$<.(*:5W2F2@<=F8]>LH4P[7)P.T&NZI7Z,(&JF^@B121Y3 4Y4SNEJ"J]8JZ:JTH(K$"/A0``#L` ` end begin 644 zeegee.gif M1TE&.#=A6P!P`/<```````@("!`0$#D`(3D`*4(`*1@8&$H`*4H`,5(`,5(` M.5H`,2$A(5H`.5((,6,`.6,`0EH(.6L`0F,(.6,(0BDI*5H0.6L(0FL(2F,0 M.6,00G,(2C$Q,4(I,6L02GL(4G,04G,02FL80H0(4H0(6E(I.7,80HP(6CDY M.6LA0D(Y.90(6I0(8XP06G,A2H084H086I008U(Y0GLA4D)"0G,I2H0A2G,I M4H0A4H0A6H0I4I0A8TI*2FLY4GLQ6G,Y4I0I8U)24F-*4EI22I0Q8Y0Q:YPQ M:Y0Y6I0Y8X1"6I0Y:UI:6HQ"6H1*8Z4Y<YQ"8XQ*:ZTY:Y1*8YQ">V-C8WM: M8Z5"<Y12:Z5*:WMC8ZU*:VMK:ZU*<ZU*>X1C:Y1:<WMK:Z52>ZU2<Z5::[52 M<W-S<XQK:ZU:<ZU:A+5:A*UC<XQS<ZUC>WM[>Y1S<ZUCA)QS<ZUK>[UC>XQ[ M>YQS>[5K>[UCE)Q[>X2$A+UKA)Q[E*5[>[UKC*5[A*5[E)R$>[USC*5[G-YC MC(R,C*U[G*6$A,YKE+U[C*V$A+5[G,YSC*V$C+5[I=YKE)24E*V,C+6$I;V$ MI;6,C+6,E-9[G+V,C*V4C+V,E-Y[E-Y[G)R<G-Z$E+V4E,:4E,:4G-:,G*6E MI>>$I;V<G,Z4G-:4G.^$K<:<G-:4I=Z,M=Z,O<Z<G,Z<I=Z4I;VEI>^,I:VM MK<:EI<ZEI>>4O>^4M=:EI=:EK>><K;6UM=ZEK=ZEI=ZEM?><I>>EK?><K=:M MK>>EM=ZMK>>EO=ZMM>^EK?^<M?^<O;V]O>^EO?^<QN>MK>>MM>^ESO>EO?^E MO>^MO?^EQN>UM?^ESO>MQL;&QN^UM=Z]M>^UO?^MO?>UO>>]O>^]O?^USO^U MQO>]O<[.SN?&O?>]QO^]QO^]SO?&QO^]WO?&SM;6UO_&QO_&SO_&WO_&Y__. MSN_6SO_.UM[>WO_.WO_6UO_6WO_6Y^?GY__>WO_>Y__GWO_GY__G[__G]^_O M[__O[_?W]__W]__W_____RP`````6P!P``<(_P#_"1Q(L*#!@P@3*ES(L*'# MAQ`C2IQ(L:+%BQ@S:I08J:-'2"!#BAP9DI')1(12JES)LF6@ES!C^IE)L^9, M/3ASZE2XH:?/GAB"8KA`M"B%HT@A*(7PH('3IU`;*)BJ(('5JPBR:M5ZH&N! MKV#!$AA+8(#9LSQ__A0ZM"A1I$F7-HT:E6K5JUBW<O4:-BS9LF<'I%7KDVU; MHW"/RIU+]RE5O'GU9N7;5RQ9M`D_$%;+UNW;Q$N9-H9J%W("R7L/5+8\UJS" M#YHW%Q;J^4)B"J$9CRYM&C6"KJI7%_@K.#-LV;-IN[V-6ZGNW5--G_9->379 MU["/(]_0V3-SN:,=/_^&[/MW];YCL6>/C;S[<M#@PTL=3QXU<.'#U:_?SMW] M9_BBR3??7?79%]QJ^JW'GFS^_1>7<P+R5J!>]U66H(+\-6C;;?&%)R%>U)U7 M@$(C*(CA=H9YQR&$$4;76XA]D5BBB?NAJ-Q[<.76HHL@9I5`!M.9=Z",,]*H M77LW(I9CA]#Q:)4-9#22R2:*".+"9'P1.4*1-&;8X'?./4?78PM$T8@K=4A1 M@P4U,*$($WN-F!`)6]9I9'9>!E7;BBQZJ(`5I6RBA@B1I7"(!7LI1`*==7+9 MI8UZJKADGXV]4`HQ9U@@759()+'5`8HNVJBC)N89J9*3BMG``W8\H\@,]('_ MB$,3>H6Z**-VWKG@9AJ"&:!3+\CBRA/B.6F5!F_4FM`)MXK:J*Z[$M8K@`%: M$4TC)M05JU6'*(O0"<PV.RJI-2*9Y(8`2F!(-'),T"1>$>01)`(*@1NNN,_J M:NJ>H+VP##'$RL=;!F/D5:^]]SJ;ZYW[2GH4$>2$<L.O35;E`A,@'HQPL[@N M_*BYI_XW!3F8>,!DDTBD`)G&&W,\*K0-NV4'.89XH-C)8RKP!*%XL8QPPAV3 M6RZ#21HB#AO4JDJ:&!D0F(#//[O\,L.0ZHG*-EB@FZK2#5R`!7T*L?!SU%)[ M_#'1&,BRC1(X/DAQ`Q'H@(48+@Q85=ABC]WRK5-3_[U=*MP4P>^DO]90BSWW MW*.+!G;CS<(*>MM;]I8P(W=U$>?ZVI0&M'S#3C_WL+/*`DY-Y3@+>4?.<="5 MJW6U$?V%[."#7[3B2S7L?).-+S<X=CKJD4N.K]GKP0`$%UQT@3PJZ<`.U+E: MWPS!&G]8(@HLL+1BR0]0_8XZY,%/3CEL.Z3!BC7KM*.^^NJD$XPSGZ"10^RR M?^=%%F"L,<?^8)30?4*H"Z``@P>TCL$@#;Q81_K@P<`&RB,=QV!@.Q3X"S2` M8%IP:8(02C`$(0AA""5(P/\0(L`2IDYUXH*!';"A0/4UL('O4$<$7SC!=8`# M$!>47?0\4`49J."'*G!`5/_J94(!@@^%BWJ#-<[1PG:\,![Q>$<^@@'%>-!0 M@>C`QAF^!!</_$`&'>B`$(>XK!.LH(@!)"`)@'"*;IP#'2U\(3SBD0YYS*** M5KSB.LX!CD_D`'IPT4(*(L`DC9T1C2?\612@X48FQI&&\CC&._`HQQJB@X_4 M4`(@*:"#)$CO5SY#9"+!E09&@N.-"EQ@`]NA#F2L@Y*53.4YSM$-:H3A2V(0 MP=8:`+5#HA%A>8"&-;HQ#E0^$A[M(`<SRB''9M9P'9<$1S>@P0;_X$`*?&(* MU,PH2E(F`QK:(*8QT^=$>&Q#&N!H9B6?&<UN6`,:M[P1&4(0O>8H99O@$F47 M@*'_#&J$LYCC5!\WEH$-==*0G;.4IC:@`0Q-L@4'1T!57/`)+E\*T`FX``8T M_-F-4XYS'=R0QC#*6<55KB^5T$QH-Q::C%/H('9DT(##D*(H`EJ4!3$812TT MRE%P`!2.ZPB'-&SAQ'C0XQ[XN$<]Z(%,E&)QEN-0*#24`8Q+A(`[.V#"821* M@5`1\`0"Y`,M=KI1:X33HV\4QS-F<0XGU@,?_A#(/N[!5*=>4J7:>"=5:3&& MGIS!`YF#BZV^BKH=T&*L_!1F.#LZRW,TPQ8L;`<]\%&0?-0#'JE$QUWYV(V5 MZA48M/`$"(QPA!1)RE:+LBD@8G'8Q%+#K)T]93.:P0LX_\*C'OTP"#[B`<W- M<M:SU&`H:%41!SDD9ZN?(1''@K<#5:QB%;0`AFMAVXUK/(,5LT2'9'-;D'M@ MMK'GB&IG\QI<JN*"%JK@Q$N/B]RN)J1.S8K<&U3A7,1JM*S:P,8S/@$.C[[R M'G$=2#Z8>LEQB'>\U@BN<`^KBDY<05KGTM)R$=:"3IC"%*I@K72_6=9BA((: ML06'=N-QCWV8>!]UY:,TQTM>:$`C&<`X;RQ,P0E$\"I)6AK!A,'E!$YXXL+0 MC2XP.$R,69Q"&TB.+1/+*<$]KGBE>4VPBV$,6O326!(^N+%R7C.J'<>!$YRP M<'V%#(Q>%.,0U'BM61?KT_!"=?_%2(ZR@I5!Y<.N0A6>X,0CFH`V/6%G7,L] M!)C#C&'61G<8R`"$,EQ<5FNL.<Z0CK*4&4U5Z1XV%JJ@,2<6`8>JZ:?+MX*! M)"9Q"3#_.,.TR$4Q*)$+?BZ:T1M-<W!E+6M83U6ZEJ8%IDV19TD@`@Y7-=>% M0%T$21A;$J8N]"YF<0E<2U<9K[:UM%T,;6?7XM*9SC,G)%$(.,PO0\/NLA*. M;>QDLZ(8=3CL3IT-#&%`&]KN?K<RA,%N8%S;SMD&LR06L0<X^.!(LKD0;$9U MA4<\8A&+*#<G1E&,/*!:W>NNM\2M?5A=WYG7^O;U'<SP;X`31N`#KU/!%X&( MDI>[%YG_J`1]5V%HB-?"%\#PA<QACNM:V+SB%J<OQK?MZSW0P0P]&)I:0)Z= M+8V\$'TH1,))40PS^!C#SF4YSJ=.]8K'(A9WSK0I.I%Q1!3B#F[P0M!/-/2$ M]$17(X#"P??`]D)(HAEUF`28._%CJ#_WZGB?.MZQGO4+[_P2QO9ZO\V0A;&3 MW2>#T97:%W&'QN\!Y7M0>++]3M^5/_?RE=?YA3W!]8P_0O!T<`,8JN`"(Y7= M(OQ(O>I7S_K6N_[UL(?]1A32>GW$_O:XSST_9D][U=M>]ZLO"/!?S_O>\^/W MPU_(\%5?_(',0Q\$\?WR$<(/=\SC^0))OD4&P8#N>]_[CG!'__2/O_S=%\08 M/!```-8?`!08XQ_`OT@;UD__^FO"_`,A__3S3X7Z&Z#^2X!\L8<1Y@`*!FB` MFA```,``YF`0YB=[^<=\V<<#Z\<!H.`._#`/T]!_`+`$Q)=]^+<1>+!^CE`0 MW@`*FG"!U]=Z_U"`FJ`)&)AZ`U$&ZX<'$9AZMZ"`K]!ZT_""H`!]PG=]/9B" M0.@0\Z"`/#`/`^$.*%!_`!`$WA"#J><.%%A_/.`-0.@."K@%XZ=Z\V!]7F@, M'%!_`4`%^*</YF`,30B`1;@02P```G`+`^$-Z@<`!L`#_V>'MQ"#YI"'=^B' MM[![(R@`^'=[\_`*"FB'>+A^%0!]_/]P@G7(`#S``.O'`&V($-.P?EOP@)3( M`=XP$--0`0#``<9@>Z*(`MZ@>MXPAA6`@11(!=D'?_`7@O"G#].@?CQ@#JIW MBT_8@L:`B^(G$(Z`BPPABA7PB0*A"788C,ZG?GC@#LIHB06A#_\W"/PPAGC@ MA>ZPC=RXC>;PA?V'`LRW>[>P?FG8?QP0@OPP@@#0@`GA""1($$$``#SP@O;X M@C0``#3@#?,8!/=HC_G(`_S0A&6@>J_@A/77!N9`B5OPCYK@")0X"+=`B53@ M"/\(D0`P"`FA#[BHA`,QA@A9?Q5@#B`9DA7(#V](`[]7CB;Y"MY@DO6W!0<) MD^M7!@G1?W'_6!!-6`$HL`14\)-`N01M,)`+&`1+<)1(>91#J8P!D(K'UXWN MD(;J]X7KQP-'"914<)6O,)-!@)59J968J(FTN`7T.`W,*'QDF8NL%WT<28\" MZ'OSZ('\0(GW1Q#Z,`_F-PW_IPG19PZ7:!!CR`%G*1`L"0K?.!#ZD)6ZF(D` M``K/9WZ)N00QJ(Q/B)>KIP]O*`"ZN(X+Z)'_<)>OX),"\8;2^)E1J0FB>1"@ M```!L(=0.0W3,(\!H)"I9PRG.!"RV08Q.)$`((ZJ-W]P6`:O8`Z:4`9Y&(BI M1XT+N(/\8`YXH(`V^)G_QP"EJ`_>T`;0B1#`&9*TF8^L:0"1Z)GZ_["&`0"> ME6B9JN<(B>B$##`-P=>'ZR<`!I"(2T`0=!B?\[E^L(@0$/E]WF<`=?D/@Y"' M<+@%E\@/;5"'!?J6J3</;8`"!A"A0?"#P2<0\[`$ZUD!?%D0\Q`$&;JA$J&. M&HB7"=&<QN`.#*I[!W&7T^"9*^H.+1H1OX=]$G%]-ZBBS;<0&-E^QN"7$-$& M_Z>$H-">LSB`.<H09(D"FH"=`G"B#T&#/%""_Z",TW"D&#$/"UBE_V`,`$`% M[^<0`E`!!*&,7SI[M)A_$7&09<",%<`!;<@/K_""U;E[U?>$VQB%([B'7QB" M:!A]*)I_M_""@3@/AQF%U@<*GYB!MNB#[O^H$.7H"%@H$-9'$*"@H`!0`;>@ MA.Q(?V19?PP0`"[*`Z"ZA`!@D_P`"@2ZG!#Z#WJ)`I28C1JXAO07!']IEP'@ MB<^G#VU(@T'0HO-P"Z+H"'YYA*TX#R?8?V4`"N6HD0*A#PH("@,!CZDX"*.8 MJ8?XJ=VWI?^WCW>9@P!Z?>XP@J6)$(@8`$N@@AY9CEP8?:)Z"]`G`.DX$,HH MA_]0`31@?DP9!-E'`PRPI?K(IZ+8K[\8`-"G#^[0?2[Z#R.XGPGAH)0H`&5@ M#@U(`TUI$,[*`^('K_AWD/3ZG,'(`Q6P!83X#UC:!OK@H7]YD&+ZBS0@J=1* MKP3A#A40`&=Z$*__0(F]J@^C.)@"$00&\'X&4`$;"P"O(*D92;(!@`=<^G[* M:`[N(`#Z:A#F$*;_<`L"4)];ZJ%."Y7A"@!ENJ)`.`]CZ`B9&`0\^P_S5Z5! M6X0'6;0"P0$""8_B%P";"+(D"P!M<!#SP`!B:K58RYLT":T'X0V:X*0"L9I! M@*5+T*@$L04T^P]!.[1N*Z`!8`X\P`&CV8I)*Q!EN*(,@+F(N)][RP#75[K7 M%X4D>A#*.)SF5XXVR0$,F+#_((D"80`,(+G.A[<!P*P'.7_!2`,&X("9B+F@ MT+D"T7\)^X7;F!#NT*5.NWMD*7YJ"H8#\;*U.ZYM2Q`H,)79%P#P.A"KQ\FL MLZ@/8X@"_U"\ZXJT6`M_7^@-!A"U"/&&6Q"%\Y>WQ^N\CCA_#-M]^%>.D_L/ M\&B^`T&!4BH0%%@&OS<-3=A^4PH`Z7N^'2A^U:<)#&``LAM]\\BI!3%_Y9F? MFS@0;4H0Y0BS=UO`#>RB*/F=_R<`J&J^+VF3!(&(=FB>*'#!!G&"FL"X2]@& M61FQ!?$*7SL//_C#;:@/_SN'6_"3@P!]M_"EB.J`@_"36T#"5EK%5GS%6)S% 36KS%7-S%7OS%8!S&8IP1`<$`.P`` ` end ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/frag_decoded_1_2_1_2_1_2_1_2.binapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/frag_decoded_1_2_1_2_1_2_1_2.0000644000000000000000000016673611702050534031470 0ustar rootrootÿØÿàJFIFHHÿí.Photoshop 3.08BIMíHH8BIM x8BIMó8BIM 8BIM' 8BIMõH/fflff/ff¡™š2Z5-8BIMøpÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿè8BIM8BIM8BIM@@8BIM8BIM ~pTPn@ bÿØÿàJFIFHHÿîAdobed€ÿÛ„            ÿÀTp"ÿÝÿÄ?   3!1AQa"q2‘¡±B#$RÁb34r‚ÑC%’Sðáñcs5¢²ƒ&D“TdE£t6ÒUâeò³„ÃÓuãóF'”¤…´•ÄÔäô¥µÅÕåõVfv†–¦¶ÆÖæö7GWgw‡—§·Ç×ç÷5!1AQaq"2‘¡±B#ÁRÑð3$bár‚’CScs4ñ%¢²ƒ&5ÂÒD“T£dEU6teâò³„ÃÓuãóF”¤…´•ÄÔäô¥µÅÕåõVfv†–¦¶ÆÖæö'7GWgw‡—§·ÇÿÚ ?æ(Ë nw¨Í¯2à&…»Ó?æõºæfä1Ñ;j ÿÛ¾¥û¿íº×$q,û3n­{¾âýÊçÕü+oꬢ¶ËÝ]†"x”Â6´ÉënÈú ÆSWP½ý­/­Ÿô~ùô¬çÝA|Ò×2¾Í±ÁîþÓÚÊ[ÿ©dô^¦ÇéQ#Å¢uwáŠ^>Èmj»²w²d¡[];¥½Õ²Ûé5±íkša­Fàd„ùXØ|5ÀÍ?‘.®'âVæ–Šj‡hFÍ­íP~.Uu’À  €ukùËxšÏ¦ösï›’³+¥z7vâkxhl™%®ÛËZÔ8Òx‹È»e}¥ ßhža6ÕKŽL´m´÷P&ÃÝOjhCŽ]ÓAƒ»”74£– [`k½0%ýÇa(ÄÈ;è‚@ÝÿÐÍìõšŸ¼ÿ’ZŸUq««ë&5À~eÍ0'éVáÿT±ëê}>Ð=+ƒÞ öµ¯$´îkvnwÑR¿;©ãã»+¦SšËØÙ§&¬k`nÚÓúK+Ù¶Êß·ûjKßV%qÐýsõ’›ih’ZIåºiò\Ûc¬÷™>'ûÖ'¯õÓ¨Ö™Ôò˜Ó¨©Í|ëû̪ºÚÇ"UõsëMÍ–dæ<ÛÿTö£îÄn['³Ðcc3ì¦Ûe•Q[m…³µ®>›"~Ÿ¿÷Vè6[šáÈÛ ?£}\úÀ*n5õdvûœñ.#ÞÆ>§Ùïnå®ß«dØóg¨@…®´=ßœ6oöÿ[riÈûÊ®ŽF_Ju]ˆøª``p?º"éªèýv½N+Hî ÀÏþdˆ>Ù[]]˜o6æº8’ }¾×~ò,|~ …pŸ?'ÎÃL‚mŽð] ú­” ®×{L†³QýbQÕ˜0ædä絛 ™(ö?cÂõ'ä·.º«µõ5Õn!§hÄn2«9÷µ¥ÏÉ·€DYα¦Ð»Lï©ø·?íW[•Ci¬‡¸ÖÍ­%î{ÜåËu]k›]0ꮘÂÁ[r,×VûjdzÞ÷~‹wéõ"d¶¾!†C…ne{‹·c‰t4ãûŽO^EuTA4kˆÔ{Ü×Ýõg¹T±×z•ÖÒüsU§Ø!–žÌmm÷{?}ïiumº¿Y€ÔæˆÞG¶Ç¤ÏfÔ½@‰âkvdêÿÿѱ‹õ÷£ãXÛ«è8Ôd­.enãiÙ8ÍsÏWêÿ´µÝ<ŠÆk-dñ·ÜÕÁ†Ÿû> Qî»GÐþ1:I» ú¤D5µ9§úñc7+¸ÿ[ëÌsF6%χ5§vÆ!ߢc}Aúw5¾«6~Ò\(ë¹»Kšp‡ÓŸh{ìnÉ$´—H†ræûKÞ[³Ówý·þº…ШèúQëXí¬ºæY[êÚmé;ks.ÚÊìs·5Ïm{ý‰ÙÕ1lm¦’ñV; –?c‰Ûæú~×úŸÈ\U]{>¶Ö=g nsXkáÿMí²·¶ßðޱþ¯ú+?J‰WÖºÙUo­Ž5SÖöâ×;{¬n×RÖ;Ùùÿ¿ú_Q+lŒ>®^ý’{›C‹H´×®ÂÒI$5ûØÆÞæûX¡fac¶ÞðÂÐ÷ 6°ÎÇý'~êåÝõ¨Ùsæº7^Ò×[d6#MÒ}_äßÿ'·ªÔlõÞúšl{ÜË÷:I{6:ßgÒc\Ïð»Ò´ˆüÚhôŽÍ`—YÓ´¶Lx½ßžßz…™5úN°¸¹µ4Øø"IßnÇnõî\^WQÊs_K™E¯lÓµíoµÜºš-÷û¶Á3ûhWu¼šZÉp²[é2²ËÖÖ\@o¥ì¥¶ogç~“÷-ý"V¸Ç@a¿ˆèÞúÁ™Ós]]W ÛZ}—6 @÷Zæ;Ó¡ßGßeûÿœýk“êyìû+pñpF6›ÇXûj-s·2×mÙöŸÑÖöXÛïŠoË;œ\Ïq$ºÜû¹ù¤3HàØ>ÿ2Bf¤äI:Õÿ-Þײ·1Íw ©-ú@NßPmÿ ôîFÍh©õ°y0kÌ oæµíæÿ:¶˜Óô·ŸˆŸâ˜eT?>OŒÜtú:ØÇ}¢Ž½˜¸|_ÿÒçö¶£mKj)CµXÁ>•»Ü%§IHéäïÛýµ ¨˜à‡84F¦%£·½Óíö¦–\ÎÞÇ྄!Ìp9 C¾‰>¤º×26lþoþÛMµ®h!»˜Ý[ì.1¹·zžÝÛžëìÿH¬Û»Ó/ôÁq5pZtú'pÝêlú~bgµÕ;Ô°5pÜ_·kuöo<îölo³ÙïMtDIÑ.i>ëLÃÞöµîÝìmŸàÙúJ“5Î/©•o'aö‡=à;ô›ì?Iï{Ÿu®þ§óˆ›2 :âI;M–»ÒqkBߤÆ~ÿè«P}­-o¨¸€79µNàûÙ¾¦ºÇl{½É+CHEeÖï´Yh À ?œvÿÑ~çþ|Psì±´šZËì2òã£ÙMŸMµÛþýHãÓsd‚Ðw¨@-s}¥Žþy­þoÙ¾ÅVñ¶«"º’óímªÖ˜úwü_¥[ÿÌAEÍy&ç÷÷¢gˆã¼)–a€ p9ì8H©F„e¡f;ÐõÞ£3á?%o.8E??½AÐG÷”’f5¬‡ËÕÿzÿÿÓÊÚ‘jœ$BqJ=¨˜ì%ÎI>ö–íM¸åŒs·ê×13#À~riÙ“ ¬‘ógegnÁ,—5¡À û6·{XÖiôÜÍÿøfºCK\C\e›½“¸íú.¯ù¬ÿœØÛÍ78—5»†òÖ}7!¬ŸëïRu`9Ðãên&@ æ^_æû¶„Lt4(C‚æŽãkÁ™.swû½­aþmÞͨ͟›k¡Î]©Ö³Ýìu˜Ö„F²°â2Ð@÷Ñ;šÖ·wÓýÏÏC&ÆO'hÜLHi3¦×l­›lý/¿þÝI,,¬Î‘¹Ü´¼n’[éµínç;í³ÔõÁ¡Y꺡Ä·kšÖˆ q;}ô·kÛéþußñ^§¨¬¸9ŧk„–žâ4a6zž£½Çèmb¯—Pm_§ sih%å§sío³eµnÙwªïüši:y“ýÊ%¨‘.$Ô‚<å1 î|&ƒ×οæ¢#ýaAÃOá¤(8"ùeWw}gÿw'ÿÔÎdë?.•çI'®–ý?ÁÙôCÊ.,úãlNÇó~wÒþNåæÉ&—bùãæL¿fæúû'c==¿JgÝ¿þwÓôÿAè2«Oô31§§êsº[1þ~ÿMyâIŽ€}ôžÝ›vKbgw'ÖßþoÓÙÿüÚ‘ß¿æ6îú_IßGÔþOÓôÿ3ùßð+Í’I/¤~’}Þ¦é³lñ¿sýn7nÿúÏóhNô};#lF±ÏþwÖ÷}-Ÿú-yâI$ìö-àÏ;ù\™Ð¸ô”Ëêõ¥ Ë–I?ÿÙ8BIMÿâ XICC_PROFILE HLinomntrRGB XYZ Î 1acspMSFTIEC sRGBöÖÓ-HP cprtP3desc„lwtptðbkptrXYZgXYZ,bXYZ@dmndTpdmddĈvuedL†viewÔ$lumiømeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ óQÌXYZ XYZ o¢8õXYZ b™·…ÚXYZ $ „¶ÏdescIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view¤þ_.ÏíÌ \žXYZ L VPWçmeassig CRT curv #(-27;@EJOTY^chmrw|†‹•šŸ¤©®²·¼ÁÆËÐÕÛàåëðöû %+28>ELRY`gnu|ƒ‹’š¡©±¹ÁÉÑÙáéòú &/8AKT]gqz„Ž˜¢¬¶ÁËÕàëõ !-8COZfr~Š–¢®ºÇÓàìù -;HUcq~Œš¨¶ÄÓáðþ +:IXgw†–¦µÅÕåö'7HYj{Œ¯ÀÑãõ+=Oat†™¬¿Òåø 2FZn‚–ª¾Òçû  % : O d y ¤ º Ï å û  ' = T j ˜ ® Å Ü ó " 9 Q i € ˜ ° È á ù  * C \ u Ž § À Ù ó & @ Z t Ž © Ã Þ ø.Id›¶Òî %A^z–³Ïì &Ca~›¹×õ1OmŒªÉè&Ed„£Ãã#Ccƒ¤Åå'Ij‹­Îð4Vx›½à&Il²ÖúAe‰®Ò÷@eНÕú Ek‘·Ý*QwžÅì;cвÚ*R{£ÌõGp™Ãì@j”¾é>i”¿ê  A l ˜ Ä ð!!H!u!¡!Î!û"'"U"‚"¯"Ý# #8#f#”#Â#ð$$M$|$«$Ú% %8%h%—%Ç%÷&'&W&‡&·&è''I'z'«'Ü( (?(q(¢(Ô))8)k))Ð**5*h*›*Ï++6+i++Ñ,,9,n,¢,×- -A-v-«-á..L.‚.·.î/$/Z/‘/Ç/þ050l0¤0Û11J1‚1º1ò2*2c2›2Ô3 3F33¸3ñ4+4e4ž4Ø55M5‡5Â5ý676r6®6é7$7`7œ7×88P8Œ8È99B99¼9ù:6:t:²:ï;-;k;ª;è<' >`> >à?!?a?¢?â@#@d@¦@çA)AjA¬AîB0BrBµB÷C:C}CÀDDGDŠDÎEEUEšEÞF"FgF«FðG5G{GÀHHKH‘H×IIcI©IðJ7J}JÄK KSKšKâL*LrLºMMJM“MÜN%NnN·OOIO“OÝP'PqP»QQPQ›QæR1R|RÇSS_SªSöTBTTÛU(UuUÂVV\V©V÷WDW’WàX/X}XËYYiY¸ZZVZ¦Zõ[E[•[å\5\†\Ö]']x]É^^l^½__a_³``W`ª`üaOa¢aõbIbœbðcCc—cëd@d”dée=e’eçf=f’fèg=g“géh?h–hìiCišiñjHjŸj÷kOk§kÿlWl¯mm`m¹nnknÄooxoÑp+p†pàq:q•qðrKr¦ss]s¸ttptÌu(u…uáv>v›vøwVw³xxnxÌy*y‰yçzFz¥{{c{Â|!||á}A}¡~~b~Â#„å€G€¨ kÍ‚0‚’‚ôƒWƒº„„€„ã…G…«††r†×‡;‡ŸˆˆiˆÎ‰3‰™‰þŠdŠÊ‹0‹–‹üŒcŒÊ1˜ÿŽfŽÎ6žnÖ‘?‘¨’’z’ã“M“¶” ”Š”ô•_•É–4–Ÿ— —u—à˜L˜¸™$™™üšhšÕ›B›¯œœ‰œ÷dÒž@ž®ŸŸ‹Ÿú i Ø¡G¡¶¢&¢–££v£æ¤V¤Ç¥8¥©¦¦‹¦ý§n§à¨R¨Ä©7©©ªª««u«é¬\¬Ð­D­¸®-®¡¯¯‹°°u°ê±`±Ö²K²Â³8³®´%´œµµŠ¶¶y¶ð·h·à¸Y¸Ñ¹J¹Âº;ºµ».»§¼!¼›½½¾ ¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäü儿 æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿÿîAdobedÿÛ„         ÿÀà€ÿÝPÿÄ¢  s!1AQa"q2‘¡±B#ÁRÑá3bð$r‚ñ%C4S’¢²csÂ5D'“£³6TdtÃÒâ&ƒ „”EF¤´VÓU(òãóÄÔäôeu…•¥µÅÕåõfv†–¦¶ÆÖæö7GWgw‡—§·Ç×ç÷8HXhxˆ˜¨¸ÈØèø)9IYiy‰™©¹ÉÙéù*:JZjzŠšªºÊÚêúm!1AQa"q‘2¡±ðÁÑá#BRbrñ3$4C‚’S%¢c²ÂsÒ5âDƒT“ &6E'dtU7ò£³Ã()Óã󄔤´ÄÔäôeu…•¥µÅÕåõFVfv†–¦¶ÆÖæöGWgw‡—§·Ç×ç÷8HXhxˆ˜¨¸ÈØèø9IYiy‰™©¹ÉÙéù*:JZjzŠšªºÊÚêúÿÚ ?ç —ÉR{¤#Ro*, œi÷ <øe‘Y&€wı_ñPoж6Å[õèOÑŠ·ÍûF*¾²ø£UŒžõUQÄõ?~n£Ç_‰W™j•™±ƒ…]“dꌉVÃ'q\Šº­ÙE;d®äþaWUS÷b«‚Žäý9«ÀÛ"­€k–*õ­v4ÀBA_é“×| +\#Ƙ—i!aZñ¥R(ÀìiíÛеVP`áU ghú+c¨'“X¹“ÒµX•C#qýxðªãå/:M^Z¤ËÜÆ¥Ïà) ´<¨7ûÙ¯\H<#PŸÄeƒ“ TÿåZùz¤Ü‹“ݤÐýØ”ñ"-ü“å[qðiÑ:3ÕâFAx÷ÞIòåÏ.6ßWcûP»øÒ¤bÄ”šO#jVd+T‘Gd’ ýëÉà—*Ã?œ->¸Öá;È6'åÇ"ØœÚ_I*ƒ"jo€ª!¥a¿“ú°+„”تÓ!ßS3œUg­ã‘*ã'¹À«L›b«yŠŠâ­3ñ!¥zŽØªÑpáH"‡üœUoÖ}ñVýsJâ«L渫^¾*ã0ìMqU¦f÷úqVŒí^ƒ§|Uh¸œUcË!ïQŠ­õ1dД¤–(+L¢½qBÎx²hɶ*´ÉN§Zd={b­¨5é튩eRi^‡hÌ;ìrAZ.Õ­4È*ÆsʾØmV«œx•as\x/uXÌÔÇ‚·R·‘=qâcKèqâZSyGJïØøcļ/ÿÐçJê{æD‚¥º‡Ò ËШü2ªevœJ£­+ï“ $À è=°Ó ]×bvÀV×*¥w[VZÐa¥µÃ|V׎¸ÒUO\ *ªÇµzü²T­ð_ôš¸Ó Ú­½…ÔìË3xFŒÿŠƒ-8¶ò'œî”5¾“?ûn/ü18ÓEü¤ó¹„Èa·VíL¼Ý¶<*JWuä;Ûo.“+ÞIGü)Ç…IEŭݱ"æÚhHÿ~Féø‘L,¸””ÄÛð®ùE ®1ÔSç¶F“máÓüþü!mÔÞžQmŠx൵êV›œZÚîK-® ¾N–׆©Ä%P8¦7Ìa¤Ûg¦4¶¦Gl kwÀBÛ[cKkXrë-¨´*jêñÁKk‘§ŠžœŒ´è4û°ÒÚ!u;娲Éþ°È’‚ÛjÎTûÎU &£pÆœ ŠiAü¾áLY¦n&;—5Å<-Ôr4í¾ [h¿`6ñÀBAZ¯|—sc*ד½pR¨4¢½qU(®Ç"Ui˜øàVŒÛb«LÌ;â®õñV½J÷ÅTÌŠvÅVªj*áŠiÆm¾!\IZhN¾4öÁkM™¶ëÓBzãĴјxãÄ´ïW$Œ›bBÚÂçå‘´ñ--ï„/5¼¾G *ßTÆ™5ÏzWÙZ2/sƒ‰Zõå×$Ö™› J©´´NG‰V4 Ž„šøb$­s“Àáã ÑõKýu5ÁÄË…Ç‘ï‘2^¥Os‘â^´bv5ÃÆŠqµÇ@hŠàâgKx{ x––ZôljiÿÑæ‘ÓÃ2¤¨+áþ• R•S(#,Ú……i\+$rË]²A­QHë\WŠV•Üu=°Æ*¯3ÌÂ8Ѥ‘QY‰úÉð«!Óüƒç[Ãûè©Ü3§Gû#‚•“X~IyÆŠãêökÿHXýÑ«ÿIJ\AL‹Mü‹€…7šÈcûiø±'þ0¼Iý·å'’­œz°Ü\•Û÷“§ýŠ…ÁƼL‚ÏÊ>RÓÒ¶zLQ¸èd‹Ô|œ²_~H+uÌ1*¦Ç~µÈ«D×Xzâ®ÅVñÞ§i”WuD…kˆÇ…Bƾ<,–˜« Ý)5¡$vÆ—‰ñLÃl«€ª™b;àá!Xe5ÜY5êŸ1U„žçª ë‘U?X»dJ­2­zàU¦Z â«}pqV½_|Ui—~¸«½_|T-i{âÉi’¹®,}ð*ÏY|NKŒ+½jô5ú1ã ï\ö®%áhü pq$E­üpñ'…ªl†i[YZ¿fŸ'p’jvÆ•ÜÛ¹Û#JÕG‰Æ’¿M®´ë„¶ù 4¶¸ILi½d¨Æ–Õ˜€8Òm9ÝŽN˜ªX;ÐNÛcJ©j}k8æâG¨O(Ûí= Ç…U’êE+‘!U2})[hš›ï*“¯*Ʊ¥[\i•¶–ØÒ-¿O[\#Û$m¿LcKm¬[ãKmðiߦ?–¸ð­¸ ìýøð­¯³~Èú1á[\°µ:c¶ߢÞî‚ßÔ‘¶qU=Aé€Ý(,Q¶E¿¸UZq‘SpišMM‰98ÁB4f½2£&ÓK}<XÓŠu§Ñ‚ƒ-šT5ß ìß.ÍñðÁÀ»;…1àWPá¤Rà’ xcj»ˆ+ hôÁ²¸tÆ•¿‹Ç UhâLUßIú1¥w· [C‚•Ô8Ô8U¬(qùÓi€#¿’·†JÑŽ§È[År6ŠvZuV–Ð|m qç„%¦é†Ókp ­)S\iÿÔó­Ç2š‘úI?Xßù24ó[–”ǰâÙm¹91^ ÐœÊ8ä¨'”P«=èqJ²_^¨ä% §DÅ«ß_V¾Ä Uu×îת«žõØaUTó$ QOsвVk¸¥u^!X'ÜW EªiêÉÛ,áVù1Ü“\ЏûbÑ*O\Y,/àr%ZõA¹À®2tßr3±ÅWÕ»Ôâ®§ù8ª ¥wÄ*åd¯Zü†MUƒÒ¿HÅUãS¶Øª"48ª&(ÉÙw'ÃTLqÍÇáO7áUUŽcÔññöÈ•T[yéBž8«FÕÿhP{œUcB£j}ÛâªM;b«}&öÅ[‘Š®“Š·èøªïHxŒUr ®*¿Ñ_ !WˆÍ6˜UpÉ¥) b«…«6ü±Vþ¬£bwú²|ý°K’¼ßXO÷)x7Ö—Ú9¦Ôós!É.+C˜¨ H5ùâ—q9«ˆ¦Xy*Ò+‘VÆ6­‘¶RÉ2kã¯Â2%[ß¿\ ìUØÚ»»·CелW Í0ñ+°É]•…vIZ â­aÕiZƒãŒ•ËÓkS×&«xœ‚»‰Â¢)’U´cÓ#Õ‰k¦Ã¦O¢E{Ó­4ë’•¬#A‡…_ÿ×à>šÔ«h§ë ·|Œ¹$2vZÙ7ˆFÌxón—&,#Û/q‹©„!µZ’®Å]Šº™«.ü¼°¼»¹¾p>œaœ;*ÐT ¹S|¾*Ë•Á$¡‡â~5[%“´äü²%˜P–É“öNƒ–ÜŽÛäY!%‰»m‘* cø…~“\»â«Áo UP¨Øž*¬ë֕튪Æ:nqUxÃ×áû±TLw"-¥^ÄœATæÛU`Wq\º2TÒÞG4¡ïÀÁ8³w ­>Œ!M­dé×èÉ1Lá}‡ÂO¾*ˆªx`) ˜ÍE2,„¡¦ØªHÖ½1T;À„ÐÐûdU¨ ôI0±Ô©#ñ®*ˆ·•áhؤnѸqÉ@­;U¶*½Öåù‹han¬ÔeaáI ø\ *ÛbþâQ+zHÀqœj‚Ÿ*!-\ê7÷*ŸX“Õ8 eAAá°¡bÝ^zIžOJ=Ö?Qøƒì0…ZAcRCÔš“øä•IõM*Ý€šêò·_Ã[þ"ЇK¾^È’7ê\Q%ñy›C‘ ¥'ÄÁ"¯ÞF,SKkË@ôçC^ܨ~ìU¥Q¸ûÆóW†yÙGø»V¦ÿéþ"¹¡Ëýás±rH›®QÕ’Â qVŠŠbÉ 0i²*êdV°®ìp+» UØ«±Wb®ÅZ*kÓ"­P⪒UÄU¦éŠ»nÅZúOÑŠ·‹ÑÅ q>«Y «H5®ªßÚ8«O×[†ÕÄx{ãi 7,+Vû^9 5äÉ–½ä®IäEz/lžY·ǵò;QØÓ°=3}Ž4ÅÿÐáBÝl̶ž%H už3NŒ2$¯#TÿFeîAþ¹Dy¹ìÆšÞ„×ÄôÌŠqO6½l4®hÈíÓ ´c§Q„ZÊG˧P°¢Ùwåźϩݣ§/Ür éUeË`¶ôØ´µQÄ"íï–RW6–À-|2$2 >—!Ûõ`! ¥×KWzŸžAš].Äš£"B¨þ„œŸ„Ol«£òüî¬Ûq^ Ý*¡òù+—ZÓrV4ªÿ mׂúƒã;ÐtÅU—D´õ„jÏù§êë—GVæ*iðÕi ªÇ¥U*Aä6Ç…PúîÇC¼4Œe‰#zûdLJ-7ÓíÃÙÛºCgaâƒ'ki´ò(¡e1L­£ ×îÂL킎»aE&0° øˆúqZWôÓç‰ZP@]€ƹñ%·H?v´œ¼N)µ2r?NF–Ú-8í-´d”uÆ–× ¦¦ØVÕ=i;ì0­ª$íOV׬Õê§¶¼L:aµµÏ œ›´)!ñ` ýXimËi`(}¯°Ä ¢;uû1(^ô-½¥  DÑGOçJ»ÆÖsÞëë¼7Öò!OÔÌ1â­Ô‘yžI¤óü——)i°IUû?vi3 ¹¸ù%'®cÓ'…qU‡cŠmØ m¢*2*×ñÈÒµˆ ì+°®Å\MNG‰]«±µvøÒ» +ª{áWb«[lU²6®,­¬@[ha¥¶ð!¬PÓr§\4­ ÷Ç’» ªÝö49*EµM댅%¢+€"Ö•#î®D 4ʶ´5娂:+!ûøáá¢ãÏ(äy$™êÌjOl®RÞœIßUÂ6}Åsi¡Âjü׬#©ÙµlÙÿÑä¦ÌÙ”áq7˜¦%16S3 ƒá¶P9¹©,O\ÉåºÃgCã‹%7´;íŠñ)Io\n™ (¼1âOÓX–}ù3këùžxxò-g)´û%NNÒÖºTòІ§ß¾X•ß¡€ØFÑ‘*¥.‰ËªœU>€ ? Ç…—O-þ§Šñ(Ÿ- ‹T}# ñ(M¤ØÛµfš8É5øOÑJã¼M 7O$ ¸Bzé„Ax‘Ñù~û)ð¦KÃ^$L~V“²“x‘ åYNå1á^%xü¬ý’˜ð¯Í~X‘<­«ËÇû«9¤ÿ€Zåy&Ýä]ê^¶V JÓo†5þ¸âVN¾UaûbªÃåŽH濼 •ì8ŠmŠ¢WCUíôÿ˜Å[{Š”ŒÉìœkÿ F@ÉPÓÍ$2të†ùËÁüJLJ’öB­ÎÆ4þB÷±¨úB#ÿIJŸãļ(y<Ã`:A#ÄÐcļ*æx×e¶¯Í¿³%áQo4½~u§¹'%áQ3ßðŪ þ8ñ/ ‰ó¦z2/ÉGñljxT›Ì±é5>J¿Ó%áSmgTsñ\¿Ði‘²¼+N¡~Ýnd#Ñ ^‚âàõ•ÿàŽ%áh»“RÄüÉljxU8¯€'Äîp¼,cVÔ.7ý¿à3YŸ›“H2*+˜ÅCT¨À•¥A8«¸Œ!ÜFE.â1UœF!]ÄdÕÜFD«¸Œ ê <*î# ´E0ð«` ·v*ìU¢+жzShŠ~ØBµúûä•Ù®Ä+DW&­L‰V°+"(>Šà!ªP!±ÁÊ´n…_žB(îǨî°R½é—ÅÉ»Œ µ Å·Tú¤lž÷ÿc’0á 2ôIÖ6jr<¤“ã‘o ¨JË‹)nï…¤ Ü qÊKÍŠ)·±Î‡>Ó )‰¿Q—%ÿÒçßT”ë[”;âS»®R¥·®P9»šú°aR+\Èpr}EßS¯Q°Rk=ŽØÚ¡¤² Å(wµ˜i6†’Ûâ™ Y[Ðÿ!?,\A/gr7ö@rÁ³d7/¢M®äú}|>Y>$µíÐ~Á®DÉ@B\GÄŒD–’«‡`X•4©\—Ò_=ä‘ u¶‘¹q¦‡¶6‘,Ú„Ë)ŒÙ“Är©¡ü|q´ð¨›÷)5ŒkÈî$¢²üñµáX5„BãÓ¶þì’>óˆ’ð«'šmã¦ÝOíq©ßÚƒð¯ÿÙ¦æ@ÕVþ˜8—…ßãû`>[Ü&û x—…-óŸn®´ NØ@Oiž¿fnàlù]ÉÈAÏuj~ͨÇ–L÷kû6ñj“„ð¥WWSTÒ(ÀÿT×’µáIo©³}oll¤!<ÓS#×ýc†ÓA.’§nD×¶6´‡u¡8ÚÐQ*kÓZl mirL´¬:SZ[|¼´ëµþh$ð§ ì‚yk‹hÆ!úÎGE&Ñ©ðÉ-+*“ŠBõ´Fù­R¸¢Û\R¦ÑÔàU¾˜ÆÕKÒöÈڨɯLUM¢>UMãÛU)#>Ú¨²µ:`U´> «H5®⫱A\ء٠ªž8UŒëñјwå_ š]Põ9; ²¤†±KLE>x% ´Ñëôd9¤;, ·deÍVPàuu2e]L]C…]‚Õ£ÓЏl7Æ•Žëžb½°¾0£¤r¿\ÈÇŒHÄ¥Mç-P‘ÄÆú™?-´ÞpÕi¼ˆ>J?ŽK k›õnÒ¯üáBÚ™ó^°ËCqO`‹’ðBÚßñ6®vúÓ}L¯Ã wX|ëþõ?áýŽ+ºÖ×µb´úÔ´íM°øQ]Ö~™Õsq-O_ˆŒŒWu‡SÔMA¸”øŽGŠî´_]¾’½ÁfÆ‚îÉ|¢ò°¹.Ìâ£j×õæ>aEœC!æF߯1ÌÀd‰¶Þ'^GŇˆ=3WÄ ¥ÆÊHæ—j2•?W‰Ù+´µêÇúfãE–ÂS%¿\†¹†[u›ÖŒGæ¼ pêÞ¢Ó½9c›,ZíÔá‚’c¾ÈÔÜýã1! dij/1ßÉæÿ9kz­ŒT²ˆ5È^â(Äp†Ûü¯‹2qÄ…¢–[Ú†,$ª¢ïá\Ë˪Ž1±d ßR‰‘Â1-·ÛlÃÅÚ\R¢’PëU$7PwÍÜeaÿÔŽ„陵xŒaKµU¢!§r>ñ˜½]–>H«­¤GÚ„æTy8Y~¢ˆôp–¢Ñ†¹*rA¶È!¤·R„šÜuÅŒY/å*ú_˜ú)èIý1>%ËÁÍô«.Õ?GË% "òAP 0…KnäÕ%½ƒû‚1V#:’1T¨ÅPî§Qn¸«¸ƒŠ¯@iŠª 5®*ºd-o2ö1¸ûÔã‚\• å[ËšyÿŠéÿ rùª|ªhrÅVE b«ÕIjxì1W_v&;SÀŸ„’£oÏL¬ËvqÁ)n¦–…¬¼/‰uä” ö¯lLeJë=²H]õSá‘*墳0+¾£í‘U§ïÐcj£%¶M׉håøÍF]€ ¸• –XH’0€ÂïÍ’‹ð²¾Äòðñ.fâc>IMˆ¡'¸l3æœ|“$f#—Ð~YQl¶ø†5® ®í…a´nî#+g»©@Y¼6>'ˆ<Ô‹D;™­UC§Ã˦Ýr­­Á͇IÚ8%ŒË!SË«¿Ê{W ˆje«pÏðÈÕÐwÄ ÝØ¨M¨®ˆ@ÜÓ–Õ¦_ ÷¶Œ‡ªi¡zÖ–ò%×™€‹“¢€|LOAŽN Hn‰æ'$uá ž¿3[‹Ž¼Èìe\̇G7is^éÇà§.;°¦CCëŸÆ€dJ Qä]üµVk…û¥a ‰Ýb‚IH‘¤o’Çð&qKt}R+è Š¥@ à¥u?N&Éààô-?òúæ{Hn ÜJ²ÆN.ÇâPwÜd%&¦/ç í ʚݞ}4³^ÞÂn"ô¢Uˆfy÷m†;°‘!.—ξ]·…™4ýbêU?vðBÀ/Jó”ä©¶ô¿<ÙßêöPùoYn'×.‘(Çó=#éÛ#%eKn@÷>9‚ß p¡q·Û"« ¾Ý1T<¶ÞتXb¨9-ºíˆTœ’ æˆƒ¾*†xñU #É*‰Zo„*Öë’V²A‰lŽ [[ÿŽŒ¿ìViuS|P*¤œ­›L¢¤`V˜V†W¸AáV¨1»Ý]ôWÛPêå#²o‰=2RV¸ î{â­iÒ™r­MpÆJÁüæ)©ŸøÄ¿¯3°òDù%6Uøþ{dçÍqòL­£šZÅf  “Zö*“4å<µ<1ƒq ‘mÄnØù¨é‘3¥íå芓 êHíÃôácã /tæ·§¦âa·_‡"õ€Dð°âjUMj>》AΜ™4oA YÝÄÏödY#u>ÅX/ØÜ´Ë-¤wÜ!¸ã «"°­Wp>yxäÐeºÂcì~"EG†­Û¡ mSRwÈH[#.%X%†b±R7;ô¡ößqk06˜¦r”sˆìñs¿Ý–N,ñÒß­k–ÑVJOê@`=È̸OÂmáMô]NÛP‚ê݈ˆÜA$l® £uR ð`2FO1cæ×‚£ÇF•_’öxŽÇ0£’Žì+‹‰¤±ŽÝH6Éê ¹ðÉeL9&‘Kq…­¦hš2 l¤« j锲á[,²Ï+Ë<­,®Õi–bO‰8³Œ,*B^¡âÃî,e0ÒôúòˆX ¤§o‡ýQ‡‰ÅÉJµI-”Å ’È>ܲõsþHðÃͨì)d_[¼õ!iE­@¨bØ¥$Þ¹b‚s¡ãRr:à!³pdE'½Ezä&º¥ö‘sy$¦9-¤Xƒ.üy¯%¨ïR‡&'A¶6­¢ÌÖ·+ë[D@¡æ¼HHq’bS‹­CêÆDÐÓãxºŸq‘”PwSxc¶‘Lª¾Ìw>ù‹–;8ùa²æŒ0ä7aR=Èë˜`ÓG%œM·fØl‘–ìIsÜ4vI§Ú”7Ið)·ÅÝ;.l0Kg/٨ɤ³Ú‡¨êá+¹§C\Èân$M%kN§+#nGd£(ݨqbÿÿÐ%jfC­uO|! îG-2ol§ s0”@ŠAàGã’ÙÓYe8aª“ ƒL!]ÈaU§T²œÁ{ìR#Šuª°;a·Ýôg"¿™A•O tµÞ”¯dñÊÿ†œÀÊŒÀ£é ~¼¦1¡H3%BKÛUfY'xý®L£õœ•1ÛÔõ}5c&£h€¯+ˆ‡oõ²à[­†_y‹ËJEuk>Çûô?¨å‚Kl2ûÌ^[Y¥ÿrv¤4"U#|ÒlNÝ«%^Sù“i >m¸H#X¢ô`eD”b¿«5ù@1sŽS#lÚà<2*îºâ®áà1Vˆ#l =°Z´PÓçªî”¦6­Û¦6­úcV¸{dSnàp…%Ü/ž*‰·B³GµhÀÓéÉ*Û#N´sü›Qü1TJ)åÓÛU @éÓÉUlÐ\xHãþ¿¦TRKùœ‡ü_=Þ…½?ä^kóófÄ™7¥7Êôφ)wlUÜlUÆ-«LUÁ :dJ»¥)]Àøb®à|1WzgwŠ»ðÅ]Àøb¯>óúÿ¹`?â…ýyŸ‡é ¥É#Ó7WðäÝÊËf‰MÆRØ­³¢º¤ʼ%T$rZÖ†˜7Z´×Bºœê¶¯$(‰d„׈U'ˆ Bµ–ÆÚåÛPÕ~2òsE HŒÿ+–ù9Jà –^\C<˜U÷© ëšœ˜ŒŽÎ¶q²•M«ÇJ‡rž=0ÇNZü2•jr[ß0—š‰€ ß!ã›8áæÀŒòݱ <¨}"h#'~ž©ÍD5Ë ¯5mnÞFK‰ÔWÓ9v9ñ ñrt^oÕmŒbnÎÒ•~ YD„¯Q¼¹Ô}9"ñ½¥2Á*ce,¢ñ d­¹¥j÷:uËKoB]JÛúxƒ‘–; I¤MŽ¡*N.Á&u5Vêz×l§,of³»%º?Z¼YÑi Š!>#í~¼ÅŒ+dGkJñ]\š*¬‡Òs²¨ƒoÄòË„\¨Ša—/.±x¡â\„Wf?ùxf@4eÍ6D°Ñ'kv¶Žy‚²wñ®Qâ™ÎŠ& Ve3I’Ý$‚']É#|y³ŽïÿÒ!×2jì1AGéËê[Ý/ùeY¼).žX;ïÔ ãIÌ6GrwG£²,V“¾*ÕN*ìm•8’#býXÚy&®¥5kÄþIäðçv8ù ðR[VÈÛ ²¥„ŸQþXìV›P‚÷8xBÓ™x¶ýr4NÀh&› hh ö,-*Á à á ä†H¢•×O¿aU·–½‡‹Ó†«±ÿye5íÆ˜ÏÚÈ~v ÆQ«æIµ‘»« ¶û°lXpOñ ¥ô.D‡ö’X Äßñ,Šx ˜ó4pÊ–r~É‘+Ê›tAŽ=U±á#›!Ó\I¦YÈB‡^? ®fÆV¢V‹ŒÛd’ˆà{ì™§‘ñK¨=(~Ú ßæ€)®}?NcTŽï:›†¡û—$4áˆ%´±´O³o!ÿ^I[¯Ý‡òálª šýR:ÐìQ»Šwb2crc¹æŒ‹ZÔã…#F¢(UDPØm–Ç$‚ F¿JêL~)äý_«%ãI¦öåš;“áÈáã%h¨>©jZr éN\ܵʉ’@*m¨ÀvNN}‘ÿˆ,–Ö;¬R˜À7¾HETŸQý›ø)#xAï¯ÙŽò‘ @U›SÔu½åܲÇâ‰ÙŠ¢/Em¶X-‹~¢åBÇ2£µk_Ã%ÂUVK[VO©é]ïPý“Mê­ßý—Ç0cIž›mk4bfE,(\7ó…@‚‚i2Y¶x”Ä 6é×îÆQ-r*a ¢T„O £¬†Ah{á@¶ÐFCÈHU_³âIéLh¶ïIÕ‰òúÝ“r)hÆŒK8REÊNùQ´ÅaÖäµ’Ak#Gnß £x¡5 ¯¾‰Ìƒ·$5Ω$ìð @=ÏS’éŒÀ/ÿÔåmù›¤~ͼäû?Ž]Äâþ]Eÿ4¬Àø,$orÔýXñ éÓÏ+þeY·©4É»W€ŽWbJìy ²¹îÛTÐó%ñ³ã4B%…A$JÍû=2"DlÛò]ž<Ï7—ÄÎNĬ Så\™¶¯ÊãΞy•™¡Ò£zÅ©ôµrÎ$øþjüÅqÇÓx‡üWnõ)Êç"È`Yu¯>Ê¿·‚ŸÊ¥ã\O€òÁæiÉ=Ýi_‰œÕ¾M| —¾•¬šƒÎ{¿Òp'ÃFM/Q彤£Ç÷lW…£¦_'Åõ9ÅúbR£å ˆ­<»kÃ¥¤´rбà@-PwñÊdÚ¨iôÿzã'ǘÊè¥pÔ,?åª?ù?¨ÈSVá¨Øtúä#ç*ÿ\¯ á¨i½~¹ÿžƒúäØî½/-äjG2Éþ«TþÀM$ŽŠÎö` pÈÃÇ‹Sõ`â^ƒËZÜ ºZ9ZäÔQ·úÔÈ™–B¥ò¦¶H%wøFx—Gù{bÖÜZîVžµõ”þ^1ð׉¸ÿ/-„L$»s)+ÁÑB…QÔÜ5› nºü¾²f¥½Ü°’"ß¼®ÛmðàðÑĈGÑ”ƒê'ÌŽÊÏN × þN”ªOËà¢;Õ,^¶á…~öƒûøcÂÈYHuo-êÚic4&H?Ò#£ßè®U»!+J¤GŒª¼d3*•"¿-°nŒ‘@ÌË@ŸlÐÑ~~#»/  á~ (V ?à •ðÚ2Š©­þñŒ{¢-´«ë¦â±@ÊFUåÞ¤ãe³Â &±mvn- °F˜B¥x¸)Èò/z %Øí.šå­Ž*ʧŠÖ#ñJÐR»W¾(à‰4‹Ø ËfÑÆ[Ä€5Õ¥r1‘G„-å}AD 41Gää£ +ȸÛ|°“IR—Ë—À4°Û,ðÁeEJÕ©ôm‘²Ÿ.]Ö¸Ñm(K-"ƒ­+Ý[áÙ_!͆¤ª¥­ Y¸*ÁbOCAû'ù±â*p€ë/T·#×°då^'Ó¨4ߪœlµx„£²«$ ó%Pp5$uë\l²Ak…׿WÞAÉ@ˆšŽ•ÆÊ|½­®ƒ!k>*ô£!~.•bxµ 'ª“©ßÑC8½5øú¤ãÆY0Q‘Ð1 «Ù!ØÐü°q–?—mÔ¤K+AH™Š,›…$aã,†™û°¥ÌtPÜKi^˜‰”*¬PÉ1¢AV<>.g•~ÊÓâØWl—S¥‡yëΠéŒñD¢êá Y#“»U™…>u®‘ÇÊvx¥–«j÷,á{™ääÌ@®õ©&ŸgÇ|‰ÝÆ„dy=ÊO¾Ñ¤I?CýsVe %Œ,`u¤|Z„;|X‹lpž©‡šmu'š¢hà*$Ž k¸U8øÈÛýfË‹d yóÜùqµÖÉp¶Lž*£0QÓ‰ãðü²³ÝÇ’¾…åÍ?\[øm.Z;åൗŒXSâÿc“‰­Ô Çuck=вiÞCÐFJÊ’Z„oµ±µ’ã¶Øâ´›U²KIà–ÚoZ)#  ¿ ¤‰ÙÐá¦3ÇKcÞ›§6 oy5Kµ0@¼K‚hàE_žJšRìkRÝÅSK ^þÑ"N),1Ô†ûG}÷oÔ1a1iŒW39¤×þ®,8WÛÚM$ª&5FXî*ÔÛäkŠ„’÷MÕ‰%„ðŽª´ …†Ø–ÑÉneæUÌ|r,SU·õbâ 1’@Ú¹ XbTÖ×ÓzFÀ0${}'CÿÕ⫤Ú)`Aóþ™&ÍÕÖÂû0 >`Õʶa5Â’5RrèK0ŸðX’»TòÞ»¤ßÉai"\ƾ¡DÁNî¬ «ß,ÇÉÿ”WºÝŒ:åе´¹BmÖ1êI± ¯ªqº[¤|_‘¦5i5ˆR¤‰Ó}·Ú‡—†ªy'Ë€M’žU#Ôví÷ Œ¦{™F#äòNiR¾E(ªIéó{’Og¹4.Ú ò.ŸG£·¢ƒ‰=9?E•×Kòýíã¢Å ’#xñ&ïQSYS˜Œˆ÷âXO»ø\x™ð9õD!äýˆ l§ïlj|4T7hß¼%”÷F§¾ôlj¬Ä¨ßê^„-s¬ˆ6noÀSÛc¤ADIÒ©v,Ô"„ é]ñ&ÙxjRÞú’3òàJ4ZVƒa¿Í°6!ÑX]Ê\DP*lÕ¥T… TÿÃaSŒ¶æ®… ‘NªK—qöy €¼~.TÀßH{«}>8dŠHÃ@ê‚Här9í}ŸÚÅ‘]-”vQÙËGj\*#|!“üšSñ88QǺßGÓPEb–Ѥ\‹2ÊÁä§€·lÞ­éZÇ:…‹“Æ…x¸çðÆçìïa~k"³-oLƒÔâÁŒ,‡Â7û_,4µÄ— ɬþ«a±/ ¨¶“zۀƭɻ~ól¡ÎÓAiäãÅ-¤:ÿy³~TÄD5„–XçYÙà[Š!1…ã,…Wìÿ«Ë²a-€Ôšt³Ío,´¶ŒÂcêr.7øGíp=ÿig0UâÒ7»nqž”MCΔaÁ>tíË9HxmdµtŒ§Ö"¸¢Aé­Oí15¤cÃ& ٟ®#¤¯<\Ë#nD_kH$WèÈpªÜ>®LÜ#1ôÖßAݹ!?ò¹}œ!„cºÉ/Þ[$HvŽF3#Ÿ‰ªW‰SAüü±¦~ ŒV²¬¾œŒ©êkÍZÈŸeˆÜÀñÈRdUn`GŽNVþ´“O’Èy„ˆš|cö\­xþÎÔ ½‹¤iñÌÒZÙ¤~¡T’V 囨4ãÇlØÓÖâÖÖàÃFN¼cýà†â:8ñÁÂÄGEBÖÉ))æ.g–ž¥(vqÕ_—À€Ï†y§ÏpÅ£O>ž‘ýUå’Ò Ê°…è¬UôØð«7ìýœ› §‡~`ÞÚêÚÕœ·:¬rÛz1‹‡©f$- ¬q¯PZäH½ÝDçÆlªùóRãËÃS>”†õa…ˆúqE*ªß¿#\ S~-A‡@‹·Ö3<Ù-ÍÆ‡3I1ø®Eˆ¾â‹^"  m¾.It‹óW|õ¦ÒóÌ–×{…ýû¿®¨ ÀÕ}ñ–BZòB@YJà·ò¤1E$q_=ï$~Ÿ>€ªðåJÿ1ÈÊdŠqMªùv;Ë{ñ-¬“Ä&";Ÿª€ÓúdÔñVÛ®GÄ$p¦3SYòö“{ Ú.³©Þ°T’énŠþñ‘@ R oö9n8Ó™€-„y§ÌvZíäÃa œÁJJñÊV-^mM«–ÛNL¶—Û[ÎÌ#‘‰D4U®BeÇ´êHƒX´Î‹õx¶Àø–9 (¶1qw’–ëé¥w-×ðËémšh^U{Ý4Þ´ªÖc÷nÊ„È}¦i'üÉËý\imÝÙÏ¥_ÉÞÃy ‘Æ[w.”ì> ¬>L1¥MômIL¯;k#™ø×‰SPGù_Ë‘^×Î:……¾›•ebHÑ£ºTR\Á¹“ñdˆÚÒÀF<·PÔöúrKLL6æìYÏqÜn“©4¡ê»€6ç4©Y´1ê*$•8þÑoh3vÞ]°²w’Ú8ân‘HjäWƸð²9ÑkebcXâÔ¯%eP ëöHÛÙ„³!¡Ö-]}¨+ÄD”jà0q0ñ.-®!xÞÔª8•ø© tÛ¾ Oˆ«cŠ—D‰ié5Çq¸Â8íY 3,œ1öJŸ‡…l¥“é÷ êCl‚U5USñVµZÔuþl ðÜfÞ[{‰]­É”jü_™nLjøN-ñìŒ/èÛªG0g-ËÄÓwÝwé¿Å‹8i'¼¸#×ÓI P¼€PM üëºÿ.,â)sKħ¦Å¸ž-Á{v°õã'P^˜±-ÑjP ãX–ICDûX²‘VkˆÒO€™q–€ï]‰¥íbÇ…k¿ÆLD‡’Upm¨ +ö«Š@Ù×’…G„Š•«Þ3ö*lYDn–Ã5ÛLZUŒ[’ª]™žVꆼ=>©Ù±m‘ ‚Že%ÿu#4e$¢ˆÈ  ï„5G¢„Ž%G¤Ü‡’)F'$Ž$-”ë,|¤<$%ž;jÔìH®êLƒ,°]ê°.~˜¥8HÜXTGÙþÖ(ÙLjq•DÆ~'„†:= Ó}Í)ÿ Š|%’ÜÉrì°rŠc2Ž$·/´üL7ÿWYõé`g•]Ðî\¯ :îßÞÜ[öqlŽ5ÍzóÊÅ«ªI!Ø‚E)° ã¥·q£[K jÖüÿ»HÔŒ¢´ÿ+ˆh—C÷‡š0ü¤ˆš"¿D*>&Ú˜²Ùlc éÃÁ‚»–g¨ãPZu¦-YL'2Z,K3ÁÉ!\VËÛc’ƒ4¡ýަEë/*Q´$´—ûSK./âšríY½0QÜ–ÿ$7Ú|YÃÖ‚0NÒÇzlã´RV7žFT(¦Ü@aF_Å™—ð¢[R·•$”Ç zª²ðqŇ¥²·ZSâŇ„Z…nÚÎKÕO^ùbVr‰$¨[em«ñ}œXÈQ¥iuFŽ”Ç<¨BôLWv!©É‰ú¸¤b%¬=hìÍËs ªHyŽ$Ê#Œ*¸¤ŠTŽK1úbàõ6ôâ••Ê·AʨGúذæ†}ZîĶüç••tcÁYø?n[òÞ£Óƒeÿ¤= ÅÓ./>³w ˜‚ü(#kð,ZZe™íÖE÷ñDH2?` F8Ð*òˆŠY\\D$10šA¸-Ëàf¡ÙGÂø´eq1êrÛÉj¼ܤž±Ò* >@Š!&'ÝìvëJ¶i&f™§Ò4Öà=¿R þÆ;j×Ô™ž¸³>’°U`BQv§âÞßE®QY$“Ã¥Çgª“ªñ(¼”‰%pÅX‘ºÆòžÿgíüX c.Ò{÷»²¶1ZÈ—S"ˆ®áI“ÊwŠ‹ã ¢|_ r`B—š|Ùc¢Cjº‹ÛIx¥„D™@„ò®ù&Œ²Þ/ùùæ1ÎÖ–Ltíh±Ù@ , iè[åþëÁÄë'¨³L}?\Ôå†'¸»uøm¢fi8רD&‹^ø¸Ò‘&‘—_—6mw5½¢£phZZÊ£ˆ5 .ëþËYC…)±m&ÞVÙRr}8GÅè‚z«ñ6,ËÊJó‘¹]fÄÍeW§+V0'Â~%zMéþÚ¯,­Éà ’É|ɦX36¡¨k®Þ«ñý}Å#“CXÑ–E§ùCÓ’7J5ølu™‹§è–Ú>¯lÌï«16ê¨áB•dâßÅ'òááq2á§›\ùŽöÖIíìœE3°"Q#)#Ô @¥rBºx÷)Q¹’^Ø’†´óÉ -á“Qy%‹˜âXF»qcörle$Îì‹ «(ã9Ý–”Üî0SRiï.f$Jìš,UøIñ¦¡ -@äçVcmæ[h¼±.Ÿo1Žì§%$µhMxƒB:a‰V9bmž4Iߌ²Iýé?€ñɪc-Þ›¥Ýt¸úõ²ºI#[’ˆÜ*–Þ£#ÕJouY¯'•ä52µkߥ2g’UÎgµ’éÛŒp²!'¹9B¨ÊÁ%&D&¢4µZOß“ ¶6`DNœv8«ÿ×ôĶSL±¥ÄRÉ5T!Þ0Û[10Jó!V1‚fV¯:S¶$¤ÓêÌž¡R‘Ü€ÕbWâéC+¦`¶5õ mjl_ˆñU‡P‹š[¸>³¯5î÷+¶*èmí’äËñ¹aûÔ©¾*¼Ar%}QÁøªÔvÁj¥h_Óæ_‰øÜcÄ«®nVT‘ LÌEV¡? ¯O“b«g» D<ÚðýœU|3¬üžH©O…Ž¿N¨C$ò[i¼H’¤uÀ¨+Ÿª\ÝIÝ T6ßg|UŸ;@^Ñb’̓^gæ»â«®QšÑ%OÆxÍ–äfN4âØ´™ÑK ÐSÔ¼X¬£…ú‹j%ªH朙Ðm]¾‰g ÇPxB.÷IC2ɬ¼ÎŸ\’Zrâ ýšŽ=iÓ cžÕd‡P[”++ƒ$KÆ¥Aè§ &\AU`ôbäÁÑøzHxב¨ZøâÄÎÊ –íÉmÓÓ´%žIhG qD` c‹`’ÌcŽú4‰X±FIx¾ÀŠ…ýžuÝ,âBÛ¹-aK[ìæº™O¨ejQ@%[œ÷q#‹âר¢,Ë9¹h’6‰@CR(\‘·Ä“E«^QÚÚÆìÒÚÕÑåX·Úâ¬?¼­Oìâ×3r%JQh#–e“Ö‚â¾›„.¨±ù–ÜSØ–¤v7š¥šAvcú›©q'Ì Ÿˆ?qo”¦"Õ‹Ã ~›YÛÓ’IN5¥@îßµþ®-X̤w_ ¼i¤1\ …c╘‰Z1‡44û?kÈ6Rk¨-cŠÞI`7ž¬‹Æ-Ü€Yb݇Úl£Ä*÷S%¯1 È3Iû«Uâjñ*+¸£|XÛ‚O©mÔeU˜´ÎŠÏÆ:ï'E ¹ï…´p©IõˆRãV‰B‚«4Š‹U'íP☈JœO©Å¦\¤jþ·&t=iɪwM™ßuÅ&0¨Eîž½i®¹Ž8âŒsÇ&¨?íðâ¤^áRÂy£ƒêòZJbhþ%xöbjxËö)Š2F27Õ»ËÍ* ²q|1AìžÔ¦8³Kèä‚‚}% <ŠÉ Âq­¬|èÿ»—ódYJÌ·kÂǹ·’e_N"¤AM¶…Âc+¹#În &· ŽI9yM^*Ðü(}¾Óaf l¤²Þ5´ŒÑýN_NF¸;ޝï)‹hæ·MžÆ<[§§stVè,—Ýù+žƒöq-y!eZî{[©#—/lPEoU~LK%ñÈ¢#…JkhîoyBôO¦¥ª†/Ī;“\[£Ò_Å­“Ûé°)¸B­áFvXWy–.²+ÃðZ`údÓ¿Öãsê f(Iç5 ²³76§Ù¢ÇI„rÒ_™­G;Mq©=ÌP³¼¶ÊˆÍ(Õ½øÁø—ÌÌRGæ-CXŒN4 ßÕhÖ_­#h•–¼‚}Žew¨ÊdÕ#—øùaæ=\É=#¶Šž¬×2Ÿ‰½CËá ³V¸ÖÎ\‘¹}_ăּ‘§hS[[ê7PÔî@x4»D¤>ñ³Èã€~Ù_ Ñâ«Ë?k‹/@["ó’­|á£Ýéö¾`³´¹PÓOqIteUš¿XI–Q^†>q·.xx]~}Gå)aXîˆ:)$R´4ØR¸\;µ}ONžÂeI~Û"± °ÿW¦–WÙ^éÅ©‹OP¢BFóúD³(ÿ'—lU'Õµ»½OP¸»¹þúæW™€è9šñÃ$®WYx¬ƒˆâBžõñÊʯ„[‘*°Ú”Wñ>øÅPjíœB©¨#}úå…Y.–ú<:JË4 s{;H«_#è ?ÍZäZÊÓmä³õ’0:«f;áHY¨éK «$`ëOl K..®#´¤ü Þ¡þfØŠœY!ž#–àl†*ŒšE[Xí’²NÄ»Ój(¯ù9ÿÿÐ¥þwÞYH\é8aF $‰_×”‰Ûe'Ëÿ9dWŽm J²ðªÎkAó_— ÅüäNÂ4ºÐç~4äD¨jzwG *ùÈ,\"©Óï` j¨ eG¸ø±ã ˜Áÿ9äÚ"Ê—`ÒŒí ±ú8¶ö9¦”˜ŸãuUiiÌ“\€lŽ2S;[ýáZúÍ–Îí‡'“‹! ù†…f0æ)*ó¯b.–êÚà;*ÖZ…ÀØ”¯Úâp±Ë?8hÒÄ+º©"²Ôð®%[æ?®Ïe,þ”r@¿¼i“Ÿö²VʳLOÉ´M¯j]ßKmalÀZASÆFÎv=aƒ‰Íœ@ŽÁž\Ý•³y½k}BÇ/L€c´(w8ÛÞ“Ïæý?O.ä·ŽJ#‰ƒw©'"dåCNeÉ8‡Ìs5ȇP·[8] Ç/©ÈÔ¡Zƒáb[¦I®Zp÷b+µ…¶WFà§pJŽLißa€°ð»’ÍFëT·´F;¤É,UäIû*¨¯ü/ícmøÌe·VôíwLŽ­Èx°¢3OˆÉË&É1Ib)õ¶œ8p§ÓP ü±%ŶQ–KXîZvœÈÅ0{î»oœA)mƶaCihÆ[§#Œ¯·¦®>Ñ*=±oy,1[F‹qKzÑï,ì=8Õ©û<ñlŽÞ—¬6º£Mz©qõ«ViÓ”°%G.+±8ü8·ðuFE3OnßT±w»ƒs¤‘16ä+ËöW‘ÿ+@ݵc>º®/ï­J»Ê¢—ÔšÈR‹þÇyª ”—3¥Ì ¤R („±£‘_‹‘ýp€â„<­¤—“ê6ɲ//SÔªP޼FÄÿ«6‰ma$Ô4èãžkû‹Vâx»õIP±© UóëO´¸ì9‰ÙÖ¶ÖߣãO¯ÄMb«ÕÖª9¶ü¾ÏÛݹ|X²É@ÙÙak-” –ÂjGW–YG7b:.Ý>ŒZæAê€Ô<©êqÉÒ[ܰ>™;™ìþª·p[fÈp¶`ÖPÞ%=ž­en¶–— »µÀ‡š—¡4õdxᘌœ®JS\j ¦]ÝΤZ…Fx‡©ÒBZœÂíU,0Û!r A«ÞI¥A<ÉéÇ d·39I7V^§©ßá8Úþ^D Kù¥ºšE&Xw•#XËV ×?`¨â¸m0É4{{™cŽ(AKY¾´Žy©µZU—á¯V\ZÌâ=êAýy-m¾°î‘ò£…õ‚µpÔ—«vň…‹KüǦ[Þ¯×%iÐÀ1B¡KøTF›«øÛŽ.N“S“¡K&úÛ^¬öˆ¯`ñ¥Å¼*82·ì'‡ µÁM˜¥\1ͬ‚×…m\~òI ,¾²²T*Ô GÛøp€ãJq†È©"¿[‚Þí¾°§yî(X b\B¯@œp£g’Qc²Ðz×iŽ$µâJ@䦔 •zý¬¹G<  m)mâw‚(R ªÒ7%ViXÐ3¹ZqûXÛ…–Ìš êQˆ †oÝý¥‘¢`üÚóÔ,’ äfB –†3ÓèÁ$Ê•_ócÌ7Wfæù ¸v§5ôør§\·‰„Å„ÚÓóh¢‹Xt+f¨38vp$íÈu88–1K<Ùç-Rd‚8VÞÞØF­ÆÎ‚Œ{5*kôàêØ ©§y¿Z¹³ q&×@ñ`>& eŠc[¢g–÷ׂì^£Áéúr"#IÊÔ²ŸÚȹØhÑú.­q ³CõµÃû—ž,ÄýªrãUß$sÆ"B•å²ÖâÖ,}{G`Xý_›IÁ·v¢×Ù_æÊäߎ`=KšÚU˜ÝŸV[ÓÁV õ¿Í×ö²ÇYÄJÏÒòë ,Â;9.¢®KUjM+N?fµÄ¶ãÍmõÝÕ­f’xå*9I95b aÄŽ¿ÕȳÃ)l’i¾nmNèÛªÀ‚éÈ(è)¢†‡cí¸ž–  "´»ÓmõxtØhÎb-Æ75æ6à?Õ_;ºù`¸’ŒÕnC»ÇèGV»‘ ’à }ªÝAû|g$ÓŽ¤)¨hÊ‹w·3ܳ7xËDŒÑu X·*WÃð¶DšsŽ)Jö^l™á6Ò’å¿xmœ>Ê+±òpq4ê4’†C¤\X=šJ‘ @§o€Ä؆7$å%—>hÒíLâIPÊ®"QG )ÉvøwûX³Ç£É>H_®éz¥°½µ˜G9.!`]âÄ|A-±l”6( Wκ—jbdý!©¨äÈ@ôã><Êôÿ‚ÁÄÊ)LñtMôÙì5m*–·y-îÁõ#pÅsQá·Ã°ÉJ“Å,dM4ÞŒR2Ç29V?´Š ßݶ‚ÊÆÇ„ ©BR"ø\Eü¼›ö¾Ö"N¢1$Ä¥óö±pCßH!¡g‰$13üÒ5ár\LÆB(LŸXq¬D(¯a-ǦæI ,íïË&»¦?¨ÜF·ËgYEfu 5l„mZhî§ýàä ý‘ð˜Òð¥>oº‰eK$¾&s¹ :o1!‰ÊÑÊÄ­iãøaBl'²´·²Ž5<Š^ï—ÄOÙ¦@j\é„-Ê6š|={SCH.ëO x•H+Ž´$ ® ¸ùáVG¬ÁuŒiÀ7¢’U{«O¦¼±TžÞëи‚T<%ŽU`ãb(zŒ>¼Š·RÜE³™E~.[³}ù(.^Z^¤¤|méR¾M¿^H*ž¡eþÆvtø+¹ >ÒÿÍ8”±«§/37´ñãß"É@Ò½1UÈ̈?F*ÿÿÒäÿ¤5dûV±·ú®ŽWáåë©Þõm=º¸?¯Ð[ý2Û´™~JêÁÂÆÝúzÈ}µ•=š6þ2¶¼ëškÿ»¸ò‘‡á€ã)Q5]8ÿÇÄuùúò4Y+ ËgZ¬ÉJöe'*¿’¿ØqNÇ*ªLV×ÈéŽçšÛT#®¶²;­»Ók…O^˜ñ¦ÝA4Þ4‡WÇ ‹æ‹¶´žt å!û*:œH sUÓä’Îxå¹LJþ›Äç↸VÊkqi6©èÙZÈ©#…[¨„î\ÿ«’¶R15Lö,Xy"ÆÒöÞàÝ^³³³N%—ᬌÊzS$åcˆÈ8ktËOóÄÚü®F£+¯¦÷†Ô³?äà6å~^õí94­+ÊþµÅ²ê™¦¥YКsoSã'ëqƒ)Ô=/<½¸òè†kÛK8¬Ì„´À¬Ì$-O"–B\Þ‚1É µ;»ùî´ÿÑQÜ›ž@J©1 Ð’G?€ÿ­5(òL%¹óF›p‘ËýeVIc¶ˆ|m ’Í^¿Èlx‹Oƒ¸ ]j—/,o$ik*¢ñˆÓš<ÊYOå¾ü¾·ör$–ü<#šcå¯,^ÛêIw©2­ºIÍä+ñÜLüiɾ °]«ÚƒÐþ¦/ÙÄZ„í]HF5=8’6É:’Ï*ó­­Ý–¥5º‰$i@xî](Är¶ø² èõ À Ñ>J7šmÂÙ^DëêÆ%²¼œÐ–æcà¬À€Wüœ0¾®&¼Â\•u½ÛV¶—Q‚òX!…D28R›ÎÁTõC6 sc¥ÖpÀC¨d:±¦>Æ3µ¼(8Ü1+ðÇû\Wù2W³V£ •ÉC]»K¯J} ËxVNHòP¯öŠ–øª:ಌ{„צY—I¶¢Ï*,5 yƒ9&•8ÙN]æªÖþ{F‰Œ$œžSzÖ0ßÅjËþ²ã»N8ã1l‚ÚÂôɾ‘dXUœ RѾêªdf¡vCËÒC–[^YÄrnþöÒÎÞkÙ%ŽHh^êYc3è¡iñ*Œ´ÆgÓÍ‹Eyky} Ú4 õ£i'–6)©Û‹x¸þL»¨@Æ;¢¤¸´‡ÔšG‚­!ôýSDcRŠÓ—Æï…š³W §Áb’[ýZÚëšIy4@;!~ š×¿í`<˜Æ'µ¡'Ö!’Éâ°%nÕ‰§£<€ñ þoâ.F=9ÕºÚ×U¹ž+1p÷Z¼ìò\°¬Q³}ª@T‰h§ü¬œK,¹1ã p¦7úšØ#Ú¸œ­#™^©$Ï ^5_Ør}?‡öpÛ‚%Ç)­ÔšäIcgoo¦@÷¶Í 2°UÁŠrý—,ØKF?4‚SÌ¢vOJÑRáDmq,kmo @¨DPKs òl…Û’pÆ"ÀÝu%ô6®Úv¢Ÿ½T–îåJÆ’0#à@3üCýŽ˜D õ 8ývò»–U(†YmÍZFä:ÐîßäcnLå¦Éga¨Dú«$ÈÞ¢Ù<£›D<*~ÙÆÝ~~3vµ¯ióÄfµ,³CWÜQHká#)º'Ê76M{öE†a#ÅÅæñÕ«é Tšoö¾ÖH7jå(Ú‘7Z²éq”•Zæ5ç1Uâ>#R øï…Á<—Í}ÜÜ=•òBš„åÌR‘é„ Ý@ø¹ÿ­•—kR:±Å´Öí.ÞHõ8%qð²! Úœ‰ðÊ͹3ÔÀ•&µó¤¶>¤PýH9åqŽÁÎæ¤xä¢ãœà1˜ óF›w5ß'Iý9"W‰~Ǩ8’Ël›‹¨ÊdäË©³,ð¼³9 Œ ·@kü¸„$@¦Aåï)hå¼ÖgŠ&$®àU¸ÚoÙUÉ0Ý_YóD¦ÈXèÿèv¥8Í0E8m¸×z8E2ù±¨-b¶B¨µsÔž¹tHf#M’—zÔtÁÄÇt‹Î WFJŸ­OBÄþÊ ¨0ÐACyoÉ:οïh"RDÒl¬ã¢âr4QI}îžÐ: …˜P¬ D‘ݨ’-%|ÔwÈ¡gf×,h]ŸàŽØì ÃKÄaÓí´½Fk(¥úTàP"¬£ý\!Ý(OÄ\’i>¥-ŵ»%Ñ {²3’¿uND"•ë½rRM3ï+ÝývÊ KKpo祣=kûÆcŇ³)¹!õ[9tû›ËD‘KDÊ“7nJwû›¹0Ý[MÕì`·•¯~1 ™cù¤âTSü–åË w Ø1æÒrûLÛ•=É­Hűxˆ” zxøàTÏË^]¿×¯d³²U&4õeg4UE`Ïù+_‹ ¿ÿÓå¨m]ò\MÊ”¯ù×´Œùí…8ÇUJp¿ßˆ) ’AE?1†ƒ5ŸQ²'x~äcA³ô]ûäõk¶Æ›Ÿ¤_pí\»ês³u8¨õýxC– C"öJtø‚œ-¦öf¥!«Ü ìPÕƒ…m‘Úh3 27¹Mðp È"—@“ùý$~| lj¶Ð ?¸_˜"¿Ž<ÈI >€ü¿¹jR•£ØJçÓ$V °ÌYˆUWs¶WÀQÄÚit› ’Ç'%þñH±SN„vþ\@)SMvòÞîÞÚöËPŽêÙct‘šPT ‹o÷oícI¢†2ê㟄sIf QLjoµFydvpÈ FÛ¦öÚ«KÉnY.‹²–åBi³vÉØæW"Ïü½¬Úy{E”‘lÑDÌ |ÂàgÃ9‘ïçV¿–ÕK)áë±øS±4ý®¸ÿ—œy„Íüå4—b[ghý4ôÔ"‚zS¨éµ˜Ži—šž¹wûÝNÉ8%áAûÞ¯ì7ìaáPOza©‹+¹í%Õ$Y--¿} }Zq£µÇƒ7ÃûXÓnNöÝ#óémJÜÛéWúV8cy*мSör¹9˜¢1ž.©Z~\jV‘Eè_[ݤ\Å×'ô¾Ñ.ª¥¶Ùð—#ùBÎë'²×¨¾­×Ô’HB%¼ YË‚hfôþ&%¾#67©k-þ(´²A%½Í¼2¥÷­€Ùzz•ý–åö[!Â]…Æ1æÉ?GjzlfãS¶·H™B”øë ¶èË^øð—[ñ‘æ™iVÖúmŒð<ªó߸‘žGG™`ê£âóe€8:ÁÇôî¡þ*¾·¸š ei-” š|˜ñÏxp§&¡wªØÝGLóÃÅ .@«¤ë’ÜÙV1¾ÌÏI…¬î..uÒ¤pÚ½¸+Kx÷SñoSZqÂé²å$ìÇüÅ.¤ÒÌš†¦É¥ÅO«[Û¨_T\z¬Û+òør$9Xg›ú¾Ìé`ÒR!Ê9@’3%Ž'#nNWFݼŒH£É0²}CSÔd‚}1í¡XÒhø(ˆú¤ühBµü¬4XЈئOe£Xv´ô5ˆFdº7ú:HHøMVµåÇö¸dâ#–s6¥§ëš_;‡´¹ës ­”€¡'š)Ø?kÎDôr"锹³¶’håy¦R²˜:E4*¤|@òðºiPºõ‘…¢¶ä–i+u0dZìÈe ðÔRÈL÷9Zlt^{'¡¤84÷iß[ú|ÑV5'yyÉÜøå{»ˆÎ39£,õÝ Ýzs-­Á¿¸…?Ѿpd >õäQdã’šòá”cÉ‘kš2I%ÕâÊÍÊâEŒ @JI$"’]J"ŠeuÉFíÕêd" 2MkOòj@Ô9<†¤z²†¿Ùø,›¨–YÉyVÆFŠÕeE”ƒ,3;r Œ)ÄSáÂäÈg¹TYll`—…ÜWâO†Œ¦Š;¡ ~"pÛQ WÍ÷šu¶–·£N…EË…™ªÀÀÊ(=6 ÅTŸ¶˜M6âó@jg´Ò¼£km¥Ù)kšË5ÅÌJÂJŸ‹‹u¢Ÿ³ÙÊœ4Þ}ÕÌ_W(†ÙOÁ'>€r²\i);\Óⱌûsë‘cºO1ÙÉ(—êMÃoR9hJÿ-;b² -¢Ë+<–× Ç»ÌîøF ØÒœ³hŽGîåM¼áÊ! 4<$‘Ø®Z -–C§i*ü…Ó§á\¦ËP¼ò·—o¤Ü]–”äC.ÕðÃV“(´ûxí㳋SE³ˆR;^E"ÿdU¾œ•˹iCRòN‡}M ÜQ\°"UF~…è0ÙA Lÿ–q\*ªÞÆiÜ2ÿ\ˆ»G #Nòî—#Éis”¡Xä$ h|²Û_ $w–Z‘vwºæìÅ™éÜõ?N ƒ ä…"^Ç%!™µSSEGämD«šXR¤°üi€¢¥'åî·J£Àçßöd¥ ´žù/Aó…«Áy$1É .$1Y|-Óµr6× Uÿ0t˜ô›ˆ-½Gô"–yh'˜Ÿ`9c.J¼òæ¹,hÐÚHèz0¡ü+‚2ž¾o.kÊl',P„þ¬6ž´èÚ´hßè3¨nÞ›møckE£I®ésOõ%šs ÛÜž +Ÿln;ãh§ÿÔåÿkµ-Í‚I Øœ!]ă¹ß¦j­ür, ð*«t¦Ø³hâĶ1bì[ »Ôà,J¬$zŠ=ð1fš ’bëŠK+Š(Ž bÕÕT$^èÉ2w¥튭h##¿áŠ o­QW’· |¦ +ó"ÛŽKye3•-5¼”„r RÏêuø²šCCÊîXÔ²‡ãËpÞ+¶FM±Lô<ÊÓ3ÝúH®±¤e—•ÍS"í:å«{æšk è”Åh¤ýb*ðpXñß-èש4l&šÅª}I%´‘ãý–N\”ûÓ"ÏOžitšíåœ iN¥÷p‹Ã™ØUžŸÇ:@Ètk}_ÒŽMSŒV’1…š#G«}óÅÕgÆméÞeÑ ±yXáh ¹¬ŒÔØ—ë×'ÄÑ D¥gÒ5Ø#’ò)íîVfx„„3PpÕÀM¹ú|$Gèú¶™¥XYÙÊÖá n.'¢ò”r­FãùvÀ™@Ȥ¶¾vÒ!Õî”\E!˜Ì‡trÚTþS·KEéZëͺÕ³Gr-ÑŠÿz±ú/ʽGŠÍq´cÂG$ïL»ŽêÚQHò¬T¹’ýØjrþ\[ç#TS=*ü_é,’Ë-Ô~ÊÁ*.ê²Üe²Y´¹ÔlCyvÚÞ9 å‘KÄl«ÍŠ•ö_ìqLrw¤Mæ,$“ÙO£„·Š@³Ü¬ŒÉCÈïöƒoÊÇ‚C‘e ë…•ô褺µG95s^%Z¤tâÂmIæ™jú‚;D.mÝdp5ïÓ¡S…ÄâA¶‰§Ý@ðê·Sò2¬ðÛ1(¢ ¥øâß WÈÑn-•OÖRðDP-¼œ‰DMÉX«|¾,\èkD½=èKK›­nÙ”©µ*åž1/¦Å$3Sˆ5ÅÇÏ*äÊ/Γ-¼s\[ÚÎÕ }U_²+Ó•j7ÅÂrVÌRKo.Úë+ª‹HDŽRÝaŒGQÔëП‰¾Œ®Nàx§5º†ª­ËA/Å7­äE>ªt©ÕädKf1Æw`7z_žtû;+øày£ieÕ/DHj*rBC«'ù9X$»lZ¼ôò)”g󆧣–˜H¶C“²Ý€ Z1¨É¬Ù+è“Á$ÖzÕÄÖ3D÷s±Thü («ÊòM&÷M`Ótk›g’úòUëê5´u –I £|cùF,¥.ä žµ ^q·±Ò(Ø$q¡¡¢l¼¹}¿õ˜à«`#Ź[?—&¸ŽêîîæÓ¢c–I¸Ë<¥å)Ž¿ qàf5&ƒÖ|³i§ÝÎÖRJm4åŽæè­#”òÝ9SŽCw'@y¡5ÉõíjÞX4ý:í¤¸“Œò,nR àPh8…ƉLgŽ2QÒ|­«é–®žh‡ëvêB-¤€¢ «Yéû(~Xð¬²É=Õ5-5áãå=¥¿žHXQúruZTra¨ÊÙ]–¿¢A¢¯Õ=!•Ø@¥Xþ)d>í'ðÂ\ñHäÌFîÍ®¡²”LðÝ_É,îÁ‰ãýÛ$Û-0`ww^bÔ5ë-'JšYDÒ‚«Ä«RxÍMŸ ˆB6õãåkU±[}cPŒßÈÜÇn¤":ôù-\~ÕŽQ—4IØ$:¼6¶vRØ%ؾ·V_¬*”;’;üL¿²ø¶iàIÝ‚êúŒiPÙ ™ÜÙ¨A7Ä8RÈô]«·ŒœýL€÷¤ ×zR¹['½1b&£°÷Å+ µ >ƒŠµB¯^øÝ+±âWvu«T$o„w ä¸•hùý³Bj6ùb­|^'ï8«~¬«°r~“ýpw­/v#éÀ­ú³³Ó$®úÄàS™¯Ë‚ºÔµ(Oî®Ù€ïŠÒ+OÖ£¼ŽeÖÔÝ=Ù¹¦ò&Êüž8x˜¢OêQ„e—…?Žˆ¢àóUÚàŒ“îÃøâ;m˜}«d#Ù˜bŠEÁ焉\5ˆnkÄücø©Åx_ÿÕæ»PlµÄ„-º…Ô»wja¶f­f«æ+®&…’)‡G£~ÎßÌ1kÆŠ4Ÿ2\SS¹¸•'V…&VC׉®WÄ[a‚!v™æ;éu xoi i=+• @ ¶à°¨ï„H¹qh£É—ö&œ×6×q£ÒÊâ“G RFÄѸÙÉ[‡ .I“¤k6×£P¹€fŠSn¡v Qw¦Õ£}’0æÏ(¤´‘C}tB äym¸¥2Lð›Uò…ÌY–ëUš#pæô«YHÜÿ('&%n6²UÉéMyk¡Áe¦i²ÈÆß“É"°4¹rw誤×$M:ÜdϘSÓ¯µ»í6–¢Ú;w’y9,è#ò>£ºµ8ŸnX8š³`IuíîD =¿¨$©õ£–7 µkð3d˜ÄÊ-iúî«£Ú‹FFewõ ±ÄÔ|#ä€b×9 seV:…íÕ¼›ÍÆK6äISê­*@ߨÆÚ,ìÆnüù&©ª³M;/0#v᪚€iÖ˜ †-%hý;]ã'¥{sõ ¥}`ÑJƒº•­|´€Fãõ"ôÏ5ùCHÓ¤Òí¯þâGc,¿W`¬eaðõ?i©‡‰„t9$7[{ù‡å§y¬ît‚`„VYƒ²‘]¹PlHr6¨j6³ÛF²éÑ'«238ôè?vµä9;W [DxJ:ãÌ6‘E,«i2¢”ˆ…¨o Ôd¤Æ{ØÖ‡ù¬‰î-àºF$ôÀ‘—€ØqZQ¾@J›²i!!üÓäÊíµíræÚYíGÛV²¢€dr@@¢µå’ãpe¥W&®þckR²é—6¶ö+ªbI9?ÅÇj9 ù— b,‰°ÕuÔ&²Få¿ÝPÛ¡Šb«¹æÊœr y s]ó4‘jÀ=¬SG©@E{{tÅ»†Ÿ\³‚HÞK8y‡£;š5J|±â¥á*·þqm>¬–‹õ8ÜN±–øU5~ÖiÔ¡õ%‚܆*¼€¨¶lmÈŽ½]¼Õnâ–ûÓŒúe‰4­wãòÄî׫úG½)-š-w¦F\‹ž•ä:  C Pý®ã[ý^ªÓ× Ö4®É+†4®ÃJ´õ­1V±WdJ´@'~ž¢M2j·r8ª”öèéC¹Å6è`ÇE<!T¨5§Ž3ÉT¸ÛtÉ ÕpåÒ˜HHh±_ÿÖæŒ€î[¶I¹onH¯Å‰\ªMH§Ñ‹è½Îø 0´-h0+¸ž=2Lć¿Ž® ϺŒ7'a‹c·n„m¾Ø±.+µOm‡Ï+‘h´ïßl4ßÎ~üUk4¤T±ëй%~¡ˆ#ßWŽþå 9õé\UsßÏĆjžÞ8ª‹†! ¸­Nø@UšÜ0ÿ'™E²*Z|—ÂøAoª—>»ð þl‡ Ÿ§,ÃUôšÊíeE%iUÜaL¬ÅÌ!$¶²½¿X¼‹o½ÔDñAß²m*ÞÚIa¾ˆ}Z;R Q¢×í _\œE8ùçJ—IðÂX¼cu¿aéB{¶iee[RÖe½Ó¤µQÎI—Š/_öi_|.\d‘kæêÛO…mî8J‘©6‘(cÍGï[Ô_·ñSN=Ò-ÌZÙ¸ú²§«%Âàr§•V:|Mþ¨ÀƒŠ·zEßæ¤2iÐ[%¬šmãÛ¬WÛ¡ôÀ¯¦v§ï?k'Ѧ8I‘)}Ý•üjÓO#Iè n µjïö~?ðYX·ß åô[ $²ŽäA-²4\wÜÑÇÃ×$vAÁ¨5õ‚Éqx°!_߸;°SAZ|»äA¶“„D¬òë!u´«6”Ì >%yP•;W d°‚K¬j×z´:‡ÂVR]¨ª¥EPxÉ´g€!?»ó”Ç´9„H÷©¶8ºÏÊ™DþbÔs ¦'¨h·2ŹäjŸN–ì×@¶Ò,"HµmßܘŒŠ‘]}XñsA×ïÂLÌÇ$®ç̺ÞÊ–zMÅ”hk½Ár‡ÀÖ4ß-8ÄɲÈ-të›í8êñ7®EazˆÇBHý¦ÃÂâäÕTéA¯mêÛÝ¡J¦Ãl„ƒ°Œ‚M¥Iq ÷ÁÁµ2ÐTа&»#"Œ² £yœj2³[§3!j;2Þ©ì“.¬Ò^¨†Ò6U™ZA*|kƒ…×ê%aRMX£Æ³[º3€@_oö8x\.:¬[»$W¡1µ þQï‘1QÉkêöC¹e'ü†?à Zæ–OûÔª{† ?Xðªªêšc†ê"×ÇV[‹Wû3FÞÁ×\¥T0ûòµv®Â®âqW˜ªÜUØ@WaáV€ÔtÈ«»Óu*Þ!Vdå •Ô\U£±ÉÉ!iõÈ¥ÿ׿`F½2L—„Ðb®(FتåQÈŠ»ŠÏ\UÔn‡®,ƒ˜1Y8 긵¸+«Nà`*ãNøÜHÛaإثX«DU ­R´=ÅUÒg@¿ ÉÀtn¸ ¨Ö·jœxµëQ½2D9²›)t›|o5Uwgÿ6D;XPˆ(m+H6PJ—Ö¬²Ý8–Þ'»S¢âYG6ô™Qâ¶ÄBÈH$ǹ v$2ä ®E×ö“&—õPY Æ#j×¹#­'Ðm¢µ…¿ÒäI( Õ#ß0ã šyn] êw«™~ª¡ÂIÙOÚ¥rkL®»{{ëáWÖYF¦:슃 µüÿkc!ÍGÌ/µÆŸ,$†ÈÙH©ä[£&ô» ZúÜÏpü0¿iX6ù0¼{¹®/*ñiví2«*‘Ä)M¿ Kdf„€ ¶ækŸ¬z©Éd$£xõør 'U5{©.m#€Ä$õçhíˆUBÀS’8 µqk„h´úTšXŽxÝ PcŽj‘>Í'Ú+û8¹Ø_o$W0<‚åÕqyÕ}5vïOZª•dÒ¦¼ÒV!ꜽ9¿hšÔ0úqQ:už™7è•d¼v’U)30©ä§âÅ>2W¨y¯Z°ÓáÓšéÌPµGØt=ybƒŽý]é½Þ”!µ/£+ÌÑ‚ñº…ö¢3Þ’kmúæÖ[˜Ú0^uA<ítþ|SžTmÆ…X×Õ1;PHƒbGì€rAÔxäÇGÑu ¥®@ò‘¯Ù©ÂÑ›9“gL¹—SË|ë™ã‰ŠXîÌXnh> \ÍxÝhºÜ¦Î;¨ ÝБòá?z‚̾¢|»Œ\¬™«tÂ/Ý.£¦ LÅ$PÉ Û\4¡'E*]xÑÙÀû8´U±û­kR±Ö¯4û ¼S;´²n e§0?›"\Ž:‹ Ò,õýH7’†ñýhlÙ‹=~Érœ”}ŒCªÔKˆ¥žcžIOÕmdnG¨A 4'$ј殺Ã_E2]¼iêfˆŽ*W©e'¾ùåaÜ©\3ë­ 3ýùn…z1ùàv¢;*YÅ©K¤\Iõi­] ÀW‹H I#&ÀË÷Š:kÁi¢z¤´~jã,wØœ‘Þhƒ•õ‹\[©2ª,vÖ”àêÇí»±û^99LTí|ÇoåEþ³¦Úk— Æ%¸¾2ñHø—ŠÉFL0ɃÄ÷§¶^u´ÕõvdÒ¬ …V†H"xãyEO‹~8¸91Dµæ/6OféÇ ÈÔ⪀‘ôÇœ ‹_9,£ŒÓЍ%†ÉÛØ ]¡ÇÂÇ5{µÔ½ZHÄ(¥I ÐbÌNk¬(Óílâgµž%øà’0É#¹äÚ ´éE¨É#ÑD¨C˜ÍFÿ¨ädâê1е CÃ|¶‘7㈹4£µvû_Ã%Jωʆ›Ž•É(ä à†éSØxá TÊòþ_õi…ƒ¾¯ ‰¾uÅTŽŸhÇâ‰ð¦*æÒì«öÿT²ÿ‹c_Q„G$‹ì‡ñ8Õªák0û7 GR¿Ãá«¿ÜŠíõé)âB¶DÅoÖÖSìÞùƿà ¡w×u°µõ!õ‘‡ê8|rêºÈ±@Ãýfø,‚õÖuûVhGŠÉýF> '.»p¢¯dÿì?¦WÂÖßøöÓ¡=¸ƒøŒ"*¨<ç֌&CâPŸÕ’áUÿâ Š4ä|Õ«‘1fYÒ\|7qŸ¦Ÿ¯ W¥õ“ý›ˆÏû! ª a?fEo“ú±áUõðßÿÐæüOmýòLF¡#¶*ÞæüN*ßLUÜMHðÅ]ÄøÓo¢îjN,ƒAÅ>X²m†Û1krЭ_ါtaÓ»¸#oq‹0´lMzƒJb­Ðñðß "Úâ|+m̦”Åm­ù:v²\@h‹Âý¬m©¤‰õ˜‡W|²©@n˜Xé·vîÚªLJÛ‚ñÛÒªHñì1㔆ܓè’îö(/nfXã"9¢† úˆÛºxÕq,Î2Jæ´úƪœ¢áTÖ€ûà¦8=2Ý=ÝÒÙ§§l# VÔ7æÌ{’q§2"ŠY¥.æØI<‘Ár=e¿<ʸ ýÝ;`¦y-m¬úMÝíº@=ImÐCu| ¨r¯%qEär÷v6O$ ¦ÌÍwn¤ÆìÕ<_í)ì¿g$C‚uDKÔ¬š\e'Ä\Üeœî‚œWµìà§2´—œ’ÇJ–Êê%YáRo6ÓZ$¢´o5i¦Æ%¸U¹fT“ÀõëL[ HYþ)¶žî; 8~¹'ª%¢?®»M:o‘¤T‚¦­i,T»¾•-Ìs5Â[B>õvv=XâC8’Ëľ¾´{•¸_MØzQµK4l~&ðØ`e œ<ÓÒµX-!OOã+z/˜¦s æ{[{@ncT+ ?u¨aLQIV‹®Éq=éXåŽÆõR%ûAŸ`ÔÞª¤rÅ2€—7¶÷·‘Çx«(–E ±F;Ð(-ò¤N¿mkor-bua-Œ²”Jý¦­G㋎”6ŽÚÛO&fèc„³rª±­wÃM’"·GÁ¨yÊÛT¶{¸9Û¡eu[¶Äo‡““‘Ù1Ô|íµ­Ý훩‹O@óúÕ«ÙB×qXÒóQÑüÃ%¼)o¨ËéßÉ[™ÜQºô¦ó¹k«=×™4ø£”—Ôw™H"¥ñÂÓ›áN|ǪÞi6ñdŠQÈpgPü èÀvÆvœúé…XÝÌúµ¶¬Ä³A'¨ýÃSr{äHvzŽIƯç«ËØf[&ø£dG–Z ‘}ñ×C%åûÕÔ¯ä•mãA?6øz…@Û·*ág<.ó¥¼úÍ¿¦î€7Ã*«ûDí‘-ºld ËNºâeuY}BäŽ(iáÚñÛß0XévRéš|FÒ²³óøÅ?ÉïL•µøÊí“OúÙâyƒ–ý¾þØóAJض¿q¨Ë©¢}~)‘¥<^#Á‘Iè8ø`¦`Ž©ÅÇ–4ñkõ™yËì®QeMÿ˜íá°kI#c!x§RB)‘vÚYŠn‰ RIíKr PH _rÀŒ\©€YÚiïs£À³È¡ø ¡ÅÄ”h¥qIkgõuO¬Î˜W¥Ƨè»D¹Ó!·’ ¦o_÷²ÆxVû WùqlÈXR÷X-[êþš,Ÿ kОÙ\[Œl*©m:3ʯ¨\U&•è)ñ„ßr×[“Mgd]¸†W]:Þä´¥ZG S$‚ƒ‚þÈäÇ—ð Øæ¯åJ&–.BPï$&•$È»¸ÿ¾ûâÙ òŸ–½Œ—Z’@´Y"u‘9Çì²·‰Å‰‰â =µãi:ô—Š£ŒÉÃj¿JbÙ(¢üÑ{©½¬_YGôÜUŸ³]©AִȔ€N4ˆò$õ¿w…@#ÄìV†Ø)¢ïÍ>cÓ.ŸO–i ºý’»­<1l1MÃËÚ†”ZV­Ñ^LMUË~ÏN´®-`”F‘¦‹)x­‚zlêJÜ)SAʱc’^°‚òûÚßÁè#0ÆÅnï§z:³¨Ž»×ÌäÚ®¤5™í§Ž†H˜Àf rjvRwã„1Å1ÉCKÑum8}jÚíDŽÊê®9%¡d—"a|ÚÅߨ«KËhÜQ§Ãn§ùq¦¼yDv*z©Úƒ-Íéô.¢fÛv?eƒW¦<,²›ä³Î5ŽÓœ ’83ºòp§mˆ8µaª‡–|²ë©±‚fQk²J6Y$¦ýp†N  hÕõ’Òi7\8;©¸¤E”ê-‘äŠ{ÔÖ ’¤ýÒJÒ’4¹£5DH¦õcÓ#‰­å >î¤þ8Pœ µ©´Ù%hÖ÷Q9$·Ó_‡"XGêBhww k š1;3(íßÎk5{áõاBiZ™$F% >ªuDhm%´÷ˆG=»&+Ͼø[D--›Hk¹¬þªZD ÑÔà6m5ÍSL·:ô°Áu2EfªbBiBÞÄR˜´IR}"{]QçšbÁÓh‰pu\’ZMYÀ$'£·C“‹¯+9•<@› ±Œbd@Ê∤+ʵ4é\ˆ$»|ú=> øy%9Oü¤±ððcÿªœ?æ-‘89^¦•6áë´rÓäà'‹ø£/çÂ_Ä´£JTapÕ"ø¾4 }"˜ §aÙÚXgÈc#!锽?ÐN1*Ƭ¤ÐøõÄÍv†ñãËx3éŸ×÷­F¬ïİ¡éN¸“M]¥†|¾‰—ô#ÇþõkÂBåRÛquÏ¥„pC,I¼†Qþ¥.hUT I߈íÛ~M,‰ÌeÇ’<~:ôcþœ¥þç…¿H—j£Š×僉·ù á—îsFY#’½\8ÿ¼óâ±bBôf ’ŸŽãh4øsdà‘Ÿ®QŽ>þ/çÿ±ZÊ¢–§qï\”Z5pÅV3/éqÿ;ˆ¬5‘8\GCÃol[U©×%¸ã.Ë4¯|Ó• Òøù£Œž?Çý"ºdDaµ%OÈb “Úz|8ä8ã:‡9ÿK'Åýn)záüï§Ò¶H FŸ‰ðÛ›(Õvwƒ‚3‘õÎ_GúŸ§‹Õý6ÖÖ:Fònè<+„Èïäåáì¬UŽ9 †]H⇠pcÿSãþõ álˆª%$4ŒTS·jãÅܘvN‰@ü½4ä…:³Sìä6ìHîæ©&«s>¢šu’£Ë2—ÉP¡w$Ó&×!CttÚuè°È!$³Aªäž.<5Ømœ“G«+Ãn“Ê )§$#½ymðâì8¢G$þF‚Ò¯ÊbYˆÁËL²õFãör q‰¨{âÒ ¹çŠcYZFåN,Ÿ#’e²ž=”qË©îRVµ5û%Ißl’ð“Ír˨ÛßEÖ¢’Ké·¤ŒBz7vȱ€d«SÔî-ä˜\% `P·Bê<1¶ðÉôŸ.XÉc#L·mGWn€ÇÕ¸s”¸¹¥ò_Û^ÝÏŽ$45ýàÛ¶ä²éu‹{g5ãršÔtçà0Ób% ©i‡QHgyGÕçUôÈ5n›ä¡0Øt+¥¾Xínœ¢òò¯üǶÌ䉿œ]Ŭɠ1¤’§&œ€$"ø²¿k%N) ›H´d:uа¼eºvDõ(¼i‘-òÁJ|?ðYm°€Ð$’ ©Ì,fY8¼²)p¢MÖƒ¡¦4Ì‘LšþîÙ,ÚK˜Òt‰K#Uªô4ý–S JQë1^h@Áh¨ò’ åÐÔu®4ÀFÊCuæ=FÞ£q½VܼmÙ†4Êq v™©qs!’ó“UpÔà=ü1¦l‡NÒu+mMu#24Q)Y‚Š1¦Slk¶¾›}°xdNªÀQ«þNpóc7¨Öº—Öe@VNa‚§R¤æË^±’ÒÞu$sƒêñ¯ÄÅzPá `Ñß’s¡C­rÌf›†Ž9©·.§l“N^{!¼ÙkE.¡—•(d BÜGu¯|Yã;0Ý;ÌY<ΰ$©>òG؃ÜÓlŸFºƒS¬ AjÍÂöÒy8¨¯Rƒùi†’MòSÖu[;½dZÙ([K(=8E-GA€ºíO&3|ßîrP?ßC,ˆp$Ú–Uªv©¶H† ·PÀ©Ó* Äî{|i\Ô?lÉZ¼ÕOq×j†£Ç¡>8¦›.Z•4*7•¥­#7½:Û#Hs—ãÓ¯L’´M•Þ½qHZ¼ˆø—e4_– en Sìáb\Y¶¨½i‹?\<è¾.é;b >5¦(¶‰[ŽÇ%¦q_„cLV0r+Z|ºàW~ð( w8«L•"£q½pÒ­äÕ°=q¦AÅGVØ÷Æ™?ÿÔçÝ€É77ÄÓ%ÜN,]Ä⮡ìqW©¨ÛÇl¨«EjG€Å\V»Ö”Å\Tƒüpj†‡ß¶A®H+cìÓ­LŠ·Æ½ñVŠÓuÅTƒ 'õà,¢ÝÚ!è•?, ךx¾½ŽÖ¼`7_‡¾D·b‘OÑt-&hŒñÅt¦)æ}ÜpSµ~Òàv¸âi_O¶2zRB¥C–ôPÒ¦0>ëö¶ÅDêÚ4ž7šýù-Ìb9-å?gÓzƒZþ¬\xc¤²x¡mZâm6¹vdgn[Ä¥t;©-¹³Hõ¤:¤¼D êÅ ¹¹éSlœAä©}æhìïm–½Vfàˆ£ísa·¹'$t)G˜n5ËmNâKmCÔú¼ºº˜[DAFiPĺr߆¥ìð;9 ê#/M½ò%„…ÊÿXºFB-ª±7¤ò8Ô,e ½iË×ÐÅ&’âà8‘\²[Z«$~¾±cź_¦iVºcÜܬŠ%,²D[ˆRM¨®-³’,éú-µ¨—‚Ü=*xûüñe tÏ6[Z½ÄqƒÍà‘cr´âëöNø¦XÄ•SÌn§%³^ÂZÐZð©Éšb)RgÇ` ´Òn¬êÁ’Îâ$ŽHþÈ@åQdÿ+mÎI¦2‘•MêÒ걈e0Eë9TiÔU@q¹Û"[ˆì†á¨Ü·‚ÍÊ¡á¶!8 `ßg‚iVïQ–ÒBx H‰""ƒN@¿<’Ò]3ÌW‰MçÇSh„Zì^•°c³)P6f§D¹&:½üvÖÂì[‘Ed¡£ƒ’jáH®õÖ¿à…Œ¸(Ò»öùbʶcB¼øýýHº#Q4ÅŽ45°“O¾Cy‘Ã#€%j×µ;dœa#G™õ]JYQËÃ<`©> öûò2hÔ]ZSz+­Ì©ôÀ®]Á’õ ê€A”'¶Hó`Ý+°ê| ª æÛÀŒUk+³Ú#\«ÐóªÊ5iZ©Å±¢Ä€ ×%Á¨J¨â:œX¶¤*{ÐWjâ­0-F¯*}|ñUÆ%®î9S ­24ì?'Š¿½‡ÞšŸñ;%x~çqI¦@Cr4­(z}8CV|8àA–_ÑŒãÿM(Þ´®kƒÈÅZR@;ïÒ‡'j õv +|zx›äUo@ R;á ·‹/Pk“Wq¦ûö¥qdñ O¿LY?ÿÕ€qßn™&Ël íŠ oŽÛuÅ k·LUp 0úF*à‡lU¢’•w;£û dƒL£º^·+>¹6´‚4k±ÅŒ,ÊUÔ× 3+šk3¬HȬ¼ExDõBìp"#jb±kÚ¤pÍ ‹$2)I!e«‚½ÿÊÆ›%Iŵ÷×m®%¾¶hg`®èj*ª@øà¶0•Åu¦iš¼:‹YÖx¤ä­ö‹‡¨?ó/Ž&y¢&¾†ïQµ¶šiÇÕâJ¬±£nG? ±„DTµ«Òõ{yä+40HyXÄZI!ÒMöㆂ­7µ³:½¸½µ¶ôà’«lþ¯§È÷¾@cQI.¢Ô´[¨î5+np#îÜ‹rùâ‘ú¥ý›XLöðN<‚x¾ÛbÈ%ÐX>³ 45T ¦Ž¬ jGò♟INµ/ÒÖ±ˆæˆ›‰“x®ûÓ¾-Qˆ*ÞmÓîdh!™‚ý€…·#Û¶Q8P÷6bÚ fa#Þ]si†ê@ÛÓ¶ÆT©§XO ÐŽþD‡ëQ£/üX?V“¦r-o)…° ûÁAQ¿\ 11dñÎÒýJX‡dj¨è)ü2$¢0¤,šDz”6’\ÉpZ $•Üm³q²VÕ–Š’ôH’äÛCv—V襢hBƒû;à.¬×¥ »-úzpì/ã–@ºé*‡;òb2ÞlA?Ô=I8ÒCc~ßcZ dSMîÕ¹-’à  &˜m]ÊöùâÇÃ5u³EÏ.'aàqcmIØÐ ë׿·ˆ©j’zb´ÞLj#~µ8 ¹¶$jzœ(hò+á_¾‡)DŽb–•“ðõÛÛ,W²Ô…;±öÀ«Y¶¯qЬdäy” $ÅT|IM-f$öÛÛ ¸8j€BŸ»;¶ø8x¸eÃüêô¸¥(ÀׯË&Ô++FèMr$¨+wQSö¼1´ÛÿÖÐ(¦I“©Š»¦*ìU¥? U¢¤R¢‚¸«€SÔÒ1Vˆ kÛku+€«„d`Wq#örA\qW0Å\@©°[Ó¹¸ü;×mIŠm¶*¶f¢H»î>v#|U© ÚGk!ôÒP95jyôÊÏ6üÝ3ŽØXÚ*Ú¯ÖCÖ?P=ÛŽ´lÔ CX½ûËyÈQ£¡â¢ Þ¾8²â_=—¨…å“Õ¡(+FbÎ9).ŠÇÌmï8úö¼•š2¤V˜· žÝivÐÈÚ‰%dZ‹áG/û%ø² c“‰.·Öîžîv†0ˆÏÈ•"NC‰Z/SþN[%Š…®ÔµlyLþ“2ÒY7$¸EUû<7Øàâa„òÝߘd¾{–JD@É# ‰èE<2I—$ªúÛWmX‰X™%uN¤Ô‚{Ó°ë‹8ÇÓlªÞÖh6(/Nd”¨i*:/òâ±’ OÕ,®îfWÓ¸÷–îwǪšä$we"Ú”ôä~+F,$àOÚ»Šäã&‰$º¥¥¤ÓÛ¨‘ ŽIˆ…»w¯lSŽI´ÃSŠÚeQêÅp§0¦ê¬+¶€w@èW#NÓ¦¸h¹Ý´ä3ÆCÓ€#ƒñqeny&J:]ä h¢C,RrŽV®ÇéÛÑ‹.ˆ± é"ðjÜ9™k5Õ¼ª8š?§U+²·/Ù8–jṵ́ȱÊïK߈°; ¶È&%,¼½µÒ.`’K76À”–vŠGîÌv²”‘:•µž ÑObUæ*Ûn<{QÄ…Ôµ+øm’Ý¡Q*/™ÖÀíÄ?ídx›1…’ÝÞiºN™nÐ7º’h=j?”J8,•mU&Õü±1‰’)/äyåY䨛I|(2n4"L©.Ólµ t±Ê(ˆËëP(Õ^ø¹r'~T”\Ù¥ÜЬ¥Ò¡{틉9¦íôifR2«<ÿ hÛS¾,±É!òþ›sk-õ“LK¨ \Æ£’ñ5e¯L‰g3ºÝ9dMNf^rÚ²zPM*Ðí€\ ¢©w}§åµ»‘m¥ ¦YÖY~ϤݸþÖ,TàÖ’+y.%fSFGˆÇÛþo†+Ãh‹d‡]³¶»¶q–ÒL×=¤@ŠDh«ü­üÙ&ð±_4ú°}_ëÑžáQÌ,yHAþnË‹hÉa¥æËuÄI9ëN¡ˆÅ¦q­Ù-Ýæ›`ÆÖky®w f÷Ú½†)„­(¿±–Õþ š\ο¿Ž…¡¥:=2A¶HÍ;N·–Í9?úJŽeUÃ_ ®LUtÛQak©¤v­z&1‡µ-RÉ×l“VO­YÛÅo­]˜ìšÅ$¡9ÜWÇëõ|ÒË‚¿sâ€~œœ\ +Uªµ#jõùäí‚ä,%‡ÇH^A-U؈ÂÍz(ôøŸLØÛÓèñŒú1ƒü¤å’X¯‡ÃôŸÉ·AÁTl+¶#›lôø±bÜx“Çÿ ”xx²¦â—õ4" RÝ öÃÄà˰ò ‡?{ÅÃ/Wù/«øx¿«üå¢Ô‚ùãăØóŒ%3(pã—¾¯/èÿºmã«•B¿—¾"Mùû$³Œ…Ãèõä— ã\}Óÿ5Þ‰&ªAnç|xšãØY$MJ2ŒeáñF9'ûÏó!ôÇø§ô¬“)^øokp! ™ÔxiqpËýô¿Òú—OtP44¡Û¶F<Ý×kbŽ\$p|Dá“÷ä'/RX`>Ør¯·Ý‡‰Á‹./p ßÇýÔÐߤËZ°´ä{’+‘,f\s„#G«×9Ädþoó%êp€ò?ëÆžÿv/æ7Ô×§Ê%<‡"i½}±½ÙGA iñ‘(ø™rJ>®/èG‡éáô}Rþ·§‰µ‰EÊ£SÇüë‰;6i{8b×ÃR$>¯°ðÇÕý%‹,¦æ§méý˜hSD5Ùÿ9ÄIâñ8x?£ÅÃáðÿ7øWˤR Sp+áÓ›!Ùv–›,|3?0=>¯æÜý?Îõÿ3ú\~”#Píá÷dËÊ5ÜW|Š¿ÿׂˆ÷É2]@1VŽãlUu +Øb­Pâ®ã\UÔ¦*êUh@ qVØ6ÀUÊ;àU¬(wÅWb«@oæÛ°«ˆ>ÿN*¸t¯qÓXC§¯†*Õrzm×¾*ÔèZVØTýã[V/áãôd[qóNt¥}hÌ+$yÅ<¢µ“ýö„n¼ûÀ]¶#BÑòK<«¤CÖcÂij;Ÿñ¨¦E¼$¾æyg·’4ŽRö„ÆüŽäâž Y%íÄV‘Æ*± !Ù«Üß©E3°ÓS½U¼<¡‰jŠ 91n†JEßËk¦Þ[XÙ"ú—GO²@e5ø°£ê)6¥nï{²Âž„ vÛ’UM üÛlM#­4ûÕrd‘bI4Œš*Ó쪓ûY˜Ëu¶º%®«õ»–•^;U¢»Õ lñÝ÷ðÀ³–êM3Ú-¼²­¬¢‘1rTòá¢õ? ÁÂÉCNòÖŸ¥gsú@Ü›rÞ´a €OBO±ÉD))„v?¤õ ›y‰£HIFØKÊ¥©û_Ã’BŽ•$ú´O;,öö´—ÓsÄUÛ…iþ¨®A"íRyEìV‘‚-ļYÇòò4 †›"6N5{54{€‘¬h#cÉPŠ‘ï óYm}¡=’¤ ¨E cLD¯‰,†ÎÝ´¹.ˆhå½ÜF+¸?eií‹8äAÚ[jZZÞÚÈJ__„7ã*v ¯lYJV™Þèú¬óI%묶·VâÚæeT:îdøk\XŽh ÂêK§i¶ã”pò˜©[ÓÛ’ÓjâÎj:äž§Ð[+Æh9ÅE=†)Ø[§h6ƒJ….ÂLÌŠei;»öÀ\33loZkY¬RÙ³ÛÀ†(KêÆàŸ‡oµ‘r4âÊJžÞMKYÒœ»ø¾2ŇĠïð¨+‹tà8Š_5ÕÍ“ú6²5_¸ß£bËÃÙv¶šì³Ú}f(äš!CJ1]ü1j#…¬Ãàé#[ÝDŠáão…%r*r%˜ÈL a©h—Ó%¶¥-ãÍŸÜÉr¹™Ïûª%^‡ü¬².$AKµËûK7ï¬ Æ 4rP8àý›"Þ6¶–:•âK{q¢0;pµªžŠÅ”²Rë­Ït†ÆOªH§fŽ€ñù XøÈ}O@¶´’ NøµÛ«QšOˆŽ=6É„Ê\A©µ‹9íYí±^&Š»Õwí…¬G¢¢kÚN©ym5ý„i+0InšÚ€2›|LÞaÔÞÂXìáawc:™D Î3=©Ó’öÂ×8QcÒÝA}æg6ò=¥½Â–”ƒ(­(z`H4ŠÕà•l帊þeš(Љ>ÍBî+“`eAyRòîìÏ-Ô†YGÍNûä$ê²Ì“M:×Z»'uj2ìn<•vZH#̓JƒÔ, ªÑü@Ž«ôâ«™œŽ›ü©9Ÿ›‘Æ!µ@Üêú½KÒƒ`O£ “‹µ2ãŒDxG‡ôúÓÿ§þ&•Í6 §JŒxTvÆP@ÇÃ/Oÿ)õ¬õ¤ © ׈Yö΢@‚cë¿áÓ/Wõ`åÜuÉpЦ¿åLþ7Œ+‡Óý_Çù­iN ïB+‘#v¬:쇦p2ãáÉ?_ó–«8«±ÀB4úÙâ‘”xn~™zcü_Íþgù®V ŸPq!–›]<1”b#Y>¾(ñq4fn„½Lx\å|µU àð¾ò_ÌhÎjw¨÷¶<+>ØÍ"L¸%u.ÃǦÖáôUÆwV¦Çz±õcÂãí|ñ$Ø‘”ü_Tc/Þ:.È…-j ãÂËlf‡!¨äú÷’þ%¦iV´5¨ Ç…¯je„DcÃQŸ‰L}?ñ×Häž FÔ¦uÌ™f$Mpú8#§…£,€“@ +Ê‚µÁÂßü©—‹‹ÑâªðGÄþ·õÿ§õ,2;BR€ïS\i¤ëfqF¸L¸ùzøÿŸÄ°’@í¶ ª/ŠŸ|UÿЄӯ¾I“‚W®*´ Uw€øŒUÀÔôÅ]]銴Ë_ж t5Å[*½\­¹Ä•ZhZ´®o-€ß +¸øãJÕEq ¨§ÝŠ´:b­±;(¦*²E †íÐŒUzª8*Õù}ª’ «]ŠšoóÈ–ÌGtôjê–ïufÁáxÊp‘ª@6TTñÀîp†¬µIÿGBå¢ 7©# ŸM´5î+\.Iǵ„F§lÐj1#ö±Øc–Û¨Ý<‘¤¬mɶÁ^œ¶a¹ù8RBUn·ÒÉ #ÆI˜ü,ùae’!~»§7©«;µÖÂ=:©ê¾8 H1>»k©G&¢¢K…aEjr`Ý ¦A¼g–ò9i (uæ Å·ìŸò°×Š·•$·+q-µÁK™••ËÄªî£ø{cI"Êp·¾_šQm,\Îþ ¤¨f‘¿Þ‡çØ.Ü l À©SF€jRÀZkEvBx­H䦣Ÿ\¿™q´F˜ëëÑs[{xd—ÖðáBÔ¥wØ}žøÛ2)0Ò"ÔúêGEŽ'† ±ÌHäŒÆ†¹S6™F—j¡®&Ž$™X$ 9óÛ¥OO Ó.-’=OÌš££Alޱ¨ëÈ}ž™. Ç‚·csÙjdks{ ‘ÆÌhñöÛlLK#ònµq"ÍÆñAÇê¡…Jr®6ÓRk©]E,léOˆ0?dŽõ8ÛŸs¨È‚õ¥76Ž ¡Ë 6ÙȨùZŠþMHr‚&cjb’‚„üDíAÓL§ò\Ç4“ 8ÍÄ…E]Hà¼jÎH¦˜‰ilÚ×™,­µÝ°%ÿu8z1؉ ñ€JÎK­m/`Õ-˪¼› .jLœAßùN f1v*æÚØiP][[Eyð8k‚Æ'R‡Â]ò,xÏ(t6x “C*NàUšTQ×ïo»ÒM2;í¢·/2ŒêV õ¿³fE†Ý[ÞÝ]ÍaZ’À9`*;ðæ€#Lt›9é¥-`xÅ©ŠÉ"º-?É«tùdqòWK5}7[¸¼†îüÇ=¬Ä!¹„ò^$|4ÛliŠ ½Ýµ¾—Z¯‹C² H¾âBh=3VÖ>¹5×Õ+ Ä T!Šš‘¿| àŸÌWfµh È” R§%hŒ6¶×Ê‚k†‘¡vœŠRžã¦6ÊGu*âÎûJº³vkiãn„•5R>xVÊ›ùƒô§ VZá&ººþÉ?ÊÞih­b+=TÛjEZƒJÍc•=)K‚µÜœi§$it}&õà c2ÛÃþ”!,PÉ.ôÜöùa¶zZ4‹m>úq …WâMqÓ#"áê¢Ù !›T¾Ü‰w9v7_%R?g·l‘æÁÉ^Aˆ¦ÔßQ*•©Üä ž“A¡Å“%(qqOÃÉ.9G‚êŸÍh©å¶ã$ £ÔcŒ2H@ñÂ2<3þŠÅéö‡Žãj‰êE‡:¨oáŒM¹½§§†,Ü0úxa/ôñi£¥H¾Ù8¸™ðK¸M_ôOÔÒªCW‘Û x¥9Ä\ð¶#ñدíuÈäéððçŒ2 õJ7üïéA¹4§Z ò »ÑÑß c ¾L2x“ÿ)õãâŸÑü\ÿzˆ‡$é8M×W2’+Ü{bŠh¨êG\RbClS¡ëÜâÅtiRTsaû5¦Ù]×gèá“ ¦#ãeŒ¿¹âàýÏóãÃê›¶ HÐW.}8á9ac‰áÃëþrÕT%V¿ ñ넱Òb,ÅÆrù¿SN£Õe¥@=XÿÑ„2L›Þ£pšì1Vøýp½1WqŽ*ÑÅZß¹ Å[ Z7Ü2*ÖüŽÔÅ]Äb® ¨ß¾H+ªwÄ«Bœ¶®Ù]@jqU”'|U²;÷ªÖcOˆmНUŒ qßX¶òÜEh®^ƒ‘¦D¶ã›ùsE·Ò纸»xÚw Ž3@=MsÙâÅ%ºŒ2˨DŽ8™ÕiÙÚ€®W'7º//ÛÈîÚgÑìLQÃ]‹€ oö¨qƒfPÙ©—G–L¸UÙâjŸ³\“ZK¢È/õ»D–(¿o›Ç~‹‹9¦ú¢Iq,7vTÃ"*‰UP[fgÅÅ6Šó¯–&Òš.£H^r¦ÑâýâÊ_v“ÖZ¡öœ9·¢–Çk¿!`Á¾)¤qP¾*c«µ >¡õ›BÑ‘öŸm©Þ€ KH–é$Äñ…´®âž¨Û‹Ôt² ¥$ÚxR yš7rÞ‘OEÉ⦃­i‹P;¬Ó,-ìã‚ú8åúÓþóšTPiìqo—%mfçWhƒCx¨-Ù#ôø ñ @ $ì1N!Ī· š÷¯/;¤ŒˆêÄŠÓlX½0û}nê×U‰îâ nLG@:ìœ[JvÚ€Ö"´`-cø¯k×òžÓ$¾ïË–¤bºÓc "°‘íù¥W >ù&Œ,DøÑ÷PEip×ÔJ):ƒM€Ûn™ÈòIP{˹¹Æct¢‘Zà.© ã]Bô“J²O¿¯’¬IZƒþQÉlˆ€Ôf'ßHUb8nNƹ®×&lgK`úã3>_ÏôýKã4Q¿Ïdz»Kq‰&?_‹OŽSôÆ_WÓýø¥¥ÅjPãM×ÀãŒc9cŒqø3ÇÁÅŽí¿Wñý_χ𻚰'oÄãäë{S\|–L| }ûßH‡ï#ÅýðÿGúNg¡&¤(6ï’"‚Okb㜣9ÇÄÇ}?å!þSêüqµÊ¼jj@Û"ßHœ³gÂ'—Ä0?Ýæ‡ôø£Å.O¥¦MÊ»Td‡'[¯1†¸NG„ Óñcþ/ _Ój K^Ì ¸ÖÍpÖ↮yA<9¯èÿ[Ô¶Y€I­(>XˆÓ_hö¦,Øç93 B.8Ž/Ýíéú¾¨ú¿­Ä¼Ì ×uøëÇÄxdx]®^ÙÇ’øÇïü_ ø2bôþî{ÿ¸ò®N2G^¥¾*ÔÓli”»K ‰âœçÅ–9£Åî#W }_Åýß§ÐïQ~ ·*ïüÇ„²‡já<Þ7OÕ¼,˜¥èþ·–­Ò ›5$ŠmC„À¶iûkŠF>¼’”#GHðÆ?T¿÷œ(feZöï–‘<Ú©;ñ#"‡ÿÒ†Pd™:ƒuØuëLUÕ5ô=±VêqV±W)е@ha㊷û?õ4'ÛV¸PÔãJã*ÝÁØ}8«g¨ ß,J¸j~ Š´;ÿZ⫆âƒj U¥•9*U­öAö©ÀU˸¯ˆü0*Ù$hâi@åéµxžã Kv#»W:¶±uVqÉ(OTÉB©ø¸‘ö•¿gw²æŸj–ö­e z¢#9:•-Ôø}$ƒvPµ3ˆž=s”U‡ãä¿·\[î$mõ"%:{]}J ž$“U÷Æ™Œt7RÖìãµÓ‚EuÊì­^ £<œ¼Y~¿kˆÝ,éq´¬ñ4kÂSò«Ý{cL÷CAmy{vDR%Õ›KóÓ åáúvN ‚Ål>­<3ÀÑ3,rYc ÷ã^]q¦Dî–G¥è§R˜Í4SÈ¢°Çº0$Q‹©éÓmŒÏUgÒU Ü¥ÃÅVŒÅ—ªø†]×lãQK,õgQÔ¥Ó`>¤I#Ìñ¢¯Fÿe&2ˆ;^•m¬-§õ!øYƒÒ»ö鯙Jiu΃{ºÑK,±é×2ÓÖcÀ2±ýàú2%ˆ;+ 8½4N’KÎOQÚŽ«û vãñû`D"z¡4O+ê×sMzÓ­œL­ ȤÉ&õä7øwɰËäÔΡm,öff– ÈãX‰#ŠðÙ…;6+Œ ldŽÂÙlµ1ë+1Îã–ÄÔb To: Eryq From: s.rahtz@elsevier.co.uk (Sebastian Rahtz) Subject: Re: HELP! Problems installing PSNFSS, and other querys Date: Wed, 15 Feb 1995 09:38:18 try reading the LaTeX Companion for more details ignore the checksum error in lucida.dtx. i'll fix it sebastian Sebastian Rahtz s.rahtz@elsevier.co.uk Production Methods Group +44 1865 843662 Elsevier Science Ltd Kidlington Oxford, UK apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-bad.out0000644000000000000000000001265311702050534027270 0ustar rootrootFrom: Michelle Holm Date: Mon, 21 Aug 95 13:30:57 -600 Sender: holm@sitka.colorado.edu To: imswww@rhine.gsfc.nasa.gov Mime-Version: 1.0 X-Mailer: Mozilla/1.0N (X11; IRIX 5.2 IP20) Content-Type: multipart/mixed; boundary="-------------------------------147881770724098" Subject: http://rhine.gsfc.nasa.gov:8080/ims-bin/v.b/imssearch X-Url: http://rhine.gsfc.nasa.gov:8080/ims-bin/v.b/imssearch Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit > [[ERROR]] Error 600: Internal logic. > > Dying gasp: > Bad mode: SEARCH/ (600). > > Recommended action to correct the situation: > YIKES! IMS/www failed one of its internal consistency checks! Please SAVE > THIS FILE, and contact IMS/www's developers immediately so they can fix the > problem! If the parentheses at the end of this sentence are not blank, you > can contact them here (imswww@rhine.gsfc.nasa.gov). > > ------------------------------------------------------------------------ > > > Location of error > > Dying gasp: > Package "main", file "/usr/app/people/imswww/v.b/lib/perl/imssearch.pl", line > 753. > > Traceback: > > 1. Iw::Die: from "main", "/usr/app/people/imswww/v.b/lib/perl/imssearch.pl > line 753 > 2. main::Main: from "main", > "/usr/app/people/imswww/public_cgi/v.b/imssearch line 85 > > ------------------------------------------------------------------------ > > > Basic state information > > Include path > > /usr/app/people/imswww/v.b/lib/perl > /usr/app/people/imswww/v.b/lib/perl/Eg > /usr/local/lib/perl5/sun4-sunos > /usr/local/lib/perl5 > . > > Environment variables > > CONTENT_LENGTH = "281" > CONTENT_TYPE = "application/x-www-form-urlencoded" > DOCUMENT_ROOT = "/usr/local/etc/httpd/htdocs" > GAEADATA_DIR = "/home/rhine/ims/lib/gaea_data" > GAEATMP_DIR = "/usr/app/people/imswww/v.b/tmp/imswww-usr/809033436-10153" > GATEWAY_INTERFACE = "CGI/1.1" > HTTP_ACCEPT = "*/*, image/gif, image/x-xbitmap, image/jpeg" > HTTP_REFERER = "http://rhine.gsfc.nasa.gov:8080/ims-bin/v.b/imssearch" > HTTP_USER_AGENT = "Mozilla/1.0N (X11; IRIX 5.2 IP20)" > IMS_STAFF = "1" > IW_CGI_DIR = "/usr/app/people/imswww/v.b/cgi-bin" > IW_DOCS_DIR = "/usr/app/people/imswww/v.b/docs" > IW_LIB_DIR = "/usr/app/people/imswww/v.b/lib" > IW_SESSION_DIR = "/usr/app/people/imswww/v.b/tmp/imswww-usr/809033436-10153" > IW_SESSION_ID = "809033436-10153" > IW_TMP_DIR = "/usr/app/people/imswww/v.b/tmp" > PATH = "/bin:/usr/bin:/usr/etc:/usr/ucb:/usr/local/bin:/usr/ucb" > QUERY_STRING = "" > REMOTE_ADDR = "128.138.135.33" > REMOTE_HOST = "sitka.colorado.edu" > REQUEST_METHOD = "POST" > SCRIPT_NAME = "/ims-bin/v.b/imssearch" > SERVER_NAME = "rhine.gsfc.nasa.gov" > SERVER_PORT = "8080" > SERVER_PROTOCOL = "HTTP/1.0" > SERVER_SOFTWARE = "NCSA/1.4.2" > SYSLOG_LEVEL = "7" > USRDATA_DIR = "/usr/app/people/imswww/v.b/tmp/imswww-usr/809033436-10153" > > Tags > > pmap-geo-opt = "map" > pparam-param = "Sea Ice Concentration" > pparam-param = "Snow Cover" > pparam-param = "Total Sea Ice Concentration" > s-east-long = "-40.0" > s-north-lat = "75.3" > s-south-lat = "66.0" > s-start-date = "01-01-1990" > s-start-time = "" > s-stop-date = "31-12-1994" > s-stop-time = "" > s-west-long = "-176.0" > sid = "809033436-10153" > > Permissions > > Real user id = 65534 > Real group ids = 65534 65534 > Effective user id = 65534 > Effective group ids = 65534 65534 > > ------------------------------------------------------------------------ > > > Log file /usr/app/people/imswww/v.b/tmp/imswww-usr/10184.clog > > II 1995/08/21 15:33:50 IwLog 94 > Logging begun > WWW 1995/08/21 15:33:50 Iw 263 > Perl: Use of uninitialized value at /usr/app/people/imswww/v.b/lib/perl/ims ; > search.pl line 82. > | > EEEE 1995/08/21 15:33:51 Iw 95 > Bad mode: SEARCH/ (600). > > ------------------------------------------------------------------------ > > > Session information > > [Session Directory] > > ------------------------------------------------------------------------ > > Generated by EOSDIS IMS/www version 0.3b / imswww@rhine.gsfc.nasa.gov > NASA/GSFC Task Representative: Yonsook Enloe, yonsook@killians.gsfc.nasa.gov > > A joint project of NASA/GSFC, A/WWW Enterprises, and Hughes STX Corporation. > Full contact information is available. ---------------------------------147881770724098 Content-Type: text/plain Content-Transfer-Encoding: 8bit [[ERROR]] Error 600: Internal logic. Dying gasp: Bad mode: SEARCH/ (600). Recommended action to correct the situation: YIKES! IMS/www failed one of its internal consistency checks! Please SAVE THIS FILE, and contact IMS/www's developers immediately so they can fix the problem! If the parentheses at the end of this sentence are not blank, you can contact them here (imswww@rhine.gsfc.nasa.gov). ------------------------------------------------------------------------ Location of error Dying gasp: Package "main", file "/usr/app/people/imswww/v.b/lib/perl/imssearch.pl", line 753. Traceback: 1. Iw::Die: from "main", "/usr/app/people/imswww/v.b/lib/perl/imssearch.pl line 753 2. main::Main: from "main", "/usr/app/people/imswww/public_cgi/v.b/imssearch line 85 ------------------------------------------------------------------------ Basic state information Include path /usr/app/people/imswww/v.b/lib/perl /usr/app/people/imswww/v.b/lib/perl/Eg /usr/local/lib/perl5/sun4-sunos /usr/local/lib/perl5 ---------------------------------147881770724098-- apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-simple.xml0000644000000000000000000000167211702050534030023 0ustar rootroot
From: Nathaniel Borenstein <nsb@bellcore.com> To: Ned Freed <ned@innosoft.com> Subject: Sample message MIME-Version: 1.0 Content-type: multipart/mixed; boundary="simple boundary"
This is the preamble. It is to be ignored, though it is a handy place for mail composers to include an explanatory note to non-MIME conformant readers.
This is implicitly typed plain ASCII text. It does NOT end with a linebreak.
Content-type: text/plain; charset=us-ascii
This is explicitly typed plain ASCII text. It DOES end with a linebreak.
This is the epilogue. It is also to be ignored.
././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/attachment-filename-encoding-UTF8.msgapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/attachment-filename-encoding-0000644000000000000000000000107311702050534032345 0ustar rootrootMIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------050706070100080203090004" This is a multi-part message in MIME format. --------------050706070100080203090004 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Attachment Test --------------050706070100080203090004 Content-Type: text/plain; name="=?UTF-8?B?YXR0YWNobWVudC7DpMO2w7w=?=" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename*=UTF-8''%61%74%74%61%63%68%6D%65%6E%74%2E%C3%A4%C3%B6%C3%BC VGVzdAo= --------------050706070100080203090004-- apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/x-gzip64.xml0000644000000000000000000000126711702050534026772 0ustar rootroot
Content-Type: text/plain; name=".signature" Content-Disposition: inline; filename=".signature" Content-Transfer-Encoding: x-gzip64 Mime-Version: 1.0 X-Mailer: MIME-tools 3.204 (ME 3.204 ) Subject: Testing! Content-Length: 281
H4sIAJ+A5jIAA0VPTWvDMAy9+1e8nbpCsS877bRS1vayXdJDDwURbJEEEqez VdKC6W+fnQ0iwdN7ktAHQEQAzV7irAv9DI8fvHLGD/bCobai7TisFUyuXxJW lDB70aucxfHWtBxRnc4bfG+rrTmMztXBobrWlrHvu6YV7LwErVLZZP4n0IJA K3J9N2aaJj3YqD2LeZYzFC75tlTaCtsg/SGRwmJZklnI1wOxa3wtt8Dgu2V2 EdIyAudnBvaOHd7Qd57ji/oFWju6Pg4BAAA=
././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/2002_06_12_doublebound_decoded.xmlapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/2002_06_12_doublebound_decode0000644000000000000000000000233711702050534031661 0ustar rootroot
From: Lars Hecking <lhecking@nmrc.ie> To: mutt-dev@mutt.org Subject: MIME handling bug demo Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="ReaqsoxgOBHFXBhH" Content-Disposition: inline Content-Transfer-Encoding: 8bit X-Mutt-Fcc: Status: RO Content-Length: 11138 Lines: 226
Content-Type: text/plain; charset=us-ascii Content-Disposition: inline
Content-Type: text/html; charset=iso-8859-15 Content-Disposition: attachment; filename="The Mutt E-Mail Client.html" Content-Transfer-Encoding: 8bit
././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-nested2_decoded_1_3_2.binapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-nested2_decoded_1_3_2.b0000644000000000000000000000054511702050534032047 0ustar rootrootGIF87a((óÌÝîÿ¾¾¾ˆˆˆnnnÌÝîÿÿÿççç,((þÉI«½x–Ì;.2Œdižh Jè¾p,ÇâZ{8Ö†mîS;Vèç ÞˆE[Y8Ÿã’ù¬Bk¼¡ÏÊD•ZN×z‘†-ãkÆŒI;S# ¸í†äYt:ÀïûûwByc|‡ˆ‰‰_ƒ]‰nUBV‘‡“c–G˜šœ“‚—¡¢i¤Ÿ§©U±U«K­OiN¿²^X—N¸ÆÅ¸¼V›¿ÀN´··¿ˆOÙÎÈÑÆà¸ÎºŠÍÏWlàÉ¾ÎØåìÝÞÅÅíãŠãòÞ¸Öº¯fá)Í×±X*LhÍ#aǘ4œC!–ĉŽ$X¼8ðG?‚Ì(²‚”’k”ØYÉrÄŠ0cÊœI³&ˆ;apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-2gifs_decoded_1_1.txt0000644000000000000000000000065611702050534031673 0ustar rootrootWhen unpacked, this message should produce two GIF files: * The 1st should be called "3d-compress.gif" * The 2nd should be called "3d-eye.gif" Different ways of specifying the filenames have been used. -- ____ __ / __/__________/_/ Eryq (eryq@rhine.gsfc.nasa.gov) / __/ _/ / / , / Hughes STX Corporation, NASA/Goddard /___/_/ \ /\ /___ /_/ /_____/ http://selsvr.stx.com/~eryq/ apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/ak-0696_decoded_1_2_1.txt0000644000000000000000000000432411702050534030743 0ustar rootrootHallo Herr Specht, entschuldigen Sie vorab, dass ich Ihnen nicht telefonisch zur Verfuegung stehe, ich Praesentationen gehalten/ noch zu halten und viele Kundennachfragen zu projektieren. Nach Informationen des Produkt-Managers Temme steht der POP schon zur Verfügung! Standort: voraussichtlich: Winterfeldstr. 21, 10781 Berlin. Der POP hat zur Zeit direkte 34M-Anbindungen zu folgenden Orten: Rostock, Hamburg, Hannover & Leipzig. 4 weitere werden in kuerze in Betrieb gehen. Damit haben Sie einen Besonderen Sicherheitsstandard verfuegbar! Kontakt muessen Sie ueber Ihre oerltliche Vertriebseinheit aufnehmen: entweder den Geschaefts-Kunden-Vertrieb oder das GrossKundenManagement. Diese Vertriebseinheiten greifen auf den oertlichen Technischen Vertriebs-Support zu. Die Informationen werden ueber TVS zur Vertriebseiheit gegeben und dann zu Ihnen. Sie benoetigen eine Standleitung von Ihrer Lokation zum Internet-POP Uebergabepunkt zu Ihrem Info-Server ist ein CISCO 1000-Router. Dann zahlen Sie neben den monatlichen Kosten fuer die Standleitung die Kosten fuer den Internet-Zugang: zB bei 64k: 1500DM bei 2GByte Freivolumen. 128K: 3000 DM bei 5 GB Freivolumen & 2M: 30.000 DM bei 50GB Freivolumen. Freundliche Gruesse Guenter Deuschle >Sehr geehrter Herr Deuschle, >Sie sind mir von Herrn Meyendriesch empfohlen worden. >Ich versuche Informationen ueber das T-eigene 34Mbit/s Netz und den >lokalen Pop-Berlin rauszufinden, bzw. was ein Anschluss kostet und >wo man ihn herbekommt. Laut Herrn Schnick in Berlin gibt es den >T-Pop nicht, laut Traceroute von Herrn Meyendriesch sehrwohl. Auch >ist dies Netz in der IX vom Mai 96 erwaehnt. >Koennen Sie mir helfen? > >MfG >-- >Juergen Specht - KULTURBOX > > =================================================== Dipl.-Ing. Guenter D E U S C H L E Deutsche Telekom AG Niederlassung 3 Hannover GrossKundenManagement - Techn. Vertriebs-Support: Team-Leiter Internet Online-Dienste --------------------------------------------------- GrKM-TVS-IOD Tel: +49-511-333-2772 Vahrenwalder-Str. 245 FAX: +49-511-333-2751 30179 Hannover eMail: deuschle@mnh.telekom.de =================================================== ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-nested3_decoded_1_3_1.binapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-nested3_decoded_1_3_1.b0000644000000000000000000000064311702050534032046 0ustar rootrootGIF87a((ã€ÿ/OOnnnp€ R-¾¾¾çççõÞ³ÿ¥ÿúÍ,((þÉI«½x’Ì;&rŒdižh Jè¾p,ÇâZ§xnÖa›À P˜ã±¨Â`Él68ãí¤d®XÀ3%õQ­(íŠê"MYlrÌmõÎ|T S•|2“ðyuy†%{m6^q†‚ƒ…‡$‰enGŽN†y”l–‹p€¥ˆ }—S ¯° “t©;«Œx ( ´•ª¢™»'½žµ|·Â#º¼¾ÀËoÃÏÇ¿¶%~ÍÄ&ƨɊÓ#ŽCA“ ÑÙ¸p$iW%êc ¡ãhY&ó b îIÃ&Ü µ@(„6Dàeé§à ì>9yÒ/AdžY#¾“˜†^‚“'AYBaŠŽ(U²©ŒB”Ù1; Ìå;›8A>$™æàÍœÛý¤ÙÒhLùt¤0Ek¦ÔTY½*µ‹‡¯pq{bÅŒ³hÓª]ËD;apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/badfile.xml0000644000000000000000000000066311702050534026767 0ustar rootroot
From: Michelle Holm <holm@sitka.colorado.edu> To: imswww@rhine.gsfc.nasa.gov Mime-Version: 1.0 Subject: note the bogus filename Content-Type: text/plain; charset=iso-8859-1; name="/tmp/whoa" Content-Transfer-Encoding: 8bit
This had better not end up in /tmp!
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/double-bound.xml0000644000000000000000000000622611702050534027761 0ustar rootroot
Return-Path: eryq@rhine.gsfc.nasa.gov Sender: john-bigboote Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Eryq <eryq@rhine.gsfc.nasa.gov> Organization: Yoyodyne Propulsion Systems X-Mailer: Mozilla 2.0 (X11; I; Linux 1.1.18 i486) MIME-Version: 1.0 To: john-bigboote@eryq.pr.mcs.net Subject: test of double-boundary behavior Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE"
This is a multi-part message in MIME format.
Content-Type: text/html; charset=us-ascii Content-Transfer-Encoding: 7bit Subject: [2] this should be text/html, but double-bound may mess it up
<p>This message contains double boundaries all over the place. We want to make sure that bad things don't happen. <p>One bad thing is that the doubled-boundary above can be mistaken for a single boundary plus a bogus premature end of headers.
Content-Type: text/html; charset=us-ascii Subject: [4] this should be text/html, but double-bound may mess it up
<p>Hello? Am I here?
Content-Type: text/html; charset=us-ascii Subject: [6] this should be text/html, but double-bound may mess it up
<p>Hello? Am I here?
Content-Type: text/html; charset=us-ascii Subject: [7] this header is improperly terminated
Content-Type: text/html; charset=us-ascii Subject: [8] this body is empty
Content-Type: text/html; charset=us-ascii Subject: [9] this body also empty
Content-Type: image/gif; name="3d-eye.gif" Content-Transfer-Encoding: base64 Subject: [10] just an image
R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7 VujnC96IRVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7 +3dCeRRjfAKHiImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatL rU8GaQdOBAQAB7+yXliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJ vs7Y5ewH3d7Fxe3jB4rj8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjw E0cdGxQ/gswosoKUkmuU2FnJcsSKGTBjypxJsyaICAA7
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-bad.xml0000644000000000000000000001405711702050534027261 0ustar rootroot
From: Michelle Holm <holm@sitka.colorado.edu> Date: Mon, 21 Aug 95 13:30:57 -600 Sender: holm@sitka.colorado.edu To: imswww@rhine.gsfc.nasa.gov Mime-Version: 1.0 X-Mailer: Mozilla/1.0N (X11; IRIX 5.2 IP20) Content-Type: multipart/mixed; boundary="-------------------------------147881770724098" Subject: http://rhine.gsfc.nasa.gov:8080/ims-bin/v.b/imssearch X-Url: http://rhine.gsfc.nasa.gov:8080/ims-bin/v.b/imssearch Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit
> [[ERROR]] Error 600: Internal logic. > > Dying gasp: > Bad mode: SEARCH/ (600). > > Recommended action to correct the situation: > YIKES! IMS/www failed one of its internal consistency checks! Please SAVE > THIS FILE, and contact IMS/www's developers immediately so they can fix the > problem! If the parentheses at the end of this sentence are not blank, you > can contact them here (imswww@rhine.gsfc.nasa.gov). > > ------------------------------------------------------------------------ > > > Location of error > > Dying gasp: > Package "main", file "/usr/app/people/imswww/v.b/lib/perl/imssearch.pl", line > 753. > > Traceback: > > 1. Iw::Die: from "main", "/usr/app/people/imswww/v.b/lib/perl/imssearch.pl > line 753 > 2. main::Main: from "main", > "/usr/app/people/imswww/public_cgi/v.b/imssearch line 85 > > ------------------------------------------------------------------------ > > > Basic state information > > Include path > > /usr/app/people/imswww/v.b/lib/perl > /usr/app/people/imswww/v.b/lib/perl/Eg > /usr/local/lib/perl5/sun4-sunos > /usr/local/lib/perl5 > . > > Environment variables > > CONTENT_LENGTH = "281" > CONTENT_TYPE = "application/x-www-form-urlencoded" > DOCUMENT_ROOT = "/usr/local/etc/httpd/htdocs" > GAEADATA_DIR = "/home/rhine/ims/lib/gaea_data" > GAEATMP_DIR = "/usr/app/people/imswww/v.b/tmp/imswww-usr/809033436-10153" > GATEWAY_INTERFACE = "CGI/1.1" > HTTP_ACCEPT = "*/*, image/gif, image/x-xbitmap, image/jpeg" > HTTP_REFERER = "http://rhine.gsfc.nasa.gov:8080/ims-bin/v.b/imssearch" > HTTP_USER_AGENT = "Mozilla/1.0N (X11; IRIX 5.2 IP20)" > IMS_STAFF = "1" > IW_CGI_DIR = "/usr/app/people/imswww/v.b/cgi-bin" > IW_DOCS_DIR = "/usr/app/people/imswww/v.b/docs" > IW_LIB_DIR = "/usr/app/people/imswww/v.b/lib" > IW_SESSION_DIR = "/usr/app/people/imswww/v.b/tmp/imswww-usr/809033436-10153" > IW_SESSION_ID = "809033436-10153" > IW_TMP_DIR = "/usr/app/people/imswww/v.b/tmp" > PATH = "/bin:/usr/bin:/usr/etc:/usr/ucb:/usr/local/bin:/usr/ucb" > QUERY_STRING = "" > REMOTE_ADDR = "128.138.135.33" > REMOTE_HOST = "sitka.colorado.edu" > REQUEST_METHOD = "POST" > SCRIPT_NAME = "/ims-bin/v.b/imssearch" > SERVER_NAME = "rhine.gsfc.nasa.gov" > SERVER_PORT = "8080" > SERVER_PROTOCOL = "HTTP/1.0" > SERVER_SOFTWARE = "NCSA/1.4.2" > SYSLOG_LEVEL = "7" > USRDATA_DIR = "/usr/app/people/imswww/v.b/tmp/imswww-usr/809033436-10153" > > Tags > > pmap-geo-opt = "map" > pparam-param = "Sea Ice Concentration" > pparam-param = "Snow Cover" > pparam-param = "Total Sea Ice Concentration" > s-east-long = "-40.0" > s-north-lat = "75.3" > s-south-lat = "66.0" > s-start-date = "01-01-1990" > s-start-time = "" > s-stop-date = "31-12-1994" > s-stop-time = "" > s-west-long = "-176.0" > sid = "809033436-10153" > > Permissions > > Real user id = 65534 > Real group ids = 65534 65534 > Effective user id = 65534 > Effective group ids = 65534 65534 > > ------------------------------------------------------------------------ > > > Log file /usr/app/people/imswww/v.b/tmp/imswww-usr/10184.clog > > II 1995/08/21 15:33:50 IwLog 94 > Logging begun > WWW 1995/08/21 15:33:50 Iw 263 > Perl: Use of uninitialized value at /usr/app/people/imswww/v.b/lib/perl/ims ; > search.pl line 82. > | > EEEE 1995/08/21 15:33:51 Iw 95 > Bad mode: SEARCH/ (600). > > ------------------------------------------------------------------------ > > > Session information > > [Session Directory] > > ------------------------------------------------------------------------ > > Generated by EOSDIS IMS/www version 0.3b / imswww@rhine.gsfc.nasa.gov > NASA/GSFC Task Representative: Yonsook Enloe, yonsook@killians.gsfc.nasa.gov > > A joint project of NASA/GSFC, A/WWW Enterprises, and Hughes STX Corporation. > Full contact information is available.
Content-Type: text/plain Content-Transfer-Encoding: 8bit
[[ERROR]] Error 600: Internal logic. Dying gasp: Bad mode: SEARCH/ (600). Recommended action to correct the situation: YIKES! IMS/www failed one of its internal consistency checks! Please SAVE THIS FILE, and contact IMS/www's developers immediately so they can fix the problem! If the parentheses at the end of this sentence are not blank, you can contact them here (imswww@rhine.gsfc.nasa.gov). ------------------------------------------------------------------------ Location of error Dying gasp: Package "main", file "/usr/app/people/imswww/v.b/lib/perl/imssearch.pl", line 753. Traceback: 1. Iw::Die: from "main", "/usr/app/people/imswww/v.b/lib/perl/imssearch.pl line 753 2. main::Main: from "main", "/usr/app/people/imswww/public_cgi/v.b/imssearch line 85 ------------------------------------------------------------------------ Basic state information Include path /usr/app/people/imswww/v.b/lib/perl /usr/app/people/imswww/v.b/lib/perl/Eg /usr/local/lib/perl5/sun4-sunos /usr/local/lib/perl5
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/bluedot-postcard_decoded.xml0000644000000000000000000000304311702050534032316 0ustar rootroot
Content-Type: multipart/alternative; boundary="----------=_961872013-1436-0" Content-Transfer-Encoding: binary Mime-Version: 1.0 X-Mailer: MIME-tools 5.211 (Entity 5.205) To: noone Subject: A postcard for you
This is a multi-part message in MIME format...
Content-Type: text/plain Content-Disposition: inline Content-Transfer-Encoding: binary
Content-Type: multipart/related; boundary="----------=_961872013-1436-1" Content-Transfer-Encoding: binary
This is a multi-part message in MIME format...
Content-Type: text/html Content-Disposition: inline Content-Transfer-Encoding: binary
Content-Type: image/jpeg; name="bluedot.jpg" Content-Disposition: inline; filename="bluedot.jpg" Content-Transfer-Encoding: base64 Content-Id: my-graphic
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/re-fwd_decoded_1_1_1.txt0000644000000000000000000000007611702050534031131 0ustar rootrootThis is the original message. Let's see if we can embed it! apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/lennie_decoded_1_3.bin0000644000000000000000000000245511702050534030735 0ustar rootrootGIF87a<<æÿÿÿïïïçïïï÷÷÷ÿÿÖÞÞ½ÎÖµÆÎÆÖÞ¥µ½­½ÆŒ¥µsŒœk„”)Rk„œ­{”¥Bc{Z{”RsŒJk„9ZsBc)Rs!Jk9Z1R)JÞçï½ÆÎœ­½”¥µk„œÎÖÞÆÎÖ­½Î¥µÆŒœ­„”¥c{”ZsŒRk„Bc„9Z{1Rs)Jk!Bc1Z)RÖÞç!Bk9c1Z)R”¥½s„œZs”RkŒJc„BZ{9Rs{Œ¥Œœµ„”­½ÆÖÆÎÞ¥­½µ½Î­µÆççïÖÖÞÞÞç,<<ÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢"'-33-'"£ŠG 3.-,,-.3 G±„ +-,+*9(9*+,-+ Å@(Ê:( %% '(:Ø(@£B2,:8 BDC‡òá:XȨ $”-VLñÀ‘‚„ØD<<1aDŸ<`À° †A¢@Œ›1Œt40$(V¬ôЩ ,(Pô £š7ñQH޲è°I@.xäñãƒDŒ²6àDÿHxøðDŽ .hä © °I%Üèaâǃsè'>lÂYóÂ(‘)F 2ÜÛ¡ƒBŠÐ&ˆb4h :v(Ì F‹˜ü€ñ"ƒséÚÅ»·ƒ^1XÈðbödL+Œc~A#ƒóçУG§ñ¢µñ˜8lØ1† C'jÀðCC‚BE`DèîBÓ†ƒ\p4þ ‚„À? ø‚ȧ & ²€Œ È bÀø%8"xÉD rBÀ¡í ¢fÀ†š˜`À &(Ø!‚ó ‚ªÈ¢‹˜˜ ¬À1¦@ˆ‚Ð࣎<úˆ‰ÿø)i ¡’, “n²c–[Bƒ‚ìèã–!lÀá–+v¹‰…ì°’?ªù`Œ‚B'4l€#6ò¸ÁŒ„ܩɃ…l`f  b‚¡„êÉ0 0³Ý@ –rÂl’.é ¤¸ß "̶^w§ ÁlýÙç%²Wƒ/0Guµæªë­¸jPƒrÇ]b™q´f0ƒ¸€ì²Ì.«¬3gk°Å6[ µY€Ko»üö·×È0Ü ¿‹‰`Fƒ¶,T°CðÆ+¯¼;TÀ‚p4´F_štЂ4Ì€3¨Ð'œ°*D`/3äÛWœx0C’fÊ´û®+Ìq;Xƒ k3˜ÈÉëÂ2̬°Ã» ‡lÍ5ÀüA(ü[Û±¸A´p-ˆmu-˜üI)`Fksª ­*P§Ak)P<Š%\ ëÔ\s]. ”Ào1ÄPÂÀ¦ Ã%TKv!”€ 3Ì6 (”ðêÛ|÷í÷߀.øà„nøáˆ'^x ;apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/badbound_decoded.xml0000644000000000000000000001515011702050534030623 0ustar rootroot
Received: from uriela.in-berlin.de by anna.in-berlin.de via SMTP (940816.SGI.8.6.9/940406.SGI) for <k@anna.in-berlin.de> id AAA04436; Mon, 23 Dec 1996 00:08:02 +0100 Resent-From: koenig@franz.ww.TU-Berlin.DE Received: by uriela.in-berlin.de (/\oo/\ Smail3.1.29.1 #29.8) id <m0vbx0j-000LsbC@uriela.in-berlin.de>; Mon, 23 Dec 96 00:08 MET Received: by methan.chemie.fu-berlin.de (Smail3.1.29.1) from franz.ww.TU-Berlin.DE (130.149.200.51) with smtp id <m0vbwzX-0009vcC>; Mon, 23 Dec 96 00:07 MET Received: (from koenig@localhost) by franz.ww.TU-Berlin.DE (8.7.3/8.7.3) id XAA01761 for k@anna.in-berlin.de; Sun, 22 Dec 1996 23:25:10 +0100 (CET) Resent-Date: Sun, 22 Dec 1996 23:25:10 +0100 (CET) Resent-Message-Id: <199612222225.XAA01761@franz.ww.TU-Berlin.DE> Resent-To: k Received: from mailgzrz.TU-Berlin.DE (mailgzrz.TU-Berlin.DE [130.149.4.10]) by franz.ww.TU-Berlin.DE (8.7.3/8.7.3) with ESMTP id XAA01754 for <koenig@franz.ww.TU-Berlin.DE>; Sun, 22 Dec 1996 23:24:32 +0100 (CET) Received: from challenge.uscom.com (actually mail.uscom.com) by mailgzrz.TU-Berlin.DE with SMTP (PP); Sun, 22 Dec 1996 23:19:35 +0100 To: koenig@franz.ww.tu-berlin.de From: Mail Administrator <Postmaster@challenge.uscom.com> Reply-To: Mail Administrator <Postmaster@challenge.uscom.com> Subject: Mail System Error - Returned Mail Date: Sun, 22 Dec 1996 17:21:12 -0500 Message-ID: <19961222222112.AAE16235@challenge.uscom.com> MIME-Version: 1.0 Content-Type: multipart/mixed; Boundary="===========================_ _= 2283630(16235)" Content-Transfer-Encoding: 7BIT X-Filter: mailagent [version 3.0 PL44] for koenig@franz.ww.tu-berlin.de X-Filter: mailagent [version 3.0 PL44] for k@.in-berlin.de
--===========================_ _= 2283630(16235) Content-type: text/plain; charset="us-ascii" This Message was undeliverable due to the following reason: The Program-Deliver module couldn't deliver the message to one or more of the intended recipients because their delivery program(s) failed. The following error messages provide the details about each failure: The delivery program "/pages/pnet/admin/mail_proc.pl" produced the following output while delivering the message to pnet@uscom.com Can't exec "/usr/sbin/sendmail -t": No such file or directory at /pages/pnet/admin/mail_proc.pl line 96, <> line 93. Broken pipe The program "/pages/pnet/admin/mail_proc.pl" exited with an unknown value of 141 while delivering the message to pnet@uscom.com The message was not delivered to: pnet@uscom.com Please reply to Postmaster@challenge.uscom.com if you feel this message to be in error. --===========================_ _= 2283630(16235) Content-type: message/rfc822 Content-Disposition: attachment Date: Sun, 22 Dec 1996 22:24:21 +0000 Message-ID: <"mailgzrz.T.061:22.12.96.22.24.21"@TU-Berlin.DE> Received: from franz.ww.TU-Berlin.DE ([130.149.200.51]) by challenge.uscom.com (Netscape Mail Server v2.02) with ESMTP id AAA685 for <pnet@uscom.com>; Wed, 18 Dec 1996 16:58:30 -0500 Received: from mailgzrz.TU-Berlin.DE (mailgzrz.TU-Berlin.DE [130.149.4.10]) by franz.ww.TU-Berlin.DE (8.7.3/8.7.3) with ESMTP id SAA23400 for <msqlperl@franz.ww.tu-berlin.de>; Wed, 18 Dec 1996 18:59:21 +0100 (CET) Received: from anna.in-berlin.de by mailgzrz.TU-Berlin.DE with SMTP (PP); Wed, 18 Dec 1996 18:59:11 +0100 Received: by anna.in-berlin.de (940816.SGI.8.6.9/940406.SGI) id SAA19491; Wed, 18 Dec 1996 18:55:21 +0100 Date: Wed, 18 Dec 1996 18:55:21 +0100 Message-Id: <199612181755.SAA19491@anna.in-berlin.de> From: Andreas Koenig <k@anna.in-berlin.de> To: michelle@eugene.net CC: msqlperl@franz.ww.tu-berlin.de In-reply-to: <v03007800aeddccd448d0@[206.100.174.203]> (message from Michelle Brownsworth on Wed, 18 Dec 1996 09:32:02 -0700) Subject: HOWTO (Was: unsubscribe) >>>>> On Wed, 18 Dec 1996 09:32:02 -0700, >>>>> Michelle Brownsworth >>>>> who can be reached at: michelle@eugene.net >>>>> (whose comments are cited below with " michelle> "), >>>>> sent the cited message concerning the subject of "unsubscribe" >>>>> twice to the whole list of subscribers michelle> unsubscribe michelle> ************************************************************ michelle> Michelle Brownsworth michelle> System Administrator michelle> Internet Marketing Services michelle@eugene.net michelle> 2300 Oakmont Way, #209 541-431-3374 michelle> Eugene, OR 97402 FAX 431-7345 michelle> ************************************************************ Welcome new subscriber! You've joined the mailing list of unsubscribers' collected wisdom of unsubscribe messages. Relax! You won't have to subscribe to any mailing list for the rest of your life. Better yet, you can't even unsubscribe! So just lean back and enjoy to watch your IO stream of millions of unsubscribe messages daily. Isn't that far more than everything you ever dared to dream of? andreas P.S. This was posted 12 days ago: Date: Fri, 6 Dec 1996 15:47:51 +0100 To: msqlperl@franz.ww.tu-berlin.de Subject: How To Unsubscribe (semi-regular posting) To get off this list, send mail to -------------------- majordomo@franz.ww.tu-berlin.de with the following words in the body of the message (subject line will be ignored): unsubscribe msqlperl <_insert_your_subscription_address_here_> To find out who you are subscribed as, send mail to ------------------------------------- majordomo@franz.ww.tu-berlin.de with only nothing but who msqlperl in the body of the message: If you encounter problems, ------------------------- please try sending the message "help" to majordomo@franz.ww.tu-berlin.de. Hope that help, andreas NOTE: if the above recipe does not work for you, ask me for assistance and do not spam the list with the request. Thank you! --===========================_ _= 2283630(16235)--
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/hdr-fakeout.out0000644000000000000000000000066611702050534027624 0ustar rootrootReceived: (qmail 24486 invoked by uid 501); 20 May 2000 01:55:02 -0000 Date: Fri, 19 May 2000 21:55:02 -0400 From: "Russell P. Sutherland" To: "Russell P. Sutherland" Subject: test message 1 Message-ID: <20000519215502.A24482@quist.on.ca> Mime-Version: 1.0 Content-transfer-encoding: 7BIT Content-Type: text/plain; charset=us-ascii X-Mailer: Mutt 1.0us Organization: Quist Consulting apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-simple.msg0000644000000000000000000000122411702050534030002 0ustar rootrootFrom: Nathaniel Borenstein To: Ned Freed Subject: Sample message MIME-Version: 1.0 Content-type: multipart/mixed; boundary="simple boundary" This is the preamble. It is to be ignored, though it is a handy place for mail composers to include an explanatory note to non-MIME conformant readers. --simple boundary This is implicitly typed plain ASCII text. It does NOT end with a linebreak. --simple boundary Content-type: text/plain; charset=us-ascii This is explicitly typed plain ASCII text. It DOES end with a linebreak. --simple boundary-- This is the epilogue. It is also to be ignored. apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/twopart.msg0000644000000000000000000012322511702050534027067 0ustar rootrootFrom 0647842285@uk.wowlg.com Wed Jan 12 08:08:13 2005 Return-Path: <0647842285@uk.wowlg.com> Delivered-To: wowlgcard@cpostale.com Received: from WOWLG POSTCARD (unknown [57.67.194.147]) by lbn-int.qualimucho.com (Postfix) with SMTP id B33BE3F06 for ; Wed, 12 Jan 2005 08:08:12 +0100 (CET) MIME-Version: 1.0 From: 0647842285@uk.wowlg.com To: wowlgcard@cpostale.com Message-Id:102.10200000000105 Content-Type: multipart/mixed; boundary="=_wowlgpostcardsender102.10200000000105_=" Date: Wed, 12 Jan 2005 08:08:12 +0100 (CET) This is a multi-part message in MIME format... --=_wowlgpostcardsender102.10200000000105_= Content-Type: text/plain; charset="ISO-8859-1" Content-Disposition: inline Content-Transfer-Encoding: 8bit JOY LEE;Batiment Le Rabelais 22 Ave. des Nations ZI PARIS NORD II; VILLEPINTE 93240;Greece#This is test message. Términos y Condiciones ¿Contraseña? Álbum êtes le propriétaire für geschäftliche --=_wowlgpostcardsender102.10200000000105_= Content-Type:image/jpeg; name="/home1/eucyon/data/img_event/postcard/uk7200_110_6.jpg" Content-Disposition: attachment;filename="/home1/eucyon/data/img_event/postcard/uk7200_110_6.jpg" Content-transfer-encoding: base64 /9j/4AAQSkZJRgABAgEASABIAAD/7Ri2UGhvdG9zaG9wIDMuMAA4QklNA+0KUmVzb2x1dGlvbgAA AAAQAEgAAAABAAIASAAAAAEAAjhCSU0EDRhGWCBHbG9iYWwgTGlnaHRpbmcgQW5nbGUAAAAABAAA AHg4QklNBBkSRlggR2xvYmFsIEFsdGl0dWRlAAAAAAQAAAAeOEJJTQPzC1ByaW50IEZsYWdzAAAA CQAAAAAAAAAAAQA4QklNBAoOQ29weXJpZ2h0IEZsYWcAAAAAAQAAOEJJTScQFEphcGFuZXNlIFBy aW50IEZsYWdzAAAAAAoAAQAAAAAAAAACOEJJTQP1F0NvbG9yIEhhbGZ0b25lIFNldHRpbmdzAAAA SAAvZmYAAQBsZmYABgAAAAAAAQAvZmYAAQChmZoABgAAAAAAAQAyAAAAAQBaAAAABgAAAAAAAQA1 AAAAAQAtAAAABgAAAAAAAThCSU0D+BdDb2xvciBUcmFuc2ZlciBTZXR0aW5ncwAAAHAAAP////// //////////////////////8D6AAAAAD/////////////////////////////A+gAAAAA//////// /////////////////////wPoAAAAAP////////////////////////////8D6AAAOEJJTQQIBkd1 aWRlcwAAAAAQAAAAAQAAAkAAAAJAAAAAADhCSU0EHg1VUkwgb3ZlcnJpZGVzAAAABAAAAAA4QklN BBoGU2xpY2VzAAAAAHUAAAAGAAAAAAAAAAAAAADwAAABXgAAAAoAVQBuAHQAaQB0AGwAZQBkAC0A MgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABXgAAAPAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAOEJJTQQREUlDQyBVbnRhZ2dlZCBGbGFnAAAAAQEAOEJJTQQUF0xh eWVyIElEIEdlbmVyYXRvciBCYXNlAAAABAAAAAI4QklNBAwVTmV3IFdpbmRvd3MgVGh1bWJuYWls AAAVDQAAAAEAAABwAAAATQAAAVAAAGUQAAAU8QAYAAH/2P/gABBKRklGAAECAQBIAEgAAP/uAA5B ZG9iZQBkgAAAAAH/2wCEAAwICAgJCAwJCQwRCwoLERUPDAwPFRgTExUTExgRDAwMDAwMEQwMDAwM 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 IxoVFRojIhcXFxcXIhEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAEUExMWGRYb FxcbFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM /8AAEQgA8AFeAwEiAAIRAQMRAf/dAAQAFv/EAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkK CwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEF QVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKz hMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5/cRAAICAQIEBAME BQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcm NcLSRJNUoxdkRVU2dGXi8rOEw9N14/NGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dXZ3eH l6e3x//aAAwDAQACEQMRAD8A7bYFKAkkSAiigs5u5pbxPgsXLYytxG6VrvG9hBJY3ueNFzuSaxY5 tR36Fw/eLWfSe2tvvf8A+fFl/EIkygBH1fv8X/qNt8pqSb08v+6Q2WMAOvCgMq6v+be5p7wS1V3Z DCSBrGh00lDdZx+VVowIrcF0aBFbti7NybG7bLXOb4ElV2NN7y3dta0SXf8AfPzvzEGxxI+78idh aaN1d4bbWDupLfpH97fu/wCt+p/o1OISlrfr/rLZERG1Rv8ARDp2lux0z6RgAxLdoP0fas9zy93i OCeJktb6ntRLXSweEaQZ/t/nsQnktdPZ/wBIa/5vv/8ARajhGkg0EkwWhokyBPxPt9yiXPbuEQ4a OB51/eYovJAYeTE/eVVyMrbVO4usbMg66H+X/OP+knxiSxymALTt6rm4mSRTe4A+4Ncd9f7tn6F/ 8v8A4uxdV0frbc+arG7Mhokx9B4/er/cXn92ZvrFbQCJBPciPzmfuI+B1G7FvZfXBe3TaeCP3Vfg ZRA/50WjLhlf736M31BJc1jfW7GcIyKLKj+8yLWf+irv/AlsYvVunZZ20ZDXO/dMsd/23d6b1NY6 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 AIJJuOTEonpe7YPmNfD6P76PCVP/2Q== --=_wowlgpostcardsender102.10200000000105_=-- apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-2evil_decoded_1_3.bin0000644000000000000000000000054511702050534031632 0ustar rootrootGIF87a((óÌÝîÿ¾¾¾ˆˆˆnnnÌÝîÿÿÿççç,((þÉI«½x–Ì;.2Œdižh Jè¾p,ÇâZ{8Ö†mîS;Vèç ÞˆE[Y8Ÿã’ù¬Bk¼¡ÏÊD•ZN×z‘†-ãkÆŒI;S# ¸í†äYt:ÀïûûwByc|‡ˆ‰‰_ƒ]‰nUBV‘‡“c–G˜šœ“‚—¡¢i¤Ÿ§©U±U«K­OiN¿²^X—N¸ÆÅ¸¼V›¿ÀN´··¿ˆOÙÎÈÑÆà¸ÎºŠÍÏWlàÉ¾ÎØåìÝÞÅÅíãŠãòÞ¸Öº¯fá)Í×±X*LhÍ#aǘ4œC!–ĉŽ$X¼8ðG?‚Ì(²‚”’k”ØYÉrÄŠ0cÊœI³&ˆ;apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-nested_decoded.xml0000644000000000000000000000524311702050534031461 0ustar rootroot
MIME-Version: 1.0 From: Lord John Whorfin <whorfin@yoyodyne.com> To: <john-yaya@yoyodyne.com> Subject: A complex nested multipart example Content-Type: multipart/mixed; boundary=unique-boundary-1
The preamble of the outer multipart message. Mail readers that understand multipart format should ignore this preamble. If you are reading this text, you might want to consider changing to a mail reader that understands how to properly display multipart messages.
Content-type: text/plain; charset=US-ASCII
Subject: Part 3 of the outer message is multipart! Content-Type: multipart/parallel; boundary=unique-boundary-2
A one-line preamble for the inner multipart message.
Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-vise.gif" Subject: Part 1 of the inner message is a GIF, "3d-vise.gif"
Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-eye.gif" Subject: Part 2 of the inner message is another GIF, "3d-eye.gif"
The epilogue for the inner multipart message.
Content-type: text/richtext
Content-Type: message/rfc822; name="/evil/filename";
From: (mailbox in US-ASCII) To: (address in US-ASCII) Subject: Part 5 of the outer message is itself an RFC822 message! Content-Type: Text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: Quoted-printable
The epilogue for the outer message.
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/uu-zeegee.out0000644000000000000000000001566511702050534027313 0ustar rootrootFrom: me To: you Subject: uudecoding I've uuencoded the ZeeGee logo and another GIF file below. begin 644 up.gif M1TE&.#=A$P`3`*$``/___P```("`@,#`P"P`````$P`3```"1X2/F<'MSTQ0 M%(@)YMB\;W%)@$<.(*:5W2F2@<=F8]>LH4P[7)P.T&NZI7Z,(&JF^@B121Y3 4Y4SNEJ"J]8JZ:JTH(K$"/A0``#L` ` end begin 644 zeegee.gif M1TE&.#=A6P!P`/<```````@("!`0$#D`(3D`*4(`*1@8&$H`*4H`,5(`,5(` M.5H`,2$A(5H`.5((,6,`.6,`0EH(.6L`0F,(.6,(0BDI*5H0.6L(0FL(2F,0 M.6,00G,(2C$Q,4(I,6L02GL(4G,04G,02FL80H0(4H0(6E(I.7,80HP(6CDY M.6LA0D(Y.90(6I0(8XP06G,A2H084H086I008U(Y0GLA4D)"0G,I2H0A2G,I M4H0A4H0A6H0I4I0A8TI*2FLY4GLQ6G,Y4I0I8U)24F-*4EI22I0Q8Y0Q:YPQ M:Y0Y6I0Y8X1"6I0Y:UI:6HQ"6H1*8Z4YV-C8WM: M8Z5"X1C:Y1:ZU2WM[>Y1S[UC>XQ[ M>YQS>[5K>[UCE)Q[>X2$A+UKA)Q[E*5[>[UKC*5[A*5[E)R$>[USC*5[G-YC MC(R,C*U[G*6$A,YKE+U[C*V$A+5[G,YSC*V$C+5[I=YKE)24E*V,C+6$I;V$ MI;6,C+6,E-9[G+V,C*V4C+V,E-Y[E-Y[G)R>$I;V^,I:VM MK<:EI>4O>^4M=:EI=:EK>>>EK?>>EM=ZMK>>EO=ZMM>^EK?^^EO?^MK>>MM>^ESO>EO?^E MO>^MO?^EQN>UM?^ESO>MQL;&QN^UM=Z]M>^UO?^MO?>UO>>]O>^]O?^USO^U MQO>]O<[.SN?&O?>]QO^]QO^]SO?&QO^]WO?&SM;6UO_&QO_&SO_&WO_&Y__. MSN_6SO_.UM[>WO_.WO_6UO_6WO_6Y^?GY__>WO_>Y__GWO_GY__G[__G]^_O M[__O[_?W]__W]__W_____RP`````6P!P``<(_P#_"1Q(L*#!@P@3*ES(L*'# MAQ`C2IQ(L:+%BQ@S:I08J:-'2"!#BAP9DI')1(12JES)LF6@ES!C^IE)L^9, M/3ASZE2XH:?/GAB"8KA`M"B%HT@A*(7PH('3IU`;*)BJ(('5JPBR:M5ZH&N! MKV#!$AA+8(#9LSQ__A0ZM"A1I$F7-HT:E6K5JUBW379 MU["/(]_0V3-SN:,=/_^&[/MW];YCL6>/C;S[7]U66H(+\-6C;;?&%)R%>U)U7 M@$(C*(CA=H9YQR&$$4;76XA]D5BBB?NAJ-Q[<.76HHL@9I5`!M.9=Z",,]*H M77LW(I9CA]#Q:)4-9#22R2:*".+"9'P1.4*1-&;8X'?./4?78PM$T8@K=4A1 M@P4U,*$($WN-F!`)6]9I9'9>!E7;BBQZJ(`5I6RBA@B1I7"(!7LI1`*==7+9 MI8UZJKADGXV]4`HQ9U@@759()+'5`8HNVJBC)N89J9*3BMG``W8\H\@,]('_ MB$,3>H6Z**-VWKG@9AJ"&:!3+\CBRA/B.6F5!F_4FM`)MXK:J*Z[$M8K@`%: M$4TC)M05JU6'*(O0"$>01)`(*@1NNN,_J M:NJ>H+VP##'$RL=;!F/D5:^]]SJ;ZYW[2GH4$>2$,!DDTBD`)G&&W,\*K0-NV4'.89XH-C)8RKP!*%XL8QPPAV3 M6RZ#21HB#AO4JDJ:&!D0F(#//[O\,L.0ZHG*-EB@FZK2#5R`!7T*L?!SU%)[ M_#'1&,BRC1(X/DAQ`Q'H@(48+@Q85=ABC]WRK5-3_[U=*MP4P>^DO]90BSWW MW*.+!G;CS<(*>MM;]I8P(W=U$>?ZVI0&M'S#3C_WL+/*`DY-Y3@+>4?.<="5 MJW6U$?V%[."#7[3B2S7L?).-+STCL$@#;Q81_K@P<`&RB,=QV!@.Q3X"S2` M8%IP:8(02C`$(0AA""5(P/\0(L`2IDYUXH*!';"A0/4UL('O4$<$7SC!=8`# M$!>47?0\4`49J."'*G!`5/_J94(!@@^%BWJ#-<[1PG:\,![Q>$<^@@'%>-!0 M@>C`QAF^!!B`$(>XK!.LH(@!)"`)@'"*;IP#'2U\(3SBD0YYS*** M5KSB.LX!CD_D`'IPT4(*(L`DC9T1C2?\612@X48FQI&&\CC&._`HQQJB@X_4 M4`(@*:"#)$CO5SY#9"+!E09&@N.-"EQ@`]NA#F2L@Y*53.4YSM$-:H3A2V(0 MP=8:`+5#HA%A>8"&-;HQ#E0^$A[M(`@P0;_X$`*?&(* MU,PH2E(F`QK:(*8QT^=$>&Q#&N!H9B6?&8H99O@$F47 M@*'_#&J$LYCC5!\WEH$-==*0G;.4IC:@`0Q-L@4'1T!57/`)+E\*T`FX``8T M_-F-4XYS'=R0QC#*6<55KB^5T$QH-Q::C%/H('9DT(##D*(H`EJ4!3$812TT MRE%P`!2.ZPB'-&SAQ'C0XQ[XN$<]Z(%,E&)QEN-0*#24`8Q+A(`[.V#"821* M@5`1\`0"Y`,M=KI1:X33HV\4QS-F<0XGU@,?_A#(/N[!5*=>4J7:>"=5:3&& MGIS!`YF#BZV^BKH=T&*L_!1F.#LZRW,TPQ8L;`<]\%&0?-0#'JE$QUWYV(V5 MZA48M/`$"(QPA!1)RE:+LBD@8G'8Q%+#K)T]93.:P0LX_\*C'OTP"#[B`LEQB'>\U@BN<`^KBDY<05KGTM)R$=:"3IC"%*I@K72_6=9BA((: ML06'=N-QCWV8>!]UY:,TQTM>:$`C&<`X;RQ,P0E$\"I)6AK!A,'E!$YXXL+0 MC2XP.$R,69Q"&TB.+1/+*<$]KGBE>4VPBV$,6O326!(^N+%R7C.J'<>!$YRP M<'V%#(Q>%.,0U'BM61?KT_!"=?_%2(ZR@I5!Y<.N0A6>X,0CFH`V/6%G7,L] M!)C#C&'61G<8R`"$,EQ<5FNL.JZ:?+MX*! M)"9Q"3#_.,.TR$4Q*)$+?BZ:T1M-% M0%T$21A;$J8N]"YF<0E<2U<9K[:UM%T,;6?7XM*9SC,G)%$(.,PO0\/NLA*. M;>QDLZ(8=3CL3IT-#&%`&]KN?KNNM\2M?5A=WYG7^O;U'[%YG_J`1]5V%HB-?"%\#PA#T97:%W&'QN\!Y7M0>++]3M^5/_?RE=?YA3W!]8P_0O!T<`,8JN`"(Y7= M(OQ(O>I7S_K6N_[UL(?]1A32>GW$_O:XSST_9D][U=M>]ZLO"/!?S_O>\^/W MPU_(\%5?_(',0Q\$\?WR$<(/=\SC^0))OD4&P8#N>]_[CG!'__2/O_S=%\08 M/!```-8?`!08XQ_`OT@;UD__^FO"_`,A__3S3X7Z&Z#^2X!\L8<1Y@`*!FB` MFA```,``YF`0YB=[^<=\V<<#Z\+!^CE`0 MW@`*FG"!U]=Z_U"`FJ`)&)AZ`U$&ZX<'$9AZMZ"`K]!ZT_""H`!]PG=]/9B" M0.@0\Z"`/#`/`^$.*%!_`!`$WA"#J><.%%A_/.`-0.@."K@%XZ=Z\V!]7F@, M'%!_`4`%^*'MQ"#YI"'=^B' MM[![(R@`^'=[\_`*"FB'>+A^%0!]_/]P@G7(`#S``.O'`&V($-.P?EOP@)3( M`=XP$--0`0#``<9@>Z*(`MZ@>MXPAA6`@11(!=D'?_`7@O"G#].@?CQ@#JIW MBT_8@L:`B^(G$(Z`BPPABA7PB0*A"788C,ZG?GC@#LIHB06A#_\W"/PPAGC@ MA>ZPC=RXC>;PA?V'`LRW>[>P?FG8?QP0@OPP@@#0@`GA""1($$$``#SP@O;X M@C0``#3@#?,8!/=HC_G(`_S0A&6@>J_@A/77!N9`B5OPCYK@")0X"+=`B53@ M"/\(D0`P"`FA#[BHA`,QA@A9?Q5@#B`9DA7(#V](`[]7CB;Y"MY@DO6W!0<) MD^M7!@G1?W'_6!!-6`$HL`14\)-`N01M,)`+&`1+<)1(>91#J8P!D(K'UXWN MD(;J]X7KQP-'"914<)6O,)-!@)59J968J(FTN`7T.`W,*'QDF8NL%WT<28\" MZ'OSZ('\0(GW1Q#Z,`_F-PW_IPG19PZ7:!!CR`%G*1`L"0K?.!#ZD)6ZF(D` M``K/9WZ)N00QJ(Q/B)>KIP]O*`"ZN(X+Z)'_<)>OX),"\8;2^)E1J0FB>1"@ M```!L(=0.0W3,(\!H)"I9PRG.!"RV08Q.)$`((ZJ-W]P6`:O8`Z:4`9Y&(BI M1XT+N(/\8`YXH(`V^)G_QP"EJ`_>T`;0B1#`&9*TF8^L:0"1Z)GZ_["&`0"> ME6B9JN<(B>B$##`-P=>'ZR<`!I"(2T`0=!B?\[E^L(@0$/E]WF<`=?D/@Y"' M<+@%E\@/;5"'!?J6J3$H-">LSB`.$VQB%([B'7QB" M:!A]*)I_M_""@3@/AQF%U@<*GYB!MNB#[O^H$.7H"%@H$-9'$*"@H`!0`;>@ MA.Q(?V19?PP0`"[*`Z"ZA`!@D_P`"@2ZG!#Z#WJ)`I28C1JXAO07!']IEP'@ MB<^G#VU(@T'0HO-P"Z+H"'YYA*TX#R?8?V4`"N6HD0*A#PH("@,!CZDX"*.8 MJ8?XJ=VWI?^WCW>9@P!Z?>XP@J6)$(@8`$N@@AY9CEP8?:)Z"]`G`.DX$,HH MA_]0`31@?DP9!-E'`PRPI?K(IZ+8K[\8`-"G#^[0?2[Z#R.XGPGAH)0H`&5@ M#@U(`TUI$,[*`^('K_AWD/3ZG,'(`Q6P!83X#UC:!OK@H7]YD&+ZBS0@J=1* MKP3A#A40`&=Z$*__0(F]J@^C.)@"$00&\'X&4`$;"P"O(*D92;(!@`=<^G[* M:`[N(`#Z:A#F$*;_<`L"4)];ZJ%."Y7A"@!ENJ)`.`]CZ`B9&`0\^P_S5Z5! M6X0'6;0"P0$""8_B%P";"+(D"P!MA#*.)SF5XXVR0$,F+#_((D"80`,(+G.A[WQ^N\CCA_#-M]^%>.D_L/ M\&B^`T&!4BH0%%@&OS<-3=A^4PH`Z7N^'2A^U:<)#&``LAM]\\BI!3%_Y9F? MFS@0;4H0Y0BS=UO`#>RB*/F=_R<`J&J^+VF3!(&(=FB>*'#!!G&"FL"X2]@& M61FQ!?$*7SL//_C#;:@/_SN'6_"3@P!]M_"EB.J`@_"36T#"5EK%5GS%6)S% 36KS%7-S%7OS%8!S&8IP1`<$`.P`` ` end apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-frag_decoded.xml0000644000000000000000000000516111702050534031115 0ustar rootroot
MIME-Version: 1.0 From: Lord John Whorfin <whorfin@yoyodyne.com> To: <john-yaya@yoyodyne.com> Subject: A complex nested multipart example Content-Type: multipart/mixed; boundary=unique-boundary-1
The preamble of the outer multipart message. Mail readers that understand multipart format should ignore this preamble. If you are reading this text, you might want to consider changing to a mail reader that understands how to properly display multipart messages.
Content-type: text/plain; charset=US-ASCII
Subject: Part 3 of the outer message is multipart! Content-Type: multipart/parallel; boundary=unique-boundary-2
A one-line preamble for the inner multipart message.
Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-vise.gif" Subject: Part 1 of the inner message is a GIF, "3d-vise.gif"
Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-eye.gif" Subject: Part 2 of the inner message is another GIF, "3d-eye.gif", but the terminating boundary is bad!
Content-type: text/richtext
Content-Type: message/rfc822; name="nice.name";
From: (mailbox in US-ASCII) To: (address in US-ASCII) Subject: Part 5 of the outer message is itself an RFC822 message! Content-Type: Text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: Quoted-printable
The epilogue for the outer message.
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/russian_decoded_1.txt0000644000000000000000000000002111702050534030757 0ustar rootrootSalutations apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/double-semicolon.msg0000644000000000000000000000034011702050534030617 0ustar rootrootMime-Version: 1.0 Content-Type: multipart/alternative;; boundary="foo" Preamble --foo Content-Type: text/plain; charset=us-ascii The better part --foo Content-Type: text/plain; charset=us-ascii The worse part --foo-- apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/double-semicolon2_decoded.xml0000644000000000000000000000110611702050534032363 0ustar rootroot
Mime-Version: 1.0 Content-Type: multipart/alternative ; ; ; ;; ;;;;;;;; boundary="foo"
Preamble
Content-Type: text/plain; charset=us-ascii
Content-Type: text/plain; charset=us-ascii
././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/frag_decoded_1_2_1_2_1_2_1_1.txtapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/frag_decoded_1_2_1_2_1_2_1_1.0000644000000000000000000000063111702050534031444 0ustar rootroot -----Original Message----- From: Shawn Morgan [mailto:cephalos@home.com] Sent: Wednesday, May 17, 2000 8:18 PM To: Shawn Morgan Subject: Fw: Another Priceless Moment ----- Original Message ----- From: Michele Morgan To: Sent: Tuesday, May 16, 2000 10:31 PM Subject: Fw: Another Priceless Moment > > apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/uu-zeegee_decoded.xml0000644000000000000000000000026411702050534030740 0ustar rootroot
From: me To: you Subject: uudecoding
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/empty-preamble.xml0000644000000000000000000000237111702050534030322 0ustar rootroot
Content-Type: multipart/mixed; boundary="t0UkRYy7tHLRMCai" Content-Disposition: inline
Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable
Das ist ein Test. --=20 sub i($){print$_[0]}*j=3D*ENV;sub w($){sleep$_[0]}sub _($){i"$p:$c> ",w+01 ,$_=3D$_[0],tr;i-za-h,;a-hi-z ;,i$_,w+01,i"\n"}$|=3D1;$f=3D'HO';($c=3D$j{PW= D})=3D~ s+$j{$f."ME"}+~+;$p.=3D"$j{USER}\@".`hostname`;chop$p;_"kl",$c=3D'~',_"zu,". "-zn,*",_"#,epg,lw,gwc,mfmkcbm,cvsvwev,uiqt,kwvbmvb?",i"$p:$c> ";w+1<<07
Content-Type: image/png Content-Disposition: attachment; filename="dot.png" Content-Transfer-Encoding: base64
iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAIAAAD91JpzAAAACXBIWXMAAAsTAAALEwEAmpwY AAAAB3RJTUUH1AUbFQQ0Vbb7XQAAAB10RVh0Q29tbWVudABDcmVhdGVkIHdpdGggVGhlIEdJ TVDvZCVuAAAAFklEQVR42mP8//8/AwMDEwMDAwMDAwAkBgMB/umWrAAAAABJRU5ErkJggg==
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/README.txt0000644000000000000000000000016011702050534026345 0ustar rootrootThese test messages are part of the MIME-tools Perl library: http://search.cpan.org/~dskoll/MIME-tools-5.502/ ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/empty-preamble_decoded_1_1.txtapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/empty-preamble_decoded_1_1.tx0000644000000000000000000000050011702050534032254 0ustar rootrootDas ist ein Test. -- sub i($){print$_[0]}*j=*ENV;sub w($){sleep$_[0]}sub _($){i"$p:$c> ",w+01 ,$_=$_[0],tr;i-za-h,;a-hi-z ;,i$_,w+01,i"\n"}$|=1;$f='HO';($c=$j{PWD})=~ s+$j{$f."ME"}+~+;$p.="$j{USER}\@".`hostname`;chop$p;_"kl",$c='~',_"zu,". "-zn,*",_"#,epg,lw,gwc,mfmkcbm,cvsvwev,uiqt,kwvbmvb?",i"$p:$c> ";w+1<<07 apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/not-mime.msg0000644000000000000000000000076311702050534027115 0ustar rootrootReturn-Path: To: Eryq From: s.rahtz@elsevier.co.uk (Sebastian Rahtz) Subject: Re: HELP! Problems installing PSNFSS, and other querys Date: Wed, 15 Feb 1995 09:38:18 try reading the LaTeX Companion for more details ignore the checksum error in lucida.dtx. i'll fix it sebastian Sebastian Rahtz s.rahtz@elsevier.co.uk Production Methods Group +44 1865 843662 Elsevier Science Ltd Kidlington Oxford, UK apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/bluedot-simple_decoded_1.bin0000644000000000000000000001026011702050534032157 0ustar rootrootÿØÿàJFIFÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?÷ú(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¨çžn.%Ž"BòI#TP2I'€ç4%ÃêtØÔÇ¢[KªÎ ðÐ[Œ¾k/ÌÎ jààd€A®NóÅ^)Ô£òî5x­cÁV]6ÛÉ2Ô3;;b…Éç8ÇezÚÆ:wzv'5Âaݧ={-¯™ì”WÍn×Q47—ºä ÷ »¿žxŸÈîTààŒŽ¨ªŸðè¿ô°ÿÀdÿ íŽKW¬‘æK‰h'îÁþðO¡è¯ž“CÒ¡‘e‡Nµ‚T!’Xbº0èÊË‚¤AzV„7¬«5®½¬Ç2ý×{ùg<’RèxõSŽ£JY5eðÉ2¡Ä¸gñů¹þ§ºÑ^MaãÏiêqe«ÆÏþ1$ç,謇Œ׌swvÚômvdµI$³Ô;l¯I[Ÿ“¬˜'c6ÐFì+‚¶µg?ÕÃflN”¥wÛg÷Q\ÇhQEQEQEQEQEQEQEQEQEQEq~1ñ‹iìúN“"HçÏ€Ëh¤dpx2A x†n6«éNœªÉB í™W¯N…7R£²FŸ‰<_aáÑörçR’=ðÚF<àpr-×km FÚó_Q¿ñÒÜjò,‘Ç'›of m›±^v}öç%¶„ V©Ão¸-0Ò9’G'-#ž¬Ìyf=Øäžõ-}.-§GÞž²üˆÌ3ºØ›ÂŸ»ÅúÿQEéž QEQETsÛÃu Cq sDØÜ’(e<çjJ)5}Ói݃ã}KEd·ÔÚ]KNÈv9¸¶P1À ™‡CÉßÃÈHQézv£i«iðßXγ[L2Ž ò ‚ ‚âu6—{s ê‡SÓkpø7Ê—J?…ÈGð¾ _pY[ÅÆeQ•çGGÛü¦Ë³ùAªxW~¿>ÿŸ©îVv‡®YxƒM[Û&lgd±H’ŽpFAî ‚Aè×Ï´Ó³>½5%u°QE†QEQEQEQEQEQEQUïï­ôÍ:æþòO.ÖÖ'šgÚNÔPKN=(Æþ"} GY¾ÝNû|6¬6Ÿ$í$ÌTç*œv ³"œnÈòèãX—jî9%‹3fbrY‰ä’I$žI$š±q¬ë:µâì–oÝÅò Vc7ıÉù™°v…ú¬· ì)óK⇑ð9ÖcõªÜ~ävó}ÿËþQEé0QEQEQEQEQE>«ÏáÝR=^Ýe’8ÁvÐýë˜@o”…”Ëß ®T;ö¸'†êÞ+‹ycš Pæ}Wæ6U¨ý?ËüL¢Š+À>´(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ξ%êÞ|ö~ˆü§mõçûŠÇÉ^äBù'aëÑkÄ5KÇÔüM­_ɸy%²#6ï- & ô,&:#uäžü¶Š«ˆIìµþ¾g•b^'å¢ùÿÀ¹Q_Z~zQEQEQEQEQEQEâNöÌmc»Œ¬¶Ò7D™hØðr8Át=*z*e(¸½™P›„”ãºÔöU¶×4{]NÓp†æ0á_÷FNU†x ŽÕz¼ûáuæZÒ˜¹0Ü%Üc?"G*ãhô&H¥b1Ÿ9$œz |Mjn•IAôgéøjʽÕ]RaEVfÁEPEPEPEPEPsÏ ­¼·Ç !y$‘‚ª($“ÀsšùûCáÐ4ØäFIÖ%ea‚¤ È#Ö½—ÇòOŸ×â|·Âð§>ͯ¾ßä_¢Š+è‘ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€.xþG¯ ×Ü¿úK={Uy7€QßÇâDVd‹Kd`2¼°ìöݱñë±±Ð׬×Éæ’¾&Kµ¿#ïòràbûÝþ!EWž{EPEPEPEPEP^+¯ÙfxËZ³ùqI2ÞÀ™ÎRUË6}æðy€m¯j®âvšÒivZÔI–Óe"v$[H0ütÀq³accž öà+ûêOg§Þy¹¾ë8IEnµ_/êÇEWןQ@Q@Q@Q@Q@Q@S$[™š+[$W½¹‘`·VíаíQ–b9 ¬{TNjr–ȺtåRjÝèw_ ì ƒVÖX0s­¬'#kEàN:ƒæ¼ÊsÔ*àw=ýQÑô«mGµÓ-7m£ñ¹Ïwb˜å˜ã’IïW«â«Tuj9¾¬ý;EP¥K¢°QE™°QEQEQEQEQETsÁ Õ¼¶÷G4¡I#‘C+© ƒÁqŠ’ŠñMgH—úäº\ŒÏ =œ­ŸšÄlËrÍʬrIœ¾JõŸø|x‹C{xÊ¥ôÏe#± “…e]Ø*C2·áŽ0@#É~t–Xf†H.!.hdO”“åä-}5…Ov®ðÿ€|faÔ¡yÐ÷£Ûªÿ?ëN¦mØäI£I#uxÜVSÀô úS«Ö>{`¢Š)€QEQEE%ÄqË8y'—>TÆÒK&9;QAfÀäàO2’м‘P„§%«¶KWô-÷ÄמM¨– $$O~c;TAX‹ ®ùq•Bî@Fè4‡“]2]x“jDeÓbpêãÄíŽyÀ(‡oÊAi°=!µ·ŠÞÞ(á‚$ q¨UE81^36½áCïÿ/ó>«.áû5Wÿ€ÿŸùÃéÚu¦“§ÃccÃm $õ9$“É$’I9$’I$Õª(¯ú½‚Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( SXø}¢j·uŸ¥ÝHååšÀªy¤’Ided,IÉ}»ÎÝŽ+“¼ð‰ìòmåÓu8Õw’¥íd'ûЇz“ÇÈ “ƒ€2}^Šé£‹¯GHKC‹—aqÕ‚o¾ÏïG‰M£øŠÖ&šëÃ:œp¯Þt0ÎFx$R;ž}ã©ÀÕOô¿úkŸø'ºÿãuïWdsŒBÝ'òÿ‚y²áÌz9/šýQá üÒ,qhšÛHä*+i“Æ =g@«õbî@­|1â»™V%ðì–Å¿å­ÝÜ ÷ùŒníì0§’3’=šŠRÍñk/—ù•ÁÇ{¿WþIqaðÊîYõeL${kLg To: Ned Freed Subject: Sample message MIME-Version: 1.0 Content-type: multipart/mixed; boundary="simple boundary" This is the preamble. It is to be ignored, though it is a handy place for mail composers to include an explanatory note to non-MIME conformant readers. --simple boundary This is implicitly typed plain ASCII text. It does NOT end with a linebreak. --simple boundary Content-type: text/x-numbers; charset=us-ascii Content-length: 30 123456789 123456789 123456789 --simple boundary Content-type: text/x-alphabet; charset=us-ascii Content-length: 600 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 --simple boundary-- This is the epilogue. It is also to be ignored. apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/double-semicolon_decoded.xml0000644000000000000000000000106411702050534032304 0ustar rootroot
Mime-Version: 1.0 Content-Type: multipart/alternative;; boundary="foo"
Preamble
Content-Type: text/plain; charset=us-ascii
Content-Type: text/plain; charset=us-ascii
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/hdr-fakeout_decoded_1.txt0000644000000000000000000000000011702050534031501 0ustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/jt-0498_decoded.xml0000644000000000000000000001043711702050534030067 0ustar rootroot
Received: from farabi.hpc.uh.edu (farabi.hpc.uh.edu [129.7.102.2]) by sina.hpc.uh.edu (8.7.3/8.7.3) with ESMTP id OAA27026; Thu, 30 Apr 1998 14:27:51 -0500 (CDT) Received: from sina.hpc.uh.edu (lists@[10.1.1.1]) by farabi.hpc.uh.edu (8.7.3/8.7.3) with ESMTP id WAD14645; Mon, 27 Apr 1998 22:20:19 -0500 (CDT) Received: by sina.hpc.uh.edu (TLB v0.09a (1.20 tibbs 1996/10/09 22:03:07)); Thu, 30 Apr 1998 14:26:26 -0500 (CDT) Received: (from tibbs@localhost) by sina.hpc.uh.edu (8.7.3/8.7.3) id OAA26968 for pc800@hpc.uh.edu; Thu, 30 Apr 1998 14:26:17 -0500 (CDT) Received: from imo11.mx.aol.com (imo11.mx.aol.com [198.81.17.33]) by sina.hpc.uh.edu (8.7.3/8.7.3) with ESMTP id KAA22560 for <PC800@hpc.uh.edu>; Thu, 30 Apr 1998 10:29:47 -0500 (CDT) Received: from Gaffneydp@aol.com by imo11.mx.aol.com (IMOv14.1) id QICDa02864 for <PC800@hpc.uh.edu>; Thu, 30 Apr 1998 11:28:50 -0400 (EDT) From: Gaffneydp <Gaffneydp@aol.com> Message-ID: <c8384e50.354898b3@aol.com> Date: Thu, 30 Apr 1998 11:28:50 EDT To: PC800@hpc.uh.edu Mime-Version: 1.0 Subject: Fwd: PC800: Tall Hondaline Windshield Distortion Content-type: multipart/mixed; boundary="part0_893950130_boundary" X-Mailer: AOL 3.0 16-bit for Windows sub 41 Sender: owner-pc800@hpc.uh.edu Precedence: list X-Majordomo: 1.94.jlt7
This is a multi-part message in MIME format.
Content-ID: <0_893950130@inet_out.mail.aol.com.1> Content-type: text/plain; charset=US-ASCII
Content-ID: <0_893950130@inet_out.mail.aol.com.2> Content-type: message/rfc822 Content-transfer-encoding: 7bit Content-disposition: inline
Return-Path: <owner-pc800@hpc.uh.edu> Received: from rly-za04.mx.aol.com (rly-za04.mail.aol.com [172.31.36.100]) by air-za04.mail.aol.com (v42.4) with SMTP; Wed, 29 Apr 1998 09:14:18 -0400 Received: from sina.hpc.uh.edu (Sina.HPC.UH.EDU [129.7.3.5]) by rly-za04.mx.aol.com (8.8.5/8.8.5/AOL-4.0.0) with ESMTP id JAA27623; Wed, 29 Apr 1998 09:14:08 -0400 (EDT) Received: from sina.hpc.uh.edu (lists@Sina.HPC.UH.EDU [129.7.3.5]) by sina.hpc.uh.edu (8.7.3/8.7.3) with ESMTP id IAA25294; Wed, 29 Apr 1998 08:14:23 -0500 (CDT) Received: by sina.hpc.uh.edu (TLB v0.09a (1.20 tibbs 1996/10/09 22:03:07)); Wed, 29 Apr 1998 08:14:20 -0500 (CDT) Received: from donald.cybercomm.nl (donald.cybercomm.nl [194.235.113.5]) by sina.hpc.uh.edu (8.7.3/8.7.3) with ESMTP id IAA25275 for <pc800@hpc.uh.edu>; Wed, 29 Apr 1998 08:14:11 -0500 (CDT) Received: from default (poort22-ip-x2.enertel.cybercomm.nl [194.235.118.22]) by donald.cybercomm.nl (8.8.6/8.8.6) with ESMTP id OAA25676 for <pc800@hpc.uh.edu>; Wed, 29 Apr 1998 14:12:10 -0100 (MET) Message-Id: <199804291512.OAA25676@donald.cybercomm.nl> From: "Emile Nossin" <Emile@CyberComm.nl> To: "PC800" <pc800@hpc.uh.edu> Subject: Re: PC800: Tall Hondaline Windshield Distortion Date: Wed, 29 Apr 1998 15:13:20 +0200 X-MSMail-Priority: Normal X-Priority: 3 X-Mailer: Microsoft Internet Mail 4.70.1155 Sender: owner-pc800@hpc.uh.edu Precedence: list X-Majordomo: 1.94.jlt7 Mime-Version: 1.0 Content-type: text/plain; charset=ISO-8859-1 Content-transfer-encoding: quoted-printable
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/german-qp.xml0000644000000000000000000000163311702050534027266 0ustar rootroot
Content-Type: text/plain; charset="iso-8859-15" Content-Disposition: inline Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Mailer: JaM - Just A Mailer Subject: Testnachricht Return-Path: <joern@zyn.de> Date: Wed, 21 Dec 2005 22:02:44 +0100 To: joern@zyn.de From: =?ISO-8859-15?Q?J=F6rn?= Reder <joern@zyn.de>
=0A= Hallo,=0A= =0A= das ist eine Testnachricht mit 8 Bit S=F6nderz=E4ichen, und obendrein noch= =20=0A= quoted-printable kodiert.=0A= =0A= Gr=FC=DFe,=0A= =0A= J=F6rn=0A= --=20=0A= .''`. J=F6rn Reder <joern@zyn.de>=0A= : :' : http://www.exit1.org/ http://www.zyn.de/=0A= `. `'=0A= `- Debian GNU/Linux -- The power of freedom=0A=
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/not-mime_decoded.xml0000644000000000000000000000062111702050534030567 0ustar rootroot
Return-Path: <s.rahtz@elsevier.co.uk> To: Eryq <eryq@rhine.stx.com> From: s.rahtz@elsevier.co.uk (Sebastian Rahtz) Subject: Re: HELP! Problems installing PSNFSS, and other querys Date: Wed, 15 Feb 1995 09:38:18
././@LongLink0000000000000000000000000000017300000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/attachment-filename-encoding-Latin1_decoded_1_1.txtapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/attachment-filename-encoding-0000644000000000000000000000002011702050534032334 0ustar rootrootAttachment Test apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-2evil_decoded.xml0000644000000000000000000000320311702050534031212 0ustar rootroot
Return-Path: eryq@rhine.gsfc.nasa.gov Sender: john-bigboote Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Eryq <eryq@rhine.gsfc.nasa.gov> Organization: Yoyodyne Propulsion Systems X-Mailer: Mozilla 2.0 (X11; I; Linux 1.1.18 i486) MIME-Version: 1.0 To: john-bigboote@eryq.pr.mcs.net Subject: Two images for you... Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE"
This is a multi-part message in MIME format.
Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit
Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="/evil/because:of\path\3d-=?ISO-8859-1?Q?=63?=om=?US-ASCII*EN?Q?pr?=ess.gif"
Content-Type: image/gif; name="3d-eye-is-an-evil-filename because of excessive length and verbosity. Unfortunately what can we do given an idiotic situation such as this?" Content-Transfer-Encoding: base64
That was a multi-part message in MIME format.
././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/bluedot-postcard_decoded_1_1.txtapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/bluedot-postcard_decoded_1_1.0000644000000000000000000000013311702050534032232 0ustar rootrootHaving a wonderful time... wish you were looking at HTML instead of this boring text! apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-clen_decoded_1_1.txt0000644000000000000000000000011511702050534031570 0ustar rootrootThis is implicitly typed plain ASCII text. It does NOT end with a linebreak.apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/re-fwd_decoded.xml0000644000000000000000000000256611702050534030240 0ustar rootroot
Content-Disposition: inline Content-Transfer-Encoding: binary Content-Type: message/rfc822 MIME-Version: 1.0 X-Mailer: MIME::Lite 1.147 (B2.09; Q2.03) Date: Tue, 6 Jun 2000 03:20:11 UT From: user2 To: user0 Subject: Re: Fwd: hello world
Content-Disposition: inline Content-Transfer-Encoding: binary Content-Type: message/rfc822 MIME-Version: 1.0 X-Mailer: MIME::Lite 1.147 (B2.09; Q2.03) Date: Tue, 6 Jun 2000 03:20:11 UT From: user1 To: user2 Subject: Fwd: hello world
Content-Disposition: inline Content-Length: 60 Content-Transfer-Encoding: binary Content-Type: text/plain MIME-Version: 1.0 X-Mailer: MIME::Lite 1.147 (B2.09; Q2.03) Date: Tue, 6 Jun 2000 03:20:11 UT From: user0 To: user1 Subject: hello world
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/dup-names_decoded_1_3.bin0000644000000000000000000000064311702050534031351 0ustar rootrootGIF87a((ã€ÿ/OOnnnp€ R-¾¾¾çççõÞ³ÿ¥ÿúÍ,((þÉI«½x’Ì;&rŒdižh Jè¾p,ÇâZ§xnÖa›À P˜ã±¨Â`Él68ãí¤d®XÀ3%õQ­(íŠê"MYlrÌmõÎ|T S•|2“ðyuy†%{m6^q†‚ƒ…‡$‰enGŽN†y”l–‹p€¥ˆ }—S ¯° “t©;«Œx ( ´•ª¢™»'½žµ|·Â#º¼¾ÀËoÃÏÇ¿¶%~ÍÄ&ƨɊÓ#ŽCA“ ÑÙ¸p$iW%êc ¡ãhY&ó b îIÃ&Ü µ@(„6Dàeé§à ì>9yÒ/AdžY#¾“˜†^‚“'AYBaŠŽ(U²©ŒB”Ù1; Ìå;›8A>$™æàÍœÛý¤ÙÒhLùt¤0Ek¦ÔTY½*µ‹‡¯pq{bÅŒ³hÓª]ËD;apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/badfile.out0000644000000000000000000000041411702050534026770 0ustar rootrootFrom: Michelle Holm To: imswww@rhine.gsfc.nasa.gov Mime-Version: 1.0 Subject: note the bogus filename Content-Type: text/plain; charset=iso-8859-1; name="/tmp/whoa" Content-Transfer-Encoding: 8bit This had better not end up in /tmp! apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/uu-junk-target.xml0000644000000000000000000002326511702050534030266 0ustar rootroot
Return-Path: <support@webmail.uwohali.com> Received: from virtual.mrf.mail.rcn.net ([207.172.4.103]) by mta02.mrf.mail.rcn.net (InterMail vM.4.01.02.27 201-229-119-110) with ESMTP id <20000425112650.ZPUD516.mta02.mrf.mail.rcn.net@virtual.mrf.mail.rcn.net> for <eryq@mta.mrf.mail.rcn.net>; Tue, 25 Apr 2000 07:26:50 -0400 Received: from [205.139.141.226] (helo=webmail.uwohali.com ident=root) by virtual.mrf.mail.rcn.net with esmtp (Exim 2.12 #3) id 12k3VX-00012G-00 for eryq@zeegee.com; Tue, 25 Apr 2000 07:27:59 -0400 Received: from webmail.uwohali.com (nobody@localhost [127.0.0.1]) by webmail.uwohali.com (8.8.7/8.8.7) with SMTP id GAA10264 for <eryq@zeegee.com>; Tue, 25 Apr 2000 06:34:43 -0500 Date: Tue, 25 Apr 2000 06:34:43 -0500 Message-Id: <200004251134.GAA10264@webmail.uwohali.com> From: "ADJE Webmail Tech Support" <support@webmail.uwohali.com> To: eryq@zeegee.com Subject: mime::parser Content-type: multipart/mixed; boundary="---------------------------7d033e3733c" Mime-Version: 1.0 X-Mozilla-Status: 8001
Content-Type: text/plain
Eryq - I occasionally receive an email (see below) like this one, which MIME::Parser does not parse. Any ideas? Is this a valid way to send an attachment, or is the problem on the "sender's" side? Thanks for your time! Mike -->> Promote YOUR web site! FREE Perl CGI scripts add WEB ACCESS to your -->> E-Mail accounts! Download today!! http://webmail.uwohali.com
Content-type: multipart/mixed; boundary="----------=_960622044-2175-0"
The following is a multipart MIME message which was extracted from a uuencoded message.
Here's what he's talking about. I've uuencoded the ZeeGee logo and another GIF file below.
Content-Type: image/gif; name="up.gif"; x-unix-mode="0644" Content-Disposition: inline; filename="up.gif" Content-Transfer-Encoding: base64 Mime-Version: 1.0 X-Mailer: MIME-tools 5.208 (Entity 5.204)
R0lGODdhEwATAKEAAP///wAAAICAgMDAwCwAAAAAEwATAAACR4SPmcHtz0xQ FIgJ5ti8b3FJgEcOIKaV3SmSgcdmY9esoUw7XJwO0Gu6pX6MIGqm+giRSR5T 5UzulqCq9Yq6aq0oIrECPhQAADs=
Content-Type: image/gif; name="zeegee.gif"; x-unix-mode="0644" Content-Disposition: inline; filename="zeegee.gif" Content-Transfer-Encoding: base64 Mime-Version: 1.0 X-Mailer: MIME-tools 5.208 (Entity 5.204)
R0lGODdhWwBwAPcAAAAAAAgICBAQEDkAITkAKUIAKRgYGEoAKUoAMVIAMVIA OVoAMSEhIVoAOVIIMWMAOWMAQloIOWsAQmMIOWMIQikpKVoQOWsIQmsISmMQ OWMQQnMISjExMUIpMWsQSnsIUnMQUnMQSmsYQoQIUoQIWlIpOXMYQowIWjk5 OWshQkI5OZQIWpQIY4wQWnMhSoQYUoQYWpQQY1I5QnshUkJCQnMpSoQhSnMp UoQhUoQhWoQpUpQhY0pKSms5UnsxWnM5UpQpY1JSUmNKUlpSSpQxY5Qxa5wx a5Q5WpQ5Y4RCWpQ5a1paWoxCWoRKY6U5c5xCY4xKa605a5RKY5xCe2NjY3ta Y6VCc5RSa6VKa3tjY61Ka2tra61Kc61Ke4Rja5Rac3tra6VSe61Sc6Vaa7VS c3Nzc4xra61ac61ahLVahK1jc4xzc61je3t7e5Rzc61jhJxzc61re71je4x7 e5xze7Vre71jlJx7e4SEhL1rhJx7lKV7e71rjKV7hKV7lJyEe71zjKV7nN5j jIyMjK17nKWEhM5rlL17jK2EhLV7nM5zjK2EjLV7pd5rlJSUlK2MjLWEpb2E pbWMjLWMlNZ7nL2MjK2UjL2MlN57lN57nJycnN6ElL2UlMaUlMaUnNaMnKWl peeEpb2cnM6UnNaUnO+ErcacnNaUpd6Mtd6Mvc6cnM6cpd6Upb2lpe+Mpa2t rcalpc6lpeeUve+UtdalpdalreecrbW1td6lrd6lpd6ltfecpeelrfecrdat reeltd6treelvd6tte+lrf+ctf+cvb29ve+lvf+cxuetreette+lzvelvf+l ve+tvf+lxue1tf+lzvetxsbGxu+1td69te+1vf+tvfe1vee9ve+9vf+1zv+1 xve9vc7OzufGvfe9xv+9xv+9zvfGxv+93vfGztbW1v/Gxv/Gzv/G3v/G5//O zu/Wzv/O1t7e3v/O3v/W1v/W3v/W5+fn5//e3v/e5//n3v/n5//n7//n9+/v 7//v7/f39//39//3/////ywAAAAAWwBwAAcI/wD/CRxIsKDBgwgTKlzIsKHD hxAjSpxIsaLFixgzapQYqaNHSCBDihwZkpHJRIRSqlzJsmWglzBj+plJs+ZM PThz6lS4oafPnhiCYrhAtCiFo0ghKIXwoIHTp1AbKJiqIIHVqwiyatV6oGuB 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 WrzFXNzFXvzFYBzGYpwRAcEAOw==
././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/bluedot-postcard_decoded_1_2_2.binapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/bluedot-postcard_decoded_1_2_0000644000000000000000000001026011702050534032316 0ustar rootrootÿØÿàJFIFÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?÷ú(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¨çžn.%Ž"BòI#TP2I'€ç4%ÃêtØÔÇ¢[KªÎ ðÐ[Œ¾k/ÌÎ jààd€A®NóÅ^)Ô£òî5x­cÁV]6ÛÉ2Ô3;;b…Éç8ÇezÚÆ:wzv'5Âaݧ={-¯™ì”WÍn×Q47—ºä ÷ »¿žxŸÈîTààŒŽ¨ªŸðè¿ô°ÿÀdÿ íŽKW¬‘æK‰h'îÁþðO¡è¯ž“CÒ¡‘e‡Nµ‚T!’Xbº0èÊË‚¤AzV„7¬«5®½¬Ç2ý×{ùg<’RèxõSŽ£JY5eðÉ2¡Ä¸gñů¹þ§ºÑ^MaãÏiêqe«ÆÏþ1$ç,謇Œ׌swvÚômvdµI$³Ô;l¯I[Ÿ“¬˜'c6ÐFì+‚¶µg?ÕÃflN”¥wÛg÷Q\ÇhQEQEQEQEQEQEQEQEQEQEq~1ñ‹iìúN“"HçÏ€Ëh¤dpx2A x†n6«éNœªÉB í™W¯N…7R£²FŸ‰<_aáÑörçR’=ðÚF<àpr-×km FÚó_Q¿ñÒÜjò,‘Ç'›of m›±^v}öç%¶„ V©Ão¸-0Ò9’G'-#ž¬Ìyf=Øäžõ-}.-§GÞž²üˆÌ3ºØ›ÂŸ»ÅúÿQEéž QEQETsÛÃu Cq sDØÜ’(e<çjJ)5}Ói݃ã}KEd·ÔÚ]KNÈv9¸¶P1À ™‡CÉßÃÈHQézv£i«iðßXγ[L2Ž ò ‚ ‚âu6—{s ê‡SÓkpø7Ê—J?…ÈGð¾ _pY[ÅÆeQ•çGGÛü¦Ë³ùAªxW~¿>ÿŸ©îVv‡®YxƒM[Û&lgd±H’ŽpFAî ‚Aè×Ï´Ó³>½5%u°QE†QEQEQEQEQEQEQUïï­ôÍ:æþòO.ÖÖ'šgÚNÔPKN=(Æþ"} GY¾ÝNû|6¬6Ÿ$í$ÌTç*œv ³"œnÈòèãX—jî9%‹3fbrY‰ä’I$žI$š±q¬ë:µâì–oÝÅò Vc7ıÉù™°v…ú¬· ì)óK⇑ð9ÖcõªÜ~ävó}ÿËþQEé0QEQEQEQEQE>«ÏáÝR=^Ýe’8ÁvÐýë˜@o”…”Ëß ®T;ö¸'†êÞ+‹ycš Pæ}Wæ6U¨ý?ËüL¢Š+À>´(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ξ%êÞ|ö~ˆü§mõçûŠÇÉ^äBù'aëÑkÄ5KÇÔüM­_ɸy%²#6ï- & ô,&:#uäžü¶Š«ˆIìµþ¾g•b^'å¢ùÿÀ¹Q_Z~zQEQEQEQEQEQEâNöÌmc»Œ¬¶Ò7D™hØðr8Át=*z*e(¸½™P›„”ãºÔöU¶×4{]NÓp†æ0á_÷FNU†x ŽÕz¼ûáuæZÒ˜¹0Ü%Üc?"G*ãhô&H¥b1Ÿ9$œz |Mjn•IAôgéøjʽÕ]RaEVfÁEPEPEPEPEPsÏ ­¼·Ç !y$‘‚ª($“ÀsšùûCáÐ4ØäFIÖ%ea‚¤ È#Ö½—ÇòOŸ×â|·Âð§>ͯ¾ßä_¢Š+è‘ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€.xþG¯ ×Ü¿úK={Uy7€QßÇâDVd‹Kd`2¼°ìöݱñë±±Ð׬×Éæ’¾&Kµ¿#ïòràbûÝþ!EWž{EPEPEPEPEP^+¯ÙfxËZ³ùqI2ÞÀ™ÎRUË6}æðy€m¯j®âvšÒivZÔI–Óe"v$[H0ütÀq³accž öà+ûêOg§Þy¹¾ë8IEnµ_/êÇEWןQ@Q@Q@Q@Q@Q@S$[™š+[$W½¹‘`·VíаíQ–b9 ¬{TNjr–ȺtåRjÝèw_ ì ƒVÖX0s­¬'#kEàN:ƒæ¼ÊsÔ*àw=ýQÑô«mGµÓ-7m£ñ¹Ïwb˜å˜ã’IïW«â«Tuj9¾¬ý;EP¥K¢°QE™°QEQEQEQEQETsÁ Õ¼¶÷G4¡I#‘C+© ƒÁqŠ’ŠñMgH—úäº\ŒÏ =œ­ŸšÄlËrÍʬrIœ¾JõŸø|x‹C{xÊ¥ôÏe#± “…e]Ø*C2·áŽ0@#É~t–Xf†H.!.hdO”“åä-}5…Ov®ðÿ€|faÔ¡yÐ÷£Ûªÿ?ëN¦mØäI£I#uxÜVSÀô úS«Ö>{`¢Š)€QEQEE%ÄqË8y'—>TÆÒK&9;QAfÀäàO2’м‘P„§%«¶KWô-÷ÄמM¨– $$O~c;TAX‹ ®ùq•Bî@Fè4‡“]2]x“jDeÓbpêãÄíŽyÀ(‡oÊAi°=!µ·ŠÞÞ(á‚$ q¨UE81^36½áCïÿ/ó>«.áû5Wÿ€ÿŸùÃéÚu¦“§ÃccÃm $õ9$“É$’I9$’I$Õª(¯ú½‚Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( SXø}¢j·uŸ¥ÝHååšÀªy¤’Ided,IÉ}»ÎÝŽ+“¼ð‰ìòmåÓu8Õw’¥íd'ûЇz“ÇÈ “ƒ€2}^Šé£‹¯GHKC‹—aqÕ‚o¾ÏïG‰M£øŠÖ&šëÃ:œp¯Þt0ÎFx$R;ž}ã©ÀÕOô¿úkŸø'ºÿãuïWdsŒBÝ'òÿ‚y²áÌz9/šýQá üÒ,qhšÛHä*+i“Æ =g@«õbî@­|1â»™V%ðì–Å¿å­ÝÜ ÷ùŒníì0§’3’=šŠRÍñk/—ù•ÁÇ{¿WþIqaðÊîYõeL${kLg Date: Wed, 21 Dec 2005 22:02:44 +0100 To: joern@zyn.de From: =?ISO-8859-15?Q?J=F6rn?= Reder Hallo, das ist eine Testnachricht mit 8 Bit S=F6nderz=E4ichen, und obendr= ein noch quoted-printable kodiert=2E Gr=FC=DFe, J=F6rn -- =2E''`=2E J=F6rn Reder : :' : http://www=2Eexit1= =2Eorg/ http://www=2Ezyn=2Ede/ `=2E `' `- Debian GNU/Linux -- The powe= r of freedom apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-nested.xml0000644000000000000000000001015411702050534030007 0ustar rootroot
MIME-Version: 1.0 From: Lord John Whorfin <whorfin@yoyodyne.com> To: <john-yaya@yoyodyne.com> Subject: A complex nested multipart example Content-Type: multipart/mixed; boundary=unique-boundary-1
The preamble of the outer multipart message. Mail readers that understand multipart format should ignore this preamble. If you are reading this text, you might want to consider changing to a mail reader that understands how to properly display multipart messages.
Part 1 of the outer message. [Note that the preceding blank line means no header fields were given and this is text, with charset US ASCII. It could have been done with explicit typing as in the next part.]
Content-type: text/plain; charset=US-ASCII
Part 2 of the outer message. This could have been part of the previous part, but illustrates explicit versus implicit typing of body parts.
Subject: Part 3 of the outer message is multipart! Content-Type: multipart/parallel; boundary=unique-boundary-2
A one-line preamble for the inner multipart message.
Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-vise.gif" Subject: Part 1 of the inner message is a GIF, "3d-vise.gif"
R0lGODdhKAAoAOMAAAAAAAAAgB6Q/y9PT25ubnCAkKBSLb6+vufn5/Xes/+lAP/6zQAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJLMOyYbcoxkaZ5oCkoH6L5wLMfiWqd4btZhmxbA oFCY47EIqMJgyWw2ATjj7aRkAq5YwDMl9VGtKO0SiuoiTVlscsxt9c4HgXxUIA0EAVOVfDKT 8Hl1B3kDAYYle202XnGGgoMHhYckiWVuR3+OTgCGeZRslotwgJ2lnYigfZdTjQULr7ALBZN0 qTurjHgLKAu0B5Wqopm7J72etQN8t8Ijury+wMtvw8/Hv7Ylfs0BxCbGqMmK0yOOQ0GTCgrR 2bhwJGlXJQYG6mMKoeNoWSbzCWIACe5JwxQm3AkDAbUAQCiQhDZEBeBl6afgCsOBrD45edIv QceGWSMevpOYhl6CkydBHhBZQmGKjihVshypjB9ClAHZMTugzOU7mzhBPiSZ5uDNnA7b/aTZ 0mhMnfl0pDBFa6bUElSPWb0qtYuHrxlwcR17YsWMs2jTql3LFkQEADs=
Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-eye.gif" Subject: Part 2 of the inner message is another GIF, "3d-eye.gif"
R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7 VujnC96IRVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7 +3dCeRRjfAKHiImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatL rU8GaQdOBAQAB7+yXliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJ vs7Y5ewH3d7Fxe3jB4rj8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjw E0cdGxQ/gswosoKUkmuU2FnJcsSKGTBjypxJsyaICAA7
The epilogue for the inner multipart message.
Content-type: text/richtext
This is <bold>part 4 of the outer message</bold> <smaller>as defined in RFC1341</smaller><nl> <nl> Isn't it <bigger><bigger>cool?</bigger></bigger>
Content-Type: message/rfc822; name="/evil/filename";
From: (mailbox in US-ASCII) To: (address in US-ASCII) Subject: Part 5 of the outer message is itself an RFC822 message! Content-Type: Text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: Quoted-printable
Part 5 of the outer message is itself an RFC822 message!
The epilogue for the outer message.
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/dup-names_decoded_1_2.bin0000644000000000000000000000054511702050534031351 0ustar rootrootGIF87a((óÌÝîÿ¾¾¾ˆˆˆnnnÌÝîÿÿÿççç,((þÉI«½x–Ì;.2Œdižh Jè¾p,ÇâZ{8Ö†mîS;Vèç ÞˆE[Y8Ÿã’ù¬Bk¼¡ÏÊD•ZN×z‘†-ãkÆŒI;S# ¸í†äYt:ÀïûûwByc|‡ˆ‰‰_ƒ]‰nUBV‘‡“c–G˜šœ“‚—¡¢i¤Ÿ§©U±U«K­OiN¿²^X—N¸ÆÅ¸¼V›¿ÀN´··¿ˆOÙÎÈÑÆà¸ÎºŠÍÏWlàÉ¾ÎØåìÝÞÅÅíãŠãòÞ¸Öº¯fá)Í×±X*LhÍ#aǘ4œC!–ĉŽ$X¼8ðG?‚Ì(²‚”’k”ØYÉrÄŠ0cÊœI³&ˆ;apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/jt-0498.out0000644000000000000000000001162011702050534026422 0ustar rootrootReceived: from farabi.hpc.uh.edu (farabi.hpc.uh.edu [129.7.102.2]) by sina.hpc.uh.edu (8.7.3/8.7.3) with ESMTP id OAA27026; Thu, 30 Apr 1998 14:27:51 -0500 (CDT) Received: from sina.hpc.uh.edu (lists@[10.1.1.1]) by farabi.hpc.uh.edu (8.7.3/8.7.3) with ESMTP id WAD14645; Mon, 27 Apr 1998 22:20:19 -0500 (CDT) Received: by sina.hpc.uh.edu (TLB v0.09a (1.20 tibbs 1996/10/09 22:03:07)); Thu, 30 Apr 1998 14:26:26 -0500 (CDT) Received: (from tibbs@localhost) by sina.hpc.uh.edu (8.7.3/8.7.3) id OAA26968 for pc800@hpc.uh.edu; Thu, 30 Apr 1998 14:26:17 -0500 (CDT) Received: from imo11.mx.aol.com (imo11.mx.aol.com [198.81.17.33]) by sina.hpc.uh.edu (8.7.3/8.7.3) with ESMTP id KAA22560 for ; Thu, 30 Apr 1998 10:29:47 -0500 (CDT) Received: from Gaffneydp@aol.com by imo11.mx.aol.com (IMOv14.1) id QICDa02864 for ; Thu, 30 Apr 1998 11:28:50 -0400 (EDT) From: Gaffneydp Message-ID: Date: Thu, 30 Apr 1998 11:28:50 EDT To: PC800@hpc.uh.edu Mime-Version: 1.0 Subject: Fwd: PC800: Tall Hondaline Windshield Distortion Content-type: multipart/mixed; boundary="part0_893950130_boundary" X-Mailer: AOL 3.0 16-bit for Windows sub 41 Sender: owner-pc800@hpc.uh.edu Precedence: list X-Majordomo: 1.94.jlt7 This is a multi-part message in MIME format. --part0_893950130_boundary Content-ID: <0_893950130@inet_out.mail.aol.com.1> Content-type: text/plain; charset=US-ASCII Hello to all, I purchased a tall windshield about two weeks ago from Waynesville Cycle Center in NC. The entire length and width of the windshield has optical waves or ripples which distort the view through it. It was very uncomfortable to ride with and I would be afraid to ride at night with it. I contacted the manager at WCC. He in turn contacted Honda Customer Service (310-532-9811). They replied to him that there were no bulletins concerning this problem and that they inspected several windshields. They claim that all the windshields had distortions. They have offered to give me a full refund. What bothers me is two things. First, the stock windshield has no optical distortion. Second, it appears that Honda knows that it is selling a less than perfect product and is apparently unconcerned about it (seems like a strange way to do business). Perhaps my windshield is the worst one ever made, but they made no offer to inspect mine and compare to others that they have in stock. I am going to call Honda on Monday and raise the issues of safety and quality. I will ask them if they have a problem with me forwarding their position to publications such as Cycle World, Rider, etc. Dennis Gaffney Marlboro, NY gaffneydp@aol.com 1994 PC800 Bought used in 1997 (2000 miles) Modifications: tall windshield? --part0_893950130_boundary Content-ID: <0_893950130@inet_out.mail.aol.com.2> Content-type: message/rfc822 Content-transfer-encoding: 7bit Content-disposition: inline Return-Path: Received: from rly-za04.mx.aol.com (rly-za04.mail.aol.com [172.31.36.100]) by air-za04.mail.aol.com (v42.4) with SMTP; Wed, 29 Apr 1998 09:14:18 -0400 Received: from sina.hpc.uh.edu (Sina.HPC.UH.EDU [129.7.3.5]) by rly-za04.mx.aol.com (8.8.5/8.8.5/AOL-4.0.0) with ESMTP id JAA27623; Wed, 29 Apr 1998 09:14:08 -0400 (EDT) Received: from sina.hpc.uh.edu (lists@Sina.HPC.UH.EDU [129.7.3.5]) by sina.hpc.uh.edu (8.7.3/8.7.3) with ESMTP id IAA25294; Wed, 29 Apr 1998 08:14:23 -0500 (CDT) Received: by sina.hpc.uh.edu (TLB v0.09a (1.20 tibbs 1996/10/09 22:03:07)); Wed, 29 Apr 1998 08:14:20 -0500 (CDT) Received: from donald.cybercomm.nl (donald.cybercomm.nl [194.235.113.5]) by sina.hpc.uh.edu (8.7.3/8.7.3) with ESMTP id IAA25275 for ; Wed, 29 Apr 1998 08:14:11 -0500 (CDT) Received: from default (poort22-ip-x2.enertel.cybercomm.nl [194.235.118.22]) by donald.cybercomm.nl (8.8.6/8.8.6) with ESMTP id OAA25676 for ; Wed, 29 Apr 1998 14:12:10 -0100 (MET) Message-Id: <199804291512.OAA25676@donald.cybercomm.nl> From: "Emile Nossin" To: "PC800" Subject: Re: PC800: Tall Hondaline Windshield Distortion Date: Wed, 29 Apr 1998 15:13:20 +0200 X-MSMail-Priority: Normal X-Priority: 3 X-Mailer: Microsoft Internet Mail 4.70.1155 Sender: owner-pc800@hpc.uh.edu Precedence: list X-Majordomo: 1.94.jlt7 Mime-Version: 1.0 Content-type: text/plain; charset=ISO-8859-1 Content-transfer-encoding: quoted-printable Hi Pat, I don't see any distortion in my tall Honda screen, nor any maginfication-= - Visit the PC800 web page at To unsubscribe from the list, send "unsubscribe pc800" in the body of a message to majordomo@hpc=2Euh=2Eedu=2E To report problems, send mail to pc800-owner@hpc=2Euh=2Eedu=2E --part0_893950130_boundary-- apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-2gifs-base64.msg0000644000000000000000000000647611702050534030623 0ustar rootrootContent-type: message/rfc822 Content-transfer-encoding: base64 Subject: a multipart message/rfc822 which has been base64-encoded UmV0dXJuLVBhdGg6IGVyeXFAcmhpbmUuZ3NmYy5uYXNhLmdvdgpTZW5kZXI6IGpvaG4tYmln Ym9vdGUKRGF0ZTogVGh1LCAxMSBBcHIgMTk5NiAwMToxMDozMCAtMDUwMApGcm9tOiBFcnlx IDxlcnlxQHJoaW5lLmdzZmMubmFzYS5nb3Y+Ck9yZ2FuaXphdGlvbjogWW95b2R5bmUgUHJv cHVsc2lvbiBTeXN0ZW1zClgtTWFpbGVyOiBNb3ppbGxhIDIuMCAoWDExOyBJOyBMaW51eCAx LjEuMTggaTQ4NikKTUlNRS1WZXJzaW9uOiAxLjAKVG86IGpvaG4tYmlnYm9vdGVAZXJ5cS5w ci5tY3MubmV0ClN1YmplY3Q6IFR3byBpbWFnZXMgZm9yIHlvdS4uLgpDb250ZW50LVR5cGU6 IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9Ii0tLS0tLS0tLS0tLTI5OUE3MEIzMzlCNjVB OTM1NDJEMkFFIgoKVGhpcyBpcyBhIG11bHRpLXBhcnQgbWVzc2FnZSBpbiBNSU1FIGZvcm1h dC4KCi0tLS0tLS0tLS0tLS0tMjk5QTcwQjMzOUI2NUE5MzU0MkQyQUUKQ29udGVudC1UeXBl OiB0ZXh0L3BsYWluOyBjaGFyc2V0PXVzLWFzY2lpCkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rp bmc6IDdiaXQKCldoZW4gdW5wYWNrZWQsIHRoaXMgbWVzc2FnZSBzaG91bGQgcHJvZHVjZSB0 d28gR0lGIGZpbGVzOgoKCSogVGhlIDFzdCBzaG91bGQgYmUgY2FsbGVkICIzZC1jb21wcmVz cy5naWYiCgkqIFRoZSAybmQgc2hvdWxkIGJlIGNhbGxlZCAiM2QtZXllLmdpZiIKCkRpZmZl cmVudCB3YXlzIG9mIHNwZWNpZnlpbmcgdGhlIGZpbGVuYW1lcyBoYXZlIGJlZW4gdXNlZC4K Ci0tIAogICBfX19fICAgICAgICAgICBfXwogIC8gX18vX19fX19fX19fXy9fLyAgRXJ5cSAo ZXJ5cUByaGluZS5nc2ZjLm5hc2EuZ292KQogLyBfXy8gXy8gLyAvICwgLyAgICAgSHVnaGVz IFNUWCBDb3Jwb3JhdGlvbiwgTkFTQS9Hb2RkYXJkCi9fX18vXy8gXCAgL1wgIC9fX18gCiAg ICAgICAgL18vIC9fX19fXy8gICBodHRwOi8vc2Vsc3ZyLnN0eC5jb20vfmVyeXEvCgotLS0t LS0tLS0tLS0tLTI5OUE3MEIzMzlCNjVBOTM1NDJEMkFFCkNvbnRlbnQtVHlwZTogaW1hZ2Uv Z2lmCkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NApDb250ZW50LURpc3Bvc2l0 aW9uOiBpbmxpbmU7IGZpbGVuYW1lPSIzZC1jb21wcmVzcy5naWYiCgpSMGxHT0RkaEtBQW9B T01BQUFBQUFBQUFnQjZRL3k5UFQyNXVibkNBa0tCU0xiNit2dWZuNS9YZXMvK2xBUC82elFB QUFBQUEKQUFBQUFBQUFBQ3dBQUFBQUtBQW9BQUFFL2hESlNhdTllSkxNT3lZYmNveGthWjVv Q2tvSDZMNXdMTWZpV3FkNGJ0WmhteGJBCm9GQ1k0N0VJcU1KZ3lXdzJBVGpqN2FSa0FxNVl3 RE1sOVZHdEtPMFNpdW9pVFZsc2NzeHQ5YzRIZ1h4VUlBMEVBVk9WZkRLVAo4SGwxQjNrREFZ WWxlMjAyWG5HR2dvTUhoWWNraVdWdVIzK09UZ0NHZVpSc2xvdHdnSjJsbllpZ2ZaZFRqUVVM cjdBTEJaTjAKcVR1cmpIZ0xLQXUwQjVXcW9wbTdKNzJldFFOOHQ4SWp1cnkrd010dnc4L0h2 N1lsZnMwQnhDYkdxTW1LMHlPT1EwR1RDZ3JSCjJiaHdKR2xYSlFZRzZtTUtvZU5vV1NiekNX SUFDZTVKd3hRbTNBa0RBYlVBUUNpUWhEWkVCZUJsNmFmZ0NzT0JyRDQ1ZWRJdgpRY2VHV1NN ZXZwT1lobDZDa3lkQkhoQlpRbUdLamloVnNoeXBqQjlDbEFIWk1UdWd6T1U3bXpoQlBpU1o1 dURObkE3Yi9hVFoKMG1oTW5mbDBwREJGYTZiVUVsU1BXYjBxdFl1SHJ4bHdjUjE3WXNXTXMy alRxbDNMRmtRRUFEcz0KLS0tLS0tLS0tLS0tLS0yOTlBNzBCMzM5QjY1QTkzNTQyRDJBRQpD b250ZW50LVR5cGU6IGltYWdlL2dpZjsgbmFtZT0iM2QtZXllLmdpZiIKQ29udGVudC1UcmFu c2Zlci1FbmNvZGluZzogYmFzZTY0CgpSMGxHT0RkaEtBQW9BUE1BQUFBQUFBQUF6TjN1Lzc2 K3ZvaUlpRzV1YnN6ZDd2Ly8vK2ZuNXdBQUFBQUFBQUFBQUFBQUFBQUEKQUFBQUFBQUFBQ3dB QUFBQUtBQW9BQUFFL2hESlNhdTllSmJNT3k0Yk1veGthWjVvQ2tvRDZMNXdMTWZpV25zNDFv WnQ3bE03ClZ1am5DOTZJUlZzUFdRRTRueFBqa3Ztc1FtdThvYy9LQlVTVldrN1hlcEdHTGVO cnhveEpPMU1qSUxqdGhnL2tXWFE2d08vNworM2RDZVJSamZBS0hpSW1KQVYrRENGMEJpVzVW QW8xQ0VsYVJoNU5qbGtlWW1weVRncGNUQUtHaWFhU2Zwd0twVlFheFZhdEwKclU4R2FRZE9C QVFBQjcreVhsaVhUcmdBeHNXNHZGYWJ2OEJPdEJzQnQ3Y0d2d0NJVDluT3lORUl4dUM0enJx S3pjOVhiT0RKCnZzN1k1ZXdIM2Q3RnhlM2pCNHJqOHQ2UHVOYTZyMmJoS1FYTjE3RllDQk1x VEdpQnpTTmh4NWcwbkVNaGxzU0pqaVJZdkRqdwpFMGNkR3hRL2dzd29zb0tVa211VTJGbkpj c1NLR1RCanlweEpzeWFJQ0FBNwotLS0tLS0tLS0tLS0tLTI5OUE3MEIzMzlCNjVBOTM1NDJE MkFFLS0KVGhhdCB3YXMgYSBtdWx0aS1wYXJ0IG1lc3NhZ2UgaW4gTUlNRSBmb3JtYXQuCg== apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-digest.xml0000644000000000000000000000235511702050534030010 0ustar rootroot
From: Nathaniel Borenstein <nsb@bellcore.com> To: Ned Freed <ned@innosoft.com> Subject: Sample digest message MIME-Version: 1.0 Content-type: multipart/digest; boundary="simple boundary"
This is the preamble. It is to be ignored, though it is a handy place for mail composers to include an explanatory note to non-MIME conformant readers.
From: noone@nowhere.org Subject: embedded message 1
This is implicitly-typed ASCII text. It does NOT end with a linebreak.
Content-type: message/rfc822; charset=us-ascii
From: noone@nowhere.org Subject: embedded message 2 Content-type: text
This is explicitly typed plain ASCII text. It DOES end with a linebreak.
This is the epilogue. It is also to be ignored.
././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/attachment-filename-encoding-UTF8.outapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/attachment-filename-encoding-0000644000000000000000000000111611702050534032343 0ustar rootrootMIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------050706070100080203090004" This is a multi-part message in MIME format. --------------050706070100080203090004 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Attachment Test --------------050706070100080203090004 Content-Type: text/plain; name="=?UTF-8?B?YXR0YWNobWVudC7DpMO2w7w=?=" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename*=UTF-8''%61%74%74%61%63%68%6D%65%6E%74%2E%C3%A4%C3%B6%C3%BC VGVzdAo= --------------050706070100080203090004-- apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/russian.msg0000644000000000000000000000030211702050534027041 0ustar rootrootContent-Type: text/plain; charset="US-ASCII"; name==?koi8-r?B?89DJ08/LLmRvYw==?= Content-Disposition: attachment; filename==?koi8-r?B?89DJ08/LLmRvYw==?= Subject: Greetings Salutations apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-frag_decoded_1_5_1.txt0000644000000000000000000000007211702050534032014 0ustar rootrootPart 5 of the outer message is itself an RFC822 message! apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/uu-junk-target_decoded.xml0000644000000000000000000000527511702050534031736 0ustar rootroot
Return-Path: <support@webmail.uwohali.com> Received: from virtual.mrf.mail.rcn.net ([207.172.4.103]) by mta02.mrf.mail.rcn.net (InterMail vM.4.01.02.27 201-229-119-110) with ESMTP id <20000425112650.ZPUD516.mta02.mrf.mail.rcn.net@virtual.mrf.mail.rcn.net> for <eryq@mta.mrf.mail.rcn.net>; Tue, 25 Apr 2000 07:26:50 -0400 Received: from [205.139.141.226] (helo=webmail.uwohali.com ident=root) by virtual.mrf.mail.rcn.net with esmtp (Exim 2.12 #3) id 12k3VX-00012G-00 for eryq@zeegee.com; Tue, 25 Apr 2000 07:27:59 -0400 Received: from webmail.uwohali.com (nobody@localhost [127.0.0.1]) by webmail.uwohali.com (8.8.7/8.8.7) with SMTP id GAA10264 for <eryq@zeegee.com>; Tue, 25 Apr 2000 06:34:43 -0500 Date: Tue, 25 Apr 2000 06:34:43 -0500 Message-Id: <200004251134.GAA10264@webmail.uwohali.com> From: "ADJE Webmail Tech Support" <support@webmail.uwohali.com> To: eryq@zeegee.com Subject: mime::parser Content-type: multipart/mixed; boundary="---------------------------7d033e3733c" Mime-Version: 1.0 X-Mozilla-Status: 8001
Content-Type: text/plain
Content-type: multipart/mixed; boundary="----------=_960622044-2175-0"
The following is a multipart MIME message which was extracted from a uuencoded message.
Content-Type: image/gif; name="up.gif"; x-unix-mode="0644" Content-Disposition: inline; filename="up.gif" Content-Transfer-Encoding: base64 Mime-Version: 1.0 X-Mailer: MIME-tools 5.208 (Entity 5.204)
Content-Type: image/gif; name="zeegee.gif"; x-unix-mode="0644" Content-Disposition: inline; filename="zeegee.gif" Content-Transfer-Encoding: base64 Mime-Version: 1.0 X-Mailer: MIME-tools 5.208 (Entity 5.204)
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/jt-0498.msg0000644000000000000000000001153611702050534026407 0ustar rootrootFrom owner-funnel-pc@hpc.uh.edu Thu Apr 30 14:27:51 1998 Received: from farabi.hpc.uh.edu (farabi.hpc.uh.edu [129.7.102.2]) by sina.hpc.uh.edu (8.7.3/8.7.3) with ESMTP id OAA27026; Thu, 30 Apr 1998 14:27:51 -0500 (CDT) Received: from sina.hpc.uh.edu (lists@[10.1.1.1]) by farabi.hpc.uh.edu (8.7.3/8.7.3) with ESMTP id WAD14645; Mon, 27 Apr 1998 22:20:19 -0500 (CDT) Received: by sina.hpc.uh.edu (TLB v0.09a (1.20 tibbs 1996/10/09 22:03:07)); Thu, 30 Apr 1998 14:26:26 -0500 (CDT) Received: (from tibbs@localhost) by sina.hpc.uh.edu (8.7.3/8.7.3) id OAA26968 for pc800@hpc.uh.edu; Thu, 30 Apr 1998 14:26:17 -0500 (CDT) Received: from imo11.mx.aol.com (imo11.mx.aol.com [198.81.17.33]) by sina.hpc.uh.edu (8.7.3/8.7.3) with ESMTP id KAA22560 for ; Thu, 30 Apr 1998 10:29:47 -0500 (CDT) Received: from Gaffneydp@aol.com by imo11.mx.aol.com (IMOv14.1) id QICDa02864 for ; Thu, 30 Apr 1998 11:28:50 -0400 (EDT) From: Gaffneydp Message-ID: Date: Thu, 30 Apr 1998 11:28:50 EDT To: PC800@hpc.uh.edu Mime-Version: 1.0 Subject: Fwd: PC800: Tall Hondaline Windshield Distortion Content-type: multipart/mixed; boundary="part0_893950130_boundary" X-Mailer: AOL 3.0 16-bit for Windows sub 41 Sender: owner-pc800@hpc.uh.edu Precedence: list X-Majordomo: 1.94.jlt7 This is a multi-part message in MIME format. --part0_893950130_boundary Content-ID: <0_893950130@inet_out.mail.aol.com.1> Content-type: text/plain; charset=US-ASCII Hello to all, I purchased a tall windshield about two weeks ago from Waynesville Cycle Center in NC. The entire length and width of the windshield has optical waves or ripples which distort the view through it. It was very uncomfortable to ride with and I would be afraid to ride at night with it. I contacted the manager at WCC. He in turn contacted Honda Customer Service (310-532-9811). They replied to him that there were no bulletins concerning this problem and that they inspected several windshields. They claim that all the windshields had distortions. They have offered to give me a full refund. What bothers me is two things. First, the stock windshield has no optical distortion. Second, it appears that Honda knows that it is selling a less than perfect product and is apparently unconcerned about it (seems like a strange way to do business). Perhaps my windshield is the worst one ever made, but they made no offer to inspect mine and compare to others that they have in stock. I am going to call Honda on Monday and raise the issues of safety and quality. I will ask them if they have a problem with me forwarding their position to publications such as Cycle World, Rider, etc. Dennis Gaffney Marlboro, NY gaffneydp@aol.com 1994 PC800 Bought used in 1997 (2000 miles) Modifications: tall windshield? --part0_893950130_boundary Content-ID: <0_893950130@inet_out.mail.aol.com.2> Content-type: message/rfc822 Content-transfer-encoding: 7bit Content-disposition: inline Return-Path: Received: from rly-za04.mx.aol.com (rly-za04.mail.aol.com [172.31.36.100]) by air-za04.mail.aol.com (v42.4) with SMTP; Wed, 29 Apr 1998 09:14:18 -0400 Received: from sina.hpc.uh.edu (Sina.HPC.UH.EDU [129.7.3.5]) by rly-za04.mx.aol.com (8.8.5/8.8.5/AOL-4.0.0) with ESMTP id JAA27623; Wed, 29 Apr 1998 09:14:08 -0400 (EDT) Received: from sina.hpc.uh.edu (lists@Sina.HPC.UH.EDU [129.7.3.5]) by sina.hpc.uh.edu (8.7.3/8.7.3) with ESMTP id IAA25294; Wed, 29 Apr 1998 08:14:23 -0500 (CDT) Received: by sina.hpc.uh.edu (TLB v0.09a (1.20 tibbs 1996/10/09 22:03:07)); Wed, 29 Apr 1998 08:14:20 -0500 (CDT) Received: from donald.cybercomm.nl (donald.cybercomm.nl [194.235.113.5]) by sina.hpc.uh.edu (8.7.3/8.7.3) with ESMTP id IAA25275 for ; Wed, 29 Apr 1998 08:14:11 -0500 (CDT) Received: from default (poort22-ip-x2.enertel.cybercomm.nl [194.235.118.22]) by donald.cybercomm.nl (8.8.6/8.8.6) with ESMTP id OAA25676 for ; Wed, 29 Apr 1998 14:12:10 -0100 (MET) Message-Id: <199804291512.OAA25676@donald.cybercomm.nl> From: "Emile Nossin" To: "PC800" Subject: Re: PC800: Tall Hondaline Windshield Distortion Date: Wed, 29 Apr 1998 15:13:20 +0200 X-MSMail-Priority: Normal X-Priority: 3 X-Mailer: Microsoft Internet Mail 4.70.1155 Sender: owner-pc800@hpc.uh.edu Precedence: list X-Majordomo: 1.94.jlt7 Mime-Version: 1.0 Content-type: text/plain; charset=ISO-8859-1 Content-transfer-encoding: quoted-printable Hi Pat, I don't see any distortion in my tall Honda screen, nor any maginfication= -- Visit the PC800 web page at To unsubscribe from the list, send "unsubscribe pc800" in the body of a message to majordomo@hpc.uh.edu. To report problems, send mail to pc800-owner@hpc.uh.edu. apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/x-gzip64.msg0000644000000000000000000000077511702050534026763 0ustar rootrootContent-Type: text/plain; name=".signature" Content-Disposition: inline; filename=".signature" Content-Transfer-Encoding: x-gzip64 Mime-Version: 1.0 X-Mailer: MIME-tools 3.204 (ME 3.204 ) Subject: Testing! Content-Length: 281 H4sIAJ+A5jIAA0VPTWvDMAy9+1e8nbpCsS877bRS1vayXdJDDwURbJEEEqez VdKC6W+fnQ0iwdN7ktAHQEQAzV7irAv9DI8fvHLGD/bCobai7TisFUyuXxJW lDB70aucxfHWtBxRnc4bfG+rrTmMztXBobrWlrHvu6YV7LwErVLZZP4n0IJA K3J9N2aaJj3YqD2LeZYzFC75tlTaCtsg/SGRwmJZklnI1wOxa3wtt8Dgu2V2 EdIyAudnBvaOHd7Qd57ji/oFWju6Pg4BAAA= apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-2gifs.msg0000644000000000000000000000457711702050534027541 0ustar rootrootReturn-Path: eryq@rhine.gsfc.nasa.gov Sender: john-bigboote Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Eryq Organization: Yoyodyne Propulsion Systems X-Mailer: Mozilla 2.0 (X11; I; Linux 1.1.18 i486) MIME-Version: 1.0 To: john-bigboote@eryq.pr.mcs.net Subject: Two images for you... Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE" This is a multi-part message in MIME format. --------------299A70B339B65A93542D2AE Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit When unpacked, this message should produce two GIF files: * The 1st should be called "3d-compress.gif" * The 2nd should be called "3d-eye.gif" Different ways of specifying the filenames have been used. -- ____ __ / __/__________/_/ Eryq (eryq@rhine.gsfc.nasa.gov) / __/ _/ / / , / Hughes STX Corporation, NASA/Goddard /___/_/ \ /\ /___ /_/ /_____/ http://selsvr.stx.com/~eryq/ --------------299A70B339B65A93542D2AE Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-compress.gif" R0lGODdhKAAoAOMAAAAAAAAAgB6Q/y9PT25ubnCAkKBSLb6+vufn5/Xes/+lAP/6zQAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJLMOyYbcoxkaZ5oCkoH6L5wLMfiWqd4btZhmxbA oFCY47EIqMJgyWw2ATjj7aRkAq5YwDMl9VGtKO0SiuoiTVlscsxt9c4HgXxUIA0EAVOVfDKT 8Hl1B3kDAYYle202XnGGgoMHhYckiWVuR3+OTgCGeZRslotwgJ2lnYigfZdTjQULr7ALBZN0 qTurjHgLKAu0B5Wqopm7J72etQN8t8Ijury+wMtvw8/Hv7Ylfs0BxCbGqMmK0yOOQ0GTCgrR 2bhwJGlXJQYG6mMKoeNoWSbzCWIACe5JwxQm3AkDAbUAQCiQhDZEBeBl6afgCsOBrD45edIv QceGWSMevpOYhl6CkydBHhBZQmGKjihVshypjB9ClAHZMTugzOU7mzhBPiSZ5uDNnA7b/aTZ 0mhMnfl0pDBFa6bUElSPWb0qtYuHrxlwcR17YsWMs2jTql3LFkQEADs= --------------299A70B339B65A93542D2AE Content-Type: image/gif; name="3d-eye.gif" Content-Transfer-Encoding: base64 R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7 VujnC96IRVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7 +3dCeRRjfAKHiImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatL rU8GaQdOBAQAB7+yXliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJ vs7Y5ewH3d7Fxe3jB4rj8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjw E0cdGxQ/gswosoKUkmuU2FnJcsSKGTBjypxJsyaICAA7 --------------299A70B339B65A93542D2AE-- That was a multi-part message in MIME format. apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-nested2_decoded.xml0000644000000000000000000000525111702050534031542 0ustar rootroot
MIME-Version: 1.0 From: Lord John Whorfin <whorfin@yoyodyne.com> To: <john-yaya@yoyodyne.com> Subject: A complex nested multipart example Content-Type: multipart/mixed; boundary=unique-boundary-1
The preamble of the outer multipart message. Mail readers that understand multipart format should ignore this preamble. If you are reading this text, you might want to consider changing to a mail reader that understands how to properly display multipart messages.
Content-type: text/plain; charset=US-ASCII
Subject: Part 3 of the outer message is multipart! Content-Type: multipart/parallel; boundary=unique-boundary-2
A one-line preamble for the inner multipart message.
Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-vise.gif" Subject: Part 1 of the inner message is a GIF, "3d-vise.gif"
Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-eye.gif" Subject: Part 2 of the inner message is another GIF, "3d-eye.gif"
The epilogue for the inner multipart message.
Content-type: text/richtext
Content-Type: message/rfc822; name="/evil/filename";
From: (mailbox in US-ASCII) To: (address in US-ASCII) Subject: Part 5 of the outer message is itself an RFC822 message! Content-Type: Text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: Quoted-printable
The epilogue for the outer message.
././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/double-semicolon_decoded_1_2.txtapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/double-semicolon_decoded_1_2.0000644000000000000000000000001711702050534032221 0ustar rootrootThe worse part apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-frag.msg0000644000000000000000000000640411702050534027435 0ustar rootrootMIME-Version: 1.0 From: Lord John Whorfin To: Subject: A complex nested multipart example Content-Type: multipart/mixed; boundary=unique-boundary-1 The preamble of the outer multipart message. Mail readers that understand multipart format should ignore this preamble. If you are reading this text, you might want to consider changing to a mail reader that understands how to properly display multipart messages. --unique-boundary-1 Part 1 of the outer message. [Note that the preceding blank line means no header fields were given and this is text, with charset US ASCII. It could have been done with explicit typing as in the next part.] --unique-boundary-1 Content-type: text/plain; charset=US-ASCII Part 2 of the outer message. This could have been part of the previous part, but illustrates explicit versus implicit typing of body parts. --unique-boundary-1 Subject: Part 3 of the outer message is multipart! Content-Type: multipart/parallel; boundary=unique-boundary-2 A one-line preamble for the inner multipart message. --unique-boundary-2 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-vise.gif" Subject: Part 1 of the inner message is a GIF, "3d-vise.gif" R0lGODdhKAAoAOMAAAAAAAAAgB6Q/y9PT25ubnCAkKBSLb6+vufn5/Xes/+lAP/6zQAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJLMOyYbcoxkaZ5oCkoH6L5wLMfiWqd4btZhmxbA oFCY47EIqMJgyWw2ATjj7aRkAq5YwDMl9VGtKO0SiuoiTVlscsxt9c4HgXxUIA0EAVOVfDKT 8Hl1B3kDAYYle202XnGGgoMHhYckiWVuR3+OTgCGeZRslotwgJ2lnYigfZdTjQULr7ALBZN0 qTurjHgLKAu0B5Wqopm7J72etQN8t8Ijury+wMtvw8/Hv7Ylfs0BxCbGqMmK0yOOQ0GTCgrR 2bhwJGlXJQYG6mMKoeNoWSbzCWIACe5JwxQm3AkDAbUAQCiQhDZEBeBl6afgCsOBrD45edIv QceGWSMevpOYhl6CkydBHhBZQmGKjihVshypjB9ClAHZMTugzOU7mzhBPiSZ5uDNnA7b/aTZ 0mhMnfl0pDBFa6bUElSPWb0qtYuHrxlwcR17YsWMs2jTql3LFkQEADs= --unique-boundary-2 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-eye.gif" Subject: Part 2 of the inner message is another GIF, "3d-eye.gif", but the terminating boundary is bad! R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7 VujnC96IRVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7 +3dCeRRjfAKHiImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatL rU8GaQdOBAQAB7+yXliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJ vs7Y5ewH3d7Fxe3jB4rj8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjw E0cdGxQ/gswosoKUkmuU2FnJcsSKGTBjypxJsyaICAA7 XXXXXX--unique-boundary-2-- The epilogue for the inner multipart message. --unique-boundary-1 Content-type: text/richtext This is part 4 of the outer message as defined in RFC1341 Isn't it cool? --unique-boundary-1 Content-Type: message/rfc822; name="nice.name"; From: (mailbox in US-ASCII) To: (address in US-ASCII) Subject: Part 5 of the outer message is itself an RFC822 message! Content-Type: Text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: Quoted-printable Part 5 of the outer message is itself an RFC822 message! --unique-boundary-1-- The epilogue for the outer message. apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-2evil_decoded_1_2.bin0000644000000000000000000000064311702050534031630 0ustar rootrootGIF87a((ã€ÿ/OOnnnp€ R-¾¾¾çççõÞ³ÿ¥ÿúÍ,((þÉI«½x’Ì;&rŒdižh Jè¾p,ÇâZ§xnÖa›À P˜ã±¨Â`Él68ãí¤d®XÀ3%õQ­(íŠê"MYlrÌmõÎ|T S•|2“ðyuy†%{m6^q†‚ƒ…‡$‰enGŽN†y”l–‹p€¥ˆ }—S ¯° “t©;«Œx ( ´•ª¢™»'½žµ|·Â#º¼¾ÀËoÃÏÇ¿¶%~ÍÄ&ƨɊÓ#ŽCA“ ÑÙ¸p$iW%êc ¡ãhY&ó b îIÃ&Ü µ@(„6Dàeé§à ì>9yÒ/AdžY#¾“˜†^‚“'AYBaŠŽ(U²©ŒB”Ù1; Ìå;›8A>$™æàÍœÛý¤ÙÒhLùt¤0Ek¦ÔTY½*µ‹‡¯pq{bÅŒ³hÓª]ËD;././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/double-semicolon2_decoded_1_1.txtapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/double-semicolon2_decoded_1_10000644000000000000000000000002011702050534032216 0ustar rootrootThe better part ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-digest_decoded_1_2_1.txtapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-digest_decoded_1_2_1.tx0000644000000000000000000000011311702050534032161 0ustar rootrootThis is explicitly typed plain ASCII text. It DOES end with a linebreak. apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-igor2_decoded_1_3.txt0000644000000000000000000000631011702050534031676 0ustar rootrootMIME-Version: 1.0 From: Lord John Whorfin To: Subject: A complex nested multipart example Content-Type: multipart/mixed; boundary=unique-boundary-1 The preamble of the outer multipart message. Mail readers that understand multipart format should ignore this preamble. If you are reading this text, you might want to consider changing to a mail reader that understands how to properly display multipart messages. --unique-boundary-1 Part 1 of the outer message. [Note that the preceding blank line means no header fields were given and this is text, with charset US ASCII. It could have been done with explicit typing as in the next part.] --unique-boundary-1 Content-type: text/plain; charset=US-ASCII Part 2 of the outer message. This could have been part of the previous part, but illustrates explicit versus implicit typing of body parts. --unique-boundary-1 Subject: Part 3 of the outer message is multipart! Content-Type: multipart/parallel; boundary=unique-boundary-2 A one-line preamble for the inner multipart message. --unique-boundary-2 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-compress.gif" Subject: Part 1 of the inner message is a GIF, "3d-compress.gif" R0lGODdhKAAoAOMAAAAAAAAAgB6Q/y9PT25ubnCAkKBSLb6+vufn5/Xes/+lAP/6zQAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJLMOyYbcoxkaZ5oCkoH6L5wLMfiWqd4btZhmxbA oFCY47EIqMJgyWw2ATjj7aRkAq5YwDMl9VGtKO0SiuoiTVlscsxt9c4HgXxUIA0EAVOVfDKT 8Hl1B3kDAYYle202XnGGgoMHhYckiWVuR3+OTgCGeZRslotwgJ2lnYigfZdTjQULr7ALBZN0 qTurjHgLKAu0B5Wqopm7J72etQN8t8Ijury+wMtvw8/Hv7Ylfs0BxCbGqMmK0yOOQ0GTCgrR 2bhwJGlXJQYG6mMKoeNoWSbzCWIACe5JwxQm3AkDAbUAQCiQhDZEBeBl6afgCsOBrD45edIv QceGWSMevpOYhl6CkydBHhBZQmGKjihVshypjB9ClAHZMTugzOU7mzhBPiSZ5uDNnA7b/aTZ 0mhMnfl0pDBFa6bUElSPWb0qtYuHrxlwcR17YsWMs2jTql3LFkQEADs= --unique-boundary-2 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-eye.gif" Subject: Part 2 of the inner message is another GIF, "3d-eye.gif" R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7 VujnC96IRVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7 +3dCeRRjfAKHiImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatL rU8GaQdOBAQAB7+yXliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJ vs7Y5ewH3d7Fxe3jB4rj8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjw E0cdGxQ/gswosoKUkmuU2FnJcsSKGTBjypxJsyaICAA7 --unique-boundary-2-- The epilogue for the inner multipart message. --unique-boundary-1 Content-type: text/richtext This is part 4 of the outer message as defined in RFC1341 Isn't it cool? --unique-boundary-1 Content-Type: message/rfc822 From: (mailbox in US-ASCII) To: (address in US-ASCII) Subject: Part 5 of the outer message is itself an RFC822 message! Content-Type: Text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: Quoted-printable Part 5 of the outer message is itself an RFC822 message! --unique-boundary-1-- The epilogue for the outer message. apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/german-qp_decoded.xml0000644000000000000000000000113711702050534030734 0ustar rootroot
Content-Type: text/plain; charset="iso-8859-15" Content-Disposition: inline Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Mailer: JaM - Just A Mailer Subject: Testnachricht Return-Path: <joern@zyn.de> Date: Wed, 21 Dec 2005 22:02:44 +0100 To: joern@zyn.de From: =?ISO-8859-15?Q?J=F6rn?= Reder <joern@zyn.de>
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/ticket-60931.xml0000644000000000000000000000112511702050534027336 0ustar rootroot
MIME-Version: 1.0 Received: by 10.220.78.157 with HTTP; Thu, 26 Aug 2010 21:33:17 -0700 (PDT) Content-Type: multipart/alternative; boundary=90e6ba4fc6ea25d329048ec69d99
Content-Type: text/plain; charset=ISO-8859-1
HELLO
Content-Type: text/html; charset=ISO-8859-1
HELLO<br>
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/badfile_decoded.xml0000644000000000000000000000065111702050534030433 0ustar rootroot
From: Michelle Holm <holm@sitka.colorado.edu> To: imswww@rhine.gsfc.nasa.gov Mime-Version: 1.0 Subject: note the bogus filename Content-Type: text/plain; charset=iso-8859-1; name="/tmp/whoa" Content-Transfer-Encoding: 8bit
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/frag.msg0000644000000000000000000025525311702050534026315 0ustar rootrootReturn-Path: Received: from virtual.mrf.mail.rcn.net ([207.172.4.103]) by mta05.mrf.mail.rcn.net (InterMail vM.4.01.02.27 201-229-119-110) with ESMTP id <20000524184032.XKFS1688.mta05.mrf.mail.rcn.net@virtual.mrf.mail.rcn.net> for ; Wed, 24 May 2000 14:40:32 -0400 Received: from mail.desktop.com ([166.90.128.242]) by virtual.mrf.mail.rcn.net with esmtp (Exim 2.12 #3) id 12ug50-00059f-00 for eryq@zeegee.com; Wed, 24 May 2000 14:40:30 -0400 Received: from mailandnews.com (jumpgate.desktop.com [166.90.128.243]) by mail.desktop.com (8.9.2/8.9.2) with ESMTP id LAA31102 for ; Wed, 24 May 2000 11:40:29 -0700 (PDT) (envelope-from omrec@mailandnews.com) Message-ID: <392C2385.4C402C55@mailandnews.com> Date: Wed, 24 May 2000 11:46:29 -0700 From: Sven Reply-To: omrec@mailandnews.com X-Mailer: Mozilla 4.7 [en] (WinNT; I) X-Accept-Language: en MIME-Version: 1.0 To: Eryq Subject: [Fwd: [Fwd: [Fwd: FW: Another Priceless Moment]]] Content-Type: multipart/mixed; boundary="------------ABE49921AF9E83E8F9A7667E" X-Mozilla-Status: 8001 This is a multi-part message in MIME format. --------------ABE49921AF9E83E8F9A7667E Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit --------------ABE49921AF9E83E8F9A7667E Content-Type: message/rfc822 Content-Transfer-Encoding: 7bit Content-Disposition: inline Received: from mail.vynce.org [63.198.43.13] (vynce@vynce.org); Tue, 23 May 2000 22:00:16 -0400 X-Envelope-To: omrec Received: from vynce.org (166.90.128.243) by mail.vynce.org with ESMTP (Eudora Internet Mail Server 1.3.1); Tue, 23 May 2000 19:05:52 -0700 Message-ID: <392B389A.1968998B@vynce.org> Date: Tue, 23 May 2000 19:04:10 -0700 From: Vynce Organization: Desktop.com X-Mailer: Mozilla 4.61 [en] (Win98; U) X-Accept-Language: en MIME-Version: 1.0 To: omrec@mailandnews.com Subject: [Fwd: [Fwd: FW: Another Priceless Moment]] Content-Type: multipart/mixed; boundary="------------4CEB5E448DC077F35050C4BE" X-Mozilla-Status2: 00000000 This is a multi-part message in MIME format. --------------4CEB5E448DC077F35050C4BE Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit just to add to your personal hell. --------------4CEB5E448DC077F35050C4BE Content-Type: message/rfc822 Content-Transfer-Encoding: 7bit Content-Disposition: inline Return-Path: Received: from iglou.com (192.107.41.3) by mail.vynce.org with SMTP (Eudora Internet Mail Server 1.3.1); Thu, 18 May 2000 16:10:02 -0700 Received: from [204.255.234.19] (helo=ntserver2.snesystems.com) by iglou.com with esmtp (8.9.3/8.9.3) id 12sZKw-0007JK-00; Thu, 18 May 2000 19:04:15 -0400 Received: from snesystems.com (sne-30.snesystems.com [204.255.234.30]) by ntserver2.snesystems.com with SMTP (Microsoft Exchange Internet Mail Service Version 5.5.2650.21) id LGJH8AYQ; Thu, 18 May 2000 19:03:40 -0400 Sender: root@mail.vynce.org Message-ID: <39247724.AF25EF83@snesystems.com> Date: Thu, 18 May 2000 19:05:08 -0400 From: root Reply-To: jasonc@snesystems.com Organization: SNE Systems, Inc. X-Mailer: Mozilla 4.72 [en] (X11; I; Linux 2.2.12-20 i686) X-Accept-Language: ja, en MIME-Version: 1.0 To: vynce@vynce.org Subject: [Fwd: FW: Another Priceless Moment] Content-Type: multipart/mixed; boundary="------------8B533A82922407D7C3D35A99" X-Mozilla-Status2: 00000000 This is a multi-part message in MIME format. --------------8B533A82922407D7C3D35A99 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit --------------8B533A82922407D7C3D35A99 Content-Type: message/rfc822 Content-Transfer-Encoding: 7bit Content-Disposition: inline Received: by ntserver2 id <01BFC0CA.C31F7A10@ntserver2>; Thu, 18 May 2000 09:12:47 -0400 Message-ID: <01D476341BDBD211B7C500A0CC209BA03DF5C6@ntserver2> From: Shawn Morgan To: Wayne Price , Tim Spayner , Gary Jones , Jason Chelliah Subject: FW: Another Priceless Moment Date: Thu, 18 May 2000 09:12:47 -0400 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----_=_NextPart_000_01BFC0CA.C32A4450" This message is in MIME format. Since your mail reader does not understand this format, some or all of this message may not be legible. ------_=_NextPart_000_01BFC0CA.C32A4450 Content-Type: text/plain; charset="iso-8859-1" -----Original Message----- From: Shawn Morgan [mailto:cephalos@home.com] Sent: Wednesday, May 17, 2000 8:18 PM To: Shawn Morgan Subject: Fw: Another Priceless Moment ----- Original Message ----- From: Michele Morgan To: Sent: Tuesday, May 16, 2000 10:31 PM Subject: Fw: Another Priceless Moment > > ------_=_NextPart_000_01BFC0CA.C32A4450 Content-Type: image/jpeg; name="aprilfools.jpg" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="aprilfools.jpg" /9j/4AAQSkZJRgABAgEASABIAAD/7Q4uUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQABOEJJTQQNAAAAAAAEAAAAeDhCSU0D8wAAAAAACAAAAAAAAAAAOEJJTQQKAAAAAAAB AAA4QklNJxAAAAAAAAoAAQAAAAAAAAACOEJJTQP1AAAAAABIAC9mZgABAGxmZgAGAAAAAAABAC9m ZgABAKGZmgAGAAAAAAABADIAAAABAFoAAAAGAAAAAAABADUAAAABAC0AAAAGAAAAAAABOEJJTQP4 AAAAAABwAAD/////////////////////////////A+gAAAAA//////////////////////////// /wPoAAAAAP////////////////////////////8D6AAAAAD///////////////////////////// A+gAADhCSU0EAAAAAAAAAgACOEJJTQQCAAAAAAAGAAAAAAAAOEJJTQQIAAAAAAAQAAAAAQAAAkAA AAJAAAAAADhCSU0EFAAAAAAABAAAAAQ4QklNBAwAAAAADH4AAAABAAAAcAAAAFQAAAFQAABuQAAA DGIAGAAB/9j/4AAQSkZJRgABAgEASABIAAD/7gAOQWRvYmUAZIAAAAAB/9sAhAAMCAgICQgMCQkM EQsKCxEVDwwMDxUYExMVExMYEQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQ0L Cw0ODRAODhAUDg4OFBQODg4OFBEMDAwMDBERDAwMDAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM DAwMDAz/wAARCABUAHADASIAAhEBAxEB/90ABAAH/8QBPwAAAQUBAQEBAQEAAAAAAAAAAwABAgQF BgcICQoLAQABBQEBAQEBAQAAAAAAAAABAAIDBAUGBwgJCgsQAAEEAQMCBAIFBwYIBQMMMwEAAhED BCESMQVBUWETInGBMgYUkaGxQiMkFVLBYjM0coLRQwclklPw4fFjczUWorKDJkSTVGRFwqN0NhfS VeJl8rOEw9N14/NGJ5SkhbSVxNTk9KW1xdXl9VZmdoaWprbG1ub2N0dXZ3eHl6e3x9fn9xEAAgIB AgQEAwQFBgcHBgU1AQACEQMhMRIEQVFhcSITBTKBkRShsUIjwVLR8DMkYuFygpJDUxVjczTxJQYW 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 AAEBAP/iDFhJQ0NfUFJPRklMRQABAQAADEhMaW5vAhAAAG1udHJSR0IgWFlaIAfOAAIACQAGADEA AGFjc3BNU0ZUAAAAAElFQyBzUkdCAAAAAAAAAAAAAAAAAAD21gABAAAAANMtSFAgIAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEWNwcnQAAAFQAAAAM2Rlc2MA AAGEAAAAbHd0cHQAAAHwAAAAFGJrcHQAAAIEAAAAFHJYWVoAAAIYAAAAFGdYWVoAAAIsAAAAFGJY WVoAAAJAAAAAFGRtbmQAAAJUAAAAcGRtZGQAAALEAAAAiHZ1ZWQAAANMAAAAhnZpZXcAAAPUAAAA JGx1bWkAAAP4AAAAFG1lYXMAAAQMAAAAJHRlY2gAAAQwAAAADHJUUkMAAAQ8AAAIDGdUUkMAAAQ8 AAAIDGJUUkMAAAQ8AAAIDHRleHQAAAAAQ29weXJpZ2h0IChjKSAxOTk4IEhld2xldHQtUGFja2Fy ZCBDb21wYW55AABkZXNjAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAEnNSR0Ig SUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAABYWVogAAAAAAAA81EAAQAAAAEWzFhZWiAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAG+i AAA49QAAA5BYWVogAAAAAAAAYpkAALeFAAAY2lhZWiAAAAAAAAAkoAAAD4QAALbPZGVzYwAAAAAA AAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNo AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRlc2MAAAAAAAAA LklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAA LklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAA AAAAAAAAAAAAAABkZXNjAAAAAAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVD NjE5NjYtMi4xAAAAAAAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYx OTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdmlldwAAAAAAE6T+ABRfLgAQzxQAA+3M AAQTCwADXJ4AAAABWFlaIAAAAAAATAlWAFAAAABXH+dtZWFzAAAAAAAAAAEAAAAAAAAAAAAAAAAA AAAAAAACjwAAAAJzaWcgAAAAAENSVCBjdXJ2AAAAAAAABAAAAAAFAAoADwAUABkAHgAjACgALQAy ADcAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8AIEAhgCLAJAAlQCaAJ8ApACpAK4AsgC3ALwA wQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEHAQ0BEwEZAR8BJQErATIBOAE+AUUBTAFSAVkBYAFn AW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB0QHZAeEB6QHyAfoCAwIMAhQCHQImAi8COAJBAksC VAJdAmcCcQJ6AoQCjgKYAqICrAK2AsECywLVAuAC6wL1AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+ A4oDlgOiA64DugPHA9MD4APsA/kEBgQTBCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE0wThBPAE /gUNBRwFKwU6BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZBmoGewaMBp0GrwbA BtEG4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8IMghGCFoIbgiCCJYIqgi+CNII 5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9ClQKagqBCpgKrgrFCtwK8wsLCyILOQtR C2kLgAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4MpwzADNkM8w0NDSYNQA1aDXQNjg2pDcMN3g34DhMO Lg5JDmQOfw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MPzw/sEAkQJhBDEGEQfhCbELkQ1xD1ERMRMRFP EW0RjBGqEckR6BIHEiYSRRJkEoQSoxLDEuMTAxMjE0MTYxODE6QTxRPlFAYUJxRJFGoUixStFM4U 8BUSFTQVVhV4FZsVvRXgFgMWJhZJFmwWjxayFtYW+hcdF0EXZReJF64X0hf3GBsYQBhlGIoYrxjV GPoZIBlFGWsZkRm3Gd0aBBoqGlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4d Rx1wHZkdwx3sHhYeQB5qHpQevh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7 IiciVSKCIq8i3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgllyXHJfcmJyZXJocmtyboJxgn SSd6J6sn3CgNKD8ocSiiKNQpBik4KWspnSnQKgIqNSpoKpsqzysCKzYraSudK9EsBSw5LG4soizX LQwtQS12Last4S4WLkwugi63Lu4vJC9aL5Evxy/+MDUwbDCkMNsxEjFKMYIxujHyMioyYzKbMtQz DTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9Njc2cjauNuk3JDdgN5w31zgUOFA4jDjIOQU5Qjl/ Obw5+To2OnQ6sjrvOy07azuqO+g8JzxlPKQ84z0iPWE9oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRA pkDnQSlBakGsQe5CMEJyQrVC90M6Q31DwEQDREdEikTORRJFVUWaRd5GIkZnRqtG8Ec1R3tHwEgF SEtIkUjXSR1JY0mpSfBKN0p9SsRLDEtTS5pL4kwqTHJMuk0CTUpNk03cTiVObk63TwBPSU+TT91Q J1BxULtRBlFQUZtR5lIxUnxSx1MTU19TqlP2VEJUj1TbVShVdVXCVg9WXFapVvdXRFeSV+BYL1h9 WMtZGllpWbhaB1pWWqZa9VtFW5Vb5Vw1XIZc1l0nXXhdyV4aXmxevV8PX2Ffs2AFYFdgqmD8YU9h omH1YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1mkmboZz1nk2fpaD9olmjsaUNpmmnxakhqn2r3 a09rp2v/bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6cZVx8HJLcqZzAXNdc7h0FHRwdMx1 KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF84X1BfaF+AX5ifsJ/I3+E f+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZyhteHO4efiASIaYjOiTOJmYn+imSK yoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q1pE/kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0 lp+XCpd1l+CYTJi4mSSZkJn8mmia1ZtCm6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNihR6G2oiai lqMGo3aj5qRWpMelOKWpphqmi6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2uoa8W r4uwALB1sOqxYLHWskuywrM4s660JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7urW7LrunvCG8 m70VvY++Cr6Evv+/er/1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dBx7/IPci8yTrJuco4 yrfLNsu2zDXMtc01zbXONs62zzfPuNA50LrRPNG+0j/SwdNE08bUSdTL1U7V0dZV1tjXXNfg2GTY 6Nls2fHadtr724DcBdyK3RDdlt4c3qLfKd+v4DbgveFE4cziU+Lb42Pj6+Rz5PzlhOYN5pbnH+ep 6DLovOlG6dDqW+rl63Dr++yG7RHtnO4o7rTvQO/M8Fjw5fFy8f/yjPMZ86f0NPTC9VD13vZt9vv3 ivgZ+Kj5OPnH+lf65/t3/Af8mP0p/br+S/7c/23////uAA5BZG9iZQBkAAAAAAH/2wCEAAYEBAQF BAYFBQYJBgUGCQsIBgYICwwKCgsKCgwQDAwMDAwMEAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM DAwBBwcHDQwNGBAQGBQODg4UFA4ODg4UEQwMDAwMEREMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwM DAwMDAwMDAwMDP/AABEIAeACgAMBEQACEQEDEQH/3QAEAFD/xAGiAAAABwEBAQEBAAAAAAAAAAAE BQMCBgEABwgJCgsBAAICAwEBAQEBAAAAAAAAAAEAAgMEBQYHCAkKCxAAAgEDAwIEAgYHAwQCBgJz AQIDEQQABSESMUFRBhNhInGBFDKRoQcVsUIjwVLR4TMWYvAkcoLxJUM0U5KismNzwjVEJ5OjszYX VGR0w9LiCCaDCQoYGYSURUaktFbTVSga8uPzxNTk9GV1hZWltcXV5fVmdoaWprbG1ub2N0dXZ3eH l6e3x9fn9zhIWGh4iJiouMjY6PgpOUlZaXmJmam5ydnp+So6SlpqeoqaqrrK2ur6EQACAgECAwUF BAUGBAgDA20BAAIRAwQhEjFBBVETYSIGcYGRMqGx8BTB0eEjQhVSYnLxMyQ0Q4IWklMlomOywgdz 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 q4g+/wBOKrh0r3HTFVhDDqevhirVCHJ6bde+KtToWhNW2FT94xVbHVYIjy+P4eP0ZFtx8050pX1o zAcrJIF5xTyitZP99oRuvPsWwF22I0LRFvJLPKsdpEPWY8JpH2o7Ap8R8aimRbweJL7meWe3kjSO UvaExvyO5OKeClkl7cRWkcYqsZCgIdmr3APfFqlFM7DTF1O9Vbw8oYlqig05HwIxboZKRd/La6be W1jZIvqXFUdPskBlNfiwo+opNqVu73sUssKehH8MdtuSVU0K/NsDbE0jrTT71XJkkWJJBzSMmirT 7KqT+1kSmMt1trolrqv1u5aVXjtVHqK7GNUJH2zx3ffwwLOW6hNNM9otvLKtrKKRMXJU8gPhovU/ CcHCw4lDTvLWnwalZ3P6QNybct60YQqAT0JPsclEKSmEdhY/pPULm3kAiaNISUbYS8qlqftfD8OS Qp2OlST6tE87LPb2tJfTc8RV24Vp/qiuQRki7VJ5RexWkYItxLxZx/LyNA2GmyI2TjV7HTU0e4CR rGgjY8kFGFCKke+PCwjzWW19oT2SpAoeqEUNCWNMkESviSyGzt20uS6IaOW93EYruD9lae2LOORB 2ltqWlre2shKX1+EFjcH4yp2oK9sWUpWmd7o+qzzSSXrrLa3VuLa5h5lVDruZBX4a1xYjmgLCcLq S6dptuOUcPKYqQFb09uS02rizmo65BqepwTQWyvGaDkDxUU9hinYBlunaDaDSoUuwkzMimVpO527 9sBcMzNsb1prWaxS2QWz28CGKEsT6sbgn4dvtZFyNOLKF0qe3k0eS1nSnH+7+L4yxYfEoO/wqCuL dOA4il811c2T+jayFTUFX7jfo2LLw9l2tprss9p9ZijkkJohQ0oxFV38MWojhR2swxDg6SNb3USK 4eNvhSUAcipyJZjITAphqWiX0yW2pS3jzRafAtzJcn+5mc/7qiVeh/yssi4cJEFLtcv7SzeB76wW C8YJNHJQOOD9myLeBTa2ljqV4kt7cRSiMBo7cLWqnooAxZSyUuutEM90hsZPqkinZo6A8fkMWPjI fU9AtrSSDU74tdurUZpPiI49NsmEylxBqbWLOe1Z7cKxXiaKu9V37YWsR6Kia9pOqXltNf2EaSsw SW4XmgbagDKNmwJ8FEzeYdTewljs4WF3YzqZRAnOMwA9qdOS9sLXOFFj0t1BfeZnNvI9pb3ClpQP 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 Ec7jlsTUD2I8cWUrR9zpt9diNbG --------------8B533A82922407D7C3D35A99-- --------------4CEB5E448DC077F35050C4BE-- --------------ABE49921AF9E83E8F9A7667E-- ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/uu-junk-target_decoded_1_1.txtapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/uu-junk-target_decoded_1_1.tx0000644000000000000000000000060011702050534032214 0ustar rootrootEryq - I occasionally receive an email (see below) like this one, which MIME::Parser does not parse. Any ideas? Is this a valid way to send an attachment, or is the problem on the "sender's" side? Thanks for your time! Mike -->> Promote YOUR web site! FREE Perl CGI scripts add WEB ACCESS to your -->> E-Mail accounts! Download today!! http://webmail.uwohali.com apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-igor_decoded_1_4.txt0000644000000000000000000000161211702050534031615 0ustar rootroot* Waiting for a MIME message from STDIN... ============================================================ Content-type: multipart/mixed Body-file: NONE Subject: A complex nested multipart example Num-parts: 3 -- Content-type: text/plain Body-file: ./testout/msg-3538-1.doc -- Content-type: text/plain Body-file: ./testout/msg-3538-2.doc -- Content-type: multipart/parallel Body-file: NONE Subject: Part 3 of the outer message is multipart! Num-parts: 2 -- Content-type: image/gif Body-file: ./testout/3d-compress.gif Subject: Part 1 of the inner message is a GIF, "3d-compress.gif" -- Content-type: image/gif Body-file: ./testout/3d-eye.gif Subject: Part 2 of the inner message is another GIF, "3d-eye.gif" -- ============================================================ apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/ticket-60931.out0000644000000000000000000000060411702050534027346 0ustar rootrootMIME-Version: 1.0 Received: by 10.220.78.157 with HTTP; Thu, 26 Aug 2010 21:33:17 -0700 (PDT) Content-Type: multipart/alternative; boundary=90e6ba4fc6ea25d329048ec69d99 --90e6ba4fc6ea25d329048ec69d99 Content-Type: text/plain; charset=ISO-8859-1 HELLO --90e6ba4fc6ea25d329048ec69d99 Content-Type: text/html; charset=ISO-8859-1 HELLO
--90e6ba4fc6ea25d329048ec69d99-- apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-igor_decoded_1_1.txt0000644000000000000000000000046411702050534031616 0ustar rootrootDear Sir, I have a problem with Your MIME-Parser-1.9 and multipart-nested messages. Not all parts are parsed. Here my Makefile, Your own multipart-nested.msg and its out after "make test". Some my messages not completely parsed too. Is this a bug? Thank You for help. Igor Starovoytov.apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/german_decoded.xml0000644000000000000000000000403111702050534030312 0ustar rootroot
X-POP3-Rcpt: specht@trachea Return-Path: hermes Received: (from hermes@localhost) by kulturbox.netmbx.de (8.7.1/8.7.1) id SAA04513 for specht; Wed, 19 Jun 1996 18:30:12 +0200 Received: by netmbx.netmbx.de (/\==/\ Smail3.1.28.1) from mail.cs.tu-berlin.de with smtp id <m0uWPrO-0004wpC>; Wed, 19 Jun 96 18:12 MES Received: (from nobody@localhost) by mail.cs.tu-berlin.de (8.6.12/8.6.12) id SAA12413; Wed, 19 Jun 1996 18:26:28 +0200 Resent-Date: Wed, 19 Jun 1996 18:26:28 +0200 Resent-Message-Id: <199606191626.SAA12413@mail.cs.tu-berlin.de> Resent-From: nobody@cs.tu-berlin.de Resent-To: kultur@kulturbox.netmbx.de Received: from gatekeeper.telekom.de ([194.25.15.11]) by mail.cs.tu-berlin.de (8.6.12/8.6.12) with SMTP id SAA11678 for <specht@kulturbox.de>; Wed, 19 Jun 1996 18:11:29 +0200 Received: from ULM02.mnh.telekom.de by gatekeeper.telekom.de; (5.65v3.0/1.1.8.2/02Aug95-0132PM) id AA01376; Wed, 19 Jun 1996 18:11:27 +0200 Received: from ulm02.mnh.telekom.de (deuschle@mnh.telekom.de) by ULM02.mnh.telekom.de (8.6.10/3) with SMTP id SAA30680 for <specht@kulturbox.de>; Wed, 19 Jun 1996 18:14:40 GMT Message-Id: <199606191814.SAA30680@ULM02.mnh.telekom.de> X-Sender: deuschle@ulm02.mnh.telekom.de X-Mailer: Windows Eudora Version 1.4.4 Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Date: Wed, 19 Jun 1996 18:12:02 +0200 To: Juergen Specht <specht@kulturbox.de> From: deuschle@mnh.telekom.de (Guenter Deuschle) Subject: Re: 34Mbit/s Netz X-Mozilla-Status: 0011
././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-weirdspace_decoded_1_3.binapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-weirdspace_decoded_1_3.0000644000000000000000000000054511702050534032246 0ustar rootrootGIF87a((óÌÝîÿ¾¾¾ˆˆˆnnnÌÝîÿÿÿççç,((þÉI«½x–Ì;.2Œdižh Jè¾p,ÇâZ{8Ö†mîS;Vèç ÞˆE[Y8Ÿã’ù¬Bk¼¡ÏÊD•ZN×z‘†-ãkÆŒI;S# ¸í†äYt:ÀïûûwByc|‡ˆ‰‰_ƒ]‰nUBV‘‡“c–G˜šœ“‚—¡¢i¤Ÿ§©U±U«K­OiN¿²^X—N¸ÆÅ¸¼V›¿ÀN´··¿ˆOÙÎÈÑÆà¸ÎºŠÍÏWlàÉ¾ÎØåìÝÞÅÅíãŠãòÞ¸Öº¯fá)Í×±X*LhÍ#aǘ4œC!–ĉŽ$X¼8ðG?‚Ì(²‚”’k”ØYÉrÄŠ0cÊœI³&ˆ;apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/double-bound_decoded_1_3.txt0000644000000000000000000000000011702050534032071 0ustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-weirdspace.msg0000644000000000000000000000446511702050534030651 0ustar rootrootReturn-Path: eryq@rhine.gsfc.nasa.gov Sender: john-bigboote Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Eryq Organization: Yoyodyne Propulsion Systems X-Mailer: Mozilla 2.0 (X11; I; Linux 1.1.18 i486) MIME-Version: 1.0 To: john-bigboote@eryq.pr.mcs.net Subject: Two images for you... Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE" --------------299A70B339B65A93542D2AE Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit When unpacked, this message should produce two GIF files: * The 1st should be called "3d-compress.gif" * The 2nd should be called "3d-eye.gif" There is an empty preamble, and linear space after the bounds. -- ____ __ / __/__________/_/ Eryq (eryq@rhine.gsfc.nasa.gov) / __/ _/ / / , / Hughes STX Corporation, NASA/Goddard /___/_/ \ /\ /___ /_/ /_____/ http://selsvr.stx.com/~eryq/ --------------299A70B339B65A93542D2AE Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-compress.gif" R0lGODdhKAAoAOMAAAAAAAAAgB6Q/y9PT25ubnCAkKBSLb6+vufn5/Xes/+lAP/6zQAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJLMOyYbcoxkaZ5oCkoH6L5wLMfiWqd4btZhmxbA oFCY47EIqMJgyWw2ATjj7aRkAq5YwDMl9VGtKO0SiuoiTVlscsxt9c4HgXxUIA0EAVOVfDKT 8Hl1B3kDAYYle202XnGGgoMHhYckiWVuR3+OTgCGeZRslotwgJ2lnYigfZdTjQULr7ALBZN0 qTurjHgLKAu0B5Wqopm7J72etQN8t8Ijury+wMtvw8/Hv7Ylfs0BxCbGqMmK0yOOQ0GTCgrR 2bhwJGlXJQYG6mMKoeNoWSbzCWIACe5JwxQm3AkDAbUAQCiQhDZEBeBl6afgCsOBrD45edIv QceGWSMevpOYhl6CkydBHhBZQmGKjihVshypjB9ClAHZMTugzOU7mzhBPiSZ5uDNnA7b/aTZ 0mhMnfl0pDBFa6bUElSPWb0qtYuHrxlwcR17YsWMs2jTql3LFkQEADs= --------------299A70B339B65A93542D2AE Content-Type: image/gif; name="3d-eye.gif" Content-Transfer-Encoding: base64 R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7 VujnC96IRVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7 +3dCeRRjfAKHiImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatL rU8GaQdOBAQAB7+yXliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJ vs7Y5ewH3d7Fxe3jB4rj8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjw E0cdGxQ/gswosoKUkmuU2FnJcsSKGTBjypxJsyaICAA7 --------------299A70B339B65A93542D2AE-- ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-nested_decoded_1_5_1.txtapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-nested_decoded_1_5_1.tx0000644000000000000000000000007211702050534032173 0ustar rootrootPart 5 of the outer message is itself an RFC822 message! apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/ak-0696.msg0000644000000000000000000001130611702050534026360 0ustar rootrootDate: Thu, 20 Jun 1996 08:35:17 +0200 From: Juergen Specht Organization: KULTURBOX X-Mailer: Mozilla 2.02 (WinNT; I) MIME-Version: 1.0 To: andreas.koenig@mind.de, kun@pop.combox.de, 101762.2307@compuserve.com Subject: [Fwd: Re: 34Mbit/s Netz] Content-Type: MULTIPART/MIXED; boundary="------------70522FC73543" X-Filter: mailagent [version 3.0 PL44] for k@.in-berlin.de This is a multi-part message in MIME format. --------------70522FC73543 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit -- Juergen Specht - KULTURBOX --------------70522FC73543 Content-Type: message/rfc822 Content-Transfer-Encoding: 7bit Content-Disposition: inline X-POP3-Rcpt: specht@trachea Return-Path: hermes Received: (from hermes@localhost) by kulturbox.netmbx.de (8.7.1/8.7.1) id SAA04513 for specht; Wed, 19 Jun 1996 18:30:12 +0200 Received: by netmbx.netmbx.de (/\==/\ Smail3.1.28.1) from mail.cs.tu-berlin.de with smtp id ; Wed, 19 Jun 96 18:12 MES Received: (from nobody@localhost) by mail.cs.tu-berlin.de (8.6.12/8.6.12) id SAA12413; Wed, 19 Jun 1996 18:26:28 +0200 Resent-Date: Wed, 19 Jun 1996 18:26:28 +0200 Resent-Message-Id: <199606191626.SAA12413@mail.cs.tu-berlin.de> Resent-From: nobody@cs.tu-berlin.de Resent-To: kultur@kulturbox.netmbx.de Received: from gatekeeper.telekom.de ([194.25.15.11]) by mail.cs.tu-berlin.de (8.6.12/8.6.12) with SMTP id SAA11678 for ; Wed, 19 Jun 1996 18:11:29 +0200 Received: from ULM02.mnh.telekom.de by gatekeeper.telekom.de; (5.65v3.0/1.1.8.2/02Aug95-0132PM) id AA01376; Wed, 19 Jun 1996 18:11:27 +0200 Received: from ulm02.mnh.telekom.de (deuschle@mnh.telekom.de) by ULM02.mnh.telekom.de (8.6.10/3) with SMTP id SAA30680 for ; Wed, 19 Jun 1996 18:14:40 GMT Message-Id: <199606191814.SAA30680@ULM02.mnh.telekom.de> X-Sender: deuschle@ulm02.mnh.telekom.de X-Mailer: Windows Eudora Version 1.4.4 Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Date: Wed, 19 Jun 1996 18:12:02 +0200 To: Juergen Specht From: deuschle@mnh.telekom.de (Guenter Deuschle) Subject: Re: 34Mbit/s Netz X-Mozilla-Status: 0011 Hallo Herr Specht, entschuldigen Sie vorab, dass ich Ihnen nicht telefonisch zur Verfuegung stehe, ich Praesentationen gehalten/ noch zu halten und viele Kundennachfragen zu projektieren. Nach Informationen des Produkt-Managers Temme steht der POP schon zur Verf=FCgung! Standort: voraussichtlich: Winterfeldstr. 21, 10781 Berlin. Der POP hat zur Zeit direkte 34M-Anbindungen zu folgenden Orten: Rostock, Hamburg, Hannover & Leipzig. 4 weitere werden in kuerze in Betrieb gehen. Damit haben Sie einen Besonderen Sicherheitsstandard verfuegbar! Kontakt muessen Sie ueber Ihre oerltliche Vertriebseinheit aufnehmen: entweder den Geschaefts-Kunden-Vertrieb oder das GrossKundenManagement. Diese Vertriebseinheiten greifen auf den oertlichen Technischen Vertriebs-Support zu. Die Informationen werden ueber TVS zur Vertriebseiheit gegeben und dann zu Ihnen. Sie benoetigen eine Standleitung von Ihrer Lokation zum Internet-POP Uebergabepunkt zu Ihrem Info-Server ist ein CISCO 1000-Router. Dann zahlen Sie neben den monatlichen Kosten fuer die Standleitung die Kosten fuer den Internet-Zugang: zB bei 64k: 1500DM bei 2GByte Freivolumen. 128K: 3000 DM bei 5 GB Freivolumen & 2M: 30.000 DM bei 50GB Freivolumen. Freundliche Gruesse=20 Guenter Deuschle >Sehr geehrter Herr Deuschle, >Sie sind mir von Herrn Meyendriesch empfohlen worden. >Ich versuche Informationen ueber das T-eigene 34Mbit/s Netz und den=20 >lokalen Pop-Berlin rauszufinden, bzw. was ein Anschluss kostet und=20 >wo man ihn herbekommt. Laut Herrn Schnick in Berlin gibt es den=20 >T-Pop nicht, laut Traceroute von Herrn Meyendriesch sehrwohl. Auch=20 >ist dies Netz in der IX vom Mai 96 erwaehnt. >Koennen Sie mir helfen? > >MfG >--=20 >Juergen Specht - KULTURBOX > > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D Dipl.-Ing. Guenter D E U S C H L E Deutsche Telekom AG Niederlassung 3 Hannover GrossKundenManagement - Techn. Vertriebs-Support: Team-Leiter Internet Online-Dienste --------------------------------------------------- GrKM-TVS-IOD Tel: +49-511-333-2772 Vahrenwalder-Str. 245 FAX: +49-511-333-2751 30179 Hannover eMail: deuschle@mnh.telekom.de=20 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D --------------70522FC73543-- ././@LongLink0000000000000000000000000000016500000000000011567 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/attachment-filename-encoding-UTF8_decoded.xmlapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/attachment-filename-encoding-0000644000000000000000000000161411702050534032346 0ustar rootroot
MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------050706070100080203090004"
This is a multi-part message in MIME format.
Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit
Content-Type: text/plain; name="=?UTF-8?B?YXR0YWNobWVudC7DpMO2w7w=?=" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename*=UTF-8''%61%74%74%61%63%68%6D%65%6E%74%2E%C3%A4%C3%B6%C3%BC
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/german_decoded_1.txt0000644000000000000000000000431611702050534030557 0ustar rootrootHallo Herr Specht, entschuldigen Sie vorab, dass ich Ihnen nicht telefonisch zur Verfuegung stehe, ich Praesentationen gehalten/ noch zu halten und viele Kundennachfragen zu projektieren. Nach Informationen des Produkt-Managers Temme steht der POP schon zur Verfügung! Standort: voraussichtlich: Winterfeldstr. 21, 10781 Berlin. Der POP hat zur Zeit direkte 34M-Anbindungen zu folgenden Orten: Rostock, Hamburg, Hannover & Leipzig. 4 weitere werden in kuerze in Betrieb gehen. Damit haben Sie einen Besonderen Sicherheitsstandard verfuegbar! Kontakt muessen Sie ueber Ihre oerltliche Vertriebseinheit aufnehmen: entweder den Geschaefts-Kunden-Vertrieb oder das GrossKundenManagement. Diese Vertriebseinheiten greifen auf den oertlichen Technischen Vertriebs-Support zu. Die Informationen werden ueber TVS zur Vertriebseiheit gegeben und dann zu Ihnen. Sie benoetigen eine Standleitung von Ihrer Lokation zum Internet-POP Uebergabepunkt zu Ihrem Info-Server ist ein CISCO 1000-Router. Dann zahlen Sie neben den monatlichen Kosten fuer die Standleitung die Kosten fuer den Internet-Zugang: zB bei 64k: 1500DM bei 2GByte Freivolumen. 128K: 3000 DM bei 5 GB Freivolumen & 2M: 30.000 DM bei 50GB Freivolumen. Freundliche Gruesse Guenter Deuschle >Sehr geehrter Herr Deuschle, >Sie sind mir von Herrn Meyendriesch empfohlen worden. >Ich versuche Informationen ueber das T-eigene 34Mbit/s Netz und den >lokalen Pop-Berlin rauszufinden, bzw. was ein Anschluss kostet und >wo man ihn herbekommt. Laut Herrn Schnick in Berlin gibt es den >T-Pop nicht, laut Traceroute von Herrn Meyendriesch sehrwohl. Auch >ist dies Netz in der IX vom Mai 96 erwaehnt. >Koennen Sie mir helfen? > >MfG >-- >Juergen Specht - KULTURBOX > > =================================================== Dipl.-Ing. Guenter D E U S C H L E Deutsche Telekom AG Niederlassung 3 Hannover GrossKundenManagement - Techn. Vertriebs-Support: Team-Leiter Internet Online-Dienste --------------------------------------------------- GrKM-TVS-IOD Tel: +49-511-333-2772 Vahrenwalder-Str. 245 FAX: +49-511-333-2751 30179 Hannover eMail: deuschle@mnh.telekom.de =================================================== apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-nested3_decoded_1_2.txt0000644000000000000000000000022011702050534032212 0ustar rootrootPart 2 of the outer message. This could have been part of the previous part, but illustrates explicit versus implicit typing of body parts. apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/bluedot-postcard.xml0000644000000000000000000001665711702050534030666 0ustar rootroot
Content-Type: multipart/alternative; boundary="----------=_961872013-1436-0" Content-Transfer-Encoding: binary Mime-Version: 1.0 X-Mailer: MIME-tools 5.211 (Entity 5.205) To: noone Subject: A postcard for you
This is a multi-part message in MIME format...
Content-Type: text/plain Content-Disposition: inline Content-Transfer-Encoding: binary
Having a wonderful time... wish you were looking at HTML instead of this boring text!
Content-Type: multipart/related; boundary="----------=_961872013-1436-1" Content-Transfer-Encoding: binary
This is a multi-part message in MIME format...
Content-Type: text/html Content-Disposition: inline Content-Transfer-Encoding: binary
<H1>Hey there!</H1> Having a <I>wonderful</I> time... take a look! <BR><IMG SRC="cid:my-graphic" ALT="Snapshot"><HR>
Content-Type: image/jpeg; name="bluedot.jpg" Content-Disposition: inline; filename="bluedot.jpg" Content-Transfer-Encoding: base64 Content-Id: my-graphic
/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsL DBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/ 2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAEAAQADASIAAhEBAxEB/8QA HwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUF BAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkK FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1 dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXG x8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEB AQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAEC AxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRom JygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU 1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iiigAoo ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKjnnhtbeW4uJY4YIkLySSMF VFAySSeAAOc0ASUVw+p/E3TY1MeiW0uqzgkb8NBbjB6+ay/MCM4MauDgZIBB rk7zxV4p1KPy7jV4rWPBVl0228kyA9QzOzsPYoUIyec4x2UcBXraxjp3eh52 JzXCYd2nPXstf6+Z7JRXgc1u11E0N5e6jeQN96C7v554nxyNyO5U4OCMjggH qKqf8I/ov/QIsP8AwGT/AArtjktXrJHmS4loJ+7B/h/wT6Hor56TQ9KhkWWH TrWCVCGSWGIRujDoysuCpB5BBBB6VoQ3Gp2sqzWuvazHMv3Xe/lnAzwfklLo ePVTjqMEA0pZNWXwyTKhxLhn8cWvuf6nutFeTWHjzxNp6hJxZavGAQDP/o0x JOcs6KyHHIwI14xzkHd22heN9G12ZLVJJLPUHztsrwBJWwCfkwSsmAMnYzbQ RuweK4K2ErUdZx0/A9XDZhhsTpSld9tn9x0dFFFcx2hRRRQAUUUUAFFFFABR RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRXF+MfGLaez6TpMinUiB58+Ay2ik ZHB4MhBBCngAhm42q+lOnKrJQgrtmVevToU3UqOyRp+JPF9h4dH2chrnUpI9 8NpGDzzgF3AIjXIPLddrbQxG2vMdX1G/8RXS3GryLJHHJ5tvZqAYbZuxXgF2 AH325yW2hAxWqcNvFbh/LTDSOZJHJy0jnqzMeWY92OSe9S19LhMtp0fenrL8 D4jMM7rYm8Kfuw/F+v8AkFFFFemeIFFFFABRRRQAVHPbw3ULQ3EMc0TY3JIo ZTznkGpKKTV9GNNp3R0Og+N9S0Vkt9TaXUtOyAZ2Obi2UDHAC5mHQ8nfwxzI SFHpenajaatp8N9YzrNbTDKOAR0OCCDyCCCCDgggggEV4nU2l3tzoOqHU9ME a3D4FxE3ypdKP4XIHUfwvglfcFlbxcZlUZXnR0fb/I+my7P5Qap4nVd+vz7/ AJ+p7hRWdoeuWXiDTVvbJmxnZLFIAJIXABKOBnBGQe4IIIJBBOjXz7TTsz69 NSV1sFFFFIYUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUVXv7630zTrm/vJP LtbWJ5pn2k7UUEscDk4APSgDA8b+In0LRxBZvt1O+3w2rDafJO0kzFTnKpx2 ILMinG7I8ujjWJdq7jklizMWZmJyWYnkkkkknkkkmrF/f3Gs6xc6teLslm/d xR4A8qBWYxocEjcAxLHJ+ZmwdoUCGvqstwnsKfNL4n+HkfA51mP1qtyQfuR2 833/AMv+CFFFFekeMFFFFABRRRQAUUUUAFFFFABRRRQBPp2rz+HdUj1e3WWS OMEXdtD965hAb5QOhZSdy98grlQ7Gva4J4bq3iuLeWOaCVA8ckbBldSMggjg gjnNeG11Xw+13+zr/wD4R64bFtdO8lgQuSsp3yyoT6HBdc553gkfIteFm2Eu vbw+f+Z9Vw/mNn9VqP0/y/yPTKKKK8A+tCiiigAooooAKKKKACiiigAooooA KKKKACvOviXq3nz2fh2I/Kdt9ef7isfJXp3kQvkHjycEYevRa8Q1S8fU/E2t X8m4E3klsiM27y0gJiAB9CyPJjoDI3Xknvy2iquISey1/r5nlZ1iXh8HJx3l ovn/AMC5BRRRX1p+ehRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABUF4k72zG0d Y7uMrLbSN0SZCGjY8HIDBTjBHHQ9KnoqZRUouL2ZUJuElOO61PaNH1W21zR7 XU7TcIbmMOFfG5D3RgCQGU5VhnggjtV6vPvhdeYXWtKYuTDcJdxjPyJHKuNo 9CZIpWIxj585JJx6DXxNam6VSUH0Z+n4asq9GNVdUmFFFFZmwUUUUAFFFFAB RRRQAUUUUAFFFFAEc88Nrby3FxLHDBEheSSRgqooGSSTwABzmvn7Q43h0DTY 5EZJEtYlZWGCpCDII9a9l8d/8k88S/8AYKuv/RTV5TXuZJH3pv0/U+W4nlaN OPe/4W/zCiiivoD5EKKKKACiiigAooooAKKKKACiiigAooooAKKKKANnwO6R fEK1MjKgk065iQscbnLwMFHqdqOcdcKx7GvXa8V8P/8AI9eGv+vuX/0lnr2q vlM1jbEt97fkffZDLmwMV2b/ADv+oUUUV5x7IUUUUAFFFFABRRRQAUUUUAFF FFAHP+O/+SeeJf8AsFXX/opq8pr3avnrQ0eHQrCGVWSWGBIpUYYZHUBWVh2I IIIPIIIr3Mll704+n9fifLcTwvCnPs2vvt/kX6KKK+gPkQooooAKKKKACiii gAooooAKKKKACiiigAooooAueH/+R68Nf9fcv/pLPXtVeTeAUd/H4kRWZItL nWRgMhC8sOwE9t2x8euxsdDXrNfJ5pK+Jku1vyPv8hhy4GL73f4hRRRXnnsB RRRQAUUUUAFFFFABRRRQAUUUUAFeK6/Zf2Z4y1qzEflxSTLewJnOUlXLNn3m E/B5HoBtr2quF+J2mtJpdlrUSZbTZSJ2GSRbSDD8dMBxE7McYWNjnqD24Cv7 GupPZ6feebm+F+s4SUVutV8v6scHRRRX15+dBRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRTJFuZmitbJFe9uZFgt1YEje3QsBztUZZiOQqse1ROahFylsi6 dOVSahHd6HdfC+wJg1bWWDAXc62sJyNrRQbgTjqD5rzKc9Qq4Hc9/VHR9Ktt D0e10y03GG2jCBnxuc93YgAFmOWY45JJ71er4qtUdWo5vqz9Ow9FUKUaS6Kw UUUVmbBRRRQAUUUUAFFFFABRRRQAUUUUAFRzwQ3VvLb3EUc0EqFJI5FDK6kY IIPBBHGKkooA8U1nSJfDuuS6XIzPCwM9nK2fmhLEbMtyzR/KrHJJBRicvgVK 9Z8W+Hx4i0N7eMql9ATPZSOxCpOFZV3YBypDMrcE4Y4wQCPJfnSWWGaGSC4h fy5oZAA8bdcHHHQgggkEEEEggn6jLMZ7aHs5v3l+KPhc8y76vV9rTXuS/B9v 8v8AgC0UUV6h4QUUUUAFFFFABRRRQAUUUUAFFFFABXZ/DvQRP/xUt2issgK6 cjqcxqCytMO37wEbSM/JyD+8YVzWh+H38Val9heNm0qMkajIDtBUqSIVb+82 VyByEJOVLIT7RXz+bYy/7iD9f8j63h/LrL61UXp/n/kFFFFeGfVBRRRQAUUU UAFFFFABRRRQAUUUUAFFFFABRRRQAVzPi3wkmvxC7tGjg1aFNscrZCSryfLk xztyThsEoSSMgsrdNRVQnKElKLs0RVpQqwcJq6Z4QfNiuJLa5tp7W6i/1kE8 ZRl5IyOzLkMAykqdpwTilr2HXfDmmeIrYRX1upmjB8i6QATW5OMtGxBx0GR0 YDDAjIrzDXvDmp+GWeW4DXemAnZexKWZFAzmdVXCYGcuPk+Uk+XkLX0eEzWF T3auj/D/AIB8ZmGQ1KF50Pej26r/AD/rTqZtFNjkSaNJI3V43AZWU5DA9CD6 U6vWPntgooopgFFFFABRRUUlxHHLHDh5J5c+VBDG0ksmOTtRQWbA5OAcDk8V MpKKvJ2RUISnJRirtktX9C0O98TXnk2olgskJE9+YztUAkFYiw2u+QRxlUIO 7kBG6DQfh5NdMl14k2pECGXTYnDq4xnE7Y55wCiHb8pBaRWwPQ4IIbW3it7e KOGCJAkccahVRQMAADgADjFeFjM2veFD7/8AL/M+qy7h+zVXFf8AgP8An/l/ wxDp2nWmk6fDY2MCw20IwiAk9Tkkk8kkkkk5JJJJJNWqKK8I+r2CiiigAooo oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDlNY+H2iarcPdQef pd1I5eWawKp5pJJJZGVkLEnJfbvOAN2OK5O88AeJ7PJt5dN1ONV3kqXtZCf7 iod6k8cEyKCTg4AyfV6K6aOLr0dIS0OLEZdhcRrVgm++z+9HiU2j+IrWJprr wzqccK/edDDORngfJFI7nn0U46nABNVP9L/6A2uf+Ce6/wDjde8UV2RzjELd J/L/AIJ5suHMG3o5L5r9UeEJHfzSLHFomttI5CoraZPGCT0BZ0Cr9WIA7kCt GHwx4ruZViXw7JbFv+Wt3dwLEvf5jG7t7DCnkjOBkj2ailLN8Q9rL5f5lQ4d wcd7v1f+SR5xYfDK7lkR9Z1lTCQGe2sITGc8ZQzMxJXGRlVRjwQV6V2ukeH9 I0GN00rTra0MgUSvHGA8u3ODI/3nPJ5Yk5JOeTWlRXBVr1KrvUdz1aGFo4dW pRSCiiisjoCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA//Z
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/bluedot-simple.msg0000644000000000000000000001363611702050534030320 0ustar rootrootContent-Type: image/jpeg; name="bluedot.jpg" Content-Disposition: inline; filename="bluedot.jpg" Content-Transfer-Encoding: base64 Content-Id: my-graphic /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsL DBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/ 2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAEAAQADASIAAhEBAxEB/8QA HwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUF BAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkK FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1 dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXG x8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEB AQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAEC AxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRom JygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU 1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iiigAoo ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKjnnhtbeW4uJY4YIkLySSMF VFAySSeAAOc0ASUVw+p/E3TY1MeiW0uqzgkb8NBbjB6+ay/MCM4MauDgZIBB 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 KOGCJAkccahVRQMAADgADjFeFjM2veFD7/8AL/M+qy7h+zVXFf8AgP8An/l/ wxDp2nWmk6fDY2MCw20IwiAk9Tkkk8kkkkk5JJJJJNWqKK8I+r2CiiigAooo oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDlNY+H2iarcPdQef pd1I5eWawKp5pJJJZGVkLEnJfbvOAN2OK5O88AeJ7PJt5dN1ONV3kqXtZCf7 iod6k8cEyKCTg4AyfV6K6aOLr0dIS0OLEZdhcRrVgm++z+9HiU2j+IrWJprr wzqccK/edDDORngfJFI7nn0U46nABNVP9L/6A2uf+Ce6/wDjde8UV2RzjELd J/L/AIJ5suHMG3o5L5r9UeEJHfzSLHFomttI5CoraZPGCT0BZ0Cr9WIA7kCt GHwx4ruZViXw7JbFv+Wt3dwLEvf5jG7t7DCnkjOBkj2ailLN8Q9rL5f5lQ4d wcd7v1f+SR5xYfDK7lkR9Z1lTCQGe2sITGc8ZQzMxJXGRlVRjwQV6V2ukeH9 I0GN00rTra0MgUSvHGA8u3ODI/3nPJ5Yk5JOeTWlRXBVr1KrvUdz1aGFo4dW pRSCiiisjoCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA//Z apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-nested3_decoded.xml0000644000000000000000000000524411702050534031545 0ustar rootroot
MIME-Version: 1.0 From: Lord John Whorfin <whorfin@yoyodyne.com> To: <john-yaya@yoyodyne.com> Subject: A complex nested multipart example Content-Type: multipart/mixed; boundary=unique-boundary-1
The preamble of the outer multipart message. Mail readers that understand multipart format should ignore this preamble. If you are reading this text, you might want to consider changing to a mail reader that understands how to properly display multipart messages.
Content-type: text/plain; charset=US-ASCII
Subject: Part 3 of the outer message is multipart! Content-Type: multipart/parallel; boundary=unique-boundary-2
A one-line preamble for the inner multipart message.
Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-vise.gif" Subject: Part 1 of the inner message is a GIF, "3d-vise.gif"
Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-eye.gif" Subject: Part 2 of the inner message is another GIF, "3d-eye.gif"
The epilogue for the inner multipart message.
Content-type: text/richtext
Content-Type: message/rfc822; name="nice.name";
From: (mailbox in US-ASCII) To: (address in US-ASCII) Subject: Part 5 of the outer message is itself an RFC822 message! Content-Type: Text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: Quoted-printable
The epilogue for the outer message.
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/simple.xml0000644000000000000000000000152211702050534026665 0ustar rootroot
Return-Path: eryq@rhine.gsfc.nasa.gov Date: Wed, 20 Dec 95 19:59 CST From: eryq@rhine.gsfc.nasa.gov To: sitaram@selsvr.stx.com Cc: johnson@killians.gsfc.nasa.gov,harvel@killians.gsfc.nasa.gov, eryq Subject: Request for Leave
I will be taking vacation from Friday, 12/22/95, through 12/26/95. I will be back on Wednesday, 12/27/95. Advance notice: I may take a second stretch of vacation after that, around New Year's. Thanks, ____ __ | _/__________/_/ Eryq (eryq@rhine.gsfc.nasa.gov) | _| _/ | | . | Hughes STX Corporation, NASA/Goddard Space Flight Cntr. |___|_|\_ |_ |___ | | |____/ http://selsvr.stx.com/~eryq/ `-'
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/dup-names_decoded_1_4.bin0000644000000000000000000000054511702050534031353 0ustar rootrootGIF87a((óÌÝîÿ¾¾¾ˆˆˆnnnÌÝîÿÿÿççç,((þÉI«½x–Ì;.2Œdižh Jè¾p,ÇâZ{8Ö†mîS;Vèç ÞˆE[Y8Ÿã’ù¬Bk¼¡ÏÊD•ZN×z‘†-ãkÆŒI;S# ¸í†äYt:ÀïûûwByc|‡ˆ‰‰_ƒ]‰nUBV‘‡“c–G˜šœ“‚—¡¢i¤Ÿ§©U±U«K­OiN¿²^X—N¸ÆÅ¸¼V›¿ÀN´··¿ˆOÙÎÈÑÆà¸ÎºŠÍÏWlàÉ¾ÎØåìÝÞÅÅíãŠãòÞ¸Öº¯fá)Í×±X*LhÍ#aǘ4œC!–ĉŽ$X¼8ðG?‚Ì(²‚”’k”ØYÉrÄŠ0cÊœI³&ˆ;apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-digest.out0000644000000000000000000000143611702050534030016 0ustar rootrootFrom: Nathaniel Borenstein To: Ned Freed Subject: Sample digest message MIME-Version: 1.0 Content-type: multipart/digest; boundary="simple boundary" This is the preamble. It is to be ignored, though it is a handy place for mail composers to include an explanatory note to non-MIME conformant readers. --simple boundary From: noone@nowhere.org Subject: embedded message 1 This is implicitly-typed ASCII text. It does NOT end with a linebreak. --simple boundary Content-type: message/rfc822; charset=us-ascii From: noone@nowhere.org Subject: embedded message 2 Content-type: text This is explicitly typed plain ASCII text. It DOES end with a linebreak. --simple boundary-- This is the epilogue. It is also to be ignored. apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-clen.out0000644000000000000000000000250111702050534027452 0ustar rootrootFrom: Nathaniel Borenstein To: Ned Freed Subject: Sample message MIME-Version: 1.0 Content-type: multipart/mixed; boundary="simple boundary" This is the preamble. It is to be ignored, though it is a handy place for mail composers to include an explanatory note to non-MIME conformant readers. --simple boundary This is implicitly typed plain ASCII text. It does NOT end with a linebreak. --simple boundary Content-type: text/x-numbers; charset=us-ascii Content-length: 30 123456789 123456789 123456789 --simple boundary Content-type: text/x-alphabet; charset=us-ascii Content-length: 600 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 --simple boundary-- This is the epilogue. It is also to be ignored. ././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-2gifs-base64_decoded_1_1_1.txtapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-2gifs-base64_decoded_1_0000644000000000000000000000064111702050534032050 0ustar rootrootWhen unpacked, this message should produce two GIF files: * The 1st should be called "3d-compress.gif" * The 2nd should be called "3d-eye.gif" Different ways of specifying the filenames have been used. -- ____ __ / __/__________/_/ Eryq (eryq@rhine.gsfc.nasa.gov) / __/ _/ / / , / Hughes STX Corporation, NASA/Goddard /___/_/ \ /\ /___ /_/ /_____/ http://selsvr.stx.com/~eryq/ apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/twopart_decoded_1_2.bin0000644000000000000000000007364711702050534031175 0ustar rootrootÿØÿàJFIFHHÿí¶Photoshop 3.08BIMí ResolutionHH8BIM FX Global Lighting Anglex8BIMFX Global Altitude8BIMó Print Flags 8BIM Copyright Flag8BIM'Japanese Print Flags 8BIMõColor Halftone SettingsH/fflff/ff¡™š2Z5-8BIMøColor Transfer Settingspÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿè8BIMGuides@@8BIM URL overrides8BIMSlicesuð^ Untitled-2^ð8BIMICC Untagged Flag8BIMLayer ID Generator Base8BIM New Windows Thumbnail pMPeñÿØÿàJFIFHHÿîAdobed€ÿÛ„            ÿÀMp"ÿÝÿÄ?   3!1AQa"q2‘¡±B#$RÁb34r‚ÑC%’Sðáñcs5¢²ƒ&D“TdE£t6ÒUâeò³„ÃÓuãóF'”¤…´•ÄÔäô¥µÅÕåõVfv†–¦¶ÆÖæö7GWgw‡—§·Ç×ç÷5!1AQaq"2‘¡±B#ÁRÑð3$bár‚’CScs4ñ%¢²ƒ&5ÂÒD“T£dEU6teâò³„ÃÓuãóF”¤…´•ÄÔäô¥µÅÕåõVfv†–¦¶ÆÖæö'7GWgw‡—§·ÇÿÚ ?ôì«éÆ¢Ël-cÒ\ç@ïÛô—œfõKMÎ}sY´Öí§Ý¨þoÜÏoò×£XÖZM¬­ßKwV6gÔΙ“­n}öi‘[–?ÊeË’ŒDÄž®ñK›†-߆óx1q‰Ø2;ðÜxGüç„«¨8ý¤Úòm°Isõqlϱîvç»é:Ú¿óçø<Ì®½‹]1A7¼ ‡}]¿Ûô›ÿMw·ýHú¿ŠÂüü÷PÀ>“Ÿ]`ëZ×.k¨àÿ‹ú2\\ºêšÝqñ˜/°º;d²«*÷)Š8rFħŒ~?³‰¹—žÅ!! µêåÿKÿ@[êÇøËÌé¸ßdêT[X|×k­›˜Ãþ ÆÖþŸoÓg©mößÐôn…õƒ¦uìC•Óì.kNÛ+p‡±ß»c}ßô}‹ÌªËú¡Žæ3¥ý]ËêùS,ûkÄÈýìJ‘¹ŒüÿÕGÒr¾¶g–ÖìCõ{¦ý'q›Y‰ÚÆÚçdzwçý–ŸMŸ¤ÿŒ½ÇÂ,Èë_ÅË™„¶ˆþ—þ‚õ=b¼šé7á>†ÙÅ•de€é·t·cÿóçókê¹¢§Ý:ÌÁÛnV ‘>ÏN“é»wç£ÿŒFoOc-vNmù™YïØÚžâó>ßGúM×Öí¾ýž‹6}?Mh3 Ìc…èÓywµÙÖn­¾íöWüÖÇ3þšX¾1‚J2 ü“Ž€ÿPÏŠ÷lså'-A·þ—ÌçtQq ÈÅêøö_Ü|¶†¹­ãé»ßê»ù wíŸY± Y…^`:‡âÙ·û.mÛÿÏPÆ¡¸Ä›ã¨d: –ÝML‡}#éŠjk˜ßÜõ,·gúE{íù¹À~­¨<´´CŒþ‘ߟ³gò™|C„g((áýd¾(pz8bÅ÷yBZÿPßüÙ£8Ù½CÇ+ªl~›26X[ü¯Ðnk¶þjÊø½ú¹¸¿$FœWú1?¼æÍ›Õûz¾;2«ÅºóêZÒáÓOÍl9c¿Ñ³þ¸‡™Õñpj}ÖcdäzdîeLyÚv{w½Œvç9ž_ÏYþz†\×-)ÂÍzb8·ýÙ²{Y¢á•w““Õ¿ÅOÕ쌽%§9êïÞ÷5ç÷2+s¶ì³÷èm~—õ?B¹Ê>ª}yèwZü qºŒÁ¹–Šïs¶­}ÂŒŸk~ƒXõêØ¹Xùt2üwoªÆµÌt!ÍmŒÑÐï ö çâä[Iv§)£ôo{w1Ñþæý-Žýæ~’¿ü oAF¸e§ïE\RŽÚ¿ÿд>´ŒÎ¨âÞÒþÈØÐýßø~ ú(wöZú³þ5:“wçuq†5úŇæÎŸP«ÿ]•½|ƸÀq׿¡gQ.ç¯’Ææ~;Ëã«Í#·ù8/ûÆÈå2éc†ÞJŸñeÓëx³ªu+òžHõ Lk}Î>çz¹N˵ÞïÏ[XU¾¤ôý¾ž ̱¿Ÿyu³ýœ‡z?æV¬;#׺º‰Ö×Ì{A—»û-W-ÉéôÚh.‹æÁ‰ »fæ¿E¨|?âÉ&^dÃã¨hvù¤?zJËËJ&1ˆ2•\«ó^ŒæÒÆãàbWP;Z hþÅMj†OT†Zç<¿ìãq–½ðïI¬c÷ZÿQßÿôÐÎsªÈ¤½µU‰cËMpÕ‘»×™ý¿Ù¶Äº®NKs)«–]‹;²,–ƒM±ö¿Kó1žõ/7Ìûœ¹8æ@'€Ç‡€ŸO¹Åê§2DL ®/›O›‡†_Öp×Y^&{^Ö,÷—R-ÜàÝí¯÷ö·¥ÿ¿ý2ÊNû¨¯%µ]èYuØ÷XÂÖÜÇ8ßE^¥ûvmvúÙc?áÿTèx™xî¡ÇõŠA¹ØØòeï¶²ïcw×ù¾öÕꡲÊ݇ŒË®±Õ\\Ó&¦}†ß´½ÿ¢p·eŸÌÒ¨Š1 îxbk†"_,æ3ñ0@±­×é6ò³ßMV½ÖVÜ–5í©‡Ô²²Zlu^×XƽŸ›±ö×ú;?Á¨Óõƒ§ÛÓÙi>£­kö;BàDz¯s }wómþÂÅ鬦æõL+²]n63êÈ¥­Ô©Ì;ËšC\Û_ïnÏæéýÕúÓÒ>ËÑ«wHÇcs1Èf3¤1´SìúYYÿ]L5ò°u?ª‡¹éùgýÿRá@‹d =fPèxXz¸®Ïª«E˜¯­âê\ý›ß§©èÛ»¿Ò3gè=;Xµ­‡ØÇXÂòæµÇh÷̵͹ծsêöC:_Wê”ìÈ}o¢ÚKa­º§:·]}VßhØÖzž§©úÇó~…ŸÎôyÛôc€ËÚÞFÒ6É{·Îç;gø?ÜQf‰…ˆ“è<$~쯧õ?®»ˆHÄÑQ:ù|ËtΩn6}˜™ÍÙ6æµúÿ8ßfßä+ü¿?“a‡Q^®/Tø¿ïš“Â,ëÓ¡ý.ÏÿÑß¹–U™ö;ˆmŒi~éAÇ}ŸKéÙþü"Ž^h«ÖÔ \ûvY³s\Ç5ŸAþ¯§üæC?˜[S3aÛem-}Ãe–±£ÔkOÓs²ßfÿë® ¨Û‘gìŒ:­º¢ç_cœpcu~Чû²oÝé6·?þ sXù|2>‘Åu.*Ûéqÿ‚ìG,¥d*ºw—þŒô#Ô~]™˜Ùl«¢Ófï{´ÏI–9Œw§îoÐgü®ðìL|kýwæÔÚÎ뫨†¼·}ô>±þìÛ²ÏSßgø*ÿÁ*6ýŸê÷PÚûî~fM--©î’4¿{¶}z[í{7ÿ…ôëT¿kßFeŒ£)”tÜfŒšz{ë ,2Óg¤Éú-¾Çäÿ£©HqD5¦OÞáÿ 0ôž+¾"²=6=/EONÊ~!êcÛ‘`s(Ü(mlsMOfMÝ·¿Ïýš¿ÓUþõb·öìVVmwQôI¹¬`iÚgÒuO}¾–Õsö³×ÙZ­ŠüÊqqñÖ·÷3clÝ]ŽužéµÖ½ÖÑù¶~‚ÜÒþ’Ÿ¨®n›SÝHÁÀ -Ûc¢ËW›m÷û*»ùßzlŽ»w¯Ò®›û²X|}]ˆýßÑýÿùŒiÍ£Ù÷¹í{K÷\Û¬,`‘½Ìß‘íﵕÿ#ùk õ뺟Õ|œíþ~[ik`€ÚëkÆ;èí³Ý½Õÿ4´²0°zI«©_‹Ô²q©x¤µÎkFó ÚêÎïÓ½Œô·ûñ¿íÔOª8OÀÅÌÄ7Rã‘ëèîXk=†XÆ~±[ký#ÒâŠÆ«ìµYV#C1l¹ÛŸ\û?zÿ¤ÿk?ë‰tî°Ÿé×S®%®w¢@õ"wHwÑú^ÿÏU¤ ÆÍI­‡ý÷ï6§Š&ëXÆÈðšù„K¬Çl¶§¶û,7,¾× šÖϪæ1Âß{â·ÞÿðÈc2ʺ»ëq.SY¡ÎÐ]®ïoÑmý¥‡‹‹xɯ+²À }…ÞýÀþ‹Ñý+¦½ÕÖÿç}_SôŸM\ÌÉ6õoO!ûjf1¶¨üò a›·w½:ǧ¿§oÝóâÿŽPSÅé;øpðpð¿ÿÒî:§Õl ª¬v6ü[Þ>•.!¤öÝS·UÿAbt,£Ò32(ÈÇm¹¶×º¾¢æ×RÏçj²ÖJ—ú›ÿvëU®Ê«·#ÃQ¯e[ªšÎ4:çPydnøC•!†sˆ¯–¡vÍË呺ŽouÎÇ-nÁºãµ¥ÑºÆ{¿ž±¿£ÿH³qº.u¹–õ]õ;¿¢//s«³ß]68z¸»l¯mß õnÿMþ&È#Ã#Á q¡ÃqtÌbeÆgÊGH‘§ ôÃæàu=u,ŸWÖõæQq-69–ZÖXãKë/ô,¡¶ÿ?¿Ùþz¸Ü³\2:•U8VKñ¥Ž4–²ÍFÊjÇoôvU¿ùÏߦ´Ç / ÏkݸRqEos{œók/DZßB­ßÎþ{?í¥Êuü®­MYu˜Çmí®©-cß³ôm­­xÞöã?ÔÞ› rãŒcú¹—ŠZ@ËþíG†Q‘3kC×(þì?ïÀw,úÉ€ÜÑN@v%aÎ/sšÖí°îšëÝí­ÎwÓ¿óÖ}U´¾œjšÑ©$=ÆË–°½÷Z_eØ>›Ÿ½y‘sºçSÆy`78¶§1ÃÚgÝaoç6†ŸSsžº~¡Ò±zmT?£ºÌ‹ë-e¬°‘ê5ÃkrYc=?Iµ;w§ìÿûö)ç˘ˆpÂF¸ÇË.ŸôN\r?Íú@ôÑâw²¾°Ñ‹k±r±E˜äL´XËcÒÈÿFö¿ÿ³ôjUõn‘Õ[«Ù™ŽâÐK\"·Wf§{ëwÑgþ è®aÝfß¶Û~4Q{KYc*—¹ÎuLu¾˜væz,ÉþcÓôÿ‘ú$~›—e,fvO©]»ò}wÚØw¦ñUx÷»Ú]ú+ú?ø+.QO£ƒAÂj$™ðúGÖËÛÐ:–Ò1þ÷§ô"ÚêýC/2¼º«k™MÄV°ךíµío¹Ÿ¿_ü^õ/¨Õ ¿iÝd:××Xe‚wjl–Ïõ¶½HeZËnÈDz²üªY‡s=Os}F<}+=ú_ðÌÿ„õ·ÒAéöznsðÿ+†û]íݹ;’Ç8@ ˜Òü–fÉ å®÷êu™Ó½ »³2žlÈÈhªªÀ–±ƒèÓ¹Åû­{ÜëÿÑÿàK¬c]ö {ÛXõYú'` }8ÜßçwúKB¼>·~#ñî§½¥=7ƒôÞlŸR›Ýü¿Ñÿ V±~¯ZÜvWuû`‚XÁ"æû¿ò)bä²äˆˆéRÓþw£‰ßŽ1óƒ+/îÂÿÿÓôf5ØÖ: d„öø®WëŸÕŒ|ܧõl›kÆ1”Z¶}KZöïÜïwò,üÅØåG§ü©«]öIßkôök?êÕ|qœ(Ë€ÝÄíê]†s„îâÓÔ¿KÊ7';©Ž—Ô*2Ç=–¹¥ÿ¢a‡9¬¯éY¶ß¡ê!aÓÖéÄËêÊuÖ¿$±÷ Ŷlgè²CC_³}Xo¯óýÌÿ «xú²rOÙ Û_´Ð²6þ’µÛ6}5[êöÁÑ^1eøþ«½äKNùöOô¿ ôvmÛbÆË†8±Ô'  Ö°<^¯Ð¿êÿݺ³Êsãáí!Çýf¿¼Ç¤t¾™a¹–ÜË\ˤ½¥íÔPæŠÙ],ݾ§²Š¿F±¨ÏfhÍÀÎÊAØÍô£sžïnß{_âÿðŸ£ÿ mU£uÚ§>ÿCÖzuú¡²_2ïæ÷í¿ù­›½/ð+#¢7êÇÚö‹.õcÜ+c¸Ö}OÒ[ùÏå¡'&HFRÖéá—§À‘Ž2–ÀéÅþ+>ƒõ7©Ö*ϯ!¢ÒÇ0´––½¦»íCýÌüÿ§ùë[§âuœ,©øá°e¶± 0È íÎß§ï.Ï¢þÊû#>Å>”i¾gç»Ü´C"6îüÙ‰ZY°òòÜÉ*f Ü´¡“(>˜šò²ð]'¢e¾Öº¼[KA.Þö†¶I%Î~ÅÕ‰ê ¶5¶‹l¹Á‡{Zë?u\ÉS ?eª‡»·©kš?èQbåúË¿Æ#˜ãŠÌj„hÚ\ëü¯sëǯþ‚qÇËTå!-ÿOôQÅ’ôtzfôî—ŽwŠ*¬Ç0Ïê?Y¾­a±ÔdäVIꙫ´ãÚÏwÒ^OÖG×Uÿ¶Q “»BkþÏÙKiبãð=£Ú6ŸŠ<'€ ÿš²‹:þ/¨dÿŒZ˜8·ùo!­Ÿ‡ÓX™ÿ\¾°ä•ÚÜ`y·Xós×=ˆ\$4>#þú塎ã½Æ{ÈnÞ˜NbkþñO¥ÿÙ8BIM!Version compatibility infoUAdobe PhotoshopAdobe Photoshop 6.08BIM JPEG QualityÿÿÿîAdobed€ÿÛ„##""     ÿÀð^"ÿÝÿÄ?   3!1AQa"q2‘¡±B#$RÁb34r‚ÑC%’Sðáñcs5¢²ƒ&D“TdE£t6ÒUâeò³„ÃÓuãóF'”¤…´•ÄÔäô¥µÅÕåõVfv†–¦¶ÆÖæö7GWgw‡—§·Ç×ç÷5!1AQaq"2‘¡±B#ÁRÑð3$bár‚’CScs4ñ%¢²ƒ&5ÂÒD“T£dEU6teâò³„ÃÓuãóF”¤…´•ÄÔäô¥µÅÕåõVfv†–¦¶ÆÖæö'7GWgw‡—§·ÇÿÚ ?í¶( $H¢‚Înæ–ñ> -Œ­Än•®ñ½„XÞç;’k9µúÞ-gÒ{ko½ÿùñeüB$ÊGÕûü_ú·ÊjI½<¿îÙc:ð 2®¯ù·¹§¼Õ]Ù $¬htÒPÝg•VŒ­Áth[¶.Íɱ»lµÎo%WcMï-ݵ­]ÿ|üïÌA±Ä»ò'ai£uw†ÛX;©-úG÷·îÿ­úŸèÔâ–·ëþ²ÙµFÿD:v–ìtϤ`Ý ýjÏsËÝâ8'‰’ÖúžÔK],¤þßç± äµÓÙÿHkþo¿ÿE¨áH4L†‰2üO·Ü¢\öî8uýæ(¼y1?yUr2¶Õ;‹¬lÈ:è—üãþ’|bK¦´í깸™$S{€>à×õþퟡòÿâì]WGëmÏš¬n̆‰1ô?z¿Ü^vfúÅm‰÷"?9Ÿ¸ÔnŽ—×íÓiàÝWàe?çE£._ï~ŒßPIsXß[±œ#"‹*?¼ÈµŸú*ïü lbõn–vÑ×;÷L±ßöÝÞ›ÔÖ: Ãu$’E Bºþöé`àøÿ!È©" )¥[˜Ih#sN­ŸsO·Ù·ùÄöcÕoóŒkǃšýõ ©tÖå7Ô¬{GÊÁþ†ßý+ÿ¢×>Ëî®Ý»YnŽnâ OçïfÿõÿÏÓ• ‘±ÑÿTׯü+z¦-º:k#÷Áïü¶ï¯ýí¶2>Åà =[ &<õتÝÓ©x>ÐOqÿÐÿ_ý(™m6ÒN‚?ëþ¿Îzw=¿isMt±î/™<4øçíÿ_ô¿àÚ`à„¸Hô.gJ¦ÇŸLÖ˜"´³ßÒ,lítsμ}&®¶®›~›ÜÆÄ Îæúu±t¼yÅÎŽDíiM0ÇZÍ]Ä^ö~Gç0=½ÌG?×Cýìƒúkƒ¿àØ^Í{wèÿðZפ×E5­¿—üäE †ºñx>pï©ýgh-cO“žÖ»þ‹®gþ ²2q2ðï5_[ª¹ Hp×i;ZÿQ»ë²¯øOæ—¯*S¥cõ,JÏe“MÍúu8ÿçÊ_þù»‘áñµ_ÑòÑöðMD~ud°ÿn¦9•oÿ‹ô•Š^-Èm™9l rì†? è?›²‡¶íÿöòÑÉéGçÕc[aoxÜ×7ó,­Îÿ_ðj¸Û\KñÝQÙ;OýjÏû嵦ê>Õàžîþ'üÛ±á–zUXuõ)¶ê*/ýϳ¾Ú¾ÍÿƒUüçé·ìžž[ê·"æÐ>˜Ÿû¾¥¯±Û?Iþ†ú×êHºÆ?•ùèPñ-7r;ì(e‚ä$'1x½¾)JÝ]ÇÒ¾¯ÿÐî%Djd¤ã:xr¤ŠÝÏ“›Ôsj­ž2þLO³oço\åž›Øç²¿R¶{ƒw´ûïÛþ¿ùó¦ËÁ{Îú\æ¸òˆ #ÖË´Å»ÃóþšÈÎHÊNQ8Kåó?Ôà“§Ë/ô¸þg<»óF1ǵ§û>Ä"ÐÃ^Gæþú´úˆ"LOã»ßcÐlalxƒ¨!ÈtmÓ\È?ëà 7‹«!®aäñËú(Å®&@Òyù}RþÍÜ'ŸüÅKƒDWt†Ü{[#n%üéu.‘üíNÿÕñé©]™moup׉úl;ëwò«³ÿJ~’µ`VZ "˜“ôP^ òÔjž IùC´kÓ:k?6Ó>ÝO’¬ãsˤ‘»ŸyÌ·e²xRDÄl'†]M´}#Æ y¢4Œæwñüò”©Ç»!Å´Vûœ9µÖGõý&½IÅl&(„ˆ¡ÓÈŸ"–7Õ¾¯yþé4þ}Î öÛ=|ŸülâýN¼Ÿ‹)hlèFG­¿ÿaéK„žˆãˆëö5ú'Z»Í¢×oÇ$w5ÏçTïô_ðK³Yx½ ¤ááP{ǹޡþÃmýõªÕËs±jûûó”°Œ†û1d”dlÞþ³a%o^¨i\;á.×úÞÕŸW˶@†ƒÛ?³ìHÎ#¯Ø¶‹Ò¾úY!Ï9ªÎ¾Ì\‹'c]ûÅÀvú?Kóÿõú?ÑsϺÇê÷“ߘn‹C×Y]…›Cª{ôíßÉîêĆhIàˆý%^›«+ ¾ÚÁ­æI‡æíw¨ÏýEÿl[gOÓs_¯ƒ‡ýþ¯õÿϪàÜINèŸí;gÐüïõþy2cÌÀlêgó[ýõý"½š/ùÌ2€½œ7c\Ø&·kôK}Ã÷½»w+عYçp>¡ï»Þ{v×cKþ¿öþý‚“¾Ç5¶Dêu ú?GÿGÛá>ÑK1ݼ3"Ö5üîi ´¾–½Ÿöÿþ©ŒóXø¸$cÅÙCëÓlêë qÚË îÏpŸê{ÿ‚ê-s1,d²Öžú§Ûü‡ûÖ~?KÀ´Ã2æ»V´l—7÷Ùf×úµ½_¯¤`0î5úŽì&Áÿm¿ô?øXˆ¸’o÷>UpÌ#ílïiÓ¸ùUl鸶Éu^ãË›ú=±±^c[CkhcG hÿEDÛX·Ò'ߣÈîÿÒv(¸øv<+¸ow)ݧ:}WÜ'ú»ö±¾‡‚Ýo†÷qÿlz+D¹£’ ÕŽÿrqÉõ(áˆèª¨¦™VÚç 7þ¡äv>*&÷”Ú%-žêÚCaçŸõÿ_ýH›ÜcÄéçþ¿ëÿ -²nëþ¿ëþ‘ë´½Ñ*ûHí¯‚³C6‰î‘ÒÂdé&.¤vV×yBÜj ,x÷{cénú>õ¥ÝÚ›`ƒÈà÷ ¶(ÕÈwBÁ¼—ÌwL•XýTÇÞ{¶Î£O¢µýµ‘[ȃŸ¤Óô÷9ÿ©?íònµtÊŽÖÚG;­ÿÏ?¢ÿÁVVG×»LzÌkî°úmøº=kðuχ´Og{Ušz7R¶=wØÀÚÓÿ^ÉôjGŽú«èÞwSêy›ÀŸôMÿý5Ê4Õm¶±‚l²ÂK‰qqþ·þ ÿn"ÕõSª¼?Ò¦{¸¸ÛYWþ ·0:¸7¿,Ùiic=»ÍÿNÏÒ;!ö¿Ùú=ÿ¡ÿQä‰6RF»ºE•Ræú·¸HØóãüÝu9Œõ}Ÿá/ôkõ?àÔÒ2]µ¯-¦>›µ´—¸û6ÓK}6lÿZíy ÷VïQÞÐ÷êû6þ…¯üÏOý'¥_ú_UeÚÌìwz­tVLÌ“±ß»vßßTŽR&@³ú_Üe5Ñ1éx5»‹­ˆ¤ì‰üïѲ§úëüâ=Xôã‚êh-sÈc¸õêúŸOÞïøåo²œw¹ÂËo ¸V.ÚÏoõÿÂ*fÓëKZG´Úãþô¶}§ÿÿÒŠ2rL>EÑ6Žy k‹ƒ¶9Æ, I†îÛíR½ù´‡^ÖÉlv´„÷~—Ø¢êé‘S³óÄïÿc>…¯ÿIþµ«§¦È."×Dj˜$cW#§ósÇ%Ò5CûÜN)ÉÈ÷VãyÖÇ=HýÏUÿh};ÿ™ý¡þ‰hatj1ˆ»,ä“,hq²º¿Ñíc½?µ[þÕ¾¯ç¿™ZZÖ±áFѧý‹ÞÚÆ¾çjtú?š¦‰&UÇ“/éÐþÿï¬6½bÊqi;ª¤z’NàÖ×ßÎýMe»Ô=fyó6ªÄ?"}I5ÔñùÊÞ<T¶ùáÃó±Ê`ƒbûjÙ9n<õÿ_õÿIVÆ<æwÉmcpHk÷möÿ…÷ê¿çTÚÃ~~QùÊ©mŸlcÆŒ³ØÖƒÎßuÞ¶ïßÙþ¿Ì%Ìd7ƒê2ãÓþbØü›„ŽæL™ÿ_õÿÑI â×ýÖ¿Yæ±\‘·k€$vÿåý$[Cu67oˆ×AýU æqõ—¼>¥{S;&s-R®ÊCZððtîã鬮£`¯Ð©¥¾«}Ï îeGÙe»3ÖþnŸZ´øy¸ÕP=6ŠÆç¿™_¤ß屟ú/ô©™yÁ0õ}Lå‰ݺූÌ=çþžÄä¤Ú$r?7û ¥–>Ê·9²× lêtAŒÃE^˜]P‘u…¬£ÞÏ¢£‡ãÿZn÷«5>»+­ÁÍ=Çý%ÊgU–*³-ïû<º5’í ¶›Ÿ²–ÛìBèy9xMøÙ,q7¶ t{=K>Ûÿ³ÿôìÿ¥ÇžþjÇôuùVW‰{4)¸½îc´ ÔИœD‡ÊPE)$’NB ¬Zrª5\77FŽk¿~µÎ»1™-Ã/!–’éw¤êÛïwèÿÒz,þgý'üéP˜µ¤‚@%¦ZOc=¿Øz’3 ú2 l‚ÿÿÒíƒ~iÎÞIÓÍq6ýn½Ú×C¿´øæTÏûúÏ·ëT´èæÕ?º7;üû\䌇t¾„o¡¿œ>H6uzĺ@ñ0Ñþu®bó[3º…°_“aþÙhÿÀ½6*Žq—KÏ™ßÿT‡M>‡ÖŽ›Tþ•„ŽÍ&Ãþf;^³núå_ø:ì>`5ƒÿsÞ¸í®=¢;$ 7xŽJENýßZ³íÒ¦9Ïÿ¢ÏAŠS¨ÛôïsGƒ¬Ñnõ,nÕoKÂ#é9¾ˆÿ?5ÔzŸõµ±õC9âo¶º$hÜïê¿ú5öÝ–¦ž"—Ÿq}¿Î=Ö]Îwþ|wúÿç±m„4|¿ò+´«ê†#¤ä¾Ítkioþì]ÿƒ-J:GÇú¬qñ°þ~_¬•[çTÒë_²–›lýÖc¿íº}ëWêçUÈÐz,?q ÿÀÛêåìºôW]mÛ[CàÐ?è©'p¡åhú©xmì¬Õ´¿þ®«ÿ=êM:>®ôê ¼>÷ö;Iÿ‰£Ñ¥jºÆ7é8eÔÓIK‚#§Ú­UNuW[†›˜Æµß絪¢ìÿÝ>TMÖpOÈ%ÅÕT] ª¾KØXÎÚ¦Ðv½þÿsK-"\H3{Ÿênýúú¿ñ‰ä?eoD€Ö¯›·¨«ó9ÀˆršèÇVO³Ùûõ'ʨ¨9×V=µ‹˜=ŧóÿ?óŸ™ÿ©ê-cömºxj¥‡knÃkƒ 8¸?÷¡®sîYÀ“3*ù}<_½ýö× õØŒ±ʘItnýáÿeþoè"±åÍÞ[Î¥¯×ù>õF×5k˜csÚÝ­öTÚžvì¹®oü&ÿûrßôh Ïý`ã˃Z÷K›C Ÿ£ÿ§ÿ\ÿÏ“âËP”O«¡/Lyl¡t@áœkR“(¶û+xÜ*1òoµˆwXöäYc‰sµ‡þ íÙýçFd†ç[»FÜu¥¿¤÷mÿ¶•Ž¥³5Ìs±ûaÏÎÔÇ{6}?§é(Æ8ð›ôü’þ¤\%+±¯Íÿ ¶ð2\àó´7éyÓsvìþ¿üZ½ö‚ÒÖ=¡ÚK]ü•Ï0»ú¶ÛêÖ/‘¶GÒýç­÷8ÜÐ`3³@üØö!°°vùxô5Äk¨ù’‹Zéi®©Ÿ‘En«ˆÖ7A-ÿ¤þGøOôð*­[Ü\è {›¹¿KÔÿ_ýH66-ÆHŽ÷{½®Ùûßø’<ÖXÐ>¿Òõ,öqŸòú[ް™m^øåÀË`û6{>ŸúÿÂÔ¦ÚZàݬե£VŸðŽÞýÞ—øUWÖÊî`ö7tµ ÃZòþÔV*{]í­…Î$™'ÃÝ¿ú‰³Èg“ˆþý\sÿR ãá°?Gô˜\mp5´LjàáîýöýIï~•±°ó¬Aà{½MßÈZÊuN!Àyí¶?{vä;Zë.h‡í,àÁþOõy"MË$ã|qe 1?,¿®Ñ·!ôokØæŸqÛ¸¸ÃÁû+÷þþ SéíÆ¶Òq}Žc÷XÉú@{®®ÚÿÐÙèÿà¿Ï«õØðø;–N„4~‘DáQ‘ëÈØ@6öýz­÷×ô?õZ|&*¨Ž/úQ]!!v”6[[š[µ§èH€Z«Þ+cZ蛹ò?ÕˆôÉ/xß >“?Èr^˜µ›CC¶ö´Þ÷oKˆ›½ô!@Þ£÷šã =Ð÷¸[<¶6ìsùþäZýŽÈ ÙDÖÛÖ·uomγéúuþ‡þ7)3CÚÂá>×h§èl­»¿F¡–ÿN†ä4d†ý('Ñõ¶îÿôìy%¨ýïÝŸ¥êNÉpï{ò\'{k!¥àFç8{¶Áÿ¯ü^ªæñúƒk¶·ZàÚšcsˆÙµ¿ž×û{ù«¿OWú;¿ž] wWgÐpp"AC‡ï1íZŸ¶o÷šóC4’Ô JÒÅ% $’ŸÿÓçÐOèåÎðo»ÿ&¯ãôž©y¬K]"CœÓKcþ7/ìõÿÛkÒ˜Æ1¡¬hkG I¼*xZ>©uKcÕ5c¶u—^ü],®¯ý™Z}K¤ëe½Ã¸c_þ}ûRê’&<¾)TBœœ«]ˆ>€¹Ã½ÄÛÿ[úü jWUU42¦6¶ŽÐ?Íbƒ®wäP7;à\œîX¾)Üõ.%3ì '°Uc.?§d‹ ¼xY\Ï=<§Ò}¼¹û¦XAkZàg@áøeÙ­eQ°È×·÷§kKÚ×FŽëþ¿è®|;!á”züÊËú'vm‡ˆoãþ¿ëÿ[®µü“æ?×ýá?Ò8¬v¯úÿ­^³úcçßý×ÿ>-+‘êâ]üe0c´+“þ¿ëþ¿àÒk<Š=ÕhC5ŸŸüéZÔ\Á'B'¿õØÖ¹!^ÿ×ý×ôªaƒ·Å2xL¢—·þ„€:‹iYŸsϸ}€IyçÝ£zž=u6r¬qþo{·íl=ô~š-øž½µŽrOÉþOò䱄hítk"=¿ýEŸš3Œ¤lÏ€ðñËþõž<$·ÌàæØl±îî2ïÈÝ&ê†Æ{ƒÄû½G¹÷ZÿÑý:ÐYÿ[GÉé^µN­Ö@´‚æ†îþhîÙûžŸªÿÓֿѪx˜o¥–Ø4²³éµ„h=žÖ7g©ô¬Èÿ†LB‰á•ñ6dDˆ¯–>–9ÅÖW½¯Øàe¤ÇÒo¾¿õÿÏŠ­WÔay©¢àÐÓc~œð{¿Ñ£u5ÁîyõixÚY£`¤bÈÄÚ[ü¤ûÿFµ&8 X²N¶êŒ[mÁÏ / É-Dÿ'oúÿàKA¯Èع¾í6‘ÿœ­¾•eTÖ+®±QÒ!¤éô½FþóþoÿJ+ÙŒNÛ¢Âd»Mºû~žÿæÓäA Üv?ÂyüÚ›’Ö5¤‘iÛ[D‡4}?K÷?ã?š[Ý/ÚpÛFM†ç“ý†‚f÷;ùÚ¿ÒÖ–CñX×–8XߢIÚþ?œD§.ÚX+öšä¹Ïv­mnÛ¿¿ÿSzŠ+< TGOý –Cˆöt³¶7}ãM°Ià: [¿ÛþfY—{…‚ …M$Né÷oýú5¨ÏJÊ´!̓¤Ž÷5›Ö&=ޝ&ÌWº GØòaÎiêßîý'±èGÕdÿya&5æÏ +&ËK©Á«_¹­çé}6¿ó?ô§èZíê†ÊIgÚâ8iþ¦çïßþ‘dtü={2j·ÝQtÖàáoæ~ežžÏÓ7ÿž¬EÈÁ,fꋱÜés˜}Ìy?Î~ìöÖÓ¤b<Ò¿I»^…/©Áάµ­tF?ÈÿÑhØÎm•’ 0¸ò5}žÏõÿ»‡òÿÑ hžõêr›H-µ–®¡»ƒ 7}Ÿ»~Æ]U{ÿëVÛèÄ¥]ŠÜ–²¶º²ðâÖèÃ}Íe~ÏVÆz¿¢«ô*å·ú l÷½ó¶Ÿó\.–ÖØÃ‘d4öÑ;Ôo¾¿Ò¿ýüývßMYŒ¬WË/ß`”+_Ñ=°ã2ÝG!ä床 ÚÝïl{IÛ£½¾§µ¯DÐjÁÏ’…¬–Ï1÷§Ã.HG‹NŸÍ~ @±éKUáä6¸€G‘¹gÐö–87S[‹uøûåxÙ¿´J³‹˜”±Lš÷1ã3Š%&heÂÿÿÔíhh%ÄHüѪÉf¼˜Y¦ã8P}¦=° ðXóç²½-¸òýݘâa 6|uPÞ]ôŒ™ÓïT*´ë¯?NU<ùòÈÔ¤eÝýÇŽÁ±º bý%¿Í@¹U¥%sÐËù(oüIIà~Táâ+ØáÜø+ì«kZÎv€ ø,ê­xÝôîþ‹ÿ>Õ«.< ?ÖþJØä¢1ã”åáñ~v ûÆ#ûÒÿ¹b+ðçñÿ_õÿHŸhü½Õ\ŒñCÃZÇXçØÑô`íõç¯bC2jl€â!Á§wé69X—9òǤ¾y~“Á:²˜‘á'áÈÿΓ\ík¥¤I3¬Ïæ?ý%J°ˆ ·vŸË×ó½®BÇö¼¡k£ÓÚH>w²¿oóžúÕo¼æ€Dx¿sô£Š/Ñ멽EÕ¼µàXÍÞ×ðZÏ£îÙýU°9ŽËžº†:ÇWê6°ÂÁüÖ;÷¿±ÿn.®k„´ÈV¹<³”eÆo†¸x¾v>f&‡ˆz]aªHï÷•‰nc‘[K›¼±°ZÛ·Ó©›ÛúK¯ÿ«µsçÑ{ƒ€vÒ çó=«žý~FCli[¤¸þ‘•ƒú=þƒ}?¡_©gó¾·ÚI“,’‰52ƒ& x÷]v_µ®kŸ¤O¸'ýÙíCÅ—Ùk‡¹Pèú_KùRÇéõ–^âöƒ ‚ZHßÒz^—¾Õj·ŠZk­®M³»ý~šŽ0â£#ÃÆ_½5Ò”Eˆú¤k‹ô äþÏk±ö?ÝXÓw ÛÿúU×#ƒèZ}#Ün=¿õÕ¿fE5ÄïÖ­Ûgèÿá}5™ŸKˆm – ;ÁÑŽÓn×mÿ­³ùÄl‚O¨áæ%aÞ½[Yo ‘s_æ?ýÑ«7b4<¶ÆÉiÁ%¾§þN—ÿ9þ’»?ã=ZÖ—½¾æ‚æÖþóv}-›ýÿ™þ¾¢ŽnVH-²·ì04ןÝvÔI£ÃgðV|>ªœÃެ4n¥»‹¶<»ô¿géšôÿãÒzk «ãš±i¼6àè·]À4·Ôõ[íô꥖3oú?çVþ.S.ßô›p‚Öi{}'íµÍý%£þsÔÿ­z‹/6ÁUŽkÁìÐIõk-ú.kÜïR»?ë‰À‘!^¯û¥ £*_«ùœ7µàŽÚÇŽ;¬}[6ÿ‚Ùÿm#ætÚì&Ûë{^âú½­w·ù¶²ÏÒûßÿþ‹ôˆ]; ÝŸV®,Ùéìlz#k¾ÖÛ?‘ì£gøOý+6ë%Ï-x<†Ýª’á‹„²K‹‚?,}–ˆðŠ—õ¤Ü£æÜzÅ^ În€íúKóÿÖÄL¦2Êáã{9>nýÄf8<5Æ ‰hÿ16éiÒGîƒ'ó’•’}_7Ëéý(0Go•âzÍ›m}aðúËC^4÷;fGç~zIê_fÊ ±¾«ržÆY3¸=Ïö]ìoéþkü"Óêý$ß‘cØðÝÐâ^>6z~žßþ‹\æ죩ã’Ïu6°9®°—z>ýßÍÛþ‚ÏôªÞ. â#æ1®?ÖÿØŒ™ ¡ùKÖu.œnÉuµ»x° ßAÞæ—m}v?ôõ«—JÅmtfËl1`<€Ïæ™·ó>šWµ¦‡ZÓ'=ãý'ý4,L›ND:6´k?ëùЧÒ2>>_ókÌL HýÿÕtÍ;_¸¦²`éÿ˜ \ëàz!£_Ò9Ä´1ŸÉe_ÏXŽ2ñ‰÷;Ëß¿þ¡S¾Ã] ´H‘.pöÿ_ÿI¥@Æe(ÌIŠDѯë0¶ÇùÓ§öÓRc^$,- -ö€â6~æ~W©…Ïpt±ãVƒ«\ßðÛáÿÂ}?æ•ܪ•Öé“Kƒ€1îÞÕcÔþ­ž\ ˆ÷Gê¶›Kœ[ ÕÿHµ¿Iì¯éªç6ËžïJ» Úf$ûýìßOæþôÊ_c³!Û¤Á0 #c¹ßCù×­\a‹Ž*ݹÒKÆâUŒq2‰ÞñúíŽrŒ¯úxXã5ÕWï–Ç s·¸øÅ6Ø×³è’Oaß÷\ª=—:÷¸Y¾±¬€ÐÂ79þ—ýÑ"î{«Û¸z7A&6ïØß§±3ŒÖŸÖý>>5†?i¯ðT+ô­cô°|~‚²,[¤Ï†“(;ILñ Òcóÿã 9<% p‚ˆÎ2þ÷ ½:Ñ'ÕÿÕØŽàÂƒŽ¾j-%Ó„:ÏÞ¹ÓzjX•Ø`ù”`ï=UpA0“À•i˜÷l"¾ˆ‚O-ja„‰ÐZ¦Fä«q0;öŽT\,n®iŸÙGÚ-Ñ€ LØÑöÓüâ©oRÝIɪMVÈÄ—QüÇóÿMO¹­AâºX š5âØ$rxåW²ÒçCutÿ¯úÿ­e®Ÿ´â6ÖÜy™¨‚#s[S½µäÓÿ\­fYuµ8´K ¥?žÕ.<4hüÝQ)€†Ž½Óh¯wp ¿µþ¿ú6wçš,ª–¼4_òó«nû>ŸèÿÁ¬Z-µ×Vçî-ÉÖ'ó7ÿUC¨[e9,»{¶ád™kõc·ÔÝžÏý­ËaéÓÓýè±@q#ë×Õÿ|ëZ@,È2i´n%Å»¶“µž£}Ìý'üþ”A/¬XÛßp¡ß©ú?Ûÿ_øAd·!øíºêÎÖmÚâèôý®¯þÓW³ü"Ž6Ë®ÏsDÑ!Úþc}õ*¦ž!qm—Z•z}-çzÿgeŒ¬Ø,0HŸvEγoè*ÿÔ~’‹úï£Kƒn’Òâ?:ô}¨c*ÊÉÄ-u–85µ†´¸º³þþžÏOÑÙúUO†›/»"¢×½Â–= —1ñêºÆPÏéCõŸôuÛÿ†‘€«= ÿyˆÕž!kéþ¬dØûUN}nykm°–xÞ=?fúÿŸô¿Gú_ý\‰g¡’iipqúU´“£§UlÆk}ZìÿúÑú?Í'»¤8²†?amo¡Ž~ßϹ»Ÿ²¿ý(ë°Û`¡í:KžD¸Aþcü'çÿO3ª«h#Õ¢A`½¢*‚ &,Ûýoê¢Ù“Y Þí¡ÅÚ8m>ŸÑY¯²ÏR¶´ax‡ÚÃ;_k\ö¿ÒØ—VeÌ#乄Æâ7mü÷þýÛÿ›QÆOé(bôÓüWB¦d¿Ø!íi29YÙ™L²íŽÂ}í#kà½j÷ÛŽÿ¡ÿªÓôúóš òÜÆWCl;ç÷,®¯Ogèk(Æße®s½&ûw5ÛHŸçK˜ÝŸú‚Äø.¾n-ø–TO¼]!NL©”TæXÿT¸—D~ŒíôÙ¶·?gÓÿKúD²G¬FÒOïDñÿSÇ®ºñ›cE.l‚á«çÜ×Û·úÿ£E}Ï5€ÀKH î¿Înþi ¦ÏL|ð…±ßÍzqI¤Üj({Þ]º=Î%­iß¡ÿmÿƒV†#n«Ô¹òIö‘û¿Ëwç¿bÇËê@°×2ò ~hüíë^ɯ™qnÚåÃS»OzmÜ ¥£éý _ªGûÎÖÕX²º@¦Ê"vûõpõZÏ´=úoøZÖ{?hgÁ¡¾£í~òÖ0ôv»úŸöÚ{ïvר 9£|ˆ×_Ïçÿ£ÿ_Òª¶‹ ²i·W±¿¼Fû©{]þ‹ý'þ¤SB†Äxçü¸•p¾vzWKÊÇÍmÖÖ*c采‚÷Iµ{]ìöÁÿçÕ¶ü m¨ú¥Íqüæ@¸×,Þ—ö¦Ž ÇYè€ZÀd9ŇÐÝelÙú,oKù¯ýVµö¸¸µÂð·wïY»ýóäSŒqé>ÕÂB_3‘Äðëê”Rµô±•ûšÝ­ Oò=ßÔjV9¥„€XÀ*ø˜— …Ö»FÌ4Û‰öïõ»K@!Òà5 kÊ< 8ˆŽ.#ÃÃÃÿw󭈕îw“”q¯;¬xmŽÜê=¿¤ÿÏ‹'¬}±¯Ç¬n~Û. ¹§ôhoóž…ú³ôžšÝ¾÷04¶C] þÆÝÉß™E%®ºÇ7é=¤ÿ£QÃÓ>+zeÅýxðO°Läáââùx?ªƒSŒÚâœ9Ñ‚¿oýsÿ>,×›‹^ÊGéž Y:{Ð÷¿ÙZ¿vC/­ðÍÕ tGЩ– Û¾ªÛsZ]±ÛžÙE¾ÿ§ý”˲?I’7A'X–ÒÀ±.÷B^Ë*†‰ :rvˆú×I±ßQämqö´ß¾¥UB²@ÔžßØ@ñ^§‡ù}? ×ÐΕX¬®ã{äßqƒ ÍþwÙêÿ¤·ùÏKô*øôØ íÎ:|»oõ_ö¸®ºLsü´ ocois$µÐ$~ã‘âø¿Éûœ?£Âº¥#·õ´Yù´ÔY[Ëšë -Û®ôýW[¿gç¹^õj¹®Øéžñ¢Ï³‡‘eŒ²Â ¤ûšß£³wó?é?Eé£9Ô×X-¡E`¸ëî?ùöÄøÈˆÕzª?7Íþø(ÄÃÅÅà¤Å–n:9ÜÏhwÒÿ® d¶áuo p;]¬‡kýÿÛo§ê)ó^Ê÷ÆwxÉö7ý«°³W<òâx-Û»ÙþÞ˜$Db?tñqÜ®Œx¦z~žê·†@±ðuF¢?ÉÝÿŸtÙÞ|÷p³ºe€°±òæ€I0æŸÍÿF®:Æú­‚èçí'ñu¿ ½k8=\5ÕÿÖÝÈò Â7ÄsÊbÊsÍÔ´Fšþêèò3¡ù,O±Ýc…{ƒ¤ž[îð~ŸÐ÷ÙþÏæ–4±pȈ“Ã#K¯ñ›@9ߪÒè@ÈwÐu“»kiÿGÿ g󾥟£UCòXAfÿiöÎÜDþ—õ}žŽNÊÃÆ„þnõÔXÙ,-6¾ ­¢æSÓ­ßè}_Ò,›ó[XtØl,Î͘Ýô™k¿eßø“'O–P¥X®’ânÙm¬­÷ZÓ[\$IöúŸ™ëû¿Á~…Tnó“Mì±û¸7G ½Z¬}^Ÿé-ÿ‰ÿÏJÕ/uX­6Ùê\ÿ{ߦ…Ãù¦7ûú‘cu û7:ºÇè´.†ûØ7Ó³ý‰±¬®ÿ7ʼMŠ¯Ç¶—Y[ö¹’ç±ÒHŸÒ}7ÿàv(2Šrë«"Àâ xÕ¤¸nݽË3ì—a8Ë[þ†–ÒA±ùÿé9üçú/KühØyµÖí„XXK%¿Hí¶«(ú®ÄøÀFdׇ¥l‡tïévŠÐ@€Ê=Íöa ìfîqh{š}¶i-?Gô^¯¿ßþW%ù5C mM2ò‡MÛ»ôv¤Xùv»ÖYé¹µXíž[¿{Ûþ›ÿ×üe#“Ò==£ûÈŒ#I?Þwr2»Û6´‚ÒÑí?N§ïôÖc\*´¿, í„û› Ýùþ÷²¥»èÐÖ·ôµÀhøÝô½Îs?3ßÿn,¼ÆÓ]ÆÚØ {aíd]?¢ýÃ?þÿE¨ÄxO õq„¾2h)Êý´æ»káF·s· Ölo¨ÿøÖî-¢¼gd1Æö1ï5ŸvÇÞvþ—÷îû3=/MÿÌú—Áª~†>õå=¯viŒÛ{ŸìôÙS›üí{ÂYê-®Ÿ{ 6‚]k½ÎlmÞc7¡þmHL F 㿞÷ãúls2£-%ЯÒþ¼Üî£Vaî ×]ÇtÍô¿á=¿Íÿ„­¯H5Ï`eÂí¸¸ïõ¿ÑýõõæM 3k °èuÖî¬ŒÜ›Úæz{}7û\â=þßvÇþýÿ¢ýéS"cF6º2”€Âܧ!–µõ€ïÍ?Ër6Fn3v׿nÓï{†ßÏ?Ýü禹‘Ôn®}/KÝ;œY¹¤û}JïþvßOô¿áU۪Ȳ¿mn²×CZ\}2ÒÛüß©þ¿ñgX€Ë=?wåWI²hIÏ0ÜǶ֑-ôµÓè3éÿƒÿL‘n+­­Æ°a¤í°þo¾Ÿæí÷ÿ7ê3úT,l,¼V8±ì2÷;ÝVã»ù·7ùŸø¥;1aac›ðLü­É„ÑÓo˜&£ßˆ6w:í…ö0FŸæþüR¡Môßëè\k.sZ׺Çû?Wý-‹5ÝxW5SQ7XCý­aßæ«þrïûmWÊ»/)ƒ×sZɱ£BèúW:Ç~“þ'ùµ,qH}<_¥#óCûˆ_N¼?£ûæ¶-Ì»Rï{Þ ²$í.nÿÑ…ýø5ÝÛ”êÚòÚ#F8 #÷¬ÿÔk϶zvŽd‡ûGgýýz#êu´°Wᨘ?ïìOÎH#ƒ¬e!éã“"ǵé/sk®‹—1ùÓÿcVfE”¼²ÚÛµ¤A'Ûïßí]5ݨžÖ5¶0飡ïoüEŒô¿ë~ªÀ4z1ž••¹®õ½®æw„gþy³ÒOÆhYââÜ_§Š ™åIŒ£Oeõe·3£ÖËæ—z{¿:·~š·×ÿúU{&úé`Ý¢7×_ÏQÅý’–ïôÚ]»M²7ísÒ{ÔrqM­ >ŽÃ£\HüëïgÐPJr™ùv<<_4x¥“ä‹\fË\u õ·k„˜ð¯íGm4êã¡Y‚Ï¥²ÆÂ"°TêÚ÷×´Òw´oþNížÆ$ö‹Aô½§‰#pÓóF3‘.2}4ÉÅïI¤âËlh{À ØàŸw±®Uò2ZìÆÖÚÆ@‡ Nïú…ª³Õ±¶³ÞçjùÔÿ[OÚ7dîÖ ¾z¾ô¢ º­¸›°Æ,ëÅà ÿÃ>¶âþ›í=¿›'{Ûîÿ_Ò!{CDýã«Pj¸Xèùòqÿ¨M°p–Æ­þ¿ëüÛE“¨£ ß~&Ö3¶¹Ì‘µ±6=ûëŸñõÄwØá¨tuçüåY·ÃcŒîñÍoî¨8“P³lÃ@בýtÙíAo›?Ýÿ Vd¸8â&GˆOŽú¯¸[c„³P#ó¿ò¨³ÎÙ:Ÿtæà‰W 74'~nÿúÚQÓVB!\1Ò(!º ‡kØCœLó1·oЩWê‡46»-ØÝÛ·WÉEûê³þ gÙ–Xöµæf\_1ßúÊËz[Ûº9`é5'€ ~÷õVœRÇ‹sºq1ÙUv9쨀7ç÷{Þßø½êŸQg¦é>à ÕÑü¤Ý:ñ™Ô !˜À8¸w¸îgºç{?ôe¿àÖ–Vf—€H€]® 8{ÿ;ßïDÂfªfNpêùT\ip€æ¹€C˜gü÷úHøDYaµî‡5Ì ×ÛÃÙcŸÿŸ›@È®›rvÝÅžó¨ö†îþ_þŒWŠ(Å680öìÚZC˜Ã~‹w«êƒVHˆðÎQL@ÌKYznUëï=®°›Ku ˜hÿ3ýôeìœ|Z‹É6Ûf€¸û™\ÿ1¹¿ëbÈÆ³Ô.¸NÁ Ù¯æ¿èújýد{Zrh k̹Íö½¡Ãèÿ¦Çÿ€ÿ ÿ]PkÖ¾œKåGÓÓÏæn]ŸNC^Ƹ‹Œì`q oÐ}¾›?›}ˆµ`cÝHvCeíqz„¯ïãÿ¯é?KúEG!íÃ6PÜ{KZç ÃF£ÓgØö·Ô³лíV´ké®h›ûìhÇÑ“îõ}ð¾—ú_ôipʤb— ˆQöø¥éÿÑ›_ª²‘FÖ ƒv¶¾Y¶?:µ^î£é07P öÁãþ oø4#‡kÞÖîhÝ:¬7éýu¸•ÓA ç}+'Ýÿª“1Œ²â‘ý]GÕ/’KHÇ×Ý‘;~‹”sÆ×9ð×>ßçù»»þÛVñòϧ$À>ÿIµ¨6ÓEÔ0^íÍÝ,ÜgiüÚªÿƒÿÀìþoÑFéø¶1®.-/qöŸ¤Ö´~nßôÿøþŒhŒ¥B>•äÄ™«¿ %ÕfÝEOº Zl‡@ÝôIÿ¤¿â?œTs0:T{¢“cŽÛk®lû¶]íÙeá?à¿Á­\ºÞ÷µÃè7éûˆùËÍ¿¸¹ìê.µÚ,cñËwR÷ š±Ÿá>—èíý©ÿÝ «ý^?Oø_ÕþúÈÕX$HëÂ?³%®-›1Þ襷V湟à¯gþ½ ;kµ$Èw<Èüå€Î‰‰‘e—åZl6µšàǦûùÿñ?ÍÿÂz«cš«¬ÐÖ=ÚÎØ÷ÿÐõË’?«6} ûœ?ëU OK2œÃ-ã_ ‚ÜëOh䂟ûªå”Vö¸8nÄŸú;”Š[-©¢4{\¢1È.çý~,‘ãýÿo–:Ö'‹ºí}ž÷7V@‚9ÞïSo¹TmæÜ–Öñ;wÑÜôUÚh5¼€g·îûVMæÊ³EÍ»_ʲ­®Ò AÛ©ÛéúÞßç?@…—Ôò_5“µƒ_ýXäñ?Qù¥SŒÉ®†HpØáý/ÞnÓÚ^û?JZ#N=¾ÿä8ªÝÑËl}¬‡¸‚EcM}ßõŸQZÀh·ZèÝ%’>Œ}ú‰½K\]ÚÁ#úßÔL65³Å&PH‘"1¦Q“SÑ]pÓíq@ža¾ïßÿÁë_èç~úÖè÷D7Oê{¯¥¾Ó@'XØÝGõÙûˆ£ðëÞyÒ?×zi5­¯"$Ýðßè²ükx=ÿÍú ÛÆé;}!]–ÚÇ¥[„ý5_Ö$Ìðš N¥pßÉÝÆ´XØnŒ\ññýÖ9»ÿíÔ¡an064´4þ“YÔdàÆI’:ínÿMßð›?š¯ÿI«Z÷¿Þþ|N$ŠŸî±û`NÇËó%£§V÷ú×6·¹Ó;áíhú;)­Í²¯øË¿œÿ­~hñK@07†ÖÖ·g.÷5`^Ù°°XXOÐdHŸêîý/üØ©Ûi«Ùî hp=Ãvÿc‘½5õiú\_ód±+Ôÿ‚ŸÓcÅ51¬­¤À`L{òÝ5Xòí»„ ?è¤C3ÔÐñi³s¶~“èïcöªÝA®n€èßhÖ5oæÿRÏý™g†¯‹Ô¶c¥Æ'_ùÈ(w©c`ïîWN¯ö8’AÙµ»½Wþ5VèÁ¾³ìqÕº5¼ #ßoþ‹ÿ·ñwëŽ:A!€ùoýýûˇ‡üó7”Ýáÿ¤ÿÿÐÙûSj{H0A˜)êÉnA}CG-ó†ï~Ïø·Ûÿ¤Ö•Ý?Ñ«BÊÊèZÞ (üö¬áÊJúQþ«0Ê>­;Ë ƒA—’@ø…Fáì¾—O<Ü|¶L4<¯èÕ*séä4ø$ñý¯ÏLŽ3WÛô[à¶–Ew{>–‘Ç»÷Zºúú3œj/k\Êk x3<3Óôöÿ¡®ïô‰tLRØö‡Xæ1ΟcFÏ ßüùgó‹]ÙUϰÈíñüärN4<5û¿?©ŽÏá ;,e×M ´00~ulÿ_ûwü3ÖZn÷êX4fƒQôê~ÿèÿðEµ›o¹Ïà¬ÕaåÜ,ú2Nœ¨qJG'H–Ü! Hjäà\ê‹v–þ铨ŸÏÿ3ÔWýJ+kžã´9ÚÌùÛ?ãT0z&F@õj©î¨IxØÇ»ù§ßö´Wíÿbë:}NÆÅäʾ@hg¦Éskªš¶þÔþrÿSÿI«y lëÓŠMXÈÆ5¤¥¶ïæ\ø}5—FšOò;Ùþ¿õ²ãÝchuV­f†I÷ßCû_¡ôÿíÅ«Ó1l{‡Ù®h?£2ì~}¿ÑÿðzàÖ³-éx­`ª¯Rú‡èípý){†ËÜìŸôžÿõ­0åjkú¾¯quHŸLe?ý&çt®Šà+ËÏ%ÌÅ{]¿xvÜ{²w~gó–}›ÒÿCÿ´.¾¹}…ócÈ.ÓIhØÍ‰Ù~ù.qÝ·Bxûþÿü¤ìÃ4^HÕ¢ ~ï»÷ÕL¹e2(ú0dŒD 3:¹yÇ4æ@NÖï§ÿoóðkM™vxª_${ü4’$->i~“*ýM¤q̺gþ—øDÒÒöï™#A¬Ý܇뇂H'Ü'èÿa6-­%ÆÈ:þ÷ç¤EÈ.(ÿ¬[Âhšû¿ µ¤™hZÿYSõ¬eÀ¸vŒ-ú.þª·uBà°5‡€úïú(Ç 5°h3<{‡ç5;ÚË3ói ᜥÿp¡(Dm|_0r3ñߒøn'P$´ÁÞ§ó{õgü£è9›ÁÒC‰÷í;üÚèí9»[£¾ˆŽªßÌTrq1ífÚ½–ƒ-’[§õ½ÿ™üÚ$Dz¸ê_7÷™0å©kqŒ‡ò’fUö_I§Ü 1Þô÷%X¶–¸nsŒ?³¿z³…ŒæÑºÃé;¼ì÷þgé,ȵïù͘tnÙê7éÖ›­Y<2#Ò¸ÏÕ(Ä{‘âõ5} ßS»¡Ð Ñk¿H‡c+¤´’òáwmužçlØ£‘Ÿk-·Ý¸f O¶½Y™Nsšð÷â=²x™·ýõ€³×~.Þ¯©P2úp£{ëàÖÌA;gŸôlúj£²ç5•‘®§Æ?;ýõb®Üs¤4ü?¬§W¯‘^;N×X@‰Ú{Ü­ :¬ã£[GþsÑtŒW·Yu[›e²“£¡¥ž‡­ôö„·þÿ=«¶aµÆb~êíU†R+5€5£^6ª¬Ï.{ŽØ˜žê¶MLzLbd™xZã¸\à×6ïs‘ïÿÕh˜Wz´wKŒ þ·ú5Ÿ’ë2ÞìfY°²ÏyÚ\}§Ùéoô÷­ÌjU,`lTÁ´H‡ð~®Ä(Ðýÿ/òl³ Fq~÷÷PÙalµÂ#CÛè¹éeZÖ‡ðøÜâ|wUíÚ–f¯‚‘Þ[ô¬s\Ú]·F–î"`Aö13¬Åíò ~wÙVK˜çAh-pñ!ßú/ôŠÓr?JóæœËPrqâÛ,G8¸8IUdA2ff{ÿ¯øE&þ¡Ñ”‘¡êÿÿÑî"BiN’x­x0 ¬ Ε£Ÿ·@$ˆÖÓØßk=EÖ–‚„úC”sÄ%¨ôÉtfA«Éaå ^Ë,.Á¾5tn­ßE™_¡ý§³úWýjÏð¥Õ4ÜC¶‰u|³ó¿¬Æ"ftJn;˶úHÕ[m ÆÇeUAkZÖo±Ñ£Cj¯ï¬ÜøÈ"ÿœ„u¯óäýmG(¿Hùÿé96âdØæ°¸0> .2ZßÎw£þ’¶+Àéí¸µ]cGÓ±Œ{çÙmöØÅYh‹ž ®Ý"Á1Þ÷ìz³UMµÎ$k 84†¿Óúþ—ùµ2Là”¤?¿ÀÉ=@$Ücú?×Húɤ6¢#资~»koój¦f-¶Öw;u˜¬O±µÿ_þÿÿKrÈtÔ@ ½ù»YùŒP·%¯©Ö} Ñ×”ïp1>ªý/êþêÈÂb´ÐŸðž}®{­»n犚^óô…@nvë~¥ôGU¿¦ýüg§o†ç€ç†È`?Ÿ°~šÆ{›¯ù¿Q'9µt¼–­7€ Þáéÿ×­UzV}- Z¶ [ n ÞÖÀÙ^ÿÒ‚¶øU%Fqú³âýæ{œD†Úúx}HŽHnvÐ÷K]¢?ž»ßþ޵­ÔöOd0ˆÐû‰üßø6#;ì5^ûKk¿8‰ö¿ß±ŸàÕL,œë!¸Äú£i¼ÏÔ_Góµÿ…ÿ‚ôÿÂ&\Mp'ÿÑA ‚fzx,°ÏMÌÜ@qv¿øßoøçv=!ìs냷ÛcQúJØßwóžïæÖŽF.%·ñ¸“Xs«cÿ ·ùÄZÙN=m¦ Æ1ƒ@%ÛK»÷½èÄñxGÓòŽÅœ1Iõzœ§bgÙ^ý¬§`׿iqþVÖݳüÐÅe88í¡¤¸Æûl#ÝcÏÓúÿ6¦ë驤ÎÿS¼ë»ïTmµþ›m-"²#pŽÇfû31Ó_ô—T²|Þ˜_¤|‰r2+y–—1‘/Ú7÷íܨ?ª2«Ö×ú##ù[FÏå¿ýé˜ ºvéÖ–³zƒc€ö@$!Œ\µ7î³Äcˆ©t ´îvø#˜óû»ÖÕŒ8£Óöµ³»ÇwöWöö°nÖø’§‹Öln@ØÂêΖ4}7Þoø&+Ä€&#¤ƒ\• Ûåz¡cœ} H'ùSùÊ?ôž×H<©×ŸŽ}ì¹­ñkå¿ÚÿIþ¿éUväË‹ƒ‰kŒ‰:ªÞÍ GÚ¸k³·Šò,p˜#¾ƒú¿õ´£eX›IeV×î×Ýýu mi]îòÓD{ÝC±­mãu.n ü?Gé~®Ë?˜ôÿ£ƒ@ƒÂ°’%N¹Îc™½ŽýúLDþb êOõZÓ±Æ]û÷¬ì*žÖÓSÉsÞÿp5?Gýü'úþ’Ópr,¹­¬Cƒ„ûF‡s×ÿR'D/Šöe5­:-¹cŒAÍN˜yŸ§ÿYÿÔ¿à”[Ô±ô4.?7è9ª°µ•¼ÀCLÌ#ùk!Œ{Ä÷ÖB€1³é¤Ãe¯ï=a¾ëkk›£\4¼ô’£—Êkkݺ\v±±û¿ð4±ï{ñë6vºú>Ä.¡º–ºH5û ¤Öý6ÿ™üÚe\…’@Yˆš:kú-=åÍsŒ¹Â?³_C-h‡°Ã¤~i?ù5 Cì`hÄ@ì´ìéæÜH­Þî@#»{þ >êQÓmÿ¸¿)Kåy“\ºO*Æ%V š}'ly{@w€?ÎcÑÿ_ôocv¼ƒ£šH?ô¿×ÿ>#âP/½”¹æ°ãÇÒ˜ÜÆ×ôHÿð_ëëØ2Óè×­¼º+ ñ¯ö• éyÌ÷)ºßd8qÄý"æ7wòÞ‰‡maŽÐ‡ çÁT¬˜ð ëýU€Äš½VÇÂÆÅÜö×µï%Îq—ºOýGýmÚ\·¿)ÍÌsƒG»q„ëpÕŽöÓÙI0Eðž8×úÏð– O«æ?¼ÕÌ%å¬I†AçHRÇ{}[„îsŽ‚'þ­=ÙÔßDŸÒÈ&?×è'Æ}fŸ~š—DcnÕK}Á¿ûÆò`WË/Oýû—ž-»˜{@;ý=‹7Ótù.“2 ìh†ˆàôè,¿K¼,GêÈð’8ú¿ÿÒíRUÃÜ‘>a¯iîœBÀY¤’I«Ø¿è'ÉcddYM…¥£qîpãwîn[N˜ÑW¹­ p²,hC¾ ?œÇÅ1 ~HëûŸú±› „N£ŒÑyã”æè’ tvÕeÙ†Ú€h<Ïò½þÿFÖþýhÖ`z–µÏY€æÎÏN±û¶7w¿ý}E_2¾Ÿê[šÐÍ @Ídû};í®·Öÿá•.I¿N­ã8HÆ£ÅúZ~‹]×jb|y@6[÷I$ ßEJú²+gªêÈ$Èc¾”/üïõý*ǽíÜÆй šçý©ýõþmã¦Orbäæ‚èy0æ ˆÓ÷Û¹hוCp¾ÏPÔÂày.þOó›Õ|ÆzÏmyõ9Àìs€>Ý­µ¿¦ý#–Ž Ä û3 ¹ ?¤¼ Ídý6ú[«góõßÒ+@@^ã§èÿŒÃ L4GÌeúM·Õi—6L´IØ\?Gïú¤NÓ4ÒM¡\$λ·Sé7gó~£ý5‡ýq F1<:~°…Œ+4Gµ.OÉ>êµ/Ïm—ce †·°†û“±SÈËÔ1XÀ6ˉžGî»wõ?âÐòZá“c[.ÃXìïz­’,k_nÇÆã¼ÿ›ì­Y„ëÓe‘ˆŽŸ¢=!°Ì¿Sc‡FÃgý\§Ô-kÃên¡­äs?Gý×ÓÃ9Ot¡ xOÖÿ_úڲ̀k† uŸ"~—µM숛 Cʯ hí2áÛ·—õUÊëetƒ!£hywý-Ÿš†á®ºÏ2µº-W^ã|š¨ ~Þ[;¶µîfßð_ÎÆÛjYËKìÅT¶'Lʺ ñY­Ž†ÙîþUÿ<Ïøÿæ¿Ñ¨ØÓd\[H9ÜàW[¹‡Ùm&K¯g¯ü'üW¨³ú–+3ZFßÑ:wH pÓc™üßþ|ÿH«ñk¯ÊJè’6sñ ²«›Cô™hiƒ³mvÖÏÑÿÆê5w.ªßIÉ­Å‚¶‚ö‚^Ç}ï«ÔÙèÛþ¶.j»í²ZÐâÖÀ7{Yôÿ´›˜ñÓ/õÛ5ÔÞ-s·ß·ô~ÏMÿΧOÒ“줴7‘’Ç›Gt:öÿ…¯w»ežÿç?Ö»u7lÐðg{~“}ÿOýí¼êªßÓÜÐu¾?uÇÿE§õëÀ>Qýe€×{º¶XÎ÷g“›sÚtr~ æmM¯¥6þ,sZàù²Ö5¿EcäÜÖ±ÂuƒUÑ\æ»­vƒ`˜à5Ú›0#šý/ú,¢W þò\;öàQez´nÞ÷)¶àöÃÚOò‡ù¿Igá=ÌÅ4m4—6u;]û©Ú.õöv …´&¾_ÝG÷óoÄÖ·õúqÜK«¸~‰æÜ ·Òퟟüßþ·[’ÖÐâ}"$!¾Õ—Ô(­þƒÒÜH 9¾ÿüáAûÜÐI õÿ_ø7ˆqÈ\4ºÈ›—Õy.Ç“¡t˜1šÂ\÷Ìÿ £LÜÖ†2`ÍT0ln9-±žÇi¸ Ûô™ü×î{–¸8–0:­püöê½±Þÿüø«ê7ô㆟ã¦\Õqq~›Ž..âI0uÛ?E¿æ+”“ÀÓáþ¿ëÿŸbXë CwÉg¹¼~ÿµhcô÷/ïØ«8ñÇ÷–Ï êZVF¤ýçý×þ50aþÿ?õÿÕ~š×84¤'ý×ý}4A‹ŽY°m<«#µÛf”?ÿÓëXæ–y®ïõÿZÊ ý%Q„ƒëßâY'N?×ý×ù ÒÓ¹ÁŒ.q†´I?À#æ•›MnѰdò›2DdFâ%1ÃS'?“;N\${GòÖ=Ý_§=¥¬·ˆ’¶]ûÖ:ÏôÍ~‰s™Oȶ÷ûŒÚó»_¥¯³Ôÿ­újdµÚµ„“ÉÐi›îYÒÇë’V[ñ€†ß4~kÿ¹{Šƒ2+f÷oöײ=0Ñs_WÓÿ_ѪXø9T]îkvVíí°5»ßmtÙ·ùúYTé™/ÆÀ­†e¯t‰ú@íöÿÁ±h»1²§»{CšÄ{ZöÿÀ¨ kôeÃ)ÿW÷×pÌXÑ>/O÷ZýB›ÞàÐN¾Ó3ý­ÿψyvØÚk.{ik\êýÌh©ƒß¹ô{ê¶ïSô–z¿àý?ôˆ™ùU í-{ÄIÔžOÑþZÏ«¬ý–€XÐëeÁíwç·üÝ즶'c²MkK÷~Wo§^Ëi> ªˆqƒ´–ïúnFȰˆ¬ î·ùºÀïî·Õ±rع6U‘[Amw¼>ŠCüǤúGú¿þWó‹qùö´í°#Æ;ó?ðD2iè7ÂwüI­Œ,ñU(6é¾ÊcsÓÀ—F‘»Õ÷mýþ“Mnf8d±ÐÁ®CåaõÍ„5®s²cZ ý£ô·=Õ±¿¹úOý³ñ[•Òæ1Æ®xѤ“üç·éØÿWÓRú¿êÞù‘(ú¯÷µôü¿â½E—U”×—ºíavŸGóÿ{ÿR([Œ *`­ÎÇn.-£+{.Ùïßü劦PÿRÇ—;󾚞U¶¶ÇW`,#Ýî:mþ·ó_£Q‘MH2xb?—ʇ ÒÇ[q sôsôÙ¯òDô>¨ç·ø”T@~–.s„%™U5®mŽ‚ð#¾ŸOÔÜïbÉH·G0–OÕú?ž›ÄAáe¢I½žZÚö’Ø‹âŽãèÿ¯ý¶\6Ó$kçû¿ëþ¶]êÀ››cOµí-“ü‘ìÿ ³çRy?êÕ£ŒÜAýàÔÈ8g_ºÚkƒílÀ_‰]69n-˜—h÷j.÷zoÐúëþ rU¼µìxÛ\·Çikö.£"Æä4[I7âºK@qnÂGéuoÿÒ~¥ñ?¤Qf~ê£-ÛȦÆëXÍѨÓù_ëþ·$nqa`xp²Éèß³÷?óêÍf;ÐèsÏýÝÑÿ_üù§[Úî#Àê¨%¦Ì‘j׈Ìb-«‡{c˜E­ÿÒj†[½Yš ¶ò¶mÿ®ÿè¿úå}¬¬Fœtqþ¿ëþ‘bÆû_ii s‰kxÛ^ïc±qYׇÅ Gj´5ºÍ€FÁܯúÿèÒ7×2~PŽÆ0¸H’¿PDèTâ:ìÇÄç¼&ŠëáþÀîÍîÏ£ù¬ZŒ¬8õönÿ_úÊTãQö‚êõ{´.ðùͪf›ëPõ™°å«ÑÄÌcëm.d‡‚`Žcé)Õ›pÆùÔƒ´ekfTËl©­ˆlÃGæÊ#zenúC_â–2ÉkdO5z¹-sœâ÷èç æH‚· ‘ãþ¿ëÿµ‡J¥±ÈGf4ñV£Ë˸‹ Ê ‚1ž_ x O— ¤×ýÖ¥¢Üf7€Ãþ’ ­Ô)#„D߬3'£]ðÊ\í¥Ð8ôüÔÿfcÀts¯ßþ¿ëüÚ=•ïc˜Y¸\ØÝ¯õÚôíùÿ¯úÿ×l6ƸhR®‡U8'¡šsêÛo 'PÝÞ¯§ïYÙ ¾²ÖTØ:‡$íþKW{ŽÝkÉö*qpËC/ðým¼yIÞŠ ±ƒ)¬ï.\>‹‹¿9¿ðëê ubCCƒO3ô'Øçÿ׿šOö¶Šý;ZtÐë?IÛ^«¿4Z÷7H0;wÐr«Á+ªlÇ&”Hú¶ßÒ³saŒ“¦Ë‡_̧ùû=5Z﫹LÜÇí%i{¿ÑînúëÿÁCÓ2]n. }.û?þ‚ϾÒÈÝvÐu‰Û'éoÛýwzjC#ɇŠR–§åìÓè¶däbÕS%®Õ¬?á¶þezuêT[ñmÇÈ,‘e¯ìÓç÷=OøG­N‹MUcÙ49VÄ–—Tïgü%¾ª†~;ƒ…Õ{Ú “»ÞÍßèÜߦ›ê¯ç‡îBL˜²z¸4á®ïähtû¾ÍÔÜ\ÃcYk¬åÕýÿð]¿ùåiŒZͪ¢'kDµ¤ŸwÙ«þ_ø_MfÕF@{‹xyÖd×} û[g½ú+°íÒ>zý5²zD~hñ—NˆÈþ ¡VUXFÖ²6;_ån¯ù UzÅV[Oª6ÝÅÌqa•žæþ{Û÷8ã´@ÌÈiªÏRKZ €Í€ù˜øM‚KϹöz¦°ÝÎ1´7ÝíüÍ­­lt×µîØ}vû‡¨=šû×ü/þŒæß˜ïY¥§h8Ú5÷{þ’Øûqª›ZÝÁöˆa'sXÒ7?÷??ý'é?Müâ·8‘Znƒ;±Ð+®QŒkyôË2K›é–¼}:ò}Þ—éh²Ë=OôŸöÚÍÇé{ ‘+IÖz•8ZwÝd;Ã_¡ýõý¿‰HØ æ9òüå. #„¬#w)½ G¢_²‹A‰h10Kf?{Ýþ¿ø"é[Dëÿ¯úÿé/ðR8ÚþûíoúÿàJDziŒ<Ùߊé¬k3®ºë¯þ{Z4äÒF’¤ÁZvôòícO4ÓËxëþ¿ëþŽ á'qõ^2xµœK™AÜxë»wúÿê¸@ݯá?Øÿ_õºã±œ>?ëþ¿ö×ý}ëéy/d7Äè?é¯þ‹£.å¨Ý“=†ƒý×ÿIÜ ø Véè®ôá.ÿÒjýXõöÜGæµMfìÐXd•#N?óõÿ[ Ì'Is\k°ÿ;é«­côZð¤Ÿ<8ç\Qâá@œ†Æ­­^5ê»÷Ž¥4ङ>1Ãê­&ÍWI Ö±¿IÀfÒšÂu[fR••UmmÞâ*og<†úk&ÿ¬Xú†Øû<ØÝ?Ï~Ä Êµ/Pë«i‚àwçÒÞ$ü—o\¹ó±›Gï<Ë£þ·±Ÿëÿ\UŽ~EŸJ× ðöü ýóÒiœFÞ¥Ü=Þºþ®ÊÁÜC<'Ÿõÿ_ø›o^kµkœøàÀÿ§µs퉙’{òïÈ ž×ý×ýSÒ‚DCyýS&Ï¡ú>u's¿ôR¬ûò!ö8ƒù£Ú?ð?õÿÑÐÚ?Ùëþ¿è¿Â#íþ¿ëþ¿ñl3‘꺺$€<çÿ2ÿ_ý&ÛOÏðDÚyîŸhãýÈ!ÿÕíÔÍÑâ?ˆDMÊ+Z {ÁÉÖT¶0ò5ñîšæZF€ŸüÉ3]÷ÿUÑ‘¦A‚~U» î¡WZeL! èœ;0·ÜÁñÿ#»ýÁª/éw—?ëþ¿á?ÐõP‘cO"Tg ñÉçpšüZ7>“0ÓË\ïÏ©ÿ×ÿÿmÿÂfdÚá’n /%»d»@?;c?Á®ºÌ:Ü!º,œ®™aÕ¢|Ç?ëþ¿£ÿ´ðeÁ­Rød=YôK§·Ø6—=í ü×{¶î¯ýÒ«99ÄIÚ~•6½¸˜¸ì°NÂùžÚú­wö7«OÈcñöšÞ×¹ Ã¿yŽÝù›Õï(š ¥ÃýæÔc/LÇéõF÷ÙKË÷¶\<¹ÌÕYy™F›ê}²æ¹Ï†±ôÕn¼‡Ã˜ðN¤.ÓèúŽY½M䱑ô¤³¼B…š>>Ÿï2ÂÜUóU)ÎÆk75û»Ã>‘üïoú5››—uíÚ°‘>?½·ùÇÿÆ&kKL·P~:"Šî¨ÑX†(Ç_ͯ,„¹OÆy€5•gœ¡íÑíMÒHó=»¥868ÁçÃPµñzeƒRÒx:ˆÿ«ÿ_ýf13 T\VÓsŽâ7å¤äÖ=›Até?ëþ¿öåkJ¼º’ÀJ²ÚZß5,1F&îëôV™Ñ + x"ìðER™,áF*øßg¯ó„¢¥(Y]Af±ú-à!:‰{[É„ 3i`æO’«l¦•›oRŽÿ™,œŸ¬XÌÐݸþå_¤×úõþ‹ÿGN¥TNÏLëÑ«€„ 3ior~ Œ·ëv¬¤7º4þ­*S6Ù‹mÿƒOýºíö eЕpž¥í2:•a5ÃÙÖ};Ý_æàŸöÊÊÉúLjÒG­êÍ®lþÏ©Wè?×þº¹+]«åî<ïú´>D|Ðã𤈇rï¬ÄÑRIñ±Ð?íª?ô¯þŠY—uŽ£v†âƟͬzôÿžÿÁ_L ø|¶’âCˆ¥pç=ÛÞKÏbés¿wé9X9"<|“ žÑÓÄ$4ƒáÂjH×4÷øvEkIÿ_í*ÛBÐèHäP1SklvüQÚu9yÒ/AdžY#¾“˜†^‚“'AYBaŠŽ(U²©ŒB”Ù1; Ìå;›8A>$™æàÍœÛý¤ÙÒhLùt¤0Ek¦ÔTY½*µ‹‡¯pq{bÅŒ³hÓª]ËD;apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/lennie.msg0000644000000000000000000000675411702050534026650 0ustar rootrootReturn-Path: Received: from brickbat8.mindspring.com (brickbat8.mindspring.com [207.69.200.11]) by camel10.mindspring.com (8.8.5/8.8.5) with ESMTP id GAA27894 for ; Fri, 25 Jul 1997 06:58:07 -0400 (EDT) Received: from lennie (user-2k7i8oq.dialup.mindspring.com [168.121.35.26]) by brickbat8.mindspring.com (8.8.5/8.8.5) with SMTP id GAA22488 for ; Fri, 25 Jul 1997 06:58:05 -0400 (EDT) Message-ID: <33D89532.29EA@atl.mindspring.com> Date: Fri, 25 Jul 1997 06:59:46 -0500 From: Lennie Jarratt Reply-To: lbj_ccsi@mindspring.com Organization: Custom Computer Services Inc. X-Mailer: Mozilla 3.01Gold (Win95; I) MIME-Version: 1.0 To: lbj_ccsi@atl.mindspring.com Subject: Test Mail Again Content-Type: multipart/mixed; boundary="------------52E03A8932B4" This is a multi-part message in MIME format. --------------52E03A8932B4 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit This is the message body. A picture should also be displayed. --------------52E03A8932B4 Content-Type: text/html; charset=us-ascii; name="Pull3.html" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="Pull3.html" Content-Base: "file:///E|/ChckFree/Html/Pull3.html" Client Pull Rolling Page Demo> This is Page 3 of my rolling web page demo. --------------52E03A8932B4 Content-Type: image/gif; name="WWWIcon.gif" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="WWWIcon.gif" R0lGODdhPAA8AOYAAP///+/v7+fv7+/39/f//9be3r3O1rXGzsbW3qW1va29xoyltXOMnGuE lClSa4ScrXuUpUJje1p7lFJzjEprhDlacxhCYylScyFKaxA5WggxUgApSt7n773GzpytvZSl tWuEnM7W3sbO1q29zqW1xoycrYSUpWN7lFpzjFJrhEJjhDlaezFScylKayFCYwgxWgApUtbe 5yFCaxg5YxAxWggpUpSlvXOEnFpzlFJrjEpjhEJaezlSc3uMpYyctYSUrb3G1sbO3qWtvbW9 zq21xufn79bW3t7e5wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAPAA8AAAH/4AAgoOEhYaHiImKi4yNjo+QkZKTlJWW l5iZmpucnZ6foKGinSIfJxEtMzMtEScfIqOKRwsUMy4YLQ4sLA4tGC4zFAtHsYQBCysWLSwr KhQ5Eyg5FCorLC0WKwsBxUAoyhU6KA0MEA8lJQ8QDCcoOhXYKECjQhUyLDo4DA8fQkRDAIcQ EfLhAQMcOljIqCAklI0WLVZMAPHAA5EDBoKE2BgCgYEDRDw8ADFhBUQbnzxgwLACBQMfCYYA QRCiQIybMYx0NDAkgQ8GKFas9NCpAwsLLChQ9KAAowiaHDcGEfFRgUgQFI6y6LBJQA4aLnjk APHjgwcSRBSMGLI24AgFRP9IePjwA0SOCi5o5BCgqQQMsEkl3Ohh4seDc+gSJz5sAsKNE1nz wiiRKUYLGBoy3Nuhg0KKHNAmiB6NYjRoCjp2KMygAUaLGJj8woDxIoMFGRBz6drFu7eDXhAx WMjwYvZkTCuMY35BI4Pz59CjR6fxorXxFZg4bNgxCIYMQydqwALwQ0OCQkVgROjuQtOGE4Nc cBc0/gcMDoKEwBg/HgAM+ILIpwkLJgyyA4AAjCDICBsMYsAG+CU4CIEGInjJDkQJckKBABjA oQHtCaKdgQZmCMCGmphgwCAmKNghgvMJwoKBEarIoouYmBDCIAusCMACMaZAiJCC0OCjjjz6 iIn/j/gpaQINDgIQoZIbLCAIkx1usmOWWwKQQoOC7OjjliFswOGWK3a5iYUA7LCBkj+q+WCM GoJCJwA0bIAjADbyuMGMhNypyYOFbGBmoBwKYoKhhBDqyQgwDDAIB7PdQAgLlg5ywmySLhjp IASkuN8gIsy2XnenChLBbP3ZB+clshlXgwYvMEcDdbXmquutuGpQg3LHXWKZcbRmMIMFFriA 7LLMLqusBTMQZ51rsMU2Ww21WYBLb7v89hu318gw3Au/BouJABRgRoO2LFSwQwTwxiuvvDtU wIJwNLRGAV+adNCCBjTMgAEzEajQGQUIJ5ywDipEYC8GM+TbAleceDBDkmbKtPuuDgcrzHEE O1iDDWszmMjJBxcb68IyzKyww7sgh2zNNcCQ/EEoHvxb27G4QbQbcC2IG211LZj8SQcpYEZr c6ocC60qGVCnQWspUDyKACVcIOvUXHNdLgwXlMBvMQDEUMIOwKYNww4lVEt2IQaUgAILM8w2 AwsolPDq23z37fffgAcu+OCEF2744YgnXnggADs= --------------52E03A8932B4-- apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/uu-junk_decoded_1_1.txt0000644000000000000000000000060011702050534031114 0ustar rootrootEryq - I occasionally receive an email (see below) like this one, which MIME::Parser does not parse. Any ideas? Is this a valid way to send an attachment, or is the problem on the "sender's" side? Thanks for your time! Mike -->> Promote YOUR web site! FREE Perl CGI scripts add WEB ACCESS to your -->> E-Mail accounts! Download today!! http://webmail.uwohali.com ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-nested_decoded_1_3_2.binapache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-nested_decoded_1_3_2.bi0000644000000000000000000000054511702050534032136 0ustar rootrootGIF87a((óÌÝîÿ¾¾¾ˆˆˆnnnÌÝîÿÿÿççç,((þÉI«½x–Ì;.2Œdižh Jè¾p,ÇâZ{8Ö†mîS;Vèç ÞˆE[Y8Ÿã’ù¬Bk¼¡ÏÊD•ZN×z‘†-ãkÆŒI;S# ¸í†äYt:ÀïûûwByc|‡ˆ‰‰_ƒ]‰nUBV‘‡“c–G˜šœ“‚—¡¢i¤Ÿ§©U±U«K­OiN¿²^X—N¸ÆÅ¸¼V›¿ÀN´··¿ˆOÙÎÈÑÆà¸ÎºŠÍÏWlàÉ¾ÎØåìÝÞÅÅíãŠãòÞ¸Öº¯fá)Í×±X*LhÍ#aǘ4œC!–ĉŽ$X¼8ðG?‚Ì(²‚”’k”ØYÉrÄŠ0cÊœI³&ˆ;apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-igor2.out0000644000000000000000000002473011702050534027563 0ustar rootrootDate: Thu, 6 Jun 1996 15:50:39 +0400 (MOW DST) From: Starovoitov Igor To: eryq@rhine.gsfc.nasa.gov Subject: Need help MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="-490585488-806670346-834061839=:2195" This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. Send mail to mime@docserver.cac.washington.edu for more info. ---490585488-806670346-834061839=:2195 Content-Type: TEXT/PLAIN; charset=US-ASCII Dear Sir, I have a problem with Your MIME-Parser-1.9 and multipart-nested messages. Not all parts are parsed. Here my Makefile, Your own multipart-nested.msg and its out after "make test". Some my messages not completely parsed too. Is this a bug? Thank You for help. Igor Starovoytov. ---490585488-806670346-834061839=:2195 Content-Type: TEXT/PLAIN; charset=US-ASCII; name=Makefile Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Makefile Iy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQ0KIyBNYWtlZmlsZSBmb3IgTUlNRTo6DQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMgV2hlcmUgdG8gaW5zdGFsbCB0 aGUgbGlicmFyaWVzOg0KU0lURV9QRVJMID0gL3Vzci9saWIvcGVybDUNCg0KIyBXaGF0IFBlcmw1 IGlzIGNhbGxlZCBvbiB5b3VyIHN5c3RlbSAobm8gbmVlZCB0byBnaXZlIGVudGlyZSBwYXRoKToN ClBFUkw1ICAgICA9IHBlcmwNCg0KIyBZb3UgcHJvYmFibHkgd29uJ3QgbmVlZCB0byBjaGFuZ2Ug dGhlc2UuLi4NCk1PRFMgICAgICA9IERlY29kZXIucG0gRW50aXR5LnBtIEhlYWQucG0gUGFyc2Vy LnBtIEJhc2U2NC5wbSBRdW90ZWRQcmludC5wbQ0KU0hFTEwgICAgID0gL2Jpbi9zaA0KDQojLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t DQojIEZvciBpbnN0YWxsZXJzLi4uDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCmhlbHA6CQ0KCUBlY2hvICJWYWxpZCB0YXJn ZXRzOiB0ZXN0IGNsZWFuIGluc3RhbGwiDQoNCmNsZWFuOg0KCXJtIC1mIHRlc3RvdXQvKg0KDQp0 ZXN0Og0KIwlAZWNobyAiVEVTVElORyBIZWFkLnBtLi4uIg0KIwkke1BFUkw1fSBNSU1FL0hlYWQu cG0gICA8IHRlc3Rpbi9maXJzdC5oZHIgICAgICAgPiB0ZXN0b3V0L0hlYWQub3V0DQojCUBlY2hv ICJURVNUSU5HIERlY29kZXIucG0uLi4iDQojCSR7UEVSTDV9IE1JTUUvRGVjb2Rlci5wbSA8IHRl c3Rpbi9xdW90LXByaW50LmJvZHkgPiB0ZXN0b3V0L0RlY29kZXIub3V0DQojCUBlY2hvICJURVNU SU5HIFBhcnNlci5wbSAoc2ltcGxlKS4uLiINCiMJJHtQRVJMNX0gTUlNRS9QYXJzZXIucG0gPCB0 ZXN0aW4vc2ltcGxlLm1zZyAgICAgID4gdGVzdG91dC9QYXJzZXIucy5vdXQNCiMJQGVjaG8gIlRF U1RJTkcgUGFyc2VyLnBtIChtdWx0aXBhcnQpLi4uIg0KIwkke1BFUkw1fSBNSU1FL1BhcnNlci5w bSA8IHRlc3Rpbi9tdWx0aS0yZ2lmcy5tc2cgPiB0ZXN0b3V0L1BhcnNlci5tLm91dA0KCUBlY2hv ICJURVNUSU5HIFBhcnNlci5wbSAobXVsdGlfbmVzdGVkLm1zZykuLi4iDQoJJHtQRVJMNX0gTUlN RS9QYXJzZXIucG0gPCB0ZXN0aW4vbXVsdGktbmVzdGVkLm1zZyA+IHRlc3RvdXQvUGFyc2VyLm4u b3V0DQoJQGVjaG8gIkFsbCB0ZXN0cyBwYXNzZWQuLi4gc2VlIC4vdGVzdG91dC9NT0RVTEUqLm91 dCBmb3Igb3V0cHV0Ig0KDQppbnN0YWxsOg0KCUBpZiBbICEgLWQgJHtTSVRFX1BFUkx9IF07IHRo ZW4gXA0KCSAgICBlY2hvICJQbGVhc2UgZWRpdCB0aGUgU0lURV9QRVJMIGluIHlvdXIgTWFrZWZp bGUiOyBleGl0IC0xOyBcDQogICAgICAgIGZpICAgICAgICAgIA0KCUBpZiBbICEgLXcgJHtTSVRF X1BFUkx9IF07IHRoZW4gXA0KCSAgICBlY2hvICJObyBwZXJtaXNzaW9uLi4uIHNob3VsZCB5b3Ug YmUgcm9vdD8iOyBleGl0IC0xOyBcDQogICAgICAgIGZpICAgICAgICAgIA0KCUBpZiBbICEgLWQg JHtTSVRFX1BFUkx9L01JTUUgXTsgdGhlbiBcDQoJICAgIG1rZGlyICR7U0lURV9QRVJMfS9NSU1F OyBcDQogICAgICAgIGZpDQoJaW5zdGFsbCAtbSAwNjQ0IE1JTUUvKi5wbSAke1NJVEVfUEVSTH0v TUlNRQ0KDQoNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0NCiMgRm9yIGRldmVsb3BlciBvbmx5Li4uDQojLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNClBPRDJIVE1M X0ZMQUdTID0gLS1wb2RwYXRoPS4gLS1mbHVzaCAtLWh0bWxyb290PS4uDQpIVE1MUyAgICAgICAg ICA9ICR7TU9EUzoucG09Lmh0bWx9DQpWUEFUSCAgICAgICAgICA9IE1JTUUNCg0KLlNVRkZJWEVT OiAucG0gLnBvZCAuaHRtbA0KDQojIHYuMS44IGdlbmVyYXRlZCAzMCBBcHIgOTYNCiMgdi4xLjkg aXMgb25seSBiZWNhdXNlIDEuOCBmYWlsZWQgQ1BBTiBpbmdlc3Rpb24NCmRpc3Q6IGRvY3VtZW50 ZWQJDQoJVkVSU0lPTj0xLjkgOyBcDQoJbWtkaXN0IC10Z3ogTUlNRS1wYXJzZXItJCRWRVJTSU9O IDsgXA0KCWNwIE1LRElTVC9NSU1FLXBhcnNlci0kJFZFUlNJT04udGd6ICR7SE9NRX0vcHVibGlj X2h0bWwvY3Bhbg0KCQ0KZG9jdW1lbnRlZDogJHtIVE1MU30gJHtNT0RTfQ0KDQoucG0uaHRtbDoN Cglwb2QyaHRtbCAke1BPRDJIVE1MX0ZMQUdTfSBcDQoJCS0tdGl0bGU9TUlNRTo6JCogXA0KCQkt LWluZmlsZT0kPCBcDQoJCS0tb3V0ZmlsZT1kb2NzLyQqLmh0bWwNCg0KIy0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0K ---490585488-806670346-834061839=:2195 Content-Type: TEXT/PLAIN; charset=US-ASCII; name="multi-nested.msg" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: test message TUlNRS1WZXJzaW9uOiAxLjANCkZyb206IExvcmQgSm9obiBXaG9yZmluIDx3aG9yZmluQHlveW9k eW5lLmNvbT4NClRvOiA8am9obi15YXlhQHlveW9keW5lLmNvbT4NClN1YmplY3Q6IEEgY29tcGxl eCBuZXN0ZWQgbXVsdGlwYXJ0IGV4YW1wbGUNCkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVk Ow0KICAgICBib3VuZGFyeT11bmlxdWUtYm91bmRhcnktMQ0KDQpUaGUgcHJlYW1ibGUgb2YgdGhl IG91dGVyIG11bHRpcGFydCBtZXNzYWdlLg0KTWFpbCByZWFkZXJzIHRoYXQgdW5kZXJzdGFuZCBt dWx0aXBhcnQgZm9ybWF0DQpzaG91bGQgaWdub3JlIHRoaXMgcHJlYW1ibGUuDQpJZiB5b3UgYXJl IHJlYWRpbmcgdGhpcyB0ZXh0LCB5b3UgbWlnaHQgd2FudCB0bw0KY29uc2lkZXIgY2hhbmdpbmcg dG8gYSBtYWlsIHJlYWRlciB0aGF0IHVuZGVyc3RhbmRzDQpob3cgdG8gcHJvcGVybHkgZGlzcGxh eSBtdWx0aXBhcnQgbWVzc2FnZXMuDQotLXVuaXF1ZS1ib3VuZGFyeS0xDQoNClBhcnQgMSBvZiB0 aGUgb3V0ZXIgbWVzc2FnZS4NCltOb3RlIHRoYXQgdGhlIHByZWNlZGluZyBibGFuayBsaW5lIG1l YW5zDQpubyBoZWFkZXIgZmllbGRzIHdlcmUgZ2l2ZW4gYW5kIHRoaXMgaXMgdGV4dCwNCndpdGgg Y2hhcnNldCBVUyBBU0NJSS4gIEl0IGNvdWxkIGhhdmUgYmVlbg0KZG9uZSB3aXRoIGV4cGxpY2l0 IHR5cGluZyBhcyBpbiB0aGUgbmV4dCBwYXJ0Ll0NCg0KLS11bmlxdWUtYm91bmRhcnktMQ0KQ29u dGVudC10eXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVTLUFTQ0lJDQoNClBhcnQgMiBvZiB0aGUg b3V0ZXIgbWVzc2FnZS4NClRoaXMgY291bGQgaGF2ZSBiZWVuIHBhcnQgb2YgdGhlIHByZXZpb3Vz IHBhcnQsDQpidXQgaWxsdXN0cmF0ZXMgZXhwbGljaXQgdmVyc3VzIGltcGxpY2l0DQp0eXBpbmcg b2YgYm9keSBwYXJ0cy4NCg0KLS11bmlxdWUtYm91bmRhcnktMQ0KU3ViamVjdDogUGFydCAzIG9m IHRoZSBvdXRlciBtZXNzYWdlIGlzIG11bHRpcGFydCENCkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0 L3BhcmFsbGVsOw0KICAgICBib3VuZGFyeT11bmlxdWUtYm91bmRhcnktMg0KDQpBIG9uZS1saW5l IHByZWFtYmxlIGZvciB0aGUgaW5uZXIgbXVsdGlwYXJ0IG1lc3NhZ2UuDQotLXVuaXF1ZS1ib3Vu ZGFyeS0yDQpDb250ZW50LVR5cGU6IGltYWdlL2dpZg0KQ29udGVudC1UcmFuc2Zlci1FbmNvZGlu ZzogYmFzZTY0DQpDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7IGZpbGVuYW1lPSIzZC1jb21w cmVzcy5naWYiDQpTdWJqZWN0OiBQYXJ0IDEgb2YgdGhlIGlubmVyIG1lc3NhZ2UgaXMgYSBHSUYs ICIzZC1jb21wcmVzcy5naWYiDQoNClIwbEdPRGRoS0FBb0FPTUFBQUFBQUFBQWdCNlEveTlQVDI1 dWJuQ0FrS0JTTGI2K3Z1Zm41L1hlcy8rbEFQLzZ6UUFBQUFBQQ0KQUFBQUFBQUFBQ3dBQUFBQUtB QW9BQUFFL2hESlNhdTllSkxNT3lZYmNveGthWjVvQ2tvSDZMNXdMTWZpV3FkNGJ0WmhteGJBDQpv RkNZNDdFSXFNSmd5V3cyQVRqajdhUmtBcTVZd0RNbDlWR3RLTzBTaXVvaVRWbHNjc3h0OWM0SGdY eFVJQTBFQVZPVmZES1QNCjhIbDFCM2tEQVlZbGUyMDJYbkdHZ29NSGhZY2tpV1Z1UjMrT1RnQ0dl WlJzbG90d2dKMmxuWWlnZlpkVGpRVUxyN0FMQlpOMA0KcVR1cmpIZ0xLQXUwQjVXcW9wbTdKNzJl dFFOOHQ4SWp1cnkrd010dnc4L0h2N1lsZnMwQnhDYkdxTW1LMHlPT1EwR1RDZ3JSDQoyYmh3Skds WEpRWUc2bU1Lb2VOb1dTYnpDV0lBQ2U1Snd4UW0zQWtEQWJVQVFDaVFoRFpFQmVCbDZhZmdDc09C ckQ0NWVkSXYNClFjZUdXU01ldnBPWWhsNkNreWRCSGhCWlFtR0tqaWhWc2h5cGpCOUNsQUhaTVR1 Z3pPVTdtemhCUGlTWjV1RE5uQTdiL2FUWg0KMG1oTW5mbDBwREJGYTZiVUVsU1BXYjBxdFl1SHJ4 bHdjUjE3WXNXTXMyalRxbDNMRmtRRUFEcz0NCi0tdW5pcXVlLWJvdW5kYXJ5LTINCkNvbnRlbnQt VHlwZTogaW1hZ2UvZ2lmDQpDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNlNjQNCkNvbnRl bnQtRGlzcG9zaXRpb246IGlubGluZTsgZmlsZW5hbWU9IjNkLWV5ZS5naWYiDQpTdWJqZWN0OiBQ YXJ0IDIgb2YgdGhlIGlubmVyIG1lc3NhZ2UgaXMgYW5vdGhlciBHSUYsICIzZC1leWUuZ2lmIg0K DQpSMGxHT0RkaEtBQW9BUE1BQUFBQUFBQUF6TjN1Lzc2K3ZvaUlpRzV1YnN6ZDd2Ly8vK2ZuNXdB QUFBQUFBQUFBQUFBQUFBQUENCkFBQUFBQUFBQUN3QUFBQUFLQUFvQUFBRS9oREpTYXU5ZUpiTU95 NGJNb3hrYVo1b0Nrb0Q2TDV3TE1maVduczQxb1p0N2xNNw0KVnVqbkM5NklSVnNQV1FFNG54UGpr dm1zUW11OG9jL0tCVVNWV2s3WGVwR0dMZU5yeG94Sk8xTWpJTGp0aGcva1dYUTZ3Ty83DQorM2RD ZVJSamZBS0hpSW1KQVYrRENGMEJpVzVWQW8xQ0VsYVJoNU5qbGtlWW1weVRncGNUQUtHaWFhU2Zw d0twVlFheFZhdEwNCnJVOEdhUWRPQkFRQUI3K3lYbGlYVHJnQXhzVzR2RmFidjhCT3RCc0J0N2NH dndDSVQ5bk95TkVJeHVDNHpycUt6YzlYYk9ESg0KdnM3WTVld0gzZDdGeGUzakI0cmo4dDZQdU5h NnIyYmhLUVhOMTdGWUNCTXFUR2lCelNOaHg1ZzBuRU1obHNTSmppUll2RGp3DQpFMGNkR3hRL2dz d29zb0tVa211VTJGbkpjc1NLR1RCanlweEpzeWFJQ0FBNw0KLS11bmlxdWUtYm91bmRhcnktMi0t DQoNClRoZSBlcGlsb2d1ZSBmb3IgdGhlIGlubmVyIG11bHRpcGFydCBtZXNzYWdlLg0KDQotLXVu aXF1ZS1ib3VuZGFyeS0xDQpDb250ZW50LXR5cGU6IHRleHQvcmljaHRleHQNCg0KVGhpcyBpcyA8 Ym9sZD5wYXJ0IDQgb2YgdGhlIG91dGVyIG1lc3NhZ2U8L2JvbGQ+DQo8c21hbGxlcj5hcyBkZWZp bmVkIGluIFJGQzEzNDE8L3NtYWxsZXI+PG5sPg0KPG5sPg0KSXNuJ3QgaXQgPGJpZ2dlcj48Ymln Z2VyPmNvb2w/PC9iaWdnZXI+PC9iaWdnZXI+DQoNCi0tdW5pcXVlLWJvdW5kYXJ5LTENCkNvbnRl bnQtVHlwZTogbWVzc2FnZS9yZmM4MjINCg0KRnJvbTogKG1haWxib3ggaW4gVVMtQVNDSUkpDQpU bzogKGFkZHJlc3MgaW4gVVMtQVNDSUkpDQpTdWJqZWN0OiBQYXJ0IDUgb2YgdGhlIG91dGVyIG1l c3NhZ2UgaXMgaXRzZWxmIGFuIFJGQzgyMiBtZXNzYWdlIQ0KQ29udGVudC1UeXBlOiBUZXh0L3Bs YWluOyBjaGFyc2V0PUlTTy04ODU5LTENCkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IFF1b3Rl ZC1wcmludGFibGUNCg0KUGFydCA1IG9mIHRoZSBvdXRlciBtZXNzYWdlIGlzIGl0c2VsZiBhbiBS RkM4MjIgbWVzc2FnZSENCg0KLS11bmlxdWUtYm91bmRhcnktMS0tDQoNClRoZSBlcGlsb2d1ZSBm b3IgdGhlIG91dGVyIG1lc3NhZ2UuDQo= ---490585488-806670346-834061839=:2195 Content-Type: TEXT/PLAIN; charset=US-ASCII; name="Parser.n.out" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: out from parser KiBXYWl0aW5nIGZvciBhIE1JTUUgbWVzc2FnZSBmcm9tIFNURElOLi4uDQo9PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCkNvbnRlbnQt dHlwZTogbXVsdGlwYXJ0L21peGVkDQpCb2R5LWZpbGU6IE5PTkUNClN1YmplY3Q6IEEgY29tcGxl eCBuZXN0ZWQgbXVsdGlwYXJ0IGV4YW1wbGUNCk51bS1wYXJ0czogMw0KLS0NCiAgICBDb250ZW50 LXR5cGU6IHRleHQvcGxhaW4NCiAgICBCb2R5LWZpbGU6IC4vdGVzdG91dC9tc2ctMzUzOC0xLmRv Yw0KICAgIC0tDQogICAgQ29udGVudC10eXBlOiB0ZXh0L3BsYWluDQogICAgQm9keS1maWxlOiAu L3Rlc3RvdXQvbXNnLTM1MzgtMi5kb2MNCiAgICAtLQ0KICAgIENvbnRlbnQtdHlwZTogbXVsdGlw YXJ0L3BhcmFsbGVsDQogICAgQm9keS1maWxlOiBOT05FDQogICAgU3ViamVjdDogUGFydCAzIG9m IHRoZSBvdXRlciBtZXNzYWdlIGlzIG11bHRpcGFydCENCiAgICBOdW0tcGFydHM6IDINCiAgICAt LQ0KICAgICAgICBDb250ZW50LXR5cGU6IGltYWdlL2dpZg0KICAgICAgICBCb2R5LWZpbGU6IC4v dGVzdG91dC8zZC1jb21wcmVzcy5naWYNCiAgICAgICAgU3ViamVjdDogUGFydCAxIG9mIHRoZSBp bm5lciBtZXNzYWdlIGlzIGEgR0lGLCAiM2QtY29tcHJlc3MuZ2lmIg0KICAgICAgICAtLQ0KICAg ICAgICBDb250ZW50LXR5cGU6IGltYWdlL2dpZg0KICAgICAgICBCb2R5LWZpbGU6IC4vdGVzdG91 dC8zZC1leWUuZ2lmDQogICAgICAgIFN1YmplY3Q6IFBhcnQgMiBvZiB0aGUgaW5uZXIgbWVzc2Fn ZSBpcyBhbm90aGVyIEdJRiwgIjNkLWV5ZS5naWYiDQogICAgICAgIC0tDQo9PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0K ---490585488-806670346-834061839=:2195-- apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-nested2.msg0000644000000000000000000000633211702050534030062 0ustar rootrootMIME-Version: 1.0 From: Lord John Whorfin To: Subject: A complex nested multipart example Content-Type: multipart/mixed; boundary=unique-boundary-1 The preamble of the outer multipart message. Mail readers that understand multipart format should ignore this preamble. If you are reading this text, you might want to consider changing to a mail reader that understands how to properly display multipart messages. --unique-boundary-1 Part 1 of the outer message. [Note that the preceding blank line means no header fields were given and this is text, with charset US ASCII. It could have been done with explicit typing as in the next part.] --unique-boundary-1 Content-type: text/plain; charset=US-ASCII Part 2 of the outer message. This could have been part of the previous part, but illustrates explicit versus implicit typing of body parts. --unique-boundary-1 Subject: Part 3 of the outer message is multipart! Content-Type: multipart/parallel; boundary=unique-boundary-2 A one-line preamble for the inner multipart message. --unique-boundary-2 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-vise.gif" Subject: Part 1 of the inner message is a GIF, "3d-vise.gif" R0lGODdhKAAoAOMAAAAAAAAAgB6Q/y9PT25ubnCAkKBSLb6+vufn5/Xes/+lAP/6zQAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJLMOyYbcoxkaZ5oCkoH6L5wLMfiWqd4btZhmxbA oFCY47EIqMJgyWw2ATjj7aRkAq5YwDMl9VGtKO0SiuoiTVlscsxt9c4HgXxUIA0EAVOVfDKT 8Hl1B3kDAYYle202XnGGgoMHhYckiWVuR3+OTgCGeZRslotwgJ2lnYigfZdTjQULr7ALBZN0 qTurjHgLKAu0B5Wqopm7J72etQN8t8Ijury+wMtvw8/Hv7Ylfs0BxCbGqMmK0yOOQ0GTCgrR 2bhwJGlXJQYG6mMKoeNoWSbzCWIACe5JwxQm3AkDAbUAQCiQhDZEBeBl6afgCsOBrD45edIv QceGWSMevpOYhl6CkydBHhBZQmGKjihVshypjB9ClAHZMTugzOU7mzhBPiSZ5uDNnA7b/aTZ 0mhMnfl0pDBFa6bUElSPWb0qtYuHrxlwcR17YsWMs2jTql3LFkQEADs= --unique-boundary-2 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-eye.gif" Subject: Part 2 of the inner message is another GIF, "3d-eye.gif" R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7 VujnC96IRVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7 +3dCeRRjfAKHiImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatL rU8GaQdOBAQAB7+yXliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJ vs7Y5ewH3d7Fxe3jB4rj8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjw E0cdGxQ/gswosoKUkmuU2FnJcsSKGTBjypxJsyaICAA7 --unique-boundary-2-- The epilogue for the inner multipart message. --unique-boundary-1 Content-type: text/richtext This is part 4 of the outer message as defined in RFC1341 Isn't it cool? --unique-boundary-1 Content-Type: message/rfc822; name="/evil/filename"; From: (mailbox in US-ASCII) To: (address in US-ASCII) Subject: Part 5 of the outer message is itself an RFC822 message! Content-Type: Text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: Quoted-printable Part 5 of the outer message is itself an RFC822 message! --unique-boundary-1-- The epilogue for the outer message. apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/badbound.out0000644000000000000000000001402411702050534027162 0ustar rootrootReceived: from uriela.in-berlin.de by anna.in-berlin.de via SMTP (940816.SGI.8.6.9/940406.SGI) for id AAA04436; Mon, 23 Dec 1996 00:08:02 +0100 Resent-From: koenig@franz.ww.TU-Berlin.DE Received: by uriela.in-berlin.de (/\oo/\ Smail3.1.29.1 #29.8) id ; Mon, 23 Dec 96 00:08 MET Received: by methan.chemie.fu-berlin.de (Smail3.1.29.1) from franz.ww.TU-Berlin.DE (130.149.200.51) with smtp id ; Mon, 23 Dec 96 00:07 MET Received: (from koenig@localhost) by franz.ww.TU-Berlin.DE (8.7.3/8.7.3) id XAA01761 for k@anna.in-berlin.de; Sun, 22 Dec 1996 23:25:10 +0100 (CET) Resent-Date: Sun, 22 Dec 1996 23:25:10 +0100 (CET) Resent-Message-Id: <199612222225.XAA01761@franz.ww.TU-Berlin.DE> Resent-To: k Received: from mailgzrz.TU-Berlin.DE (mailgzrz.TU-Berlin.DE [130.149.4.10]) by franz.ww.TU-Berlin.DE (8.7.3/8.7.3) with ESMTP id XAA01754 for ; Sun, 22 Dec 1996 23:24:32 +0100 (CET) Received: from challenge.uscom.com (actually mail.uscom.com) by mailgzrz.TU-Berlin.DE with SMTP (PP); Sun, 22 Dec 1996 23:19:35 +0100 To: koenig@franz.ww.tu-berlin.de From: Mail Administrator Reply-To: Mail Administrator Subject: Mail System Error - Returned Mail Date: Sun, 22 Dec 1996 17:21:12 -0500 Message-ID: <19961222222112.AAE16235@challenge.uscom.com> MIME-Version: 1.0 Content-Type: multipart/mixed; Boundary="===========================_ _= 2283630(16235)" Content-Transfer-Encoding: 7BIT X-Filter: mailagent [version 3.0 PL44] for koenig@franz.ww.tu-berlin.de X-Filter: mailagent [version 3.0 PL44] for k@.in-berlin.de --===========================_ _= 2283630(16235) Content-type: text/plain; charset="us-ascii" This Message was undeliverable due to the following reason: The Program-Deliver module couldn't deliver the message to one or more of the intended recipients because their delivery program(s) failed. The following error messages provide the details about each failure: The delivery program "/pages/pnet/admin/mail_proc.pl" produced the following output while delivering the message to pnet@uscom.com Can't exec "/usr/sbin/sendmail -t": No such file or directory at /pages/pnet/admin/mail_proc.pl line 96, <> line 93. Broken pipe The program "/pages/pnet/admin/mail_proc.pl" exited with an unknown value of 141 while delivering the message to pnet@uscom.com The message was not delivered to: pnet@uscom.com Please reply to Postmaster@challenge.uscom.com if you feel this message to be in error. --===========================_ _= 2283630(16235) Content-type: message/rfc822 Content-Disposition: attachment Date: Sun, 22 Dec 1996 22:24:21 +0000 Message-ID: <"mailgzrz.T.061:22.12.96.22.24.21"@TU-Berlin.DE> Received: from franz.ww.TU-Berlin.DE ([130.149.200.51]) by challenge.uscom.com (Netscape Mail Server v2.02) with ESMTP id AAA685 for ; Wed, 18 Dec 1996 16:58:30 -0500 Received: from mailgzrz.TU-Berlin.DE (mailgzrz.TU-Berlin.DE [130.149.4.10]) by franz.ww.TU-Berlin.DE (8.7.3/8.7.3) with ESMTP id SAA23400 for ; Wed, 18 Dec 1996 18:59:21 +0100 (CET) Received: from anna.in-berlin.de by mailgzrz.TU-Berlin.DE with SMTP (PP); Wed, 18 Dec 1996 18:59:11 +0100 Received: by anna.in-berlin.de (940816.SGI.8.6.9/940406.SGI) id SAA19491; Wed, 18 Dec 1996 18:55:21 +0100 Date: Wed, 18 Dec 1996 18:55:21 +0100 Message-Id: <199612181755.SAA19491@anna.in-berlin.de> From: Andreas Koenig To: michelle@eugene.net CC: msqlperl@franz.ww.tu-berlin.de In-reply-to: (message from Michelle Brownsworth on Wed, 18 Dec 1996 09:32:02 -0700) Subject: HOWTO (Was: unsubscribe) >>>>> On Wed, 18 Dec 1996 09:32:02 -0700, >>>>> Michelle Brownsworth >>>>> who can be reached at: michelle@eugene.net >>>>> (whose comments are cited below with " michelle> "), >>>>> sent the cited message concerning the subject of "unsubscribe" >>>>> twice to the whole list of subscribers michelle> unsubscribe michelle> ************************************************************ michelle> Michelle Brownsworth michelle> System Administrator michelle> Internet Marketing Services michelle@eugene.net michelle> 2300 Oakmont Way, #209 541-431-3374 michelle> Eugene, OR 97402 FAX 431-7345 michelle> ************************************************************ Welcome new subscriber! You've joined the mailing list of unsubscribers' collected wisdom of unsubscribe messages. Relax! You won't have to subscribe to any mailing list for the rest of your life. Better yet, you can't even unsubscribe! So just lean back and enjoy to watch your IO stream of millions of unsubscribe messages daily. Isn't that far more than everything you ever dared to dream of? andreas P.S. This was posted 12 days ago: Date: Fri, 6 Dec 1996 15:47:51 +0100 To: msqlperl@franz.ww.tu-berlin.de Subject: How To Unsubscribe (semi-regular posting) To get off this list, send mail to -------------------- majordomo@franz.ww.tu-berlin.de with the following words in the body of the message (subject line will be ignored): unsubscribe msqlperl <_insert_your_subscription_address_here_> To find out who you are subscribed as, send mail to ------------------------------------- majordomo@franz.ww.tu-berlin.de with only nothing but who msqlperl in the body of the message: If you encounter problems, ------------------------- please try sending the message "help" to majordomo@franz.ww.tu-berlin.de. Hope that help, andreas NOTE: if the above recipe does not work for you, ask me for assistance and do not spam the list with the request. Thank you! --===========================_ _= 2283630(16235)-- --===========================_ _= 2283630(16235)-- apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-frag_decoded_1_2.txt0000644000000000000000000000022011702050534031564 0ustar rootrootPart 2 of the outer message. This could have been part of the previous part, but illustrates explicit versus implicit typing of body parts. apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/german.msg0000644000000000000000000000772011702050534026641 0ustar rootrootX-POP3-Rcpt: specht@trachea Return-Path: hermes Received: (from hermes@localhost) by kulturbox.netmbx.de (8.7.1/8.7.1) id SAA04513 for specht; Wed, 19 Jun 1996 18:30:12 +0200 Received: by netmbx.netmbx.de (/\==/\ Smail3.1.28.1) from mail.cs.tu-berlin.de with smtp id ; Wed, 19 Jun 96 18:12 MES Received: (from nobody@localhost) by mail.cs.tu-berlin.de (8.6.12/8.6.12) id SAA12413; Wed, 19 Jun 1996 18:26:28 +0200 Resent-Date: Wed, 19 Jun 1996 18:26:28 +0200 Resent-Message-Id: <199606191626.SAA12413@mail.cs.tu-berlin.de> Resent-From: nobody@cs.tu-berlin.de Resent-To: kultur@kulturbox.netmbx.de Received: from gatekeeper.telekom.de ([194.25.15.11]) by mail.cs.tu-berlin.de (8.6.12/8.6.12) with SMTP id SAA11678 for ; Wed, 19 Jun 1996 18:11:29 +0200 Received: from ULM02.mnh.telekom.de by gatekeeper.telekom.de; (5.65v3.0/1.1.8.2/02Aug95-0132PM) id AA01376; Wed, 19 Jun 1996 18:11:27 +0200 Received: from ulm02.mnh.telekom.de (deuschle@mnh.telekom.de) by ULM02.mnh.telekom.de (8.6.10/3) with SMTP id SAA30680 for ; Wed, 19 Jun 1996 18:14:40 GMT Message-Id: <199606191814.SAA30680@ULM02.mnh.telekom.de> X-Sender: deuschle@ulm02.mnh.telekom.de X-Mailer: Windows Eudora Version 1.4.4 Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Date: Wed, 19 Jun 1996 18:12:02 +0200 To: Juergen Specht From: deuschle@mnh.telekom.de (Guenter Deuschle) Subject: Re: 34Mbit/s Netz X-Mozilla-Status: 0011 Hallo Herr Specht, entschuldigen Sie vorab, dass ich Ihnen nicht telefonisch zur Verfuegung stehe, ich Praesentationen gehalten/ noch zu halten und viele Kundennachfragen zu projektieren. Nach Informationen des Produkt-Managers Temme steht der POP schon zur Verf=FCgung! Standort: voraussichtlich: Winterfeldstr. 21, 10781 Berlin. Der POP hat zur Zeit direkte 34M-Anbindungen zu folgenden Orten: Rostock, Hamburg, Hannover & Leipzig. 4 weitere werden in kuerze in Betrieb gehen. Damit haben Sie einen Besonderen Sicherheitsstandard verfuegbar! Kontakt muessen Sie ueber Ihre oerltliche Vertriebseinheit aufnehmen: entweder den Geschaefts-Kunden-Vertrieb oder das GrossKundenManagement. Diese Vertriebseinheiten greifen auf den oertlichen Technischen Vertriebs-Support zu. Die Informationen werden ueber TVS zur Vertriebseiheit gegeben und dann zu Ihnen. Sie benoetigen eine Standleitung von Ihrer Lokation zum Internet-POP Uebergabepunkt zu Ihrem Info-Server ist ein CISCO 1000-Router. Dann zahlen Sie neben den monatlichen Kosten fuer die Standleitung die Kosten fuer den Internet-Zugang: zB bei 64k: 1500DM bei 2GByte Freivolumen. 128K: 3000 DM bei 5 GB Freivolumen & 2M: 30.000 DM bei 50GB Freivolumen. Freundliche Gruesse=20 Guenter Deuschle >Sehr geehrter Herr Deuschle, >Sie sind mir von Herrn Meyendriesch empfohlen worden. >Ich versuche Informationen ueber das T-eigene 34Mbit/s Netz und den=20 >lokalen Pop-Berlin rauszufinden, bzw. was ein Anschluss kostet und=20 >wo man ihn herbekommt. Laut Herrn Schnick in Berlin gibt es den=20 >T-Pop nicht, laut Traceroute von Herrn Meyendriesch sehrwohl. Auch=20 >ist dies Netz in der IX vom Mai 96 erwaehnt. >Koennen Sie mir helfen? > >MfG >--=20 >Juergen Specht - KULTURBOX > > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D Dipl.-Ing. Guenter D E U S C H L E Deutsche Telekom AG Niederlassung 3 Hannover GrossKundenManagement - Techn. Vertriebs-Support: Team-Leiter Internet Online-Dienste --------------------------------------------------- GrKM-TVS-IOD Tel: +49-511-333-2772 Vahrenwalder-Str. 245 FAX: +49-511-333-2751 30179 Hannover eMail: deuschle@mnh.telekom.de=20 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/intl.xml0000644000000000000000000000113611702050534026343 0ustar rootroot
From: =?US-ASCII?Q?Keith_Moore?= <moore@cs.utk.edu> To: =?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?= <keld@dkuug.dk> CC: =?ISO-8859-1?Q?Andr=E9_?= Pirard <PIRARD@vm1.ulg.ac.be> BCC: =?ISO-8859-1?Q?Patrik_F=E4ltstr=F6m?= <paf@nada.kth.se> Subject: =?ISO-8859-1?B?SWYgeW91IGNhbiByZWFkIHRoaXMgeW8=?= =?ISO-8859-2?B?dSB1bmRlcnN0YW5kIHRoZSBleGFtcGxlLg==?= =?US-ASCII?Q?.._so,_cool!?= Content-type: text/plain
How's this?
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/double-semicolon2.xml0000644000000000000000000000103111702050534030711 0ustar rootroot
Mime-Version: 1.0 Content-Type: multipart/alternative ; ; ; ;; ;;;;;;;; boundary="foo"
Preamble
Content-Type: text/plain; charset=us-ascii
The better part
Content-Type: text/plain; charset=us-ascii
The worse part
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-nested.out0000644000000000000000000000633611702050534030025 0ustar rootrootMIME-Version: 1.0 From: Lord John Whorfin To: Subject: A complex nested multipart example Content-Type: multipart/mixed; boundary=unique-boundary-1 The preamble of the outer multipart message. Mail readers that understand multipart format should ignore this preamble. If you are reading this text, you might want to consider changing to a mail reader that understands how to properly display multipart messages. --unique-boundary-1 Part 1 of the outer message. [Note that the preceding blank line means no header fields were given and this is text, with charset US ASCII. It could have been done with explicit typing as in the next part.] --unique-boundary-1 Content-type: text/plain; charset=US-ASCII Part 2 of the outer message. This could have been part of the previous part, but illustrates explicit versus implicit typing of body parts. --unique-boundary-1 Subject: Part 3 of the outer message is multipart! Content-Type: multipart/parallel; boundary=unique-boundary-2 A one-line preamble for the inner multipart message. --unique-boundary-2 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-vise.gif" Subject: Part 1 of the inner message is a GIF, "3d-vise.gif" R0lGODdhKAAoAOMAAAAAAAAAgB6Q/y9PT25ubnCAkKBSLb6+vufn5/Xes/+lAP/6zQAAAAAAAAAA AAAAACwAAAAAKAAoAAAE/hDJSau9eJLMOyYbcoxkaZ5oCkoH6L5wLMfiWqd4btZhmxbAoFCY47EI qMJgyWw2ATjj7aRkAq5YwDMl9VGtKO0SiuoiTVlscsxt9c4HgXxUIA0EAVOVfDKT8Hl1B3kDAYYl e202XnGGgoMHhYckiWVuR3+OTgCGeZRslotwgJ2lnYigfZdTjQULr7ALBZN0qTurjHgLKAu0B5Wq opm7J72etQN8t8Ijury+wMtvw8/Hv7Ylfs0BxCbGqMmK0yOOQ0GTCgrR2bhwJGlXJQYG6mMKoeNo WSbzCWIACe5JwxQm3AkDAbUAQCiQhDZEBeBl6afgCsOBrD45edIvQceGWSMevpOYhl6CkydBHhBZ QmGKjihVshypjB9ClAHZMTugzOU7mzhBPiSZ5uDNnA7b/aTZ0mhMnfl0pDBFa6bUElSPWb0qtYuH rxlwcR17YsWMs2jTql3LFkQEADs= --unique-boundary-2 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-eye.gif" Subject: Part 2 of the inner message is another GIF, "3d-eye.gif" R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAAAAAA AAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7VujnC96I RVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7+3dCeRRjfAKH iImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatLrU8GaQdOBAQAB7+y XliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJvs7Y5ewH3d7Fxe3jB4rj 8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjwE0cdGxQ/gswosoKUkmuU2FnJ csSKGTBjypxJsyaICAA7 --unique-boundary-2-- The epilogue for the inner multipart message. --unique-boundary-1 Content-type: text/richtext This is part 4 of the outer message as defined in RFC1341 Isn't it cool? --unique-boundary-1 Content-Type: message/rfc822; name="/evil/filename"; From: (mailbox in US-ASCII) To: (address in US-ASCII) Subject: Part 5 of the outer message is itself an RFC822 message! Content-Type: Text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: Quoted-printable Part 5 of the outer message is itself an RFC822 message! --unique-boundary-1-- The epilogue for the outer message. apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/sig-uu_decoded_1.txt0000644000000000000000000000157311702050534030521 0ustar rootrootWell, I don't know much about how these things are output, so here goes... first off, my .sig file: begin 644 .signature M("!?7U\@(%\@7R!?("`@7R`@7U]?(%\@("!%2\*("`@("`@("`@("!\7U]?+R`@("!\ M7U]?7U]?+R!O9B!T:&4@:&]M96QE+Z3Q4C@U3S$I@0XC#J?UFD2]3I.JU5O#+R4CLD4,;IK7I>%[EX[+M\, +C/A\<0=Y^J4)`#L` end Done! apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/badbound.msg0000644000000000000000000001367211702050534027151 0ustar rootrootReceived: from uriela.in-berlin.de by anna.in-berlin.de via SMTP (940816.SGI.8.6.9/940406.SGI) for id AAA04436; Mon, 23 Dec 1996 00:08:02 +0100 Resent-From: koenig@franz.ww.TU-Berlin.DE Received: by uriela.in-berlin.de (/\oo/\ Smail3.1.29.1 #29.8) id ; Mon, 23 Dec 96 00:08 MET Received: by methan.chemie.fu-berlin.de (Smail3.1.29.1) from franz.ww.TU-Berlin.DE (130.149.200.51) with smtp id ; Mon, 23 Dec 96 00:07 MET Received: (from koenig@localhost) by franz.ww.TU-Berlin.DE (8.7.3/8.7.3) id XAA01761 for k@anna.in-berlin.de; Sun, 22 Dec 1996 23:25:10 +0100 (CET) Resent-Date: Sun, 22 Dec 1996 23:25:10 +0100 (CET) Resent-Message-Id: <199612222225.XAA01761@franz.ww.TU-Berlin.DE> Resent-To: k Received: from mailgzrz.TU-Berlin.DE (mailgzrz.TU-Berlin.DE [130.149.4.10]) by franz.ww.TU-Berlin.DE (8.7.3/8.7.3) with ESMTP id XAA01754 for ; Sun, 22 Dec 1996 23:24:32 +0100 (CET) Received: from challenge.uscom.com (actually mail.uscom.com) by mailgzrz.TU-Berlin.DE with SMTP (PP); Sun, 22 Dec 1996 23:19:35 +0100 To: koenig@franz.ww.tu-berlin.de From: Mail Administrator Reply-To: Mail Administrator Subject: Mail System Error - Returned Mail Date: Sun, 22 Dec 1996 17:21:12 -0500 Message-ID: <19961222222112.AAE16235@challenge.uscom.com> MIME-Version: 1.0 Content-Type: multipart/mixed; Boundary="===========================_ _= 2283630(16235)" Content-Transfer-Encoding: 7BIT X-Filter: mailagent [version 3.0 PL44] for koenig@franz.ww.tu-berlin.de X-Filter: mailagent [version 3.0 PL44] for k@.in-berlin.de --===========================_ _= 2283630(16235) Content-type: text/plain; charset="us-ascii" This Message was undeliverable due to the following reason: The Program-Deliver module couldn't deliver the message to one or more of the intended recipients because their delivery program(s) failed. The following error messages provide the details about each failure: The delivery program "/pages/pnet/admin/mail_proc.pl" produced the following output while delivering the message to pnet@uscom.com Can't exec "/usr/sbin/sendmail -t": No such file or directory at /pages/pnet/admin/mail_proc.pl line 96, <> line 93. Broken pipe The program "/pages/pnet/admin/mail_proc.pl" exited with an unknown value of 141 while delivering the message to pnet@uscom.com The message was not delivered to: pnet@uscom.com Please reply to Postmaster@challenge.uscom.com if you feel this message to be in error. --===========================_ _= 2283630(16235) Content-type: message/rfc822 Content-Disposition: attachment Date: Sun, 22 Dec 1996 22:24:21 +0000 Message-ID: <"mailgzrz.T.061:22.12.96.22.24.21"@TU-Berlin.DE> Received: from franz.ww.TU-Berlin.DE ([130.149.200.51]) by challenge.uscom.com (Netscape Mail Server v2.02) with ESMTP id AAA685 for ; Wed, 18 Dec 1996 16:58:30 -0500 Received: from mailgzrz.TU-Berlin.DE (mailgzrz.TU-Berlin.DE [130.149.4.10]) by franz.ww.TU-Berlin.DE (8.7.3/8.7.3) with ESMTP id SAA23400 for ; Wed, 18 Dec 1996 18:59:21 +0100 (CET) Received: from anna.in-berlin.de by mailgzrz.TU-Berlin.DE with SMTP (PP); Wed, 18 Dec 1996 18:59:11 +0100 Received: by anna.in-berlin.de (940816.SGI.8.6.9/940406.SGI) id SAA19491; Wed, 18 Dec 1996 18:55:21 +0100 Date: Wed, 18 Dec 1996 18:55:21 +0100 Message-Id: <199612181755.SAA19491@anna.in-berlin.de> From: Andreas Koenig To: michelle@eugene.net CC: msqlperl@franz.ww.tu-berlin.de In-reply-to: (message from Michelle Brownsworth on Wed, 18 Dec 1996 09:32:02 -0700) Subject: HOWTO (Was: unsubscribe) >>>>> On Wed, 18 Dec 1996 09:32:02 -0700, >>>>> Michelle Brownsworth >>>>> who can be reached at: michelle@eugene.net >>>>> (whose comments are cited below with " michelle> "), >>>>> sent the cited message concerning the subject of "unsubscribe" >>>>> twice to the whole list of subscribers michelle> unsubscribe michelle> ************************************************************ michelle> Michelle Brownsworth michelle> System Administrator michelle> Internet Marketing Services michelle@eugene.net michelle> 2300 Oakmont Way, #209 541-431-3374 michelle> Eugene, OR 97402 FAX 431-7345 michelle> ************************************************************ Welcome new subscriber! You've joined the mailing list of unsubscribers' collected wisdom of unsubscribe messages. Relax! You won't have to subscribe to any mailing list for the rest of your life. Better yet, you can't even unsubscribe! So just lean back and enjoy to watch your IO stream of millions of unsubscribe messages daily. Isn't that far more than everything you ever dared to dream of? andreas P.S. This was posted 12 days ago: Date: Fri, 6 Dec 1996 15:47:51 +0100 To: msqlperl@franz.ww.tu-berlin.de Subject: How To Unsubscribe (semi-regular posting) To get off this list, send mail to -------------------- majordomo@franz.ww.tu-berlin.de with the following words in the body of the message (subject line will be ignored): unsubscribe msqlperl <_insert_your_subscription_address_here_> To find out who you are subscribed as, send mail to ------------------------------------- majordomo@franz.ww.tu-berlin.de with only nothing but who msqlperl in the body of the message: If you encounter problems, ------------------------- please try sending the message "help" to majordomo@franz.ww.tu-berlin.de. Hope that help, andreas NOTE: if the above recipe does not work for you, ask me for assistance and do not spam the list with the request. Thank you! --===========================_ _= 2283630(16235)-- apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/double-bound_decoded.xml0000644000000000000000000000527211702050534031430 0ustar rootroot
Return-Path: eryq@rhine.gsfc.nasa.gov Sender: john-bigboote Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Eryq <eryq@rhine.gsfc.nasa.gov> Organization: Yoyodyne Propulsion Systems X-Mailer: Mozilla 2.0 (X11; I; Linux 1.1.18 i486) MIME-Version: 1.0 To: john-bigboote@eryq.pr.mcs.net Subject: test of double-boundary behavior Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE"
This is a multi-part message in MIME format.
Content-Type: text/html; charset=us-ascii Content-Transfer-Encoding: 7bit Subject: [2] this should be text/html, but double-bound may mess it up
Content-Type: text/html; charset=us-ascii Subject: [4] this should be text/html, but double-bound may mess it up
Content-Type: text/html; charset=us-ascii Subject: [6] this should be text/html, but double-bound may mess it up
Content-Type: text/html; charset=us-ascii Subject: [7] this header is improperly terminated
Content-Type: text/html; charset=us-ascii Subject: [8] this body is empty
Content-Type: text/html; charset=us-ascii Subject: [9] this body also empty
Content-Type: image/gif; name="3d-eye.gif" Content-Transfer-Encoding: base64 Subject: [10] just an image
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/ticket-60931_decoded_1_2.txt0000644000000000000000000000001211702050534031457 0ustar rootrootHELLO
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/double-bound_decoded_1_4.txt0000644000000000000000000000002711702050534032103 0ustar rootroot

Hello? Am I here? apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/german-qp_decoded_1.txt0000644000000000000000000000041111702050534031165 0ustar rootroot Hallo, das ist eine Testnachricht mit 8 Bit Sönderzäichen, und obendrein noch quoted-printable kodiert. Grüße, Jörn -- .''`. Jörn Reder : :' : http://www.exit1.org/ http://www.zyn.de/ `. `' `- Debian GNU/Linux -- The power of freedom apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-nested2_decoded_1_1.txt0000644000000000000000000000032511702050534032216 0ustar rootrootPart 1 of the outer message. [Note that the preceding blank line means no header fields were given and this is text, with charset US ASCII. It could have been done with explicit typing as in the next part.] apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/uu-junk.msg0000644000000000000000000002107111702050534026761 0ustar rootrootFrom - Fri Jun 9 23:17:56 2000 Return-Path: Received: from virtual.mrf.mail.rcn.net ([207.172.4.103]) by mta02.mrf.mail.rcn.net (InterMail vM.4.01.02.27 201-229-119-110) with ESMTP id <20000425112650.ZPUD516.mta02.mrf.mail.rcn.net@virtual.mrf.mail.rcn.net> for ; Tue, 25 Apr 2000 07:26:50 -0400 Received: from [205.139.141.226] (helo=webmail.uwohali.com ident=root) by virtual.mrf.mail.rcn.net with esmtp (Exim 2.12 #3) id 12k3VX-00012G-00 for eryq@zeegee.com; Tue, 25 Apr 2000 07:27:59 -0400 Received: from webmail.uwohali.com (nobody@localhost [127.0.0.1]) by webmail.uwohali.com (8.8.7/8.8.7) with SMTP id GAA10264 for ; Tue, 25 Apr 2000 06:34:43 -0500 Date: Tue, 25 Apr 2000 06:34:43 -0500 Message-Id: <200004251134.GAA10264@webmail.uwohali.com> From: "ADJE Webmail Tech Support" To: eryq@zeegee.com Subject: mime::parser Content-type: multipart/mixed; boundary="---------------------------7d033e3733c" Mime-Version: 1.0 X-Mozilla-Status: 8001 -----------------------------7d033e3733c Content-Type: text/plain Eryq - I occasionally receive an email (see below) like this one, which MIME::Parser does not parse. Any ideas? Is this a valid way to send an attachment, or is the problem on the "sender's" side? Thanks for your time! Mike -->> Promote YOUR web site! FREE Perl CGI scripts add WEB ACCESS to your -->> E-Mail accounts! Download today!! http://webmail.uwohali.com -----------------------------7d033e3733c Here's what he's talking about. I've uuencoded the ZeeGee logo and another GIF file below. begin 644 up.gif M1TE&.#=A$P`3`*$``/___P```("`@,#`P"P`````$P`3```"1X2/F<'MSTQ0 M%(@)YMB\;W%)@$<.(*:5W2F2@<=F8]>LH4P[7)P.T&NZI7Z,(&JF^@B121Y3 4Y4SNEJ"J]8JZ:JTH(K$"/A0``#L` ` end begin 644 zeegee.gif M1TE&.#=A6P!P`/<```````@("!`0$#D`(3D`*4(`*1@8&$H`*4H`,5(`,5(` M.5H`,2$A(5H`.5((,6,`.6,`0EH(.6L`0F,(.6,(0BDI*5H0.6L(0FL(2F,0 M.6,00G,(2C$Q,4(I,6L02GL(4G,04G,02FL80H0(4H0(6E(I.7,80HP(6CDY M.6LA0D(Y.90(6I0(8XP06G,A2H084H086I008U(Y0GLA4D)"0G,I2H0A2G,I M4H0A4H0A6H0I4I0A8TI*2FLY4GLQ6G,Y4I0I8U)24F-*4EI22I0Q8Y0Q:YPQ M:Y0Y6I0Y8X1"6I0Y:UI:6HQ"6H1*8Z4YV-C8WM: M8Z5"X1C:Y1:ZU2WM[>Y1S[UC>XQ[ M>YQS>[5K>[UCE)Q[>X2$A+UKA)Q[E*5[>[UKC*5[A*5[E)R$>[USC*5[G-YC MC(R,C*U[G*6$A,YKE+U[C*V$A+5[G,YSC*V$C+5[I=YKE)24E*V,C+6$I;V$ MI;6,C+6,E-9[G+V,C*V4C+V,E-Y[E-Y[G)R>$I;V^,I:VM MK<:EI>4O>^4M=:EI=:EK>>>EK?>>EM=ZMK>>EO=ZMM>^EK?^^EO?^MK>>MM>^ESO>EO?^E MO>^MO?^EQN>UM?^ESO>MQL;&QN^UM=Z]M>^UO?^MO?>UO>>]O>^]O?^USO^U MQO>]O<[.SN?&O?>]QO^]QO^]SO?&QO^]WO?&SM;6UO_&QO_&SO_&WO_&Y__. MSN_6SO_.UM[>WO_.WO_6UO_6WO_6Y^?GY__>WO_>Y__GWO_GY__G[__G]^_O M[__O[_?W]__W]__W_____RP`````6P!P``<(_P#_"1Q(L*#!@P@3*ES(L*'# MAQ`C2IQ(L:+%BQ@S:I08J:-'2"!#BAP9DI')1(12JES)LF6@ES!C^IE)L^9, M/3ASZE2XH:?/GAB"8KA`M"B%HT@A*(7PH('3IU`;*)BJ(('5JPBR:M5ZH&N! MKV#!$AA+8(#9LSQ__A0ZM"A1I$F7-HT:E6K5JUBW379 MU["/(]_0V3-SN:,=/_^&[/MW];YCL6>/C;S[7]U66H(+\-6C;;?&%)R%>U)U7 M@$(C*(CA=H9YQR&$$4;76XA]D5BBB?NAJ-Q[<.76HHL@9I5`!M.9=Z",,]*H M77LW(I9CA]#Q:)4-9#22R2:*".+"9'P1.4*1-&;8X'?./4?78PM$T8@K=4A1 M@P4U,*$($WN-F!`)6]9I9'9>!E7;BBQZJ(`5I6RBA@B1I7"(!7LI1`*==7+9 MI8UZJKADGXV]4`HQ9U@@759()+'5`8HNVJBC)N89J9*3BMG``W8\H\@,]('_ MB$,3>H6Z**-VWKG@9AJ"&:!3+\CBRA/B.6F5!F_4FM`)MXK:J*Z[$M8K@`%: M$4TC)M05JU6'*(O0"$>01)`(*@1NNN,_J M:NJ>H+VP##'$RL=;!F/D5:^]]SJ;ZYW[2GH4$>2$,!DDTBD`)G&&W,\*K0-NV4'.89XH-C)8RKP!*%XL8QPPAV3 M6RZ#21HB#AO4JDJ:&!D0F(#//[O\,L.0ZHG*-EB@FZK2#5R`!7T*L?!SU%)[ M_#'1&,BRC1(X/DAQ`Q'H@(48+@Q85=ABC]WRK5-3_[U=*MP4P>^DO]90BSWW MW*.+!G;CS<(*>MM;]I8P(W=U$>?ZVI0&M'S#3C_WL+/*`DY-Y3@+>4?.<="5 MJW6U$?V%[."#7[3B2S7L?).-+STCL$@#;Q81_K@P<`&RB,=QV!@.Q3X"S2` M8%IP:8(02C`$(0AA""5(P/\0(L`2IDYUXH*!';"A0/4UL('O4$<$7SC!=8`# M$!>47?0\4`49J."'*G!`5/_J94(!@@^%BWJ#-<[1PG:\,![Q>$<^@@'%>-!0 M@>C`QAF^!!B`$(>XK!.LH(@!)"`)@'"*;IP#'2U\(3SBD0YYS*** M5KSB.LX!CD_D`'IPT4(*(L`DC9T1C2?\612@X48FQI&&\CC&._`HQQJB@X_4 M4`(@*:"#)$CO5SY#9"+!E09&@N.-"EQ@`]NA#F2L@Y*53.4YSM$-:H3A2V(0 MP=8:`+5#HA%A>8"&-;HQ#E0^$A[M(`@P0;_X$`*?&(* MU,PH2E(F`QK:(*8QT^=$>&Q#&N!H9B6?&8H99O@$F47 M@*'_#&J$LYCC5!\WEH$-==*0G;.4IC:@`0Q-L@4'1T!57/`)+E\*T`FX``8T M_-F-4XYS'=R0QC#*6<55KB^5T$QH-Q::C%/H('9DT(##D*(H`EJ4!3$812TT MRE%P`!2.ZPB'-&SAQ'C0XQ[XN$<]Z(%,E&)QEN-0*#24`8Q+A(`[.V#"821* M@5`1\`0"Y`,M=KI1:X33HV\4QS-F<0XGU@,?_A#(/N[!5*=>4J7:>"=5:3&& MGIS!`YF#BZV^BKH=T&*L_!1F.#LZRW,TPQ8L;`<]\%&0?-0#'JE$QUWYV(V5 MZA48M/`$"(QPA!1)RE:+LBD@8G'8Q%+#K)T]93.:P0LX_\*C'OTP"#[B`LEQB'>\U@BN<`^KBDY<05KGTM)R$=:"3IC"%*I@K72_6=9BA((: ML06'=N-QCWV8>!]UY:,TQTM>:$`C&<`X;RQ,P0E$\"I)6AK!A,'E!$YXXL+0 MC2XP.$R,69Q"&TB.+1/+*<$]KGBE>4VPBV$,6O326!(^N+%R7C.J'<>!$YRP M<'V%#(Q>%.,0U'BM61?KT_!"=?_%2(ZR@I5!Y<.N0A6>X,0CFH`V/6%G7,L] M!)C#C&'61G<8R`"$,EQ<5FNL.JZ:?+MX*! M)"9Q"3#_.,.TR$4Q*)$+?BZ:T1M-% M0%T$21A;$J8N]"YF<0E<2U<9K[:UM%T,;6?7XM*9SC,G)%$(.,PO0\/NLA*. M;>QDLZ(8=3CL3IT-#&%`&]KN?KNNM\2M?5A=WYG7^O;U'[%YG_J`1]5V%HB-?"%\#PA#T97:%W&'QN\!Y7M0>++]3M^5/_?RE=?YA3W!]8P_0O!T<`,8JN`"(Y7= M(OQ(O>I7S_K6N_[UL(?]1A32>GW$_O:XSST_9D][U=M>]ZLO"/!?S_O>\^/W MPU_(\%5?_(',0Q\$\?WR$<(/=\SC^0))OD4&P8#N>]_[CG!'__2/O_S=%\08 M/!```-8?`!08XQ_`OT@;UD__^FO"_`,A__3S3X7Z&Z#^2X!\L8<1Y@`*!FB` MFA```,``YF`0YB=[^<=\V<<#Z\+!^CE`0 MW@`*FG"!U]=Z_U"`FJ`)&)AZ`U$&ZX<'$9AZMZ"`K]!ZT_""H`!]PG=]/9B" M0.@0\Z"`/#`/`^$.*%!_`!`$WA"#J><.%%A_/.`-0.@."K@%XZ=Z\V!]7F@, M'%!_`4`%^*'MQ"#YI"'=^B' MM[![(R@`^'=[\_`*"FB'>+A^%0!]_/]P@G7(`#S``.O'`&V($-.P?EOP@)3( M`=XP$--0`0#``<9@>Z*(`MZ@>MXPAA6`@11(!=D'?_`7@O"G#].@?CQ@#JIW MBT_8@L:`B^(G$(Z`BPPABA7PB0*A"788C,ZG?GC@#LIHB06A#_\W"/PPAGC@ MA>ZPC=RXC>;PA?V'`LRW>[>P?FG8?QP0@OPP@@#0@`GA""1($$$``#SP@O;X M@C0``#3@#?,8!/=HC_G(`_S0A&6@>J_@A/77!N9`B5OPCYK@")0X"+=`B53@ M"/\(D0`P"`FA#[BHA`,QA@A9?Q5@#B`9DA7(#V](`[]7CB;Y"MY@DO6W!0<) MD^M7!@G1?W'_6!!-6`$HL`14\)-`N01M,)`+&`1+<)1(>91#J8P!D(K'UXWN MD(;J]X7KQP-'"914<)6O,)-!@)59J968J(FTN`7T.`W,*'QDF8NL%WT<28\" MZ'OSZ('\0(GW1Q#Z,`_F-PW_IPG19PZ7:!!CR`%G*1`L"0K?.!#ZD)6ZF(D` M``K/9WZ)N00QJ(Q/B)>KIP]O*`"ZN(X+Z)'_<)>OX),"\8;2^)E1J0FB>1"@ M```!L(=0.0W3,(\!H)"I9PRG.!"RV08Q.)$`((ZJ-W]P6`:O8`Z:4`9Y&(BI M1XT+N(/\8`YXH(`V^)G_QP"EJ`_>T`;0B1#`&9*TF8^L:0"1Z)GZ_["&`0"> ME6B9JN<(B>B$##`-P=>'ZR<`!I"(2T`0=!B?\[E^L(@0$/E]WF<`=?D/@Y"' M<+@%E\@/;5"'!?J6J3$H-">LSB`.$VQB%([B'7QB" M:!A]*)I_M_""@3@/AQF%U@<*GYB!MNB#[O^H$.7H"%@H$-9'$*"@H`!0`;>@ MA.Q(?V19?PP0`"[*`Z"ZA`!@D_P`"@2ZG!#Z#WJ)`I28C1JXAO07!']IEP'@ MB<^G#VU(@T'0HO-P"Z+H"'YYA*TX#R?8?V4`"N6HD0*A#PH("@,!CZDX"*.8 MJ8?XJ=VWI?^WCW>9@P!Z?>XP@J6)$(@8`$N@@AY9CEP8?:)Z"]`G`.DX$,HH MA_]0`31@?DP9!-E'`PRPI?K(IZ+8K[\8`-"G#^[0?2[Z#R.XGPGAH)0H`&5@ M#@U(`TUI$,[*`^('K_AWD/3ZG,'(`Q6P!83X#UC:!OK@H7]YD&+ZBS0@J=1* MKP3A#A40`&=Z$*__0(F]J@^C.)@"$00&\'X&4`$;"P"O(*D92;(!@`=<^G[* M:`[N(`#Z:A#F$*;_<`L"4)];ZJ%."Y7A"@!ENJ)`.`]CZ`B9&`0\^P_S5Z5! M6X0'6;0"P0$""8_B%P";"+(D"P!MA#*.)SF5XXVR0$,F+#_((D"80`,(+G.A[WQ^N\CCA_#-M]^%>.D_L/ M\&B^`T&!4BH0%%@&OS<-3=A^4PH`Z7N^'2A^U:<)#&``LAM]\\BI!3%_Y9F? MFS@0;4H0Y0BS=UO`#>RB*/F=_R<`J&J^+VF3!(&(=FB>*'#!!G&"FL"X2]@& M61FQ!?$*7SL//_C#;:@/_SN'6_"3@P!]M_"EB.J`@_"36T#"5EK%5GS%6)S% 36KS%7-S%7OS%8!S&8IP1`<$`.P`` ` end -----------------------------7d033e3733c-- apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/multi-nested2.xml0000644000000000000000000001015411702050534030071 0ustar rootroot

MIME-Version: 1.0 From: Lord John Whorfin <whorfin@yoyodyne.com> To: <john-yaya@yoyodyne.com> Subject: A complex nested multipart example Content-Type: multipart/mixed; boundary=unique-boundary-1
The preamble of the outer multipart message. Mail readers that understand multipart format should ignore this preamble. If you are reading this text, you might want to consider changing to a mail reader that understands how to properly display multipart messages.
Part 1 of the outer message. [Note that the preceding blank line means no header fields were given and this is text, with charset US ASCII. It could have been done with explicit typing as in the next part.]
Content-type: text/plain; charset=US-ASCII
Part 2 of the outer message. This could have been part of the previous part, but illustrates explicit versus implicit typing of body parts.
Subject: Part 3 of the outer message is multipart! Content-Type: multipart/parallel; boundary=unique-boundary-2
A one-line preamble for the inner multipart message.
Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-vise.gif" Subject: Part 1 of the inner message is a GIF, "3d-vise.gif"
R0lGODdhKAAoAOMAAAAAAAAAgB6Q/y9PT25ubnCAkKBSLb6+vufn5/Xes/+lAP/6zQAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJLMOyYbcoxkaZ5oCkoH6L5wLMfiWqd4btZhmxbA oFCY47EIqMJgyWw2ATjj7aRkAq5YwDMl9VGtKO0SiuoiTVlscsxt9c4HgXxUIA0EAVOVfDKT 8Hl1B3kDAYYle202XnGGgoMHhYckiWVuR3+OTgCGeZRslotwgJ2lnYigfZdTjQULr7ALBZN0 qTurjHgLKAu0B5Wqopm7J72etQN8t8Ijury+wMtvw8/Hv7Ylfs0BxCbGqMmK0yOOQ0GTCgrR 2bhwJGlXJQYG6mMKoeNoWSbzCWIACe5JwxQm3AkDAbUAQCiQhDZEBeBl6afgCsOBrD45edIv QceGWSMevpOYhl6CkydBHhBZQmGKjihVshypjB9ClAHZMTugzOU7mzhBPiSZ5uDNnA7b/aTZ 0mhMnfl0pDBFa6bUElSPWb0qtYuHrxlwcR17YsWMs2jTql3LFkQEADs=
Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-eye.gif" Subject: Part 2 of the inner message is another GIF, "3d-eye.gif"
R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7 VujnC96IRVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7 +3dCeRRjfAKHiImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatL rU8GaQdOBAQAB7+yXliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJ vs7Y5ewH3d7Fxe3jB4rj8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjw E0cdGxQ/gswosoKUkmuU2FnJcsSKGTBjypxJsyaICAA7
The epilogue for the inner multipart message.
Content-type: text/richtext
This is <bold>part 4 of the outer message</bold> <smaller>as defined in RFC1341</smaller><nl> <nl> Isn't it <bigger><bigger>cool?</bigger></bigger>
Content-Type: message/rfc822; name="/evil/filename";
From: (mailbox in US-ASCII) To: (address in US-ASCII) Subject: Part 5 of the outer message is itself an RFC822 message! Content-Type: Text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: Quoted-printable
Part 5 of the outer message is itself an RFC822 message!
The epilogue for the outer message.
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/hdr-fakeout_decoded.xml0000644000000000000000000000133411702050534031255 0ustar rootroot
Received: (qmail 24486 invoked by uid 501); 20 May 2000 01:55:02 -0000 Date: Fri, 19 May 2000 21:55:02 -0400 From: "Russell P. Sutherland" <russ@quist.on.ca> To: "Russell P. Sutherland" <russ@quist.on.ca> Subject: test message 1 Message-ID: <20000519215502.A24482@quist.on.ca> Mime-Version: 1.0 Content-transfer-encoding: 7BIT Content-Type: text/plain; charset=us-ascii X-Mailer: Mutt 1.0us Organization: Quist Consulting
apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/double-bound.out0000644000000000000000000000463011702050534027765 0ustar rootrootReturn-Path: eryq@rhine.gsfc.nasa.gov Sender: john-bigboote Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Eryq Organization: Yoyodyne Propulsion Systems X-Mailer: Mozilla 2.0 (X11; I; Linux 1.1.18 i486) MIME-Version: 1.0 To: john-bigboote@eryq.pr.mcs.net Subject: test of double-boundary behavior Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE" This is a multi-part message in MIME format. --------------299A70B339B65A93542D2AE --------------299A70B339B65A93542D2AE Content-Type: text/html; charset=us-ascii Content-Transfer-Encoding: 7bit Subject: [2] this should be text/html, but double-bound may mess it up

This message contains double boundaries all over the place. We want to make sure that bad things don't happen.

One bad thing is that the doubled-boundary above can be mistaken for a single boundary plus a bogus premature end of headers. --------------299A70B339B65A93542D2AE --------------299A70B339B65A93542D2AE Content-Type: text/html; charset=us-ascii Subject: [4] this should be text/html, but double-bound may mess it up

Hello? Am I here? --------------299A70B339B65A93542D2AE --------------299A70B339B65A93542D2AE Content-Type: text/html; charset=us-ascii Subject: [6] this should be text/html, but double-bound may mess it up

Hello? Am I here? --------------299A70B339B65A93542D2AE Content-Type: text/html; charset=us-ascii Subject: [7] this header is improperly terminated --------------299A70B339B65A93542D2AE Content-Type: text/html; charset=us-ascii Subject: [8] this body is empty --------------299A70B339B65A93542D2AE Content-Type: text/html; charset=us-ascii Subject: [9] this body also empty --------------299A70B339B65A93542D2AE Content-Type: image/gif; name="3d-eye.gif" Content-Transfer-Encoding: base64 Subject: [10] just an image R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAAAAAA AAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7VujnC96I RVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7+3dCeRRjfAKH iImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatLrU8GaQdOBAQAB7+y XliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJvs7Y5ewH3d7Fxe3jB4rj 8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjwE0cdGxQ/gswosoKUkmuU2FnJ csSKGTBjypxJsyaICAA7 --------------299A70B339B65A93542D2AE-- apache-mime4j-project-0.7.2/core/src/test/resources/mimetools-testmsgs/re-fwd.msg0000644000000000000000000000145411702050534026552 0ustar rootrootContent-Disposition: inline Content-Transfer-Encoding: binary Content-Type: message/rfc822 MIME-Version: 1.0 X-Mailer: MIME::Lite 1.147 (B2.09; Q2.03) Date: Tue, 6 Jun 2000 03:20:11 UT From: user2 To: user0 Subject: Re: Fwd: hello world Content-Disposition: inline Content-Transfer-Encoding: binary Content-Type: message/rfc822 MIME-Version: 1.0 X-Mailer: MIME::Lite 1.147 (B2.09; Q2.03) Date: Tue, 6 Jun 2000 03:20:11 UT From: user1 To: user2 Subject: Fwd: hello world Content-Disposition: inline Content-Length: 60 Content-Transfer-Encoding: binary Content-Type: text/plain MIME-Version: 1.0 X-Mailer: MIME::Lite 1.147 (B2.09; Q2.03) Date: Tue, 6 Jun 2000 03:20:11 UT From: user0 To: user1 Subject: hello world This is the original message. Let's see if we can embed it! apache-mime4j-project-0.7.2/core/src/reporting-site/0000755000000000000000000000000011702050540020752 5ustar rootrootapache-mime4j-project-0.7.2/core/src/reporting-site/site.xml0000644000000000000000000000175611702050540022451 0ustar rootroot

apache-mime4j-project-0.7.2/core/pom.xml0000644000000000000000000000454711702050540016537 0ustar rootroot 4.0.0 apache-mime4j-project org.apache.james 0.7.2 ../pom.xml apache-mime4j-core Apache JAMES Mime4j (Core) junit junit jar test true commons-io commons-io test true org.apache.maven.plugins maven-jar-plugin test-jar apache-mime4j-project-0.7.2/LICENSE0000644000000000000000000004504611702050542015300 0ustar rootroot Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS THIS PRODUCT ALSO INCLUDES THIRD PARTY SOFTWARE REDISTRIBUTED UNDER THE FOLLOWING LICENSES: Apache Commons Logging, The Apache Software License, Version 1.1 (commons-logging-1.1.1.jar) The Apache Software License, Version 1.1 Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The end-user documentation included with the redistribution, if any, must include the following acknowledgment: "This product includes software developed by the Apache Software Foundation (http://www.apache.org/)." Alternately, this acknowledgment may appear in the software itself, if and wherever such third-party acknowledgments normally appear. 4. The names "Apache" and "Apache Software Foundation" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact apache@apache.org. 5. Products derived from this software may not be called "Apache", nor may "Apache" appear in their name, without prior written permission of the Apache Software Foundation. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Test messages from the Perl-MIME-Tools project, The "Artistic License" Preamble The intent of this document is to state the conditions under which a Package may be copied, such that the Copyright Holder maintains some semblance of artistic control over the development of the package, while giving the users of the package the right to use and distribute the Package in a more-or-less customary fashion, plus the right to make reasonable modifications. Definitions: "Package" refers to the collection of files distributed by the Copyright Holder, and derivatives of that collection of files created through textual modification. "Standard Version" refers to such a Package if it has not been modified, or has been modified in accordance with the wishes of the Copyright Holder as specified below. "Copyright Holder" is whoever is named in the copyright or copyrights for the package. "You" is you, if you're thinking about copying or distributing this Package. "Reasonable copying fee" is whatever you can justify on the basis of media cost, duplication charges, time of people involved, and so on. (You will not be required to justify it to the Copyright Holder, but only to the computing community at large as a market that must bear the fee.) "Freely Available" means that no fee is charged for the item itself, though there may be fees involved in handling the item. It also means that recipients of the item may redistribute it under the same conditions they received it. 1. You may make and give away verbatim copies of the source form of the Standard Version of this Package without restriction, provided that you duplicate all of the original copyright notices and associated disclaimers. 2. You may apply bug fixes, portability fixes and other modifications derived from the Public Domain or from the Copyright Holder. A Package modified in such a way shall still be considered the Standard Version. 3. You may otherwise modify your copy of this Package in any way, provided that you insert a prominent notice in each changed file stating how and when you changed that file, and provided that you do at least ONE of the following: a) place your modifications in the Public Domain or otherwise make them Freely Available, such as by posting said modifications to Usenet or an equivalent medium, or placing the modifications on a major archive site such as uunet.uu.net, or by allowing the Copyright Holder to include your modifications in the Standard Version of the Package. b) use the modified Package only within your corporation or organization. c) rename any non-standard executables so the names do not conflict with standard executables, which must also be provided, and provide a separate manual page for each non-standard executable that clearly documents how it differs from the Standard Version. d) make other distribution arrangements with the Copyright Holder. 4. You may distribute the programs of this Package in object code or executable form, provided that you do at least ONE of the following: a) distribute a Standard Version of the executables and library files, together with instructions (in the manual page or equivalent) on where to get the Standard Version. b) accompany the distribution with the machine-readable source of the Package with your modifications. c) give non-standard executables non-standard names, and clearly document the differences in manual pages (or equivalent), together with instructions on where to get the Standard Version. d) make other distribution arrangements with the Copyright Holder. 5. You may charge a reasonable copying fee for any distribution of this Package. You may charge any fee you choose for support of this Package. You may not charge a fee for this Package itself. However, you may distribute this Package in aggregate with other (possibly commercial) programs as part of a larger (possibly commercial) software distribution provided that you do not advertise this Package as a product of your own. You may embed this Package's interpreter within an executable of yours (by linking); this shall be construed as a mere form of aggregation, provided that the complete Standard Version of the interpreter is so embedded. 6. The scripts and library files supplied as input to or produced as output from the programs of this Package do not automatically fall under the copyright of this Package, but belong to whoever generated them, and may be sold commercially, and may be aggregated with this Package. If such scripts or library files are aggregated with this Package via the so-called "undump" or "unexec" methods of producing a binary executable image, then distribution of such an image shall neither be construed as a distribution of this Package nor shall it fall under the restrictions of Paragraphs 3 and 4, provided that you do not represent such an executable image as a Standard Version of this Package. 7. C subroutines (or comparably compiled subroutines in other languages) supplied by you and linked into this Package in order to emulate subroutines and variables of the language defined by this Package shall not be considered part of this Package, but are the equivalent of input as in Paragraph 6, provided these subroutines do not change the language in any way that would cause it to fail the regression tests for the language. 8. Aggregation of this Package with a commercial distribution is always permitted provided that the use of this Package is embedded; that is, when no overt attempt is made to make this Package's interfaces visible to the end user of the commercial distribution. Such use shall not be construed as a distribution of this Package. 9. The name of the Copyright Holder may not be used to endorse or promote products derived from this software without specific prior written permission. 10. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. The End apache-mime4j-project-0.7.2/benchmark/0000755000000000000000000000000011702050540016212 5ustar rootrootapache-mime4j-project-0.7.2/benchmark/src/0000755000000000000000000000000011702050540017001 5ustar rootrootapache-mime4j-project-0.7.2/benchmark/src/main/0000755000000000000000000000000011702050540017725 5ustar rootrootapache-mime4j-project-0.7.2/benchmark/src/main/java/0000755000000000000000000000000011702050540020646 5ustar rootrootapache-mime4j-project-0.7.2/benchmark/src/main/java/org/0000755000000000000000000000000011702050540021435 5ustar rootrootapache-mime4j-project-0.7.2/benchmark/src/main/java/org/apache/0000755000000000000000000000000011702050540022656 5ustar rootrootapache-mime4j-project-0.7.2/benchmark/src/main/java/org/apache/james/0000755000000000000000000000000011702050540023755 5ustar rootrootapache-mime4j-project-0.7.2/benchmark/src/main/java/org/apache/james/mime4j/0000755000000000000000000000000011702050540025142 5ustar rootroot././@LongLink0000000000000000000000000000016200000000000011564 Lustar rootrootapache-mime4j-project-0.7.2/benchmark/src/main/java/org/apache/james/mime4j/QuotedPrintableOutputStreamBench.javaapache-mime4j-project-0.7.2/benchmark/src/main/java/org/apache/james/mime4j/QuotedPrintableOutputStr0000644000000000000000000000502511702050540032103 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j; import java.io.OutputStream; import java.util.Random; import org.apache.commons.io.output.NullOutputStream; import org.apache.james.mime4j.codec.QuotedPrintableOutputStream; public class QuotedPrintableOutputStreamBench { public static void main(String[] args) throws Exception { byte[] data = initData(1024); OutputStream nullOut = new NullOutputStream(); QuotedPrintableOutputStream base64Out = new QuotedPrintableOutputStream(nullOut, true); // warmup for (int i = 0; i < 2000; i++) { base64Out.write(data); } Thread.sleep(100); // test long t0 = System.currentTimeMillis(); final int repetitions = 500000; for (int i = 0; i < repetitions; i++) { base64Out.write(data); } base64Out.close(); long dt = System.currentTimeMillis() - t0; long totalBytes = data.length * (long) repetitions; double mbPerSec = (totalBytes / 1024.0 / 1024) / (dt / 1000.0); System.out.println(dt + " ms"); System.out.println(totalBytes + " bytes"); System.out.println(mbPerSec + " mb/sec"); } private static byte[] initData(int size) { Random random = new Random(size); byte[] data = new byte[size]; random.nextBytes(data); return data; } }././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootapache-mime4j-project-0.7.2/benchmark/src/main/java/org/apache/james/mime4j/Base64OutputStreamBench.javaapache-mime4j-project-0.7.2/benchmark/src/main/java/org/apache/james/mime4j/Base64OutputStreamBench.0000644000000000000000000000475311702050540031535 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j; import java.io.OutputStream; import java.util.Random; import org.apache.commons.io.output.NullOutputStream; import org.apache.james.mime4j.codec.Base64OutputStream; public class Base64OutputStreamBench { public static void main(String[] args) throws Exception { byte[] data = initData(1024); OutputStream nullOut = new NullOutputStream(); Base64OutputStream base64Out = new Base64OutputStream(nullOut); // warmup for (int i = 0; i < 2000; i++) { base64Out.write(data); } Thread.sleep(100); // test long t0 = System.currentTimeMillis(); final int repetitions = 500000; for (int i = 0; i < repetitions; i++) { base64Out.write(data); } base64Out.close(); long dt = System.currentTimeMillis() - t0; long totalBytes = data.length * (long) repetitions; double mbPerSec = (totalBytes / 1024.0 / 1024) / (dt / 1000.0); System.out.println(dt + " ms"); System.out.println(totalBytes + " bytes"); System.out.println(mbPerSec + " mb/sec"); } private static byte[] initData(int size) { Random random = new Random(size); byte[] data = new byte[size]; random.nextBytes(data); return data; } }././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootapache-mime4j-project-0.7.2/benchmark/src/main/java/org/apache/james/mime4j/Base64InputStreamBench.javaapache-mime4j-project-0.7.2/benchmark/src/main/java/org/apache/james/mime4j/Base64InputStreamBench.j0000644000000000000000000000771711702050540031511 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Random; import org.apache.commons.io.output.NullOutputStream; import org.apache.james.mime4j.codec.Base64InputStream; import org.apache.james.mime4j.codec.CodecUtil; public class Base64InputStreamBench { public static void main(String[] args) throws Exception { byte[] data = initData(2 * 1024 * 1024); byte[] encoded = encode(data); // decoder test to make sure everything is okay testDecode(data, encoded); // warmup OutputStream nullOut = new NullOutputStream(); for (int i = 0; i < 5; i++) { ByteArrayInputStream ed = new ByteArrayInputStream(encoded); InputStream in = new Base64InputStream(ed); CodecUtil.copy(in, nullOut); } Thread.sleep(100); // test long t0 = System.currentTimeMillis(); final int repetitions = 50; for (int i = 0; i < repetitions; i++) { ByteArrayInputStream ed = new ByteArrayInputStream(encoded); InputStream in = new Base64InputStream(ed); CodecUtil.copy(in, nullOut); } long dt = System.currentTimeMillis() - t0; long totalBytes = data.length * (long) repetitions; double mbPerSec = (totalBytes / 1024.0 / 1024) / (dt / 1000.0); System.out.println(dt + " ms"); System.out.println(totalBytes + " bytes"); System.out.println(mbPerSec + " mb/sec"); } private static byte[] initData(int size) { Random random = new Random(size); byte[] data = new byte[size]; random.nextBytes(data); return data; } private static byte[] encode(byte[] data) throws IOException { InputStream in = new ByteArrayInputStream(data); ByteArrayOutputStream out = new ByteArrayOutputStream(); CodecUtil.encodeBase64(in, out); return out.toByteArray(); } private static void testDecode(byte[] data, final byte[] encoded) throws IOException { ByteArrayInputStream ed = new ByteArrayInputStream(encoded); InputStream in = new Base64InputStream(ed); ByteArrayOutputStream out = new ByteArrayOutputStream(); CodecUtil.copy(in, out); compare(data, out.toByteArray()); } private static void compare(byte[] expected, byte[] actual) { if (expected.length != actual.length) throw new AssertionError("length: " + expected.length + ", " + actual.length); for (int i = 0; i < expected.length; i++) if (expected[i] != actual[i]) throw new AssertionError("value @ " + i); } }././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootapache-mime4j-project-0.7.2/benchmark/src/main/java/org/apache/james/mime4j/LongMultipartReadBench.javaapache-mime4j-project-0.7.2/benchmark/src/main/java/org/apache/james/mime4j/LongMultipartReadBench.j0000644000000000000000000001667111702050540031665 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import org.apache.james.mime4j.codec.CodecUtil; import org.apache.james.mime4j.dom.Header; import org.apache.james.mime4j.dom.MessageBuilder; import org.apache.james.mime4j.message.DefaultMessageBuilder; import org.apache.james.mime4j.message.SimpleContentHandler; import org.apache.james.mime4j.parser.AbstractContentHandler; import org.apache.james.mime4j.parser.ContentHandler; import org.apache.james.mime4j.parser.MimeStreamParser; import org.apache.james.mime4j.storage.DefaultStorageProvider; import org.apache.james.mime4j.storage.MemoryStorageProvider; import org.apache.james.mime4j.stream.BodyDescriptor; import org.apache.james.mime4j.stream.EntityState; import org.apache.james.mime4j.stream.MimeTokenStream; public class LongMultipartReadBench { public static void main(String[] args) throws Exception { byte[] content = loadMessage("long-multipart.msg"); if (content == null) { System.err.println("Test message not found"); return; } int testNumber = args.length > 0 ? Integer.parseInt(args[0]) : 0; Test test = createTest(testNumber); if (test == null) { System.err.println("No such test: " + testNumber); return; } int repetitions = args.length > 1 ? Integer.parseInt(args[1]) : 25000; System.out.println("Multipart message read."); System.out.println("No of repetitions: " + repetitions); System.out.println("Content length: " + content.length); System.out.println("Test: " + test.getClass().getSimpleName()); System.out.print("Warmup... "); long t0 = System.currentTimeMillis(); while (System.currentTimeMillis() - t0 < 1500) { test.run(content, 10); } System.out.println("done"); System.out.println("--------------------------------"); long start = System.currentTimeMillis(); test.run(content, repetitions); long finish = System.currentTimeMillis(); double seconds = (finish - start) / 1000.0; double mb = content.length * repetitions / 1024.0 / 1024; System.out.printf("Execution time: %f sec\n", seconds); System.out.printf("%.2f messages/sec\n", repetitions / seconds); System.out.printf("%.2f mb/sec\n", mb / seconds); } private static Test createTest(int testNumber) { switch (testNumber) { case 0: return new MimeTokenStreamTest(); case 1: return new AbstractContentHandlerTest(); case 2: return new SimpleContentHandlerTest(); case 3: return new MessageTest(); default: return null; } } private static byte[] loadMessage(String resourceName) throws IOException { ClassLoader cl = LongMultipartReadBench.class.getClassLoader(); ByteArrayOutputStream outstream = new ByteArrayOutputStream(); InputStream instream = cl.getResourceAsStream(resourceName); if (instream == null) { return null; } try { CodecUtil.copy(instream, outstream); } finally { instream.close(); } return outstream.toByteArray(); } private interface Test { void run(byte[] content, int repetitions) throws Exception; } private static final class MimeTokenStreamTest implements Test { public void run(byte[] content, int repetitions) throws Exception { MimeTokenStream stream = new MimeTokenStream(); for (int i = 0; i < repetitions; i++) { stream.parse(new ByteArrayInputStream(content)); for (EntityState state = stream.getState(); state != EntityState.T_END_OF_STREAM; state = stream .next()) { } } } } private static final class AbstractContentHandlerTest implements Test { public void run(byte[] content, int repetitions) throws Exception { ContentHandler contentHandler = new AbstractContentHandler() { }; for (int i = 0; i < repetitions; i++) { MimeStreamParser parser = new MimeStreamParser(); parser.setContentHandler(contentHandler); parser.parse(new ByteArrayInputStream(content)); } } } private static final class SimpleContentHandlerTest implements Test { public void run(byte[] content, int repetitions) throws Exception { ContentHandler contentHandler = new SimpleContentHandler() { @Override public void body(BodyDescriptor bd, InputStream is) throws IOException { byte[] b = new byte[4096]; while (is.read(b) != -1); } @Override public void headers(Header header) { } }; for (int i = 0; i < repetitions; i++) { MimeStreamParser parser = new MimeStreamParser(); parser.setContentDecoding(true); parser.setContentHandler(contentHandler); parser.parse(new ByteArrayInputStream(content)); } } } private static final class MessageTest implements Test { public void run(byte[] content, int repetitions) throws Exception { DefaultStorageProvider.setInstance(new MemoryStorageProvider()); MessageBuilder builder = new DefaultMessageBuilder(); for (int i = 0; i < repetitions; i++) { builder.parseMessage(new ByteArrayInputStream(content)); } } } /* // requires mail.jar and activation.jar to be present private static final class MimeMessageTest implements Test { public void run(byte[] content, int repetitions) throws Exception { for (int i = 0; i < repetitions; i++) { MimeMessage mm = new MimeMessage(null, new ByteArrayInputStream(content)); Multipart multipart = (Multipart) mm.getContent(); multipart.getCount(); // force parsing } } } */ } ././@LongLink0000000000000000000000000000016100000000000011563 Lustar rootrootapache-mime4j-project-0.7.2/benchmark/src/main/java/org/apache/james/mime4j/QuotedPrintableInputStreamBench.javaapache-mime4j-project-0.7.2/benchmark/src/main/java/org/apache/james/mime4j/QuotedPrintableInputStre0000644000000000000000000001001311702050540032040 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Random; import org.apache.commons.io.output.NullOutputStream; import org.apache.james.mime4j.codec.CodecUtil; import org.apache.james.mime4j.codec.QuotedPrintableInputStream; public class QuotedPrintableInputStreamBench { public static void main(String[] args) throws Exception { byte[] data = initData(2 * 1024 * 1024); byte[] encoded = encode(data); // decoder test to make sure everything is okay testDecode(data, encoded); // warmup OutputStream nullOut = new NullOutputStream(); for (int i = 0; i < 5; i++) { ByteArrayInputStream ed = new ByteArrayInputStream(encoded); InputStream in = new QuotedPrintableInputStream(ed); CodecUtil.copy(in, nullOut); } Thread.sleep(100); // test long t0 = System.currentTimeMillis(); final int repetitions = 50; for (int i = 0; i < repetitions; i++) { ByteArrayInputStream ed = new ByteArrayInputStream(encoded); InputStream in = new QuotedPrintableInputStream(ed); CodecUtil.copy(in, nullOut); } long dt = System.currentTimeMillis() - t0; long totalBytes = data.length * (long) repetitions; double mbPerSec = (totalBytes / 1024.0 / 1024) / (dt / 1000.0); System.out.println(dt + " ms"); System.out.println(totalBytes + " bytes"); System.out.println(mbPerSec + " mb/sec"); } private static byte[] initData(int size) { Random random = new Random(size); byte[] data = new byte[size]; random.nextBytes(data); return data; } private static byte[] encode(byte[] data) throws IOException { InputStream in = new ByteArrayInputStream(data); ByteArrayOutputStream out = new ByteArrayOutputStream(); CodecUtil.encodeQuotedPrintableBinary(in, out); return out.toByteArray(); } private static void testDecode(byte[] data, final byte[] encoded) throws IOException { ByteArrayInputStream ed = new ByteArrayInputStream(encoded); InputStream in = new QuotedPrintableInputStream(ed); ByteArrayOutputStream out = new ByteArrayOutputStream(); CodecUtil.copy(in, out); compare(data, out.toByteArray()); } private static void compare(byte[] expected, byte[] actual) { if (expected.length != actual.length) throw new AssertionError("length: " + expected.length + ", " + actual.length); for (int i = 0; i < expected.length; i++) if (expected[i] != actual[i]) throw new AssertionError("value @ " + i); } }apache-mime4j-project-0.7.2/benchmark/src/main/resources/0000755000000000000000000000000011702050540021737 5ustar rootrootapache-mime4j-project-0.7.2/benchmark/src/main/resources/long-multipart.msg0000644000000000000000000014776411702050540025450 0ustar rootrootDate: Fri, 27 Apr 2007 16:08:23 +0200 From: Foo Bar MIME-Version: 1.0 To: foo@example.com Subject: This is a rather long multipart message. Content-Type: multipart/mixed; boundary="------------090404080405080108000909" This is a multi-part message in MIME format. --------------090404080405080108000909 Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: 7bit 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111 --------------090404080405080108000909 Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: 7bit 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222222 --------------090404080405080108000909 Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: 7bit 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 3333333333333333333333333333333333333333333333333333333333333333333333333333333 --------------090404080405080108000909 Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: 7bit 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 4444444444444444444444444444444444444444444444444444444444444444444444444444444 --------------090404080405080108000909 Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: 7bit 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 5555555555555555555555555555555555555555555555555555555555555555555555555555555 --------------090404080405080108000909-- apache-mime4j-project-0.7.2/benchmark/src/reporting-site/0000755000000000000000000000000011702050540021754 5ustar rootrootapache-mime4j-project-0.7.2/benchmark/src/reporting-site/site.xml0000644000000000000000000000175611702050540023453 0ustar rootroot apache-mime4j-project-0.7.2/benchmark/pom.xml0000644000000000000000000000436211702050540017534 0ustar rootroot 4.0.0 apache-mime4j-project org.apache.james 0.7.2 ../pom.xml apache-mime4j-benchmark Apache JAMES Mime4j (Benchmarks) Benchmarks for MIME4J stream based MIME message parser org.apache.james apache-mime4j-dom ${project.version} org.apache.james apache-mime4j-storage ${project.version} commons-logging commons-logging commons-io commons-io false compile apache-mime4j-project-0.7.2/RELEASE_NOTES.txt0000644000000000000000000002062211702050542017055 0ustar rootrootRelease 0.7.2 ------------------- Mime4J is a flexible MIME parsing library written in Java. SAX, DOM and pull parsing styles are supported. The 0.7.2 release fixes several non-critical bugs found since release 0.7.1. Release 0.7.1 ------------------- Mime4J is a flexible MIME parsing library written in Java. SAX, DOM and pull parsing styles are supported. The 0.7.1 release fixes several non-critical bugs found since release 0.7. Release 0.7 ------------------- Mime4J is a flexible MIME parsing library written in Java. SAX, DOM and pull parsing styles are supported. The 0.7 release brings another round of API enhancements, bug fixes and performance optimizations. A major effort has been put in code reorganization, separating parsing code from DOM manipulation code. Mime4J has been restructured into three separate modules: 'core', 'dom' and 'storage'. The 'core' package provides an event-driven SAX style parser that relies on a callback mechanism to report parsing events such as the start of an entity header the start of a body, etc. The 'dom' package contains base/abstract classes and interfaces for MIME-DOM manipulation aiming to provide the base for a full featured traversable DOM. Per default the Mime4J DOM builder stores content of individual body parts in memory. The 'storage' package provides support for more complex storage backends such on-disk storage systems, overflow on max limit, or encrypted storage through JSSE API. Mime4J 0.7 improves support for headless messages, malformed separation between headers and body and adds support for "obsolete" rfc822 syntax (e.g: "Header: " style). Parsing performance for quoted printable streams have been considerably improved. A "DecodeMonitor" object has been introduced in most code to define how to deal with malformed input (Lenient vs Strict behaviours). Mime4J 0.7 also provides LenientFieldParser as an alternative to DefaultFieldParser when a higher degree of tolerance to non-severe MIME field format violations is desired. Upgrade Notes ------------- * The default field parsing logic has been moved from AbstractField to DefaultFieldParser. * Low level MIME stream classes have been moved from org.apache.james.mime4j.parser to org.apache.james.mime4j.stream package (Field, RawField, MimeTokenStream, ...) * "dom" classes/interfaces have been moved from the .message and .field package to the .dom package tree. * The method decodeBaseQuotedPrintable() of class o.a.j.mime4j.codec.DecoderUtil has been renamed in decodeQuotedPrintable(). * Preamble and Epilogue are now correctly handled as optionals and the parser invoke their tokens/events only when they are present in the message. So if your code rely on that events being always called make sure to fix it. * preamble and epilogue Strings in Multipart DOM object are now nullable: an empty preamble is different from no preamble, so we had to update the dom contract to support this difference. Make sure to add null checks if code using multipart.getPreamble and multipart.getEpilogue. * the first event for headless parsing in MimeTokenStream is not the first BODY event. You should not expect T_START_HEADER/T_END_HEADER any more. Please also note that as of this release Mime4j requires a Java 1.5 compatible runtime. Release 0.6 ------------------- Mime4J is a flexible MIME parsing library written in Java. SAX, DOM and pull parsing styles are supported. The 0.6 release brings another round of API enhancements and performance optimizations. There has been a number of notable improvements in the DOM support. MIME stream parser is expected to be 50% faster when line counting is disabled. Please also note that as of this release Mime4j requires a Java 1.5 compatible runtime. Notes ----- * Mime4j API is still considered unstable and is likely to change in future releases * The DOM API has been now been comprehensively refactored and the known limitations addressed. Please report any remaining issues to https://issues.apache.org/jira/browse/MIME4J. * Some low level functions are available only in the pull parser (recommended for advanced users) * 0.6 contains a mixture of approaches to the parsing of advanced MIME field types. Limitations are known with these approaches with some relatively uncommon use cases. A consistent and comprehensive rewrite is planned for 0.7 which should consolidate and address these. * The former interfaces TextBody and BinaryBody have been changed into abstract subclasses of class SingleBody. Code that implements these interfaces has to be changed accordingly. [https://issues.apache.org/jira/browse/MIME4J-111] * A dedicated class for writing a message has been introduced. Class MessageWriter has now to be used instead of Body.writeTo(OutputStream, int). A short-cut method Message.writeTo(OutputStream) without a mode parameter is also available. [https://issues.apache.org/jira/browse/MIME4J-110] * Class NamedMailbox has been removed. Class Mailbox now has an additional name property. [https://issues.apache.org/jira/browse/MIME4J-107] * Class MessageUtils has been removed. The methods and constants can now be found in class CharsetUtil in the same package. [https://issues.apache.org/jira/browse/MIME4J-106] * Package org.apache.james.mime4j.decoder has been renamed in org.apache.james.mime4j.codec. [https://issues.apache.org/jira/browse/MIME4J-105] * Class AbstractBody has been superseded by SingleBody. AbstractBody has been removed. * BodyFactory introduced allowing more flexible storage for Message parts. TempFileTextBody and TempFileBinaryBody removed. [https://issues.apache.org/jira/browse/MIME4J-87] * Mime4j now has a more flexible mechanism for storing message bodies. Class TempStorage has been superseded by StorageProvider in package org.apache.james.mime4j.storage. The classes TempStorage, TempPath, TempFile and SimpleTempStorage have been removed. [https://issues.apache.org/jira/browse/MIME4J-83] * Temporary text body storage for Message parts now defaults to US-ASCII (was ISO-8859-1) Detailed change log can be found here: http://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12310521&styleName=Html&version=12313434 Release 0.5 ------------------- Mime4J is a flexible MIME parsing library written in Java. SAX, DOM and pull parsing styles are supported. The 0.5 release addresses a number of important issues discovered since 0.4. In particular, it improves Mime4j ability to deal with malformed data streams including those intentionally crafted to cause excessive CPU and memory utilization that can lead to DoS conditions. This release also fixes a serious bug that can prevent Mime4j from correctly processing binary content. Detailed change log can be found here: https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12310521&styleName=Html&version=12313178 Notes ----- * Mime4j API is still considered unstable and is likely to change in future releases * DOM support has known limitations and some roundtrip issues remain to be resolved * Some low level functions are available only in the pull parser (recommended for advanced users) Release 0.4 ------------------- Mime4J is a flexible MIME parsing library written in Java. SAX, DOM and pull parsing styles are supported. The 0.4 release brings a number of significant improvements in terms of supported capabilities, flexibility and performance: * Revised and improved public API with support for pull parsing * Support for parsing of 'headless' messages transmitted using non SMTP transports such as HTTP * Reduced external dependencies. Mime4j is no longer directly dependent on log4j and commons-io * Improved parsing performance (up to 10x for large messages) * More comprehensive header parsing including support for RFC1864, RFC2045, RFC2183, RFC2557 and RFC3066 * Revised packaging and exception hierarchy. MimeException now extends IOException. Detailed change log can be found here: http://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12310521&styleName=Html&version=12312483 Notes ----- * 0.4 contains numerous API improvements and is not binary compatible with 0.3 * Mime4j API is still considered unstable and is likely to change in future releases * DOM support has known limitations and some roundtrip issues remain to be resolved * Some low level functions are available only in the pull parser (recommended for advanced users) apache-mime4j-project-0.7.2/BUILDING.txt0000644000000000000000000000056311702050542016224 0ustar rootrootBuilding Apache Mime4j ====================== Requisites ---------- * Build with Maven 3 (http://maven.apache.org) * Compile with JDK 1.5 or above Quickstart ---------- * To execute tests mvn test * To build and package (into target directory) mvn package * To generate documentation mvn javadoc:javadoc * To build web site mvn site apache-mime4j-project-0.7.2/NOTICE0000644000000000000000000000117511702050542015172 0ustar rootroot ========================================================================= == NOTICE file for use with the Apache License, Version 2.0, == ========================================================================= Apache JAMES Mime4j Copyright 2004-2010 The Apache Software Foundation This product includes software developed at The Apache Software Foundation (http://www.apache.org/). This product test suite includes data (mimetools-testmsgs folder) developed by Eryq and ZeeGee Software Inc as part of the "MIME-tools" Perl5 toolkit and licensed under the Artistic License apache-mime4j-project-0.7.2/.gitignore0000644000000000000000000000006711702050542016255 0ustar rootroot.classpath .project .settings target maven-eclipse.xml apache-mime4j-project-0.7.2/examples/0000755000000000000000000000000011702050542016100 5ustar rootrootapache-mime4j-project-0.7.2/examples/src/0000755000000000000000000000000011702050542016667 5ustar rootrootapache-mime4j-project-0.7.2/examples/src/main/0000755000000000000000000000000011702050540017611 5ustar rootrootapache-mime4j-project-0.7.2/examples/src/main/java/0000755000000000000000000000000011702050540020532 5ustar rootrootapache-mime4j-project-0.7.2/examples/src/main/java/org/0000755000000000000000000000000011702050540021321 5ustar rootrootapache-mime4j-project-0.7.2/examples/src/main/java/org/apache/0000755000000000000000000000000011702050540022542 5ustar rootrootapache-mime4j-project-0.7.2/examples/src/main/java/org/apache/james/0000755000000000000000000000000011702050540023641 5ustar rootrootapache-mime4j-project-0.7.2/examples/src/main/java/org/apache/james/mime4j/0000755000000000000000000000000011702050540025026 5ustar rootrootapache-mime4j-project-0.7.2/examples/src/main/java/org/apache/james/mime4j/samples/0000755000000000000000000000000011702050542026474 5ustar rootrootapache-mime4j-project-0.7.2/examples/src/main/java/org/apache/james/mime4j/samples/tree/0000755000000000000000000000000011702050542027433 5ustar rootroot././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootapache-mime4j-project-0.7.2/examples/src/main/java/org/apache/james/mime4j/samples/tree/MessageTree.javaapache-mime4j-project-0.7.2/examples/src/main/java/org/apache/james/mime4j/samples/tree/MessageTree.0000644000000000000000000003275311702050542031652 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.samples.tree; import java.awt.Dimension; import java.awt.GridLayout; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.Reader; import java.util.Date; import java.util.Map; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTextArea; import javax.swing.JTree; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreeSelectionModel; import org.apache.james.mime4j.MimeException; import org.apache.james.mime4j.dom.BinaryBody; import org.apache.james.mime4j.dom.Body; import org.apache.james.mime4j.dom.Entity; import org.apache.james.mime4j.dom.Header; import org.apache.james.mime4j.dom.Message; import org.apache.james.mime4j.dom.MessageBuilder; import org.apache.james.mime4j.dom.Multipart; import org.apache.james.mime4j.dom.TextBody; import org.apache.james.mime4j.dom.address.Mailbox; import org.apache.james.mime4j.dom.address.MailboxList; import org.apache.james.mime4j.dom.field.AddressListField; import org.apache.james.mime4j.dom.field.ContentTypeField; import org.apache.james.mime4j.dom.field.DateTimeField; import org.apache.james.mime4j.dom.field.UnstructuredField; import org.apache.james.mime4j.field.address.AddressFormatter; import org.apache.james.mime4j.message.BodyPart; import org.apache.james.mime4j.message.MessageImpl; import org.apache.james.mime4j.message.DefaultMessageBuilder; import org.apache.james.mime4j.stream.Field; /** * Displays a parsed Message in a window. The window will be divided into * two panels. The left panel displays the Message tree. Clicking on a * node in the tree shows information on that node in the right panel. * * Some of this code have been copied from the Java tutorial's JTree section. */ public class MessageTree extends JPanel implements TreeSelectionListener { private static final long serialVersionUID = 1L; private JPanel contentPane; private JTextArea textView; private JTree tree; /** * Wraps an Object and associates it with a text. All message parts * (headers, bodies, multiparts, body parts) will be wrapped in * ObjectWrapper instances before they are added to the JTree instance. */ public static class ObjectWrapper { private String text = ""; private Object object = null; public ObjectWrapper(String text, Object object) { this.text = text; this.object = object; } @Override public String toString() { return text; } public Object getObject() { return object; } } /** * Creates a new MessageTree instance displaying the * specified Message. * * @param message the message to display. */ public MessageTree(Message message) { super(new GridLayout(1,0)); DefaultMutableTreeNode root = createNode(message); tree = new JTree(root); tree.getSelectionModel().setSelectionMode( TreeSelectionModel.SINGLE_TREE_SELECTION); tree.addTreeSelectionListener(this); JScrollPane treeView = new JScrollPane(tree); contentPane = new JPanel(new GridLayout(1,0)); JScrollPane contentView = new JScrollPane(contentPane); JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); splitPane.setLeftComponent(treeView); splitPane.setRightComponent(contentView); Dimension minimumSize = new Dimension(100, 50); contentView.setMinimumSize(minimumSize); treeView.setMinimumSize(minimumSize); splitPane.setDividerLocation(250); splitPane.setPreferredSize(new Dimension(750, 500)); add(splitPane); textView = new JTextArea(); textView.setEditable(false); textView.setLineWrap(true); contentPane.add(textView); } /** * Create a node given a Multipart body. * Add the Preamble, all Body parts and the Epilogue to the node. * * @param multipart the Multipart. * @return the root node of the tree. */ private DefaultMutableTreeNode createNode(Header header) { DefaultMutableTreeNode node = new DefaultMutableTreeNode( new ObjectWrapper("Header", header)); for (Field field : header.getFields()) { String name = field.getName(); node.add(new DefaultMutableTreeNode(new ObjectWrapper(name, field))); } return node; } /** * Create a node given a Multipart body. * Add the Preamble, all Body parts and the Epilogue to the node. * * @param multipart the Multipart. * @return the root node of the tree. */ private DefaultMutableTreeNode createNode(Multipart multipart) { DefaultMutableTreeNode node = new DefaultMutableTreeNode( new ObjectWrapper("Multipart", multipart)); node.add(new DefaultMutableTreeNode( new ObjectWrapper("Preamble", multipart.getPreamble()))); for (Entity part : multipart.getBodyParts()) { node.add(createNode(part)); } node.add(new DefaultMutableTreeNode( new ObjectWrapper("Epilogue", multipart.getEpilogue()))); return node; } /** * Creates the tree nodes given a MIME entity (either a Message or * a BodyPart). * * @param entity the entity. * @return the root node of the tree displaying the specified entity and * its children. */ private DefaultMutableTreeNode createNode(Entity entity) { /* * Create the root node for the entity. It's either a * Message or a Body part. */ String type = "Message"; if (entity instanceof BodyPart) { type = "Body part"; } DefaultMutableTreeNode node = new DefaultMutableTreeNode( new ObjectWrapper(type, entity)); /* * Add the node encapsulating the entity Header. */ node.add(createNode(entity.getHeader())); Body body = entity.getBody(); if (body instanceof Multipart) { /* * The body of the entity is a Multipart. */ node.add(createNode((Multipart) body)); } else if (body instanceof MessageImpl) { /* * The body is another Message. */ node.add(createNode((MessageImpl) body)); } else { /* * Discrete Body (either of type TextBody or BinaryBody). */ type = "Text body"; if (body instanceof BinaryBody) { type = "Binary body"; } type += " (" + entity.getMimeType() + ")"; node.add(new DefaultMutableTreeNode(new ObjectWrapper(type, body))); } return node; } /** * Called whenever the selection changes in the JTree instance showing * the Message nodes. * * @param e the event. */ public void valueChanged(TreeSelectionEvent e) { DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent(); textView.setText(""); if (node == null) { return; } Object o = ((ObjectWrapper) node.getUserObject()).getObject(); if (node.isLeaf()) { if (o instanceof TextBody){ /* * A text body. Display its contents. */ TextBody body = (TextBody) o; StringBuilder sb = new StringBuilder(); try { Reader r = body.getReader(); int c; while ((c = r.read()) != -1) { sb.append((char) c); } } catch (IOException ex) { ex.printStackTrace(); } textView.setText(sb.toString()); } else if (o instanceof BinaryBody){ /* * A binary body. Display its MIME type and length in bytes. */ BinaryBody body = (BinaryBody) o; int size = 0; try { InputStream is = body.getInputStream(); while ((is.read()) != -1) { size++; } } catch (IOException ex) { ex.printStackTrace(); } textView.setText("Binary body\n" + "MIME type: " + body.getParent().getMimeType() + "\n" + "Size of decoded data: " + size + " bytes"); } else if (o instanceof ContentTypeField) { /* * Content-Type field. */ ContentTypeField field = (ContentTypeField) o; StringBuilder sb = new StringBuilder(); sb.append("MIME type: " + field.getMimeType() + "\n"); for (Map.Entry entry : field.getParameters().entrySet()) { sb.append(entry.getKey() + " = " + entry.getValue() + "\n"); } textView.setText(sb.toString()); } else if (o instanceof AddressListField) { /* * An address field (From, To, Cc, etc) */ AddressListField field = (AddressListField) o; MailboxList list = field.getAddressList().flatten(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < list.size(); i++) { Mailbox mb = list.get(i); sb.append(AddressFormatter.DEFAULT.format(mb, false) + "\n"); } textView.setText(sb.toString()); } else if (o instanceof DateTimeField) { Date date = ((DateTimeField) o).getDate(); textView.setText(date.toString()); } else if (o instanceof UnstructuredField){ textView.setText(((UnstructuredField) o).getValue()); } else if (o instanceof Field){ textView.setText(((Field) o).getBody()); } else { /* * The Object should be a Header or a String containing a * Preamble or Epilogue. */ textView.setText(o.toString()); } } } /** * Creates and displays the gui. * * @param message the Message to display in the tree. */ private static void createAndShowGUI(Message message) { /* * Create and set up the window. */ JFrame frame = new JFrame("MessageTree"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); /* * Create and set up the content pane. */ MessageTree newContentPane = new MessageTree(message); newContentPane.setOpaque(true); frame.setContentPane(newContentPane); /* * Display the window. */ frame.pack(); frame.setVisible(true); } public static void main(String[] args) { try { final MessageBuilder builder = new DefaultMessageBuilder(); final Message message = builder.parseMessage(new FileInputStream(args[0])); javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(message); } }); } catch (ArrayIndexOutOfBoundsException e) { System.err.println("Wrong number of arguments."); System.err.println("Usage: org.mime4j.samples.tree.MessageTree" + " path/to/message"); } catch (FileNotFoundException e) { System.err.println("The file '" + args[0] + "' could not be found."); } catch (IOException e) { System.err.println("The file '" + args[0] + "' could not be read."); } catch (MimeException e) { System.err.println("The file '" + args[0] + "' is invalid."); } } } apache-mime4j-project-0.7.2/examples/src/main/java/org/apache/james/mime4j/samples/transform/0000755000000000000000000000000011702050542030507 5ustar rootroot././@LongLink0000000000000000000000000000016300000000000011565 Lustar rootrootapache-mime4j-project-0.7.2/examples/src/main/java/org/apache/james/mime4j/samples/transform/TransformMessage.javaapache-mime4j-project-0.7.2/examples/src/main/java/org/apache/james/mime4j/samples/transform/Transfo0000644000000000000000000001650411702050542032054 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.samples.transform; import java.io.ByteArrayInputStream; import java.io.IOException; import java.util.Date; import java.util.Random; import org.apache.james.mime4j.dom.Body; import org.apache.james.mime4j.dom.Entity; import org.apache.james.mime4j.dom.Message; import org.apache.james.mime4j.dom.MessageBuilder; import org.apache.james.mime4j.dom.MessageWriter; import org.apache.james.mime4j.dom.Multipart; import org.apache.james.mime4j.dom.TextBody; import org.apache.james.mime4j.dom.field.ParseException; import org.apache.james.mime4j.field.address.AddressBuilder; import org.apache.james.mime4j.message.BodyPart; import org.apache.james.mime4j.message.MessageImpl; import org.apache.james.mime4j.message.DefaultMessageBuilder; import org.apache.james.mime4j.message.DefaultMessageWriter; import org.apache.james.mime4j.message.MultipartImpl; import org.apache.james.mime4j.storage.DefaultStorageProvider; import org.apache.james.mime4j.storage.StorageBodyFactory; import org.apache.james.mime4j.storage.StorageProvider; import org.apache.james.mime4j.storage.TempFileStorageProvider; /** * This code should illustrate how to transform a message into another message * without modifying the original. */ public class TransformMessage { // Host name used in message identifiers. private static final String HOSTNAME = "localhost"; public static void main(String[] args) throws Exception { // Explicitly set a strategy for storing body parts. Usually not // necessary; for most applications the default setting is appropriate. StorageProvider storageProvider = new TempFileStorageProvider(); DefaultStorageProvider.setInstance(storageProvider); // Create a template message. It would be possible to load a message // from an input stream but for this example a message object is created // from scratch for demonstration purposes. Message template = createTemplate(); // Create a new message by transforming the template. Message transformed = transform(template); MessageWriter writer = new DefaultMessageWriter(); // Print transformed message. System.out.println("\n\nTransformed message:\n--------------------\n"); writer.writeMessage(transformed, System.out); // Messages should be disposed of when they are no longer needed. // Disposing of a message also disposes of all child elements (e.g. body // parts) of the message. transformed.dispose(); // Print original message to illustrate that it was not affected by the // transformation. System.out.println("\n\nOriginal template:\n------------------\n"); writer.writeMessage(template, System.out); // Original message is no longer needed. template.dispose(); // At this point all temporary files have been deleted because all // messages and body parts have been disposed of properly. } /** * Copies the given message and makes some arbitrary changes to the copy. * @throws ParseException on bad arguments */ private static Message transform(Message original) throws IOException, ParseException { // Create a copy of the template. The copy can be modified without // affecting the original. MessageBuilder builder = new DefaultMessageBuilder(); Message message = builder.newMessage(original); // In this example we know we have a multipart message. Use // Message#isMultipart() if uncertain. Multipart multipart = (Multipart) message.getBody(); // Insert a new text/plain body part after every body part of the // template. final int count = multipart.getCount(); for (int i = 0; i < count; i++) { String text = "Text inserted after part " + (i + 1); BodyPart bodyPart = createTextPart(text); multipart.addBodyPart(bodyPart, 2 * i + 1); } // For no particular reason remove the second binary body part (now // at index four). Entity removed = multipart.removeBodyPart(4); // The removed body part no longer has a parent entity it belongs to so // it should be disposed of. removed.dispose(); // Set some headers on the transformed message message.createMessageId(HOSTNAME); message.setSubject("Transformed message"); message.setDate(new Date()); message.setFrom(AddressBuilder.DEFAULT.parseMailbox("John Doe ")); return message; } /** * Creates a multipart/mixed message that consists of three parts (one text, * two binary). */ private static Message createTemplate() throws IOException { Multipart multipart = new MultipartImpl("mixed"); BodyPart part1 = createTextPart("This is the first part of the template.."); multipart.addBodyPart(part1); BodyPart part2 = createRandomBinaryPart(200); multipart.addBodyPart(part2); BodyPart part3 = createRandomBinaryPart(300); multipart.addBodyPart(part3); MessageImpl message = new MessageImpl(); message.setMultipart(multipart); message.setSubject("Template message"); return message; } /** * Creates a text part from the specified string. */ private static BodyPart createTextPart(String text) { TextBody body = new StorageBodyFactory().textBody(text, "UTF-8"); BodyPart bodyPart = new BodyPart(); bodyPart.setText(body); bodyPart.setContentTransferEncoding("quoted-printable"); return bodyPart; } /** * Creates a binary part with random content. */ private static BodyPart createRandomBinaryPart(int numberOfBytes) throws IOException { byte[] data = new byte[numberOfBytes]; new Random().nextBytes(data); Body body = new StorageBodyFactory() .binaryBody(new ByteArrayInputStream(data)); BodyPart bodyPart = new BodyPart(); bodyPart.setBody(body, "application/octet-stream"); bodyPart.setContentTransferEncoding("base64"); return bodyPart; } } apache-mime4j-project-0.7.2/examples/src/main/java/org/apache/james/mime4j/samples/dom/0000755000000000000000000000000011702050542027253 5ustar rootroot././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/examples/src/main/java/org/apache/james/mime4j/samples/dom/TextPlainMessage.javaapache-mime4j-project-0.7.2/examples/src/main/java/org/apache/james/mime4j/samples/dom/TextPlainMess0000644000000000000000000000575311702050542031750 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.samples.dom; import java.io.IOException; import java.util.Date; import org.apache.james.mime4j.dom.MessageWriter; import org.apache.james.mime4j.dom.TextBody; import org.apache.james.mime4j.field.address.AddressBuilder; import org.apache.james.mime4j.field.address.ParseException; import org.apache.james.mime4j.message.MessageImpl; import org.apache.james.mime4j.message.DefaultMessageWriter; import org.apache.james.mime4j.storage.StorageBodyFactory; /** * This example generates a message very similar to the one from RFC 5322 * Appendix A.1.1. */ public class TextPlainMessage { public static void main(String[] args) throws IOException, ParseException { // 1) start with an empty message MessageImpl message = new MessageImpl(); // 2) set header fields // Date and From are required fields message.setDate(new Date()); message.setFrom(AddressBuilder.DEFAULT.parseMailbox("John Doe ")); // Message-ID should be present message.createMessageId("machine.example"); // set some optional fields message.setTo(AddressBuilder.DEFAULT.parseMailbox("Mary Smith ")); message.setSubject("Saying Hello"); // 3) set a text body StorageBodyFactory bodyFactory = new StorageBodyFactory(); TextBody body = bodyFactory.textBody("This is a message just to " + "say hello.\r\nSo, \"Hello\"."); // note that setText also sets the Content-Type header field message.setText(body); // 4) print message to standard output MessageWriter writer = new DefaultMessageWriter(); writer.writeMessage(message, System.out); // 5) message is no longer needed and should be disposed of message.dispose(); } } ././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/examples/src/main/java/org/apache/james/mime4j/samples/dom/MultipartMessage.javaapache-mime4j-project-0.7.2/examples/src/main/java/org/apache/james/mime4j/samples/dom/MultipartMess0000644000000000000000000001623511702050542032016 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.samples.dom; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Date; import javax.imageio.ImageIO; import org.apache.james.mime4j.dom.BinaryBody; import org.apache.james.mime4j.dom.MessageWriter; import org.apache.james.mime4j.dom.Multipart; import org.apache.james.mime4j.dom.TextBody; import org.apache.james.mime4j.field.address.AddressBuilder; import org.apache.james.mime4j.message.BodyPart; import org.apache.james.mime4j.message.MessageImpl; import org.apache.james.mime4j.message.DefaultMessageWriter; import org.apache.james.mime4j.message.MultipartImpl; import org.apache.james.mime4j.storage.Storage; import org.apache.james.mime4j.storage.StorageBodyFactory; import org.apache.james.mime4j.storage.StorageOutputStream; import org.apache.james.mime4j.storage.StorageProvider; /** * Creates a multipart/mixed message that consists of a text/plain and an * image/png part. The image is created on the fly; a similar technique can be * used to create PDF or XML attachments, for example. */ public class MultipartMessage { public static void main(String[] args) throws Exception { // 1) start with an empty message MessageImpl message = new MessageImpl(); // 2) set header fields // Date and From are required fields message.setDate(new Date()); message.setFrom(AddressBuilder.DEFAULT.parseMailbox("John Doe ")); // Message-ID should be present message.createMessageId("machine.example"); // set some optional fields message.setTo(AddressBuilder.DEFAULT.parseMailbox("Mary Smith ")); message.setSubject("An image for you"); // 3) set a multipart body Multipart multipart = new MultipartImpl("mixed"); // a multipart may have a preamble multipart.setPreamble("This is a multi-part message in MIME format."); // first part is text/plain StorageBodyFactory bodyFactory = new StorageBodyFactory(); BodyPart textPart = createTextPart(bodyFactory, "Why so serious?"); multipart.addBodyPart(textPart); // second part is image/png (image is created on the fly) BufferedImage image = renderSampleImage(); BodyPart imagePart = createImagePart(bodyFactory, image); multipart.addBodyPart(imagePart); // setMultipart also sets the Content-Type header field message.setMultipart(multipart); // 4) print message to standard output MessageWriter writer = new DefaultMessageWriter(); writer.writeMessage(message, System.out); // 5) message is no longer needed and should be disposed of message.dispose(); } /** * Creates a text part from the specified string. */ private static BodyPart createTextPart(StorageBodyFactory bodyFactory, String text) { // Use UTF-8 to encode the specified text TextBody body = bodyFactory.textBody(text, "UTF-8"); // Create a text/plain body part BodyPart bodyPart = new BodyPart(); bodyPart.setText(body); bodyPart.setContentTransferEncoding("quoted-printable"); return bodyPart; } /** * Creates a binary part from the specified image. */ private static BodyPart createImagePart(StorageBodyFactory bodyFactory, BufferedImage image) throws IOException { // Create a binary message body from the image StorageProvider storageProvider = bodyFactory.getStorageProvider(); Storage storage = storeImage(storageProvider, image, "png"); BinaryBody body = bodyFactory.binaryBody(storage); // Create a body part with the correct MIME-type and transfer encoding BodyPart bodyPart = new BodyPart(); bodyPart.setBody(body, "image/png"); bodyPart.setContentTransferEncoding("base64"); // Specify a filename in the Content-Disposition header (implicitly sets // the disposition type to "attachment") bodyPart.setFilename("smiley.png"); return bodyPart; } /** * Stores the specified image in a Storage object. */ private static Storage storeImage(StorageProvider storageProvider, BufferedImage image, String formatName) throws IOException { // An output stream that is capable of building a Storage object. StorageOutputStream out = storageProvider.createStorageOutputStream(); // Write the image to our output stream. A StorageOutputStream can be // used to create attachments using any API that supports writing a // document to an output stream, e.g. iText's PdfWriter. ImageIO.write(image, formatName, out); // Implicitly closes the output stream and returns the data that has // been written to it. return out.toStorage(); } /** * Draws an image; unrelated to Mime4j. */ private static BufferedImage renderSampleImage() { System.setProperty("java.awt.headless", "true"); final int size = 100; BufferedImage img = new BufferedImage(size, size, BufferedImage.TYPE_BYTE_GRAY); Graphics2D gfx = img.createGraphics(); gfx.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); gfx.setStroke(new BasicStroke(size / 40f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); gfx.setColor(Color.BLACK); gfx.setBackground(Color.WHITE); gfx.clearRect(0, 0, size, size); int b = size / 30; gfx.drawOval(b, b, size - 1 - 2 * b, size - 1 - 2 * b); int esz = size / 7; int ex = (int) (0.27f * size); gfx.drawOval(ex, ex, esz, esz); gfx.drawOval(size - 1 - esz - ex, ex, esz, esz); b = size / 5; gfx.drawArc(b, b, size - 1 - 2 * b, size - 1 - 2 * b, 200, 140); return img; } } ././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootrootapache-mime4j-project-0.7.2/examples/src/main/java/org/apache/james/mime4j/samples/dom/LoggingMonitor.javaapache-mime4j-project-0.7.2/examples/src/main/java/org/apache/james/mime4j/samples/dom/LoggingMonito0000644000000000000000000000350711702050542031757 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.samples.dom; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.james.mime4j.codec.DecodeMonitor; public final class LoggingMonitor extends DecodeMonitor { private static Log log = LogFactory.getLog(LoggingMonitor.class); public static DecodeMonitor MONITOR = new LoggingMonitor(); @Override public boolean warn(String error, String dropDesc) { if (dropDesc != null) { log.warn(error+"; "+dropDesc); } else { log.warn(error); } return false; } public boolean isListening() { return true; } } apache-mime4j-project-0.7.2/examples/src/reporting-site/0000755000000000000000000000000011702050542021642 5ustar rootrootapache-mime4j-project-0.7.2/examples/src/reporting-site/site.xml0000644000000000000000000000175611702050542023341 0ustar rootroot apache-mime4j-project-0.7.2/examples/pom.xml0000644000000000000000000000410611702050542017416 0ustar rootroot 4.0.0 apache-mime4j-project org.apache.james 0.7.2 ../pom.xml apache-mime4j-examples Apache JAMES Mime4j (Code Examples) Examples for Mime4J stream based MIME message parser org.apache.james apache-mime4j-dom ${project.version} org.apache.james apache-mime4j-storage ${project.version} commons-logging commons-logging compile apache-mime4j-project-0.7.2/DEPENDENCIES0000644000000000000000000000042511702050564016040 0ustar rootroot// ------------------------------------------------------------------ // Transitive dependencies of this project determined from the // maven pom organized by organization. // ------------------------------------------------------------------ Apache JAMES Mime4j Project apache-mime4j-project-0.7.2/doap_James_Mime4j.rdf0000644000000000000000000001270111702050542020227 0ustar rootroot Apache James Mime4j Mime4j can be used to parse e-mail message streams in plain rfc822 and MIME format and to build a tree representation of an e-mail message. Mime4j provides a parser for e-mail message streams in plain rfc822 and MIME format. The parser uses a callback mechanism to report parsing events such as the start of an entity header, the start of a body. The parser has been designed to be extremely tolerant against messages violating the standards. Mime4j can also be used to build a tree representation of an e-mail message Java Apache James Mime4j 0.5 2008-10-18 0.5 Apache James Mime4j 0.4 2008-08-20 0.4 Apache James Mime4j 0.3 2007-05-31 0.3 Apache James Mime4j 0.2 2006-01-09 0.2 Standard for ARPA Internet Text Messages IETF RFC 822 Internet Message Format IETF RFC 2822 Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies IETF RFC 2045 Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types IETF RFC 2046 Multipurpose Internet Mail Extensions (MIME) Part Three: Message Header Extensions for Non-ASCII Text IETF RFC 2047 apache-mime4j-project-0.7.2/assemble/0000755000000000000000000000000011702050540016053 5ustar rootrootapache-mime4j-project-0.7.2/assemble/src/0000755000000000000000000000000011702050540016642 5ustar rootrootapache-mime4j-project-0.7.2/assemble/src/reporting-site/0000755000000000000000000000000011702050540021615 5ustar rootrootapache-mime4j-project-0.7.2/assemble/src/reporting-site/site.xml0000644000000000000000000000175611702050540023314 0ustar rootroot apache-mime4j-project-0.7.2/assemble/src/assemble/0000755000000000000000000000000011702050540020435 5ustar rootrootapache-mime4j-project-0.7.2/assemble/src/assemble/bin.xml0000644000000000000000000000537111702050540021735 0ustar rootroot bin zip tar.gz ${project.basedir}/.. / LICENSE NOTICE RELEASE_NOTES.txt README ${project.basedir}/../core/target / apache-mime4j*.jar ${project.basedir}/../dom/target / apache-mime4j*.jar ${project.basedir}/../storage/target / apache-mime4j*.jar ${project.basedir}/../benchmark/target / apache-mime4j*.jar ${project.basedir}/../examples/target / apache-mime4j*.jar /lib/ false runtime apache-mime4j* apache-mime4j-project-0.7.2/assemble/pom.xml0000644000000000000000000001025311702050540017371 0ustar rootroot 4.0.0 apache-mime4j-project org.apache.james 0.7.2 ../pom.xml apache-mime4j pom Apache JAMES Mime4j (Assembly) org.apache.james apache-mime4j-core ${project.version} org.apache.james apache-mime4j-examples ${project.version} org.apache.james apache-mime4j-benchmark ${project.version} commons-logging commons-logging org.apache.maven.plugins maven-assembly-plugin ${basedir}/src/assemble/ gnu make-assembly package attached site-reports org.apache.maven.plugins maven-site-plugin false apache-mime4j-project-0.7.2/dom/0000755000000000000000000000000011702050530015036 5ustar rootrootapache-mime4j-project-0.7.2/dom/src/0000755000000000000000000000000011702050530015625 5ustar rootrootapache-mime4j-project-0.7.2/dom/src/main/0000755000000000000000000000000011702050530016551 5ustar rootrootapache-mime4j-project-0.7.2/dom/src/main/jjtree/0000755000000000000000000000000011702050530020034 5ustar rootrootapache-mime4j-project-0.7.2/dom/src/main/jjtree/org/0000755000000000000000000000000011702050530020623 5ustar rootrootapache-mime4j-project-0.7.2/dom/src/main/jjtree/org/apache/0000755000000000000000000000000011702050530022044 5ustar rootrootapache-mime4j-project-0.7.2/dom/src/main/jjtree/org/apache/james/0000755000000000000000000000000011702050530023143 5ustar rootrootapache-mime4j-project-0.7.2/dom/src/main/jjtree/org/apache/james/mime4j/0000755000000000000000000000000011702050530024330 5ustar rootrootapache-mime4j-project-0.7.2/dom/src/main/jjtree/org/apache/james/mime4j/field/0000755000000000000000000000000011702050530025413 5ustar rootrootapache-mime4j-project-0.7.2/dom/src/main/jjtree/org/apache/james/mime4j/field/address/0000755000000000000000000000000011702050530027040 5ustar rootroot././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/jjtree/org/apache/james/mime4j/field/address/ParseException.javaapache-mime4j-project-0.7.2/dom/src/main/jjtree/org/apache/james/mime4j/field/address/ParseException0000644000000000000000000001737411702050530031730 0ustar rootroot/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 3.0 */ /**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field.address; /** * This exception is thrown when parse errors are encountered. * You can explicitly create objects of this exception type by * calling the method generateParseException in the generated * parser. * * Changes for Mime4J: * extends org.apache.james.mime4j.field.ParseException * added serialVersionUID * added constructor ParseException(Throwable) * default detail message is "Cannot parse field" */ public class ParseException extends org.apache.james.mime4j.dom.field.ParseException { private static final long serialVersionUID = 1L; /** * This constructor is used by the method "generateParseException" * in the generated parser. Calling this constructor generates * a new object of this type with the fields "currentToken", * "expectedTokenSequences", and "tokenImage" set. The boolean * flag "specialConstructor" is also set to true to indicate that * this constructor was used to create this object. * This constructor calls its super class with the empty string * to force the "toString" method of parent class "Throwable" to * print the error message in the form: * ParseException: */ public ParseException(Token currentTokenVal, int[][] expectedTokenSequencesVal, String[] tokenImageVal ) { super(""); specialConstructor = true; currentToken = currentTokenVal; expectedTokenSequences = expectedTokenSequencesVal; tokenImage = tokenImageVal; } /** * The following constructors are for use by you for whatever * purpose you can think of. Constructing the exception in this * manner makes the exception behave in the normal way - i.e., as * documented in the class "Throwable". The fields "errorToken", * "expectedTokenSequences", and "tokenImage" do not contain * relevant information. The JavaCC generated code does not use * these constructors. */ public ParseException() { super("Cannot parse field"); specialConstructor = false; } public ParseException(Throwable cause) { super(cause); specialConstructor = false; } public ParseException(String message) { super(message); specialConstructor = false; } /** * This variable determines which constructor was used to create * this object and thereby affects the semantics of the * "getMessage" method (see below). */ protected boolean specialConstructor; /** * This is the last token that has been consumed successfully. If * this object has been created due to a parse error, the token * followng this token will (therefore) be the first error token. */ public Token currentToken; /** * Each entry in this array is an array of integers. Each array * of integers represents a sequence of tokens (by their ordinal * values) that is expected at this point of the parse. */ public int[][] expectedTokenSequences; /** * This is a reference to the "tokenImage" array of the generated * parser within which the parse error occurred. This array is * defined in the generated ...Constants interface. */ public String[] tokenImage; /** * This method has the standard behavior when this object has been * created using the standard constructors. Otherwise, it uses * "currentToken" and "expectedTokenSequences" to generate a parse * error message and returns it. If this object has been created * due to a parse error, and you do not catch it (it gets thrown * from the parser), then this method is called during the printing * of the final stack trace, and hence the correct error message * gets displayed. */ public String getMessage() { if (!specialConstructor) { return super.getMessage(); } StringBuffer expected = new StringBuffer(); int maxSize = 0; for (int i = 0; i < expectedTokenSequences.length; i++) { if (maxSize < expectedTokenSequences[i].length) { maxSize = expectedTokenSequences[i].length; } for (int j = 0; j < expectedTokenSequences[i].length; j++) { expected.append(tokenImage[expectedTokenSequences[i][j]]).append(" "); } if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) { expected.append("..."); } expected.append(eol).append(" "); } String retval = "Encountered \""; Token tok = currentToken.next; for (int i = 0; i < maxSize; i++) { if (i != 0) retval += " "; if (tok.kind == 0) { retval += tokenImage[0]; break; } retval += add_escapes(tok.image); tok = tok.next; } retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn; retval += "." + eol; if (expectedTokenSequences.length == 1) { retval += "Was expecting:" + eol + " "; } else { retval += "Was expecting one of:" + eol + " "; } retval += expected.toString(); return retval; } /** * The end of line string for this machine. */ protected String eol = System.getProperty("line.separator", "\n"); /** * Used to convert raw characters to their escaped version * when these raw version cannot be used as part of an ASCII * string literal. */ protected String add_escapes(String str) { StringBuffer retval = new StringBuffer(); char ch; for (int i = 0; i < str.length(); i++) { switch (str.charAt(i)) { case 0 : continue; case '\b': retval.append("\\b"); continue; case '\t': retval.append("\\t"); continue; case '\n': retval.append("\\n"); continue; case '\f': retval.append("\\f"); continue; case '\r': retval.append("\\r"); continue; case '\"': retval.append("\\\""); continue; case '\'': retval.append("\\\'"); continue; case '\\': retval.append("\\\\"); continue; default: if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) { String s = "0000" + Integer.toString(ch, 16); retval.append("\\u" + s.substring(s.length() - 4, s.length())); } else { retval.append(ch); } continue; } } return retval.toString(); } } ././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/jjtree/org/apache/james/mime4j/field/address/AddressListParser.jjtapache-mime4j-project-0.7.2/dom/src/main/jjtree/org/apache/james/mime4j/field/address/AddressListPar0000644000000000000000000001771711702050530031664 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ /** * RFC2822 address list parser. * * Created 9/17/2004 * by Joe Cheng */ options { STATIC=false; LOOKAHEAD=1; JDK_VERSION = "1.5"; VISITOR=true; MULTI=true; NODE_SCOPE_HOOK=true; NODE_EXTENDS="org.apache.james.mime4j.field.address.BaseNode"; //DEBUG_PARSER=true; //DEBUG_TOKEN_MANAGER=true; } PARSER_BEGIN(AddressListParser) /**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field.address; public class AddressListParser { public static void main(String args[]) throws ParseException { while (true) { try { AddressListParser parser = new AddressListParser(System.in); parser.parseLine(); ((SimpleNode) parser.jjtree.rootNode()).dump("> "); } catch (Exception x) { x.printStackTrace(); return; } } } public ASTaddress_list parseAddressList() throws ParseException { try { parseAddressList0(); return (ASTaddress_list) jjtree.rootNode(); } catch (TokenMgrError tme) { throw new ParseException(tme.getMessage()); } } public ASTaddress parseAddress() throws ParseException { try { parseAddress0(); return (ASTaddress) jjtree.rootNode(); } catch (TokenMgrError tme) { throw new ParseException(tme.getMessage()); } } public ASTmailbox parseMailbox() throws ParseException { try { parseMailbox0(); return (ASTmailbox) jjtree.rootNode(); } catch (TokenMgrError tme) { throw new ParseException(tme.getMessage()); } } void jjtreeOpenNodeScope(Node n) { ((SimpleNode) n).firstToken = getToken(1); } void jjtreeCloseNodeScope(Node n) { ((SimpleNode) n).lastToken = getToken(0); } } PARSER_END(AddressListParser) void parseLine() #void : {} { address_list() ["\r"] "\n" } void parseAddressList0() #void : {} { address_list() } void parseAddress0() #void : {} { address() } void parseMailbox0() #void : {} { mailbox() } void address_list() : {} { [ address() ] ( "," [ address() ] )* } void address() : {} { LOOKAHEAD(2147483647) addr_spec() | angle_addr() | ( phrase() (group_body() | angle_addr()) ) } void mailbox() : {} { LOOKAHEAD(2147483647) addr_spec() | angle_addr() | name_addr() } void name_addr() : {} { phrase() angle_addr() } void group_body() : {} { ":" [ mailbox() ] ( "," [ mailbox() ] )* ";" } void angle_addr() : {} { "<" [ route() ] addr_spec() ">" } void route() : {} { "@" domain() ( (",")* "@" domain() )* ":" } void phrase() : {} { ( | )+ } void addr_spec() : {} { ( local_part() "@" domain() ) } void local_part() : { Token t; } { ( t= | t= ) ( [t="."] { if ( t.kind == AddressListParserConstants.QUOTEDSTRING || t.image.charAt(t.image.length() - 1) != '.') throw new ParseException("Words in local part must be separated by '.'"); } ( t= | t= ) )* } void domain() : { Token t; } { ( t= ( [t="."] { if (t.image.charAt(t.image.length() - 1) != '.') throw new ParseException("Atoms in domain names must be separated by '.'"); } t= )* ) | } SPECIAL_TOKEN : { < WS: ( [" ", "\t"] )+ > } TOKEN : { < #ALPHA: ["a" - "z", "A" - "Z"] > | < #DIGIT: ["0" - "9"] > | < #ATEXT: ( | | "!" | "#" | "$" | "%" | "&" | "'" | "*" | "+" | "-" | "/" | "=" | "?" | "^" | "_" | "`" | "{" | "|" | "}" | "~" )> | < DOTATOM: ( | "." )* > } TOKEN_MGR_DECLS : { // Keeps track of how many levels of comment nesting // we've encountered. This is only used when the 2nd // level is reached, for example ((this)), not (this). // This is because the outermost level must be treated // specially anyway, because the outermost ")" has a // different token type than inner ")" instances. static int commentNest; } MORE : { // domain literal "[" : INDOMAINLITERAL } MORE : { < > { image.deleteCharAt(image.length() - 2); } | < ~["[", "]", "\\"] > } TOKEN : { < DOMAINLITERAL: "]" > { matchedToken.image = image.toString(); }: DEFAULT } MORE : { // starts a comment "(" : INCOMMENT } SKIP : { // ends a comment < COMMENT: ")" > : DEFAULT // if this is ever changed to not be a SKIP, need // to make sure matchedToken.token = token.toString() // is called. } MORE : { < > { image.deleteCharAt(image.length() - 2); } | "(" { commentNest = 1; } : NESTED_COMMENT | < > } MORE : { < > { image.deleteCharAt(image.length() - 2); } | "(" { ++commentNest; } | ")" { --commentNest; if (commentNest == 0) SwitchTo(INCOMMENT); } | < > } // QUOTED STRINGS MORE : { "\"" { image.deleteCharAt(image.length() - 1); } : INQUOTEDSTRING } MORE : { < > { image.deleteCharAt(image.length() - 2); } | < (~["\"", "\\"])+ > } TOKEN : { < QUOTEDSTRING: "\"" > { matchedToken.image = image.substring(0, image.length() - 1); } : DEFAULT } // GLOBALS <*> TOKEN : { < #QUOTEDPAIR: "\\" > | < #ANY: ~[] > } // ERROR! /* <*> TOKEN : { < UNEXPECTED_CHAR: > } */apache-mime4j-project-0.7.2/dom/src/main/java/0000755000000000000000000000000011702050526017477 5ustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/0000755000000000000000000000000011702050526020266 5ustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/0000755000000000000000000000000011702050526021507 5ustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/0000755000000000000000000000000011702050526022606 5ustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/0000755000000000000000000000000011702050530023766 5ustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/message/0000755000000000000000000000000011702050530025412 5ustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/message/BodyPart.java0000644000000000000000000000660111702050530030004 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.message; import java.util.Date; import java.util.Map; import org.apache.james.mime4j.dom.field.ContentDispositionField; import org.apache.james.mime4j.dom.field.ContentTransferEncodingField; import org.apache.james.mime4j.dom.field.ContentTypeField; import org.apache.james.mime4j.field.ContentTransferEncodingFieldImpl; import org.apache.james.mime4j.field.ContentTypeFieldImpl; import org.apache.james.mime4j.field.Fields; import org.apache.james.mime4j.util.MimeUtil; /** * A MIME body part (as defined in RFC 2045). */ public class BodyPart extends AbstractEntity { /** * Creates a new empty BodyPart. */ public BodyPart() { } @Override protected String newUniqueBoundary() { return MimeUtil.createUniqueBoundary(); } @Override protected ContentDispositionField newContentDisposition( String dispositionType, String filename, long size, Date creationDate, Date modificationDate, Date readDate) { return Fields.contentDisposition(dispositionType, filename, size, creationDate, modificationDate, readDate); } @Override protected ContentDispositionField newContentDisposition( String dispositionType, Map parameters) { return Fields.contentDisposition(dispositionType, parameters); } @Override protected ContentTypeField newContentType(String mimeType, Map parameters) { return Fields.contentType(mimeType, parameters); } @Override protected ContentTransferEncodingField newContentTransferEncoding( String contentTransferEncoding) { return Fields.contentTransferEncoding(contentTransferEncoding); } @Override protected String calcTransferEncoding(ContentTransferEncodingField f) { return ContentTransferEncodingFieldImpl.getEncoding(f); } @Override protected String calcMimeType(ContentTypeField child, ContentTypeField parent) { return ContentTypeFieldImpl.getMimeType(child, parent); } @Override protected String calcCharset(ContentTypeField contentType) { return ContentTypeFieldImpl.getCharset(contentType); } } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/message/MessageImpl.java0000644000000000000000000001237011702050530030466 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.message; import java.util.Collection; import java.util.Date; import java.util.Map; import java.util.TimeZone; import org.apache.james.mime4j.codec.DecodeMonitor; import org.apache.james.mime4j.dom.Header; import org.apache.james.mime4j.dom.Message; import org.apache.james.mime4j.dom.address.Address; import org.apache.james.mime4j.dom.address.Mailbox; import org.apache.james.mime4j.dom.field.AddressListField; import org.apache.james.mime4j.dom.field.ContentDispositionField; import org.apache.james.mime4j.dom.field.ContentTransferEncodingField; import org.apache.james.mime4j.dom.field.ContentTypeField; import org.apache.james.mime4j.dom.field.DateTimeField; import org.apache.james.mime4j.dom.field.FieldName; import org.apache.james.mime4j.dom.field.MailboxField; import org.apache.james.mime4j.dom.field.MailboxListField; import org.apache.james.mime4j.dom.field.UnstructuredField; import org.apache.james.mime4j.field.ContentTransferEncodingFieldImpl; import org.apache.james.mime4j.field.ContentTypeFieldImpl; import org.apache.james.mime4j.field.Fields; import org.apache.james.mime4j.field.MimeVersionFieldLenientImpl; import org.apache.james.mime4j.stream.RawField; import org.apache.james.mime4j.util.MimeUtil; /** * Default implementation of {@link Message}. */ public class MessageImpl extends AbstractMessage { /** * Creates a new empty Message. */ public MessageImpl() { super(); Header header = obtainHeader(); RawField rawField = new RawField(FieldName.MIME_VERSION, "1.0"); header.addField(MimeVersionFieldLenientImpl.PARSER.parse(rawField, DecodeMonitor.SILENT)); } @Override protected String newUniqueBoundary() { return MimeUtil.createUniqueBoundary(); } @Override protected UnstructuredField newMessageId(String hostname) { return Fields.messageId(hostname); } @Override protected DateTimeField newDate(Date date, TimeZone zone) { return Fields.date(FieldName.DATE, date, zone); } @Override protected MailboxField newMailbox(String fieldName, Mailbox mailbox) { return Fields.mailbox(fieldName, mailbox); } @Override protected MailboxListField newMailboxList(String fieldName, Collection mailboxes) { return Fields.mailboxList(fieldName, mailboxes); } @Override protected AddressListField newAddressList(String fieldName, Collection addresses) { return Fields.addressList(fieldName, addresses); } @Override protected UnstructuredField newSubject(String subject) { return Fields.subject(subject); } @Override protected ContentDispositionField newContentDisposition( String dispositionType, String filename, long size, Date creationDate, Date modificationDate, Date readDate) { return Fields.contentDisposition(dispositionType, filename, size, creationDate, modificationDate, readDate); } @Override protected ContentDispositionField newContentDisposition( String dispositionType, Map parameters) { return Fields.contentDisposition(dispositionType, parameters); } @Override protected ContentTypeField newContentType(String mimeType, Map parameters) { return Fields.contentType(mimeType, parameters); } @Override protected ContentTransferEncodingField newContentTransferEncoding( String contentTransferEncoding) { return Fields.contentTransferEncoding(contentTransferEncoding); } @Override protected String calcTransferEncoding(ContentTransferEncodingField f) { return ContentTransferEncodingFieldImpl.getEncoding(f); } @Override protected String calcMimeType(ContentTypeField child, ContentTypeField parent) { return ContentTypeFieldImpl.getMimeType(child, parent); } @Override protected String calcCharset(ContentTypeField contentType) { return ContentTypeFieldImpl.getCharset(contentType); } } ././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/message/MaximalBodyDescriptor.javaapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/message/MaximalBodyDescriptor.0000644000000000000000000003174411702050530031671 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.message; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import org.apache.james.mime4j.dom.field.ContentDescriptionField; import org.apache.james.mime4j.dom.field.ContentDispositionField; import org.apache.james.mime4j.dom.field.ContentIdField; import org.apache.james.mime4j.dom.field.ContentLanguageField; import org.apache.james.mime4j.dom.field.ContentLengthField; import org.apache.james.mime4j.dom.field.ContentLocationField; import org.apache.james.mime4j.dom.field.ContentMD5Field; import org.apache.james.mime4j.dom.field.ContentTransferEncodingField; import org.apache.james.mime4j.dom.field.ContentTypeField; import org.apache.james.mime4j.dom.field.FieldName; import org.apache.james.mime4j.dom.field.MimeVersionField; import org.apache.james.mime4j.dom.field.ParsedField; import org.apache.james.mime4j.field.MimeVersionFieldImpl; import org.apache.james.mime4j.stream.BodyDescriptor; import org.apache.james.mime4j.util.MimeUtil; /** * Extended {@link BodyDescriptor} implementation with complete content details. */ public class MaximalBodyDescriptor implements BodyDescriptor { private static final String CONTENT_TYPE = FieldName.CONTENT_TYPE.toLowerCase(Locale.US); private static final String CONTENT_LENGTH = FieldName.CONTENT_LENGTH.toLowerCase(Locale.US); private static final String CONTENT_TRANSFER_ENCODING = FieldName.CONTENT_TRANSFER_ENCODING.toLowerCase(Locale.US); private static final String CONTENT_DISPOSITION = FieldName.CONTENT_DISPOSITION.toLowerCase(Locale.US); private static final String CONTENT_ID = FieldName.CONTENT_ID.toLowerCase(Locale.US); private static final String CONTENT_MD5 = FieldName.CONTENT_MD5.toLowerCase(Locale.US); private static final String CONTENT_DESCRIPTION = FieldName.CONTENT_DESCRIPTION.toLowerCase(Locale.US); private static final String CONTENT_LANGUAGE = FieldName.CONTENT_LANGUAGE.toLowerCase(Locale.US); private static final String CONTENT_LOCATION = FieldName.CONTENT_LOCATION.toLowerCase(Locale.US); private static final String MIME_VERSION = FieldName.MIME_VERSION.toLowerCase(Locale.US); private final String mediaType; private final String subType; private final String mimeType; private final String boundary; private final String charset; private final Map fields; MaximalBodyDescriptor( final String mimeType, final String mediaType, final String subType, final String boundary, final String charset, final Map fields) { super(); this.mimeType = mimeType; this.mediaType = mediaType; this.subType = subType; this.boundary = boundary; this.charset = charset; this.fields = fields != null ? new HashMap(fields) : Collections.emptyMap(); } public String getMimeType() { return mimeType; } public String getBoundary() { return boundary; } public String getCharset() { return charset; } public String getMediaType() { return mediaType; } public String getSubType() { return subType; } public Map getContentTypeParameters() { ContentTypeField contentTypeField = (ContentTypeField) fields.get(CONTENT_TYPE); return contentTypeField != null ? contentTypeField.getParameters() : Collections.emptyMap(); } public String getTransferEncoding() { ContentTransferEncodingField contentTransferEncodingField = (ContentTransferEncodingField) fields.get(CONTENT_TRANSFER_ENCODING); return contentTransferEncodingField != null ? contentTransferEncodingField.getEncoding() : MimeUtil.ENC_7BIT; } public long getContentLength() { ContentLengthField contentLengthField = (ContentLengthField) fields.get(CONTENT_LENGTH); return contentLengthField != null ? contentLengthField.getContentLength() : -1; } /** * Gets the MIME major version * as specified by the MIME-Version * header. * Defaults to one. * @return positive integer */ public int getMimeMajorVersion() { MimeVersionField mimeVersionField = (MimeVersionField) fields.get(MIME_VERSION); return mimeVersionField != null ? mimeVersionField.getMajorVersion() : MimeVersionFieldImpl.DEFAULT_MAJOR_VERSION; } /** * Gets the MIME minor version * as specified by the MIME-Version * header. * Defaults to zero. * @return positive integer */ public int getMimeMinorVersion() { MimeVersionField mimeVersionField = (MimeVersionField) fields.get(MIME_VERSION); return mimeVersionField != null ? mimeVersionField.getMinorVersion() : MimeVersionFieldImpl.DEFAULT_MINOR_VERSION; } /** * Gets the value of the RFC * Content-Description header. * @return value of the Content-Description when present, * null otherwise */ public String getContentDescription() { ContentDescriptionField contentDescriptionField = (ContentDescriptionField) fields.get(CONTENT_DESCRIPTION); return contentDescriptionField != null ? contentDescriptionField.getDescription() : null; } /** * Gets the value of the RFC * Content-ID header. * @return value of the Content-ID when present, * null otherwise */ public String getContentId() { ContentIdField contentIdField = (ContentIdField) fields.get(CONTENT_ID); return contentIdField != null ? contentIdField.getId() : null; } /** * Gets the disposition type of the content-disposition field. * The value is case insensitive and will be converted to lower case. * See RFC2183. * @return content disposition type, * or null when this has not been set */ public String getContentDispositionType() { ContentDispositionField contentDispositionField = (ContentDispositionField) fields.get(CONTENT_DISPOSITION); return contentDispositionField != null ? contentDispositionField.getDispositionType() : null; } /** * Gets the parameters of the content-disposition field. * See RFC2183. * @return parameter value strings indexed by parameter name strings, * not null */ public Map getContentDispositionParameters() { ContentDispositionField contentDispositionField = (ContentDispositionField) fields.get(CONTENT_DISPOSITION); return contentDispositionField != null ? contentDispositionField.getParameters() : Collections.emptyMap(); } /** * Gets the filename parameter value of the content-disposition field. * See RFC2183. * @return filename parameter value, * or null when it is not present */ public String getContentDispositionFilename() { ContentDispositionField contentDispositionField = (ContentDispositionField) fields.get(CONTENT_DISPOSITION); return contentDispositionField != null ? contentDispositionField.getFilename() : null; } /** * Gets the modification-date parameter value of the content-disposition field. * See RFC2183. * @return modification-date parameter value, * or null when this is not present */ public Date getContentDispositionModificationDate() { ContentDispositionField contentDispositionField = (ContentDispositionField) fields.get(CONTENT_DISPOSITION); return contentDispositionField != null ? contentDispositionField.getModificationDate() : null; } /** * Gets the creation-date parameter value of the content-disposition field. * See RFC2183. * @return creation-date parameter value, * or null when this is not present */ public Date getContentDispositionCreationDate() { ContentDispositionField contentDispositionField = (ContentDispositionField) fields.get(CONTENT_DISPOSITION); return contentDispositionField != null ? contentDispositionField.getCreationDate() : null; } /** * Gets the read-date parameter value of the content-disposition field. * See RFC2183. * @return read-date parameter value, * or null when this is not present */ public Date getContentDispositionReadDate() { ContentDispositionField contentDispositionField = (ContentDispositionField) fields.get(CONTENT_DISPOSITION); return contentDispositionField != null ? contentDispositionField.getReadDate() : null; } /** * Gets the size parameter value of the content-disposition field. * See RFC2183. * @return size parameter value, * or -1 if this size has not been set */ public long getContentDispositionSize() { ContentDispositionField contentDispositionField = (ContentDispositionField) fields.get(CONTENT_DISPOSITION); return contentDispositionField != null ? contentDispositionField.getSize() : -1; } /** * Get the content-language header values. * Each applicable language tag will be returned in order. * See RFC4646 * http://tools.ietf.org/html/rfc4646. * @return list of language tag Strings, * or null if no header exists */ public List getContentLanguage() { ContentLanguageField contentLanguageField = (ContentLanguageField) fields.get(CONTENT_LANGUAGE); return contentLanguageField != null ? contentLanguageField.getLanguages() : Collections.emptyList(); } /** * Get the content-location header value. * See RFC2557 * @return the URL content-location * or null if no header exists */ public String getContentLocation() { ContentLocationField contentLocationField = (ContentLocationField) fields.get(CONTENT_LOCATION); return contentLocationField != null ? contentLocationField.getLocation() : null; } /** * Gets the raw, Base64 encoded value of the * Content-MD5 field. * See RFC1864. * @return raw encoded content-md5 * or null if no header exists */ public String getContentMD5Raw() { ContentMD5Field contentMD5Field = (ContentMD5Field) fields.get(CONTENT_MD5); return contentMD5Field != null ? contentMD5Field.getMD5Raw() : null; } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("[mimeType="); sb.append(mimeType); sb.append(", mediaType="); sb.append(mediaType); sb.append(", subType="); sb.append(subType); sb.append(", boundary="); sb.append(boundary); sb.append(", charset="); sb.append(charset); sb.append("]"); return sb.toString(); } } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/message/StringInputStream.java0000644000000000000000000001130511702050530031717 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.message; import java.io.IOException; import java.io.InputStream; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.charset.Charset; import java.nio.charset.CharsetEncoder; import java.nio.charset.CoderResult; import java.nio.charset.CodingErrorAction; class StringInputStream extends InputStream { private final CharsetEncoder encoder; private final CharBuffer cbuf; private final ByteBuffer bbuf; private int mark; StringInputStream(final CharSequence s, final Charset charset, int bufferSize) { super(); this.encoder = charset.newEncoder() .onMalformedInput(CodingErrorAction.REPLACE) .onUnmappableCharacter(CodingErrorAction.REPLACE); this.bbuf = ByteBuffer.allocate(124); this.bbuf.flip(); this.cbuf = CharBuffer.wrap(s); this.mark = -1; } StringInputStream(final CharSequence s, final Charset charset) { this(s, charset, 2048); } private void fillBuffer() throws IOException { this.bbuf.compact(); CoderResult result = this.encoder.encode(this.cbuf, this.bbuf, true); if (result.isError()) { result.throwException(); } this.bbuf.flip(); } @Override public int read(byte[] b, int off, int len) throws IOException { if (b == null) { throw new NullPointerException("Byte array is null"); } if (len < 0 || (off + len) > b.length) { throw new IndexOutOfBoundsException("Array Size=" + b.length + ", offset=" + off + ", length=" + len); } if (!this.bbuf.hasRemaining() && !this.cbuf.hasRemaining()) { return -1; } int bytesRead = 0; while (len > 0) { if (this.bbuf.hasRemaining()) { int chunk = Math.min(this.bbuf.remaining(), len); this.bbuf.get(b, off, chunk); off += chunk; len -= chunk; bytesRead += chunk; } else { fillBuffer(); if (!this.bbuf.hasRemaining() && !this.cbuf.hasRemaining()) { break; } } } return bytesRead == 0 && !this.cbuf.hasRemaining() ? -1 : bytesRead; } @Override public int read() throws IOException { for (;;) { if (this.bbuf.hasRemaining()) { return this.bbuf.get() & 0xFF; } else { fillBuffer(); if (!this.bbuf.hasRemaining() && !this.cbuf.hasRemaining()) { return -1; } } } } @Override public int read(byte[] b) throws IOException { return read(b, 0, b.length); } @Override public long skip(long n) throws IOException { int skipped = 0; while (n > 0 && this.cbuf.hasRemaining()) { this.cbuf.get(); n--; skipped++; } return skipped; } @Override public int available() throws IOException { return this.cbuf.remaining(); } @Override public void close() throws IOException { } @Override public void mark(int readlimit) { this.mark = this.cbuf.position(); } @Override public void reset() throws IOException { if (this.mark != -1) { this.cbuf.position(this.mark); this.mark = -1; } } @Override public boolean markSupported() { return true; } } ././@LongLink0000000000000000000000000000016000000000000011562 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/message/DefaultBodyDescriptorBuilder.javaapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/message/DefaultBodyDescriptorB0000644000000000000000000001422711702050530031706 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.message; import java.util.HashMap; import java.util.Locale; import java.util.Map; import org.apache.james.mime4j.MimeException; import org.apache.james.mime4j.codec.DecodeMonitor; import org.apache.james.mime4j.dom.FieldParser; import org.apache.james.mime4j.dom.field.ContentTypeField; import org.apache.james.mime4j.dom.field.FieldName; import org.apache.james.mime4j.dom.field.ParsedField; import org.apache.james.mime4j.field.DefaultFieldParser; import org.apache.james.mime4j.stream.BodyDescriptor; import org.apache.james.mime4j.stream.BodyDescriptorBuilder; import org.apache.james.mime4j.stream.Field; import org.apache.james.mime4j.stream.RawField; import org.apache.james.mime4j.util.MimeUtil; /** * Default {@link BodyDescriptorBuilder} implementation. */ public class DefaultBodyDescriptorBuilder implements BodyDescriptorBuilder { private static final String CONTENT_TYPE = FieldName.CONTENT_TYPE.toLowerCase(Locale.US); private static final String US_ASCII = "us-ascii"; private static final String SUB_TYPE_EMAIL = "rfc822"; private static final String MEDIA_TYPE_TEXT = "text"; private static final String MEDIA_TYPE_MESSAGE = "message"; private static final String EMAIL_MESSAGE_MIME_TYPE = MEDIA_TYPE_MESSAGE + "/" + SUB_TYPE_EMAIL; private static final String DEFAULT_SUB_TYPE = "plain"; private static final String DEFAULT_MEDIA_TYPE = MEDIA_TYPE_TEXT; private static final String DEFAULT_MIME_TYPE = DEFAULT_MEDIA_TYPE + "/" + DEFAULT_SUB_TYPE; private final String parentMimeType; private final DecodeMonitor monitor; private final FieldParser fieldParser; private final Map fields; /** * Creates a new root BodyDescriptor instance. */ public DefaultBodyDescriptorBuilder() { this(null); } public DefaultBodyDescriptorBuilder(final String parentMimeType) { this(parentMimeType, null, null); } /** * Creates a new BodyDescriptor instance. */ public DefaultBodyDescriptorBuilder( final String parentMimeType, final FieldParser fieldParser, final DecodeMonitor monitor) { super(); this.parentMimeType = parentMimeType; this.fieldParser = fieldParser != null ? fieldParser : DefaultFieldParser.getParser(); this.monitor = monitor != null ? monitor : DecodeMonitor.SILENT; this.fields = new HashMap(); } public void reset() { fields.clear(); } public Field addField(final RawField rawfield) throws MimeException { ParsedField field = fieldParser.parse(rawfield, monitor); String name = field.getName().toLowerCase(Locale.US); if (!fields.containsKey(name)) { fields.put(name, field); } return field; } public BodyDescriptor build() { String actualMimeType = null; String actualMediaType = null; String actualSubType = null; String actualCharset = null; String actualBoundary = null; ContentTypeField contentTypeField = (ContentTypeField) fields.get(CONTENT_TYPE); if (contentTypeField != null) { actualMimeType = contentTypeField.getMimeType(); actualMediaType = contentTypeField.getMediaType(); actualSubType = contentTypeField.getSubType(); actualCharset = contentTypeField.getCharset(); actualBoundary = contentTypeField.getBoundary(); } if (actualMimeType == null) { if (MimeUtil.isSameMimeType("multipart/digest", parentMimeType)) { actualMimeType = EMAIL_MESSAGE_MIME_TYPE; actualMediaType = MEDIA_TYPE_MESSAGE; actualSubType = SUB_TYPE_EMAIL; } else { actualMimeType = DEFAULT_MIME_TYPE; actualMediaType = DEFAULT_MEDIA_TYPE; actualSubType = DEFAULT_SUB_TYPE; } } if (actualCharset == null && MEDIA_TYPE_TEXT.equals(actualMediaType)) { actualCharset = US_ASCII; } if (!MimeUtil.isMultipart(actualMimeType)) { actualBoundary = null; } return new MaximalBodyDescriptor( actualMimeType, actualMediaType, actualSubType, actualBoundary, actualCharset, fields); } public BodyDescriptorBuilder newChild() { String actualMimeType; ContentTypeField contentTypeField = (ContentTypeField) fields.get(CONTENT_TYPE); if (contentTypeField != null) { actualMimeType = contentTypeField.getMimeType(); } else { if (MimeUtil.isSameMimeType("multipart/digest", parentMimeType)) { actualMimeType = EMAIL_MESSAGE_MIME_TYPE; } else { actualMimeType = DEFAULT_MIME_TYPE; } } return new DefaultBodyDescriptorBuilder(actualMimeType, fieldParser, monitor); } } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/message/AbstractEntity.java0000644000000000000000000004630011702050530031220 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.message; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.Map; import org.apache.james.mime4j.dom.Body; import org.apache.james.mime4j.dom.Disposable; import org.apache.james.mime4j.dom.Entity; import org.apache.james.mime4j.dom.Header; import org.apache.james.mime4j.dom.Message; import org.apache.james.mime4j.dom.Multipart; import org.apache.james.mime4j.dom.TextBody; import org.apache.james.mime4j.dom.field.ContentDispositionField; import org.apache.james.mime4j.dom.field.ContentTransferEncodingField; import org.apache.james.mime4j.dom.field.ContentTypeField; import org.apache.james.mime4j.dom.field.FieldName; import org.apache.james.mime4j.dom.field.ParsedField; /** * Abstract MIME entity. */ public abstract class AbstractEntity implements Entity { private Header header = null; private Body body = null; private Entity parent = null; /** * Creates a new Entity. Typically invoked implicitly by a * subclass constructor. */ protected AbstractEntity() { } /** * Gets the parent entity of this entity. * Returns null if this is the root entity. * * @return the parent or null. */ public Entity getParent() { return parent; } /** * Sets the parent entity of this entity. * * @param parent the parent entity or null if * this will be the root entity. */ public void setParent(Entity parent) { this.parent = parent; } /** * Gets the entity header. * * @return the header. */ public Header getHeader() { return header; } /** * Sets the entity header. * * @param header the header. */ public void setHeader(Header header) { this.header = header; } /** * Gets the body of this entity. * * @return the body, */ public Body getBody() { return body; } /** * Sets the body of this entity. * * @param body the body. * @throws IllegalStateException if the body has already been set. */ public void setBody(Body body) { if (this.body != null) throw new IllegalStateException("body already set"); this.body = body; body.setParent(this); } /** * Removes and returns the body of this entity. The removed body may be * attached to another entity. If it is no longer needed it should be * {@link Disposable#dispose() disposed} of. * * @return the removed body or null if no body was set. */ public Body removeBody() { if (body == null) return null; Body body = this.body; this.body = null; body.setParent(null); return body; } /** * Sets the specified message as body of this entity and the content type to * "message/rfc822". A Header is created if this * entity does not already have one. * * @param message * the message to set as body. */ public void setMessage(Message message) { setBody(message, "message/rfc822", null); } /** * Sets the specified multipart as body of this entity. Also sets the * content type accordingly and creates a message boundary string. A * Header is created if this entity does not already have * one. * * @param multipart * the multipart to set as body. */ public void setMultipart(Multipart multipart) { String mimeType = "multipart/" + multipart.getSubType(); Map parameters = Collections.singletonMap("boundary", newUniqueBoundary()); setBody(multipart, mimeType, parameters); } /** * Sets the specified multipart as body of this entity. Also sets the * content type accordingly and creates a message boundary string. A * Header is created if this entity does not already have * one. * * @param multipart * the multipart to set as body. * @param parameters * additional parameters for the Content-Type header field. */ public void setMultipart(Multipart multipart, Map parameters) { String mimeType = "multipart/" + multipart.getSubType(); if (!parameters.containsKey("boundary")) { parameters = new HashMap(parameters); parameters.put("boundary", newUniqueBoundary()); } setBody(multipart, mimeType, parameters); } /** * Sets the specified TextBody as body of this entity and the * content type to "text/plain". A Header is * created if this entity does not already have one. * * @param textBody * the TextBody to set as body. * @see org.apache.james.mime4j.message.BodyFactory#textBody(java.io.InputStream, String) */ public void setText(TextBody textBody) { setText(textBody, "plain"); } /** * Sets the specified TextBody as body of this entity. Also * sets the content type according to the specified sub-type. A * Header is created if this entity does not already have * one. * * @param textBody * the TextBody to set as body. * @param subtype * the text subtype (e.g. "plain", "html" or * "xml"). */ public void setText(TextBody textBody, String subtype) { String mimeType = "text/" + subtype; Map parameters = null; String mimeCharset = textBody.getMimeCharset(); if (mimeCharset != null && !mimeCharset.equalsIgnoreCase("us-ascii")) { parameters = Collections.singletonMap("charset", mimeCharset); } setBody(textBody, mimeType, parameters); } /** * Sets the body of this entity and sets the content-type to the specified * value. A Header is created if this entity does not already * have one. * * @param body * the body. * @param mimeType * the MIME media type of the specified body * ("type/subtype"). */ public void setBody(Body body, String mimeType) { setBody(body, mimeType, null); } /** * Sets the body of this entity and sets the content-type to the specified * value. A Header is created if this entity does not already * have one. * * @param body * the body. * @param mimeType * the MIME media type of the specified body * ("type/subtype"). * @param parameters * additional parameters for the Content-Type header field. */ public void setBody(Body body, String mimeType, Map parameters) { setBody(body); Header header = obtainHeader(); header.setField(newContentType(mimeType, parameters)); } /** * Determines the MIME type of this Entity. The MIME type * is derived by looking at the parent's Content-Type field if no * Content-Type field is set for this Entity. * * @return the MIME type. */ public String getMimeType() { ContentTypeField child = getContentTypeField(); ContentTypeField parent = getParent() != null ? (ContentTypeField) getParent().getHeader(). getField(FieldName.CONTENT_TYPE) : null; return calcMimeType(child, parent); } private ContentTypeField getContentTypeField() { return (ContentTypeField) getHeader().getField(FieldName.CONTENT_TYPE); } /** * Determines the MIME character set encoding of this Entity. * * @return the MIME character set encoding. */ public String getCharset() { return calcCharset((ContentTypeField) getHeader().getField(FieldName.CONTENT_TYPE)); } /** * Determines the transfer encoding of this Entity. * * @return the transfer encoding. */ public String getContentTransferEncoding() { ContentTransferEncodingField f = (ContentTransferEncodingField) getHeader().getField(FieldName.CONTENT_TRANSFER_ENCODING); return calcTransferEncoding(f); } /** * Sets the transfer encoding of this Entity to the specified * value. * * @param contentTransferEncoding * transfer encoding to use. */ public void setContentTransferEncoding(String contentTransferEncoding) { Header header = obtainHeader(); header.setField(newContentTransferEncoding(contentTransferEncoding)); } /** * Return the disposition type of the content disposition of this * Entity. * * @return the disposition type or null if no disposition * type has been set. */ public String getDispositionType() { ContentDispositionField field = obtainField(FieldName.CONTENT_DISPOSITION); if (field == null) return null; return field.getDispositionType(); } /** * Sets the content disposition of this Entity to the * specified disposition type. No filename, size or date parameters * are included in the content disposition. * * @param dispositionType * disposition type value (usually inline or * attachment). */ public void setContentDisposition(String dispositionType) { Header header = obtainHeader(); header.setField(newContentDisposition(dispositionType, null, -1, null, null, null)); } /** * Sets the content disposition of this Entity to the * specified disposition type and filename. No size or date parameters are * included in the content disposition. * * @param dispositionType * disposition type value (usually inline or * attachment). * @param filename * filename parameter value or null if the * parameter should not be included. */ public void setContentDisposition(String dispositionType, String filename) { Header header = obtainHeader(); header.setField(newContentDisposition(dispositionType, filename, -1, null, null, null)); } /** * Sets the content disposition of this Entity to the * specified values. No date parameters are included in the content * disposition. * * @param dispositionType * disposition type value (usually inline or * attachment). * @param filename * filename parameter value or null if the * parameter should not be included. * @param size * size parameter value or -1 if the parameter * should not be included. */ public void setContentDisposition(String dispositionType, String filename, long size) { Header header = obtainHeader(); header.setField(newContentDisposition(dispositionType, filename, size, null, null, null)); } /** * Sets the content disposition of this Entity to the * specified values. * * @param dispositionType * disposition type value (usually inline or * attachment). * @param filename * filename parameter value or null if the * parameter should not be included. * @param size * size parameter value or -1 if the parameter * should not be included. * @param creationDate * creation-date parameter value or null if the * parameter should not be included. * @param modificationDate * modification-date parameter value or null if * the parameter should not be included. * @param readDate * read-date parameter value or null if the * parameter should not be included. */ public void setContentDisposition(String dispositionType, String filename, long size, Date creationDate, Date modificationDate, Date readDate) { Header header = obtainHeader(); header.setField(newContentDisposition(dispositionType, filename, size, creationDate, modificationDate, readDate)); } /** * Returns the filename parameter of the content disposition of this * Entity. * * @return the filename parameter of the content disposition or * null if the filename has not been set. */ public String getFilename() { ContentDispositionField field = obtainField(FieldName.CONTENT_DISPOSITION); if (field == null) return null; return field.getFilename(); } /** * Sets the filename parameter of the content disposition of this * Entity to the specified value. If this entity does not * have a content disposition header field a new one with disposition type * attachment is created. * * @param filename * filename parameter value or null if the * parameter should be removed. */ public void setFilename(String filename) { Header header = obtainHeader(); ContentDispositionField field = (ContentDispositionField) header .getField(FieldName.CONTENT_DISPOSITION); if (field == null) { if (filename != null) { header.setField(newContentDisposition( ContentDispositionField.DISPOSITION_TYPE_ATTACHMENT, filename, -1, null, null, null)); } } else { String dispositionType = field.getDispositionType(); Map parameters = new HashMap(field .getParameters()); if (filename == null) { parameters.remove(ContentDispositionField.PARAM_FILENAME); } else { parameters .put(ContentDispositionField.PARAM_FILENAME, filename); } header.setField(newContentDisposition(dispositionType, parameters)); } } /** * Determines if the MIME type of this Entity matches the * given one. MIME types are case-insensitive. * * @param type the MIME type to match against. * @return true on match, false otherwise. */ public boolean isMimeType(String type) { return getMimeType().equalsIgnoreCase(type); } /** * Determines if the MIME type of this Entity is * multipart/*. Since multipart-entities must have * a boundary parameter in the Content-Type field this * method returns false if no boundary exists. * * @return true on match, false otherwise. */ public boolean isMultipart() { ContentTypeField f = getContentTypeField(); return f != null && f.getBoundary() != null && getMimeType().startsWith( ContentTypeField.TYPE_MULTIPART_PREFIX); } /** * Disposes of the body of this entity. Note that the dispose call does not * get forwarded to the parent entity of this Entity. * * Subclasses that need to free resources should override this method and * invoke super.dispose(). * * @see org.apache.james.mime4j.dom.Disposable#dispose() */ public void dispose() { if (body != null) { body.dispose(); } } /** * Obtains the header of this entity. Creates and sets a new header if this * entity's header is currently null. * * @return the header of this entity; never null. */ Header obtainHeader() { if (header == null) { header = new HeaderImpl(); } return header; } /** * Obtains the header field with the specified name. * * @param * concrete field type. * @param fieldName * name of the field to retrieve. * @return the header field or null if this entity has no * header or the header contains no such field. */ F obtainField(String fieldName) { Header header = getHeader(); if (header == null) return null; @SuppressWarnings("unchecked") F field = (F) header.getField(fieldName); return field; } protected abstract String newUniqueBoundary(); protected abstract ContentDispositionField newContentDisposition( String dispositionType, String filename, long size, Date creationDate, Date modificationDate, Date readDate); protected abstract ContentDispositionField newContentDisposition( String dispositionType, Map parameters); protected abstract ContentTypeField newContentType(String mimeType, Map parameters); protected abstract ContentTransferEncodingField newContentTransferEncoding( String contentTransferEncoding); protected abstract String calcMimeType(ContentTypeField child, ContentTypeField parent); protected abstract String calcTransferEncoding(ContentTransferEncodingField f); protected abstract String calcCharset(ContentTypeField contentType); } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/message/HeaderImpl.java0000644000000000000000000000270611702050530030274 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.message; import org.apache.james.mime4j.dom.Header; /** * Default implementation of {@link Header}. */ public class HeaderImpl extends AbstractHeader { /** * Creates a new empty Header. */ public HeaderImpl() { } } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/message/BasicTextBody.java0000644000000000000000000000425311702050530030765 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.message; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import org.apache.james.mime4j.dom.SingleBody; import org.apache.james.mime4j.dom.TextBody; class BasicTextBody extends TextBody { private final byte[] content; private final String charset; BasicTextBody(final byte[] content, final String charset) { super(); this.content = content; this.charset = charset; } @Override public String getMimeCharset() { return this.charset; } @Override public Reader getReader() throws IOException { return new InputStreamReader(getInputStream(), this.charset); } @Override public InputStream getInputStream() throws IOException { return new ByteArrayInputStream(this.content); } @Override public SingleBody copy() { return new BasicTextBody(this.content, this.charset); } } ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/message/SimpleContentHandler.javaapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/message/SimpleContentHandler.j0000644000000000000000000000675211702050530031661 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.message; import org.apache.james.mime4j.MimeException; import org.apache.james.mime4j.codec.DecodeMonitor; import org.apache.james.mime4j.dom.FieldParser; import org.apache.james.mime4j.dom.Header; import org.apache.james.mime4j.dom.field.ParsedField; import org.apache.james.mime4j.field.LenientFieldParser; import org.apache.james.mime4j.parser.AbstractContentHandler; import org.apache.james.mime4j.stream.Field; /** * Abstract implementation of ContentHandler that automates common * tasks. Currently performs header parsing. * * Older versions of this class performed decoding of content streams. * This can be now easily achieved by calling setContentDecoding(true) on the MimeStreamParser. */ public abstract class SimpleContentHandler extends AbstractContentHandler { private final FieldParser fieldParser; private final DecodeMonitor monitor; public SimpleContentHandler( final FieldParser fieldParser, final DecodeMonitor monitor) { super(); this.fieldParser = fieldParser != null ? fieldParser : LenientFieldParser.getParser(); this.monitor = monitor != null ? monitor : DecodeMonitor.SILENT; } public SimpleContentHandler() { this(null, null); } /** * Called after headers are parsed. */ public abstract void headers(Header header); /* Implement introduced callbacks. */ private Header currHeader; /** * @see org.apache.james.mime4j.parser.AbstractContentHandler#startHeader() */ @Override public final void startHeader() { currHeader = new HeaderImpl(); } /** * @see org.apache.james.mime4j.parser.AbstractContentHandler#field(Field) */ @Override public final void field(Field field) throws MimeException { ParsedField parsedField; if (field instanceof ParsedField) { parsedField = (ParsedField) field; } else { parsedField = fieldParser.parse(field, monitor); } currHeader.addField(parsedField); } /** * @see org.apache.james.mime4j.parser.AbstractContentHandler#endHeader() */ @Override public final void endHeader() { Header tmp = currHeader; currHeader = null; headers(tmp); } } ././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/message/MessageServiceFactoryImpl.javaapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/message/MessageServiceFactoryI0000644000000000000000000001162211702050530031705 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.message; import org.apache.james.mime4j.codec.DecodeMonitor; import org.apache.james.mime4j.dom.MessageBuilder; import org.apache.james.mime4j.dom.MessageServiceFactory; import org.apache.james.mime4j.dom.MessageWriter; import org.apache.james.mime4j.stream.BodyDescriptorBuilder; import org.apache.james.mime4j.stream.MimeConfig; /** * The default MessageBuilderFactory bundled with Mime4j. * * Supports the "StorageProvider", "MimeEntityConfig" and "MutableBodyDescriptorFactory" * attributes. */ public class MessageServiceFactoryImpl extends MessageServiceFactory { private BodyFactory bodyFactory = null; private MimeConfig mimeEntityConfig = null; private BodyDescriptorBuilder bodyDescriptorBuilder = null; private DecodeMonitor decodeMonitor = null; private Boolean flatMode = null; private Boolean contentDecoding = null; @Override public MessageBuilder newMessageBuilder() { DefaultMessageBuilder m = new DefaultMessageBuilder(); if (bodyFactory != null) m.setBodyFactory(bodyFactory); if (mimeEntityConfig != null) m.setMimeEntityConfig(mimeEntityConfig); if (bodyDescriptorBuilder != null) m.setBodyDescriptorBuilder(bodyDescriptorBuilder); if (flatMode != null) m.setFlatMode(flatMode.booleanValue()); if (contentDecoding != null) m.setContentDecoding(contentDecoding.booleanValue()); if (decodeMonitor != null) m.setDecodeMonitor(decodeMonitor); return m; } @Override public MessageWriter newMessageWriter() { return new DefaultMessageWriter(); } @Override public void setAttribute(String name, Object value) throws IllegalArgumentException { if ("BodyFactory".equals(name)) { if (value instanceof BodyFactory) { this.bodyFactory = (BodyFactory) value; return; } else throw new IllegalArgumentException("Unsupported attribute value type for "+name+", expected a BodyFactory"); } else if ("MimeEntityConfig".equals(name)) { if (value instanceof MimeConfig) { this.mimeEntityConfig = (MimeConfig) value; return; } else throw new IllegalArgumentException("Unsupported attribute value type for "+name+", expected a MimeConfig"); } else if ("MutableBodyDescriptorFactory".equals(name)) { if (value instanceof BodyDescriptorBuilder) { this.bodyDescriptorBuilder = (BodyDescriptorBuilder) value; return; } else throw new IllegalArgumentException("Unsupported attribute value type for "+name+", expected a MutableBodyDescriptorFactory"); } else if ("DecodeMonitor".equals(name)) { if (value instanceof DecodeMonitor) { this.decodeMonitor = (DecodeMonitor) value; return; } else throw new IllegalArgumentException("Unsupported attribute value type for "+name+", expected a DecodeMonitor"); } else if ("FlatMode".equals(name)) { if (value instanceof Boolean) { this.flatMode = (Boolean) value; return; } else throw new IllegalArgumentException("Unsupported attribute value type for "+name+", expected a Boolean"); } else if ("ContentDecoding".equals(name)) { if (value instanceof Boolean) { this.contentDecoding = (Boolean) value; return; } else throw new IllegalArgumentException("Unsupported attribute value type for "+name+", expected a Boolean"); } throw new IllegalArgumentException("Unsupported attribute: "+name); } } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/message/MultipartImpl.java0000644000000000000000000000772111702050530031067 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.message; import org.apache.james.mime4j.dom.Multipart; import org.apache.james.mime4j.util.ByteSequence; import org.apache.james.mime4j.util.ContentUtil; /** * Default implementation of {@link Multipart}. */ public class MultipartImpl extends AbstractMultipart { private ByteSequence preamble; private transient String preambleStrCache; private transient boolean preambleComputed = false; private ByteSequence epilogue; private transient String epilogueStrCache; private transient boolean epilogueComputed = false; /** * Creates a new empty Multipart instance. */ public MultipartImpl(String subType) { super(subType); preamble = null; preambleStrCache = null; preambleComputed = true; epilogue = null; epilogueStrCache = null; epilogueComputed = true; } // package private for now; might become public someday public ByteSequence getPreambleRaw() { return preamble; } public void setPreambleRaw(ByteSequence preamble) { this.preamble = preamble; this.preambleStrCache = null; this.preambleComputed = false; } /** * Gets the preamble. * * @return the preamble. */ @Override public String getPreamble() { if (!preambleComputed) { preambleStrCache = preamble != null ? ContentUtil.decode(preamble) : null; preambleComputed = true; } return preambleStrCache; } /** * Sets the preamble. * * @param preamble * the preamble. */ @Override public void setPreamble(String preamble) { this.preamble = preamble != null ? ContentUtil.encode(preamble) : null; this.preambleStrCache = preamble; this.preambleComputed = true; } // package private for now; might become public someday public ByteSequence getEpilogueRaw() { return epilogue; } public void setEpilogueRaw(ByteSequence epilogue) { this.epilogue = epilogue; this.epilogueStrCache = null; this.epilogueComputed = false; } /** * Gets the epilogue. * * @return the epilogue. */ @Override public String getEpilogue() { if (!epilogueComputed) { epilogueStrCache = epilogue != null ? ContentUtil.decode(epilogue) : null; epilogueComputed = true; } return epilogueStrCache; } /** * Sets the epilogue. * * @param epilogue * the epilogue. */ @Override public void setEpilogue(String epilogue) { this.epilogue = epilogue != null ? ContentUtil.encode(epilogue) : null; this.epilogueStrCache = epilogue; this.epilogueComputed = true; } } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/message/BodyFactory.java0000644000000000000000000000515111702050530030504 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.message; import java.io.IOException; import java.io.InputStream; import org.apache.james.mime4j.dom.BinaryBody; import org.apache.james.mime4j.dom.TextBody; /** * Factory for creating message bodies. */ public interface BodyFactory { /** * Creates a {@link BinaryBody} that holds the content of the given input * stream. * * @param is * input stream to create a message body from. * @return a binary body. * @throws IOException * if an I/O error occurs. */ BinaryBody binaryBody(InputStream is) throws IOException; /** * Creates a {@link TextBody} that holds the content of the given input * stream. *

* The charset corresponding to the given MIME charset name is used to * decode the byte content of the input stream into a character stream when * calling {@link TextBody#getReader() getReader()} on the returned object. * If the MIME charset has no corresponding Java charset or the Java charset * cannot be used for decoding then "us-ascii" is used instead. * * @param is * input stream to create a message body from. * @param mimeCharset * name of a MIME charset. * @return a text body. * @throws IOException * if an I/O error occurs. */ TextBody textBody(InputStream is, String mimeCharset) throws IOException; } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/message/AbstractMessage.java0000644000000000000000000003720411702050530031333 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.message; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.TimeZone; import org.apache.james.mime4j.dom.Header; import org.apache.james.mime4j.dom.Message; import org.apache.james.mime4j.dom.address.Address; import org.apache.james.mime4j.dom.address.AddressList; import org.apache.james.mime4j.dom.address.Mailbox; import org.apache.james.mime4j.dom.address.MailboxList; import org.apache.james.mime4j.dom.field.AddressListField; import org.apache.james.mime4j.dom.field.DateTimeField; import org.apache.james.mime4j.dom.field.FieldName; import org.apache.james.mime4j.dom.field.MailboxField; import org.apache.james.mime4j.dom.field.MailboxListField; import org.apache.james.mime4j.dom.field.ParsedField; import org.apache.james.mime4j.dom.field.UnstructuredField; import org.apache.james.mime4j.stream.Field; /** * Abstract MIME message. */ public abstract class AbstractMessage extends AbstractEntity implements Message { /** * Returns the value of the Message-ID header field of this message * or null if it is not present. * * @return the identifier of this message. */ public String getMessageId() { Field field = obtainField(FieldName.MESSAGE_ID); if (field == null) return null; return field.getBody(); } /** * Creates and sets a new Message-ID header field for this message. * A Header is created if this message does not already have * one. * * @param hostname * host name to be included in the identifier or * null if no host name should be included. */ public void createMessageId(String hostname) { Header header = obtainHeader(); header.setField(newMessageId(hostname)); } protected abstract ParsedField newMessageId(String hostname); /** * Returns the (decoded) value of the Subject header field of this * message or null if it is not present. * * @return the subject of this message. */ public String getSubject() { UnstructuredField field = obtainField(FieldName.SUBJECT); if (field == null) return null; return field.getValue(); } /** * Sets the Subject header field for this message. The specified * string may contain non-ASCII characters, in which case it gets encoded as * an 'encoded-word' automatically. A Header is created if * this message does not already have one. * * @param subject * subject to set or null to remove the subject * header field. */ public void setSubject(String subject) { Header header = obtainHeader(); if (subject == null) { header.removeFields(FieldName.SUBJECT); } else { header.setField(newSubject(subject)); } } /** * Returns the value of the Date header field of this message as * Date object or null if it is not present. * * @return the date of this message. */ public Date getDate() { DateTimeField dateField = obtainField(FieldName.DATE); if (dateField == null) return null; return dateField.getDate(); } /** * Sets the Date header field for this message. This method uses the * default TimeZone of this host to encode the specified * Date object into a string. * * @param date * date to set or null to remove the date header * field. */ public void setDate(Date date) { setDate(date, null); } /** * Sets the Date header field for this message. The specified * TimeZone is used to encode the specified Date * object into a string. * * @param date * date to set or null to remove the date header * field. * @param zone * a time zone. */ public void setDate(Date date, TimeZone zone) { Header header = obtainHeader(); if (date == null) { header.removeFields(FieldName.DATE); } else { header.setField(newDate(date, zone)); } } /** * Returns the value of the Sender header field of this message as * Mailbox object or null if it is not * present. * * @return the sender of this message. */ public Mailbox getSender() { return getMailbox(FieldName.SENDER); } /** * Sets the Sender header field of this message to the specified * mailbox address. * * @param sender * address to set or null to remove the header * field. */ public void setSender(Mailbox sender) { setMailbox(FieldName.SENDER, sender); } /** * Returns the value of the From header field of this message as * MailboxList object or null if it is not * present. * * @return value of the from field of this message. */ public MailboxList getFrom() { return getMailboxList(FieldName.FROM); } /** * Sets the From header field of this message to the specified * mailbox address. * * @param from * address to set or null to remove the header * field. */ public void setFrom(Mailbox from) { setMailboxList(FieldName.FROM, from); } /** * Sets the From header field of this message to the specified * mailbox addresses. * * @param from * addresses to set or null or no arguments to * remove the header field. */ public void setFrom(Mailbox... from) { setMailboxList(FieldName.FROM, from); } /** * Sets the From header field of this message to the specified * mailbox addresses. * * @param from * addresses to set or null or an empty collection * to remove the header field. */ public void setFrom(Collection from) { setMailboxList(FieldName.FROM, from); } /** * Returns the value of the To header field of this message as * AddressList object or null if it is not * present. * * @return value of the to field of this message. */ public AddressList getTo() { return getAddressList(FieldName.TO); } /** * Sets the To header field of this message to the specified * address. * * @param to * address to set or null to remove the header * field. */ public void setTo(Address to) { setAddressList(FieldName.TO, to); } /** * Sets the To header field of this message to the specified * addresses. * * @param to * addresses to set or null or no arguments to * remove the header field. */ public void setTo(Address... to) { setAddressList(FieldName.TO, to); } /** * Sets the To header field of this message to the specified * addresses. * * @param to * addresses to set or null or an empty collection * to remove the header field. */ public void setTo(Collection to) { setAddressList(FieldName.TO, to); } /** * Returns the value of the Cc header field of this message as * AddressList object or null if it is not * present. * * @return value of the cc field of this message. */ public AddressList getCc() { return getAddressList(FieldName.CC); } /** * Sets the Cc header field of this message to the specified * address. * * @param cc * address to set or null to remove the header * field. */ public void setCc(Address cc) { setAddressList(FieldName.CC, cc); } /** * Sets the Cc header field of this message to the specified * addresses. * * @param cc * addresses to set or null or no arguments to * remove the header field. */ public void setCc(Address... cc) { setAddressList(FieldName.CC, cc); } /** * Sets the Cc header field of this message to the specified * addresses. * * @param cc * addresses to set or null or an empty collection * to remove the header field. */ public void setCc(Collection cc) { setAddressList(FieldName.CC, cc); } /** * Returns the value of the Bcc header field of this message as * AddressList object or null if it is not * present. * * @return value of the bcc field of this message. */ public AddressList getBcc() { return getAddressList(FieldName.BCC); } /** * Sets the Bcc header field of this message to the specified * address. * * @param bcc * address to set or null to remove the header * field. */ public void setBcc(Address bcc) { setAddressList(FieldName.BCC, bcc); } /** * Sets the Bcc header field of this message to the specified * addresses. * * @param bcc * addresses to set or null or no arguments to * remove the header field. */ public void setBcc(Address... bcc) { setAddressList(FieldName.BCC, bcc); } /** * Sets the Bcc header field of this message to the specified * addresses. * * @param bcc * addresses to set or null or an empty collection * to remove the header field. */ public void setBcc(Collection bcc) { setAddressList(FieldName.BCC, bcc); } /** * Returns the value of the Reply-To header field of this message as * AddressList object or null if it is not * present. * * @return value of the reply to field of this message. */ public AddressList getReplyTo() { return getAddressList(FieldName.REPLY_TO); } /** * Sets the Reply-To header field of this message to the specified * address. * * @param replyTo * address to set or null to remove the header * field. */ public void setReplyTo(Address replyTo) { setAddressList(FieldName.REPLY_TO, replyTo); } /** * Sets the Reply-To header field of this message to the specified * addresses. * * @param replyTo * addresses to set or null or no arguments to * remove the header field. */ public void setReplyTo(Address... replyTo) { setAddressList(FieldName.REPLY_TO, replyTo); } /** * Sets the Reply-To header field of this message to the specified * addresses. * * @param replyTo * addresses to set or null or an empty collection * to remove the header field. */ public void setReplyTo(Collection replyTo) { setAddressList(FieldName.REPLY_TO, replyTo); } private Mailbox getMailbox(String fieldName) { MailboxField field = obtainField(fieldName); if (field == null) return null; return field.getMailbox(); } private void setMailbox(String fieldName, Mailbox mailbox) { Header header = obtainHeader(); if (mailbox == null) { header.removeFields(fieldName); } else { header.setField(newMailbox(fieldName, mailbox)); } } private MailboxList getMailboxList(String fieldName) { MailboxListField field = obtainField(fieldName); if (field == null) return null; return field.getMailboxList(); } private void setMailboxList(String fieldName, Mailbox mailbox) { setMailboxList(fieldName, mailbox == null ? null : Collections .singleton(mailbox)); } private void setMailboxList(String fieldName, Mailbox... mailboxes) { setMailboxList(fieldName, mailboxes == null ? null : Arrays .asList(mailboxes)); } private void setMailboxList(String fieldName, Collection mailboxes) { Header header = obtainHeader(); if (mailboxes == null || mailboxes.isEmpty()) { header.removeFields(fieldName); } else { header.setField(newMailboxList(fieldName, mailboxes)); } } private AddressList getAddressList(String fieldName) { AddressListField field = obtainField(fieldName); if (field == null) return null; return field.getAddressList(); } private void setAddressList(String fieldName, Address address) { setAddressList(fieldName, address == null ? null : Collections .singleton(address)); } private void setAddressList(String fieldName, Address... addresses) { setAddressList(fieldName, addresses == null ? null : Arrays .asList(addresses)); } private void setAddressList(String fieldName, Collection addresses) { Header header = obtainHeader(); if (addresses == null || addresses.isEmpty()) { header.removeFields(fieldName); } else { header.setField(newAddressList(fieldName, addresses)); } } protected abstract AddressListField newAddressList(String fieldName, Collection addresses); protected abstract UnstructuredField newSubject(String subject); protected abstract DateTimeField newDate(Date date, TimeZone zone); protected abstract MailboxField newMailbox(String fieldName, Mailbox mailbox); protected abstract MailboxListField newMailboxList(String fieldName, Collection mailboxes); } ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/message/DefaultMessageWriter.javaapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/message/DefaultMessageWriter.j0000644000000000000000000002256311702050530031663 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.message; import java.io.IOException; import java.io.OutputStream; import org.apache.james.mime4j.codec.CodecUtil; import org.apache.james.mime4j.dom.BinaryBody; import org.apache.james.mime4j.dom.Body; import org.apache.james.mime4j.dom.Entity; import org.apache.james.mime4j.dom.Header; import org.apache.james.mime4j.dom.Message; import org.apache.james.mime4j.dom.MessageWriter; import org.apache.james.mime4j.dom.Multipart; import org.apache.james.mime4j.dom.SingleBody; import org.apache.james.mime4j.dom.field.ContentTypeField; import org.apache.james.mime4j.dom.field.FieldName; import org.apache.james.mime4j.stream.Field; import org.apache.james.mime4j.util.ByteArrayBuffer; import org.apache.james.mime4j.util.ByteSequence; import org.apache.james.mime4j.util.ContentUtil; import org.apache.james.mime4j.util.MimeUtil; /** * Default implementation of {@link MessageWriter}. */ public class DefaultMessageWriter implements MessageWriter { private static final byte[] CRLF = { '\r', '\n' }; private static final byte[] DASHES = { '-', '-' }; /** * Protected constructor prevents direct instantiation. */ public DefaultMessageWriter() { } /** * Write the specified Body to the specified * OutputStream. * * @param body * the Body to write. * @param out * the OutputStream to write to. * @throws IOException * if an I/O error occurs. */ public void writeBody(Body body, OutputStream out) throws IOException { if (body instanceof Message) { writeEntity((Message) body, out); } else if (body instanceof Multipart) { writeMultipart((Multipart) body, out); } else if (body instanceof SingleBody) { ((SingleBody) body).writeTo(out); } else throw new IllegalArgumentException("Unsupported body class"); } /** * Write the specified Entity to the specified * OutputStream. * * @param entity * the Entity to write. * @param out * the OutputStream to write to. * @throws IOException * if an I/O error occurs. */ public void writeEntity(Entity entity, OutputStream out) throws IOException { final Header header = entity.getHeader(); if (header == null) throw new IllegalArgumentException("Missing header"); writeHeader(header, out); final Body body = entity.getBody(); if (body == null) throw new IllegalArgumentException("Missing body"); boolean binaryBody = body instanceof BinaryBody; OutputStream encOut = encodeStream(out, entity .getContentTransferEncoding(), binaryBody); writeBody(body, encOut); // close if wrapped (base64 or quoted-printable) if (encOut != out) encOut.close(); } /** * Write the specified Message to the specified * OutputStream. * * @param message * the Message to write. * @param out * the OutputStream to write to. * @throws IOException * if an I/O error occurs. */ public void writeMessage(Message message, OutputStream out) throws IOException { writeEntity(message, out); } /** * Write the specified Multipart to the specified * OutputStream. * * @param multipart * the Multipart to write. * @param out * the OutputStream to write to. * @throws IOException * if an I/O error occurs. */ public void writeMultipart(Multipart multipart, OutputStream out) throws IOException { ContentTypeField contentType = getContentType(multipart); ByteSequence boundary = getBoundary(contentType); ByteSequence preamble; ByteSequence epilogue; if (multipart instanceof MultipartImpl) { preamble = ((MultipartImpl) multipart).getPreambleRaw(); epilogue = ((MultipartImpl) multipart).getEpilogueRaw(); } else { preamble = multipart.getPreamble() != null ? ContentUtil.encode(multipart.getPreamble()) : null; epilogue = multipart.getEpilogue() != null ? ContentUtil.encode(multipart.getEpilogue()) : null; } if (preamble != null) { writeBytes(preamble, out); out.write(CRLF); } for (Entity bodyPart : multipart.getBodyParts()) { out.write(DASHES); writeBytes(boundary, out); out.write(CRLF); writeEntity(bodyPart, out); out.write(CRLF); } out.write(DASHES); writeBytes(boundary, out); out.write(DASHES); out.write(CRLF); if (epilogue != null) { writeBytes(epilogue, out); } } /** * Write the specified Field to the specified * OutputStream. * * @param field * the Field to write. * @param out * the OutputStream to write to. * @throws IOException * if an I/O error occurs. */ public void writeField(Field field, OutputStream out) throws IOException { ByteSequence raw = field.getRaw(); if (raw == null) { StringBuilder buf = new StringBuilder(); buf.append(field.getName()); buf.append(": "); String body = field.getBody(); if (body != null) { buf.append(body); } raw = ContentUtil.encode(MimeUtil.fold(buf.toString(), 0)); } writeBytes(raw, out); out.write(CRLF); } /** * Write the specified Header to the specified * OutputStream. * * @param header * the Header to write. * @param out * the OutputStream to write to. * @throws IOException * if an I/O error occurs. */ public void writeHeader(Header header, OutputStream out) throws IOException { for (Field field : header) { writeField(field, out); } out.write(CRLF); } protected OutputStream encodeStream(OutputStream out, String encoding, boolean binaryBody) throws IOException { if (MimeUtil.isBase64Encoding(encoding)) { return CodecUtil.wrapBase64(out); } else if (MimeUtil.isQuotedPrintableEncoded(encoding)) { return CodecUtil.wrapQuotedPrintable(out, binaryBody); } else { return out; } } private ContentTypeField getContentType(Multipart multipart) { Entity parent = multipart.getParent(); if (parent == null) throw new IllegalArgumentException( "Missing parent entity in multipart"); Header header = parent.getHeader(); if (header == null) throw new IllegalArgumentException( "Missing header in parent entity"); ContentTypeField contentType = (ContentTypeField) header .getField(FieldName.CONTENT_TYPE); if (contentType == null) throw new IllegalArgumentException( "Content-Type field not specified"); return contentType; } private ByteSequence getBoundary(ContentTypeField contentType) { String boundary = contentType.getBoundary(); if (boundary == null) throw new IllegalArgumentException( "Multipart boundary not specified. Mime-Type: "+contentType.getMimeType()+", Raw: "+contentType.toString()); return ContentUtil.encode(boundary); } private void writeBytes(ByteSequence byteSequence, OutputStream out) throws IOException { if (byteSequence instanceof ByteArrayBuffer) { ByteArrayBuffer bab = (ByteArrayBuffer) byteSequence; out.write(bab.buffer(), 0, bab.length()); } else { out.write(byteSequence.toByteArray()); } } } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/message/AbstractMultipart.java0000644000000000000000000001577411702050530031740 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.message; import java.util.Collections; import java.util.LinkedList; import java.util.List; import org.apache.james.mime4j.dom.Entity; import org.apache.james.mime4j.dom.Multipart; /** * Abstract MIME multipart body. */ public abstract class AbstractMultipart implements Multipart { protected List bodyParts = new LinkedList(); private Entity parent = null; private String subType; /** * Creates a new empty Multipart instance. */ public AbstractMultipart(String subType) { this.subType = subType; } /** * Gets the multipart sub-type. E.g. alternative (the * default) or parallel. See RFC 2045 for common sub-types * and their meaning. * * @return the multipart sub-type. */ public String getSubType() { return subType; } /** * Sets the multipart sub-type. E.g. alternative or * parallel. See RFC 2045 for common sub-types and their * meaning. * * @param subType * the sub-type. */ public void setSubType(String subType) { this.subType = subType; } /** * @see org.apache.james.mime4j.dom.Body#getParent() */ public Entity getParent() { return parent; } /** * @see org.apache.james.mime4j.dom.Body#setParent(org.apache.james.mime4j.dom.Entity) */ public void setParent(Entity parent) { this.parent = parent; for (Entity bodyPart : bodyParts) { bodyPart.setParent(parent); } } /** * Returns the number of body parts. * * @return number of Entity objects. */ public int getCount() { return bodyParts.size(); } /** * Gets the list of body parts. The list is immutable. * * @return the list of Entity objects. */ public List getBodyParts() { return Collections.unmodifiableList(bodyParts); } /** * Sets the list of body parts. * * @param bodyParts * the new list of Entity objects. */ public void setBodyParts(List bodyParts) { this.bodyParts = bodyParts; for (Entity bodyPart : bodyParts) { bodyPart.setParent(parent); } } /** * Adds a body part to the end of the list of body parts. * * @param bodyPart * the body part. */ public void addBodyPart(Entity bodyPart) { if (bodyPart == null) throw new IllegalArgumentException(); bodyParts.add(bodyPart); bodyPart.setParent(parent); } /** * Inserts a body part at the specified position in the list of body parts. * * @param bodyPart * the body part. * @param index * index at which the specified body part is to be inserted. * @throws IndexOutOfBoundsException * if the index is out of range (index < 0 || index > * getCount()). */ public void addBodyPart(Entity bodyPart, int index) { if (bodyPart == null) throw new IllegalArgumentException(); bodyParts.add(index, bodyPart); bodyPart.setParent(parent); } /** * Removes the body part at the specified position in the list of body * parts. * * @param index * index of the body part to be removed. * @return the removed body part. * @throws IndexOutOfBoundsException * if the index is out of range (index < 0 || index >= * getCount()). */ public Entity removeBodyPart(int index) { Entity bodyPart = bodyParts.remove(index); bodyPart.setParent(null); return bodyPart; } /** * Replaces the body part at the specified position in the list of body * parts with the specified body part. * * @param bodyPart * body part to be stored at the specified position. * @param index * index of body part to replace. * @return the replaced body part. * @throws IndexOutOfBoundsException * if the index is out of range (index < 0 || index >= * getCount()). */ public Entity replaceBodyPart(Entity bodyPart, int index) { if (bodyPart == null) throw new IllegalArgumentException(); Entity replacedEntity = bodyParts.set(index, bodyPart); if (bodyPart == replacedEntity) throw new IllegalArgumentException( "Cannot replace body part with itself"); bodyPart.setParent(parent); replacedEntity.setParent(null); return replacedEntity; } /** * Gets the preamble or null if the message has no preamble. * * @return the preamble. */ public abstract String getPreamble(); /** * Sets the preamble with a value or null to remove the preamble. * * @param preamble * the preamble. */ public abstract void setPreamble(String preamble); /** * Gets the epilogue or null if the message has no epilogue * * @return the epilogue. */ public abstract String getEpilogue(); /** * Sets the epilogue value, or remove it if the value passed is null. * * @param epilogue * the epilogue. */ public abstract void setEpilogue(String epilogue); /** * Disposes of the BodyParts of this Multipart. Note that the dispose call * does not get forwarded to the parent entity of this Multipart. * * @see org.apache.james.mime4j.dom.Disposable#dispose() */ public void dispose() { for (Entity bodyPart : bodyParts) { bodyPart.dispose(); } } } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/message/AbstractHeader.java0000644000000000000000000001532611702050530031140 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.message; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import org.apache.james.mime4j.dom.Header; import org.apache.james.mime4j.stream.Field; /** * Abstract MIME header. */ public abstract class AbstractHeader implements Header { private List fields = new LinkedList(); private Map> fieldMap = new HashMap>(); /** * Creates a new empty Header. */ public AbstractHeader() { } /** * Creates a new Header from the specified * Header. The Header instance is initialized * with a copy of the list of {@link Field}s of the specified * Header. The Field objects are not copied * because they are immutable and can safely be shared between headers. * * @param other * header to copy. */ public AbstractHeader(Header other) { for (Field otherField : other.getFields()) { addField(otherField); } } /** * Adds a field to the end of the list of fields. * * @param field the field to add. */ public void addField(Field field) { List values = fieldMap.get(field.getName().toLowerCase()); if (values == null) { values = new LinkedList(); fieldMap.put(field.getName().toLowerCase(), values); } values.add(field); fields.add(field); } /** * Gets the fields of this header. The returned list will not be * modifiable. * * @return the list of Field objects. */ public List getFields() { return Collections.unmodifiableList(fields); } /** * Gets a Field given a field name. If there are multiple * such fields defined in this header the first one will be returned. * * @param name the field name (e.g. From, Subject). * @return the field or null if none found. */ public Field getField(String name) { List l = fieldMap.get(name.toLowerCase()); if (l != null && !l.isEmpty()) { return l.get(0); } return null; } /** * Gets all Fields having the specified field name. * * @param name the field name (e.g. From, Subject). * @return the list of fields. */ public List getFields(final String name) { final String lowerCaseName = name.toLowerCase(); final List l = fieldMap.get(lowerCaseName); final List results; if (l == null || l.isEmpty()) { results = Collections.emptyList(); } else { results = Collections.unmodifiableList(l); } return results; } /** * Returns an iterator over the list of fields of this header. * * @return an iterator. */ public Iterator iterator() { return Collections.unmodifiableList(fields).iterator(); } /** * Removes all Fields having the specified field name. * * @param name * the field name (e.g. From, Subject). * @return number of fields removed. */ public int removeFields(String name) { final String lowerCaseName = name.toLowerCase(); List removed = fieldMap.remove(lowerCaseName); if (removed == null || removed.isEmpty()) return 0; for (Iterator iterator = fields.iterator(); iterator.hasNext();) { Field field = iterator.next(); if (field.getName().equalsIgnoreCase(name)) iterator.remove(); } return removed.size(); } /** * Sets or replaces a field. This method is useful for header fields such as * Subject or Message-ID that should not occur more than once in a message. * * If this Header does not already contain a header field of * the same name as the given field then it is added to the end of the list * of fields (same behavior as {@link #addField(Field)}). Otherwise the * first occurrence of a field with the same name is replaced by the given * field and all further occurrences are removed. * * @param field the field to set. */ public void setField(Field field) { final String lowerCaseName = field.getName().toLowerCase(); List l = fieldMap.get(lowerCaseName); if (l == null || l.isEmpty()) { addField(field); return; } l.clear(); l.add(field); int firstOccurrence = -1; int index = 0; for (Iterator iterator = fields.iterator(); iterator.hasNext(); index++) { Field f = iterator.next(); if (f.getName().equalsIgnoreCase(field.getName())) { iterator.remove(); if (firstOccurrence == -1) firstOccurrence = index; } } fields.add(firstOccurrence, field); } /** * Return Header Object as String representation. Each headerline is * seperated by "\r\n" * * @return headers */ @Override public String toString() { StringBuilder str = new StringBuilder(128); for (Field field : fields) { str.append(field.toString()); str.append("\r\n"); } return str.toString(); } } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/message/StringBody.java0000644000000000000000000000423411702050530030344 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.message; import java.io.IOException; import java.io.InputStream; import java.io.Reader; import java.io.StringReader; import java.nio.charset.Charset; import org.apache.james.mime4j.dom.SingleBody; import org.apache.james.mime4j.dom.TextBody; class StringBody extends TextBody { private final String content; private final Charset charset; StringBody(final String content, final Charset charset) { super(); this.content = content; this.charset = charset; } @Override public String getMimeCharset() { return this.charset.name(); } @Override public Reader getReader() throws IOException { return new StringReader(this.content); } @Override public InputStream getInputStream() throws IOException { return new StringInputStream(this.content, this.charset, 2048); } @Override public SingleBody copy() { return new StringBody(this.content, this.charset); } } ././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/message/DefaultMessageBuilder.javaapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/message/DefaultMessageBuilder.0000644000000000000000000003047411702050530031623 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.message; import java.io.IOException; import java.io.InputStream; import org.apache.james.mime4j.MimeException; import org.apache.james.mime4j.MimeIOException; import org.apache.james.mime4j.codec.DecodeMonitor; import org.apache.james.mime4j.dom.Body; import org.apache.james.mime4j.dom.Disposable; import org.apache.james.mime4j.dom.Entity; import org.apache.james.mime4j.dom.FieldParser; import org.apache.james.mime4j.dom.Header; import org.apache.james.mime4j.dom.Message; import org.apache.james.mime4j.dom.MessageBuilder; import org.apache.james.mime4j.dom.Multipart; import org.apache.james.mime4j.dom.SingleBody; import org.apache.james.mime4j.dom.field.ParsedField; import org.apache.james.mime4j.field.DefaultFieldParser; import org.apache.james.mime4j.field.LenientFieldParser; import org.apache.james.mime4j.parser.AbstractContentHandler; import org.apache.james.mime4j.parser.MimeStreamParser; import org.apache.james.mime4j.stream.BodyDescriptorBuilder; import org.apache.james.mime4j.stream.Field; import org.apache.james.mime4j.stream.MimeConfig; /** * Default implementation of {@link MessageBuilder}. */ public class DefaultMessageBuilder implements MessageBuilder { private FieldParser fieldParser = null; private BodyFactory bodyFactory = null; private MimeConfig config = null; private BodyDescriptorBuilder bodyDescBuilder = null; private boolean contentDecoding = true; private boolean flatMode = false; private DecodeMonitor monitor = null; public DefaultMessageBuilder() { super(); } public void setFieldParser(final FieldParser fieldParser) { this.fieldParser = fieldParser; } public void setBodyFactory(final BodyFactory bodyFactory) { this.bodyFactory = bodyFactory; } public void setMimeEntityConfig(final MimeConfig config) { this.config = config; } public void setBodyDescriptorBuilder(final BodyDescriptorBuilder bodyDescBuilder) { this.bodyDescBuilder = bodyDescBuilder; } public void setDecodeMonitor(final DecodeMonitor monitor) { this.monitor = monitor; } public void setContentDecoding(boolean contentDecoding) { this.contentDecoding = contentDecoding; } public void setFlatMode(boolean flatMode) { this.flatMode = flatMode; } /** * Creates a new Header from the specified * Header. The Header instance is initialized * with a copy of the list of {@link Field}s of the specified * Header. The Field objects are not copied * because they are immutable and can safely be shared between headers. * * @param other * header to copy. */ public Header copy(Header other) { HeaderImpl copy = new HeaderImpl(); for (Field otherField : other.getFields()) { copy.addField(otherField); } return copy; } /** * Creates a new BodyPart from the specified * Entity. The BodyPart instance is initialized * with copies of header and body of the specified Entity. * The parent entity of the new body part is null. * * @param other * body part to copy. * @throws UnsupportedOperationException * if other contains a {@link SingleBody} that * does not support the {@link SingleBody#copy() copy()} * operation. * @throws IllegalArgumentException * if other contains a Body that * is neither a {@link Message}, {@link Multipart} or * {@link SingleBody}. */ public BodyPart copy(Entity other) { BodyPart copy = new BodyPart(); if (other.getHeader() != null) { copy.setHeader(copy(other.getHeader())); } if (other.getBody() != null) { copy.setBody(copy(other.getBody())); } return copy; } /** * Creates a new Multipart from the specified * Multipart. The Multipart instance is * initialized with copies of preamble, epilogue, sub type and the list of * body parts of the specified Multipart. The parent entity * of the new multipart is null. * * @param other * multipart to copy. * @throws UnsupportedOperationException * if other contains a {@link SingleBody} that * does not support the {@link SingleBody#copy() copy()} * operation. * @throws IllegalArgumentException * if other contains a Body that * is neither a {@link Message}, {@link Multipart} or * {@link SingleBody}. */ public Multipart copy(Multipart other) { MultipartImpl copy = new MultipartImpl(other.getSubType()); for (Entity otherBodyPart : other.getBodyParts()) { copy.addBodyPart(copy(otherBodyPart)); } copy.setPreamble(other.getPreamble()); copy.setEpilogue(other.getEpilogue()); return copy; } /** * Returns a copy of the given {@link Body} that can be used (and modified) * independently of the original. The copy should be * {@link Disposable#dispose() disposed of} when it is no longer needed. *

* The {@link Body#getParent() parent} of the returned copy is * null, that is, the copy is detached from the parent * entity of the original. * * @param body * body to copy. * @return a copy of the given body. * @throws UnsupportedOperationException * if body is an instance of {@link SingleBody} * that does not support the {@link SingleBody#copy() copy()} * operation (or contains such a SingleBody). * @throws IllegalArgumentException * if body is null or * body is a Body that is neither * a {@link MessageImpl}, {@link Multipart} or {@link SingleBody} * (or contains such a Body). */ public Body copy(Body body) { if (body == null) throw new IllegalArgumentException("Body is null"); if (body instanceof Message) return copy((Message) body); if (body instanceof Multipart) return copy((Multipart) body); if (body instanceof SingleBody) return ((SingleBody) body).copy(); throw new IllegalArgumentException("Unsupported body class"); } /** * Creates a new Message from the specified * Message. The Message instance is * initialized with copies of header and body of the specified * Message. The parent entity of the new message is * null. * * @param other * message to copy. * @throws UnsupportedOperationException * if other contains a {@link SingleBody} that * does not support the {@link SingleBody#copy() copy()} * operation. * @throws IllegalArgumentException * if other contains a Body that * is neither a {@link MessageImpl}, {@link Multipart} or * {@link SingleBody}. */ public Message copy(Message other) { MessageImpl copy = new MessageImpl(); if (other.getHeader() != null) { copy.setHeader(copy(other.getHeader())); } if (other.getBody() != null) { copy.setBody(copy(other.getBody())); } return copy; } public Header newHeader() { return new HeaderImpl(); } public Header newHeader(final Header source) { return copy(source); } public Multipart newMultipart(final String subType) { return new MultipartImpl(subType); } public Multipart newMultipart(final Multipart source) { return copy(source); } public Header parseHeader(final InputStream is) throws IOException, MimeIOException { final MimeConfig cfg = config != null ? config : new MimeConfig(); boolean strict = cfg.isStrictParsing(); final DecodeMonitor mon = monitor != null ? monitor : strict ? DecodeMonitor.STRICT : DecodeMonitor.SILENT; final FieldParser fp = fieldParser != null ? fieldParser : strict ? DefaultFieldParser.getParser() : LenientFieldParser.getParser(); final HeaderImpl header = new HeaderImpl(); final MimeStreamParser parser = new MimeStreamParser(); parser.setContentHandler(new AbstractContentHandler() { @Override public void endHeader() { parser.stop(); } @Override public void field(Field field) throws MimeException { ParsedField parsedField; if (field instanceof ParsedField) { parsedField = (ParsedField) field; } else { parsedField = fp.parse(field, mon); } header.addField(parsedField); } }); try { parser.parse(is); } catch (MimeException ex) { throw new MimeIOException(ex); } return header; } public Message newMessage() { return new MessageImpl(); } public Message newMessage(final Message source) { return copy(source); } public Message parseMessage(final InputStream is) throws IOException, MimeIOException { try { MessageImpl message = new MessageImpl(); MimeConfig cfg = config != null ? config : new MimeConfig(); boolean strict = cfg.isStrictParsing(); DecodeMonitor mon = monitor != null ? monitor : strict ? DecodeMonitor.STRICT : DecodeMonitor.SILENT; BodyDescriptorBuilder bdb = bodyDescBuilder != null ? bodyDescBuilder : new DefaultBodyDescriptorBuilder(null, fieldParser != null ? fieldParser : strict ? DefaultFieldParser.getParser() : LenientFieldParser.getParser(), mon); BodyFactory bf = bodyFactory != null ? bodyFactory : new BasicBodyFactory(); MimeStreamParser parser = new MimeStreamParser(cfg, mon, bdb); // EntityBuilder expect the parser will send ParserFields for the well known fields // It will throw exceptions, otherwise. parser.setContentHandler(new EntityBuilder(message, bf)); parser.setContentDecoding(contentDecoding); if (flatMode) { parser.setFlat(); } else { parser.setRecurse(); } parser.parse(is); return message; } catch (MimeException e) { throw new MimeIOException(e); } } } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/message/EntityBuilder.java0000644000000000000000000001657711702050530031060 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.message; import java.io.IOException; import java.io.InputStream; import java.util.Stack; import org.apache.james.mime4j.MimeException; import org.apache.james.mime4j.dom.Body; import org.apache.james.mime4j.dom.Entity; import org.apache.james.mime4j.dom.Header; import org.apache.james.mime4j.dom.Message; import org.apache.james.mime4j.dom.Multipart; import org.apache.james.mime4j.parser.ContentHandler; import org.apache.james.mime4j.stream.BodyDescriptor; import org.apache.james.mime4j.stream.Field; import org.apache.james.mime4j.stream.RawField; import org.apache.james.mime4j.util.ByteArrayBuffer; import org.apache.james.mime4j.util.ByteSequence; /** * A ContentHandler for building an Entity to be * used in conjunction with a {@link org.apache.james.mime4j.parser.MimeStreamParser}. */ class EntityBuilder implements ContentHandler { private final Entity entity; private final BodyFactory bodyFactory; private final Stack stack; EntityBuilder( final Entity entity, final BodyFactory bodyFactory) { this.entity = entity; this.bodyFactory = bodyFactory; this.stack = new Stack(); } private void expect(Class c) { if (!c.isInstance(stack.peek())) { throw new IllegalStateException("Internal stack error: " + "Expected '" + c.getName() + "' found '" + stack.peek().getClass().getName() + "'"); } } /** * @see org.apache.james.mime4j.parser.ContentHandler#startMessage() */ public void startMessage() throws MimeException { if (stack.isEmpty()) { stack.push(this.entity); } else { expect(Entity.class); Message m = new MessageImpl(); ((Entity) stack.peek()).setBody(m); stack.push(m); } } /** * @see org.apache.james.mime4j.parser.ContentHandler#endMessage() */ public void endMessage() throws MimeException { expect(Message.class); stack.pop(); } /** * @see org.apache.james.mime4j.parser.ContentHandler#startHeader() */ public void startHeader() throws MimeException { stack.push(new HeaderImpl()); } /** * @see org.apache.james.mime4j.parser.ContentHandler#field(RawField) */ public void field(Field field) throws MimeException { expect(Header.class); ((Header) stack.peek()).addField(field); } /** * @see org.apache.james.mime4j.parser.ContentHandler#endHeader() */ public void endHeader() throws MimeException { expect(Header.class); Header h = (Header) stack.pop(); expect(Entity.class); ((Entity) stack.peek()).setHeader(h); } /** * @see org.apache.james.mime4j.parser.ContentHandler#startMultipart(org.apache.james.mime4j.stream.BodyDescriptor) */ public void startMultipart(final BodyDescriptor bd) throws MimeException { expect(Entity.class); final Entity e = (Entity) stack.peek(); final String subType = bd.getSubType(); final Multipart multiPart = new MultipartImpl(subType); e.setBody(multiPart); stack.push(multiPart); } /** * @see org.apache.james.mime4j.parser.ContentHandler#body(org.apache.james.mime4j.stream.BodyDescriptor, java.io.InputStream) */ public void body(BodyDescriptor bd, final InputStream is) throws MimeException, IOException { expect(Entity.class); // NO NEED TO MANUALLY RUN DECODING. // The parser has a "setContentDecoding" method. We should // simply instantiate the MimeStreamParser with that method. // final String enc = bd.getTransferEncoding(); final Body body; /* final InputStream decodedStream; if (MimeUtil.ENC_BASE64.equals(enc)) { decodedStream = new Base64InputStream(is); } else if (MimeUtil.ENC_QUOTED_PRINTABLE.equals(enc)) { decodedStream = new QuotedPrintableInputStream(is); } else { decodedStream = is; } */ if (bd.getMimeType().startsWith("text/")) { body = bodyFactory.textBody(is, bd.getCharset()); } else { body = bodyFactory.binaryBody(is); } Entity entity = ((Entity) stack.peek()); entity.setBody(body); } /** * @see org.apache.james.mime4j.parser.ContentHandler#endMultipart() */ public void endMultipart() throws MimeException { stack.pop(); } /** * @see org.apache.james.mime4j.parser.ContentHandler#startBodyPart() */ public void startBodyPart() throws MimeException { expect(Multipart.class); BodyPart bodyPart = new BodyPart(); ((Multipart) stack.peek()).addBodyPart(bodyPart); stack.push(bodyPart); } /** * @see org.apache.james.mime4j.parser.ContentHandler#endBodyPart() */ public void endBodyPart() throws MimeException { expect(BodyPart.class); stack.pop(); } /** * @see org.apache.james.mime4j.parser.ContentHandler#epilogue(java.io.InputStream) */ public void epilogue(InputStream is) throws MimeException, IOException { expect(MultipartImpl.class); ByteSequence bytes = loadStream(is); ((MultipartImpl) stack.peek()).setEpilogueRaw(bytes); } /** * @see org.apache.james.mime4j.parser.ContentHandler#preamble(java.io.InputStream) */ public void preamble(InputStream is) throws MimeException, IOException { expect(MultipartImpl.class); ByteSequence bytes = loadStream(is); ((MultipartImpl) stack.peek()).setPreambleRaw(bytes); } /** * Unsupported. * @see org.apache.james.mime4j.parser.ContentHandler#raw(java.io.InputStream) */ public void raw(InputStream is) throws MimeException, IOException { throw new UnsupportedOperationException("Not supported"); } private static ByteSequence loadStream(InputStream in) throws IOException { ByteArrayBuffer bab = new ByteArrayBuffer(64); int b; while ((b = in.read()) != -1) { bab.append(b); } return bab; } } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/message/BasicBinaryBody.java0000644000000000000000000000340711702050530031265 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.message; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import org.apache.james.mime4j.dom.BinaryBody; class BasicBinaryBody extends BinaryBody { private final byte[] content; BasicBinaryBody(final byte[] content) { super(); this.content = content; } @Override public InputStream getInputStream() throws IOException { return new ByteArrayInputStream(this.content); } @Override public BasicBinaryBody copy() { return new BasicBinaryBody(this.content); } } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/message/BasicBodyFactory.java0000644000000000000000000000650011702050530031445 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.message; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.nio.charset.Charset; import java.nio.charset.UnsupportedCharsetException; import org.apache.james.mime4j.dom.BinaryBody; import org.apache.james.mime4j.dom.TextBody; import org.apache.james.mime4j.util.CharsetUtil; /** * Factory for creating message bodies. */ public class BasicBodyFactory implements BodyFactory { public BinaryBody binaryBody(final InputStream is) throws IOException { return new BasicBinaryBody(bufferContent(is)); } public TextBody textBody(final InputStream is, final String mimeCharset) throws IOException { return new BasicTextBody(bufferContent(is), mimeCharset); } private static byte[] bufferContent(final InputStream is) throws IOException { if (is == null) { throw new IllegalArgumentException("Input stream may not be null"); } ByteArrayOutputStream buf = new ByteArrayOutputStream(); byte[] tmp = new byte[2048]; int l; while ((l = is.read(tmp)) != -1) { buf.write(tmp, 0, l); } return buf.toByteArray(); } public TextBody textBody(final String text, final String mimeCharset) throws UnsupportedEncodingException { if (text == null) { throw new IllegalArgumentException("Text may not be null"); } Charset charset = Charset.forName(mimeCharset); try { return new StringBody(text, charset); } catch (UnsupportedCharsetException ex) { throw new UnsupportedEncodingException(ex.getMessage()); } } public TextBody textBody(final String text, final Charset charset) { if (text == null) { throw new IllegalArgumentException("Text may not be null"); } return new StringBody(text, charset); } public TextBody textBody(final String text) { return textBody(text, CharsetUtil.DEFAULT_CHARSET); } public BinaryBody binaryBody(final byte[] buf) { return new BasicBinaryBody(buf); } } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/0000755000000000000000000000000011702050526024552 5ustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/MessageBuilder.java0000644000000000000000000000373511702050526030320 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom; import java.io.IOException; import java.io.InputStream; import org.apache.james.mime4j.MimeException; /** * An interface to build instances of {@link Message} and other DOM elements either without * any content, by copying content of an existing object or by reading content from * an {@link InputStream}. */ public interface MessageBuilder { Header newHeader(); Header newHeader(Header source); Multipart newMultipart(String subType); Multipart newMultipart(Multipart source); Message newMessage(); Message newMessage(Message source); Header parseHeader(InputStream source) throws MimeException, IOException; Message parseMessage(InputStream source) throws MimeException, IOException; } ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/ServiceLoaderException.javaapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/ServiceLoaderException.jav0000644000000000000000000000314711702050526031667 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom; public class ServiceLoaderException extends RuntimeException { private static final long serialVersionUID = -2801857820835508778L; public ServiceLoaderException(String message) { super(message); } public ServiceLoaderException(Throwable cause) { super(cause); } public ServiceLoaderException(String message, Throwable cause) { super(message, cause); } } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/Message.java0000644000000000000000000002373211702050526027010 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom; import java.util.Collection; import java.util.Date; import java.util.TimeZone; import org.apache.james.mime4j.dom.address.Address; import org.apache.james.mime4j.dom.address.AddressList; import org.apache.james.mime4j.dom.address.Mailbox; import org.apache.james.mime4j.dom.address.MailboxList; /** * An MIME message (as defined in RFC 2045). */ public interface Message extends Entity, Body { /** * Returns the value of the Message-ID header field of this message * or null if it is not present. * * @return the identifier of this message. */ String getMessageId(); /** * Creates and sets a new Message-ID header field for this message. * A Header is created if this message does not already have * one. * * @param hostname * host name to be included in the identifier or * null if no host name should be included. */ void createMessageId(String hostname); /** * Returns the (decoded) value of the Subject header field of this * message or null if it is not present. * * @return the subject of this message. */ String getSubject(); /** * Sets the Subject header field for this message. The specified * string may contain non-ASCII characters, in which case it gets encoded as * an 'encoded-word' automatically. A Header is created if * this message does not already have one. * * @param subject * subject to set or null to remove the subject * header field. */ void setSubject(String subject); /** * Returns the value of the Date header field of this message as * Date object or null if it is not present. * * @return the date of this message. */ Date getDate(); /** * Sets the Date header field for this message. This method uses the * default TimeZone of this host to encode the specified * Date object into a string. * * @param date * date to set or null to remove the date header * field. */ void setDate(Date date); /** * Sets the Date header field for this message. The specified * TimeZone is used to encode the specified Date * object into a string. * * @param date * date to set or null to remove the date header * field. * @param zone * a time zone. */ void setDate(Date date, TimeZone zone); /** * Returns the value of the Sender header field of this message as * Mailbox object or null if it is not * present. * * @return the sender of this message. */ Mailbox getSender(); /** * Sets the Sender header field of this message to the specified * mailbox address. * * @param sender * address to set or null to remove the header * field. */ void setSender(Mailbox sender); /** * Returns the value of the From header field of this message as * MailboxList object or null if it is not * present. * * @return value of the from field of this message. */ MailboxList getFrom(); /** * Sets the From header field of this message to the specified * mailbox address. * * @param from * address to set or null to remove the header * field. */ void setFrom(Mailbox from); /** * Sets the From header field of this message to the specified * mailbox addresses. * * @param from * addresses to set or null or no arguments to * remove the header field. */ void setFrom(Mailbox... from); /** * Sets the From header field of this message to the specified * mailbox addresses. * * @param from * addresses to set or null or an empty collection * to remove the header field. */ void setFrom(Collection from); /** * Returns the value of the To header field of this message as * AddressList object or null if it is not * present. * * @return value of the to field of this message. */ AddressList getTo(); /** * Sets the To header field of this message to the specified * address. * * @param to * address to set or null to remove the header * field. */ void setTo(Address to); /** * Sets the To header field of this message to the specified * addresses. * * @param to * addresses to set or null or no arguments to * remove the header field. */ void setTo(Address... to); /** * Sets the To header field of this message to the specified * addresses. * * @param to * addresses to set or null or an empty collection * to remove the header field. */ void setTo(Collection to); /** * Returns the value of the Cc header field of this message as * AddressList object or null if it is not * present. * * @return value of the cc field of this message. */ AddressList getCc(); /** * Sets the Cc header field of this message to the specified * address. * * @param cc * address to set or null to remove the header * field. */ void setCc(Address cc); /** * Sets the Cc header field of this message to the specified * addresses. * * @param cc * addresses to set or null or no arguments to * remove the header field. */ void setCc(Address... cc); /** * Sets the Cc header field of this message to the specified * addresses. * * @param cc * addresses to set or null or an empty collection * to remove the header field. */ void setCc(Collection cc); /** * Returns the value of the Bcc header field of this message as * AddressList object or null if it is not * present. * * @return value of the bcc field of this message. */ AddressList getBcc(); /** * Sets the Bcc header field of this message to the specified * address. * * @param bcc * address to set or null to remove the header * field. */ void setBcc(Address bcc); /** * Sets the Bcc header field of this message to the specified * addresses. * * @param bcc * addresses to set or null or no arguments to * remove the header field. */ void setBcc(Address... bcc); /** * Sets the Bcc header field of this message to the specified * addresses. * * @param bcc * addresses to set or null or an empty collection * to remove the header field. */ void setBcc(Collection bcc); /** * Returns the value of the Reply-To header field of this message as * AddressList object or null if it is not * present. * * @return value of the reply to field of this message. */ AddressList getReplyTo(); /** * Sets the Reply-To header field of this message to the specified * address. * * @param replyTo * address to set or null to remove the header * field. */ void setReplyTo(Address replyTo); /** * Sets the Reply-To header field of this message to the specified * addresses. * * @param replyTo * addresses to set or null or no arguments to * remove the header field. */ void setReplyTo(Address... replyTo); /** * Sets the Reply-To header field of this message to the specified * addresses. * * @param replyTo * addresses to set or null or an empty collection * to remove the header field. */ void setReplyTo(Collection replyTo); } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/address/0000755000000000000000000000000011702050526026177 5ustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/address/DomainList.java0000644000000000000000000000601511702050526031107 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom.address; import java.io.Serializable; import java.util.AbstractList; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * An immutable, random-access list of Strings (that are supposedly domain names * or domain literals). */ public class DomainList extends AbstractList implements Serializable { private static final long serialVersionUID = 1L; private final List domains; /** * @param domains * A List that contains only String objects. * @param dontCopy * true iff it is not possible for the domains list to be * modified by someone else. */ public DomainList(List domains, boolean dontCopy) { if (domains != null) this.domains = dontCopy ? domains : new ArrayList(domains); else this.domains = Collections.emptyList(); } /** * The number of elements in this list. */ @Override public int size() { return domains.size(); } /** * Gets the domain name or domain literal at the specified index. * * @throws IndexOutOfBoundsException * If index is < 0 or >= size(). */ @Override public String get(int index) { return domains.get(index); } /** * Returns the list of domains formatted as a route string (not including * the trailing ':'). */ public String toRouteString() { StringBuilder sb = new StringBuilder(); for (String domain : domains) { if (sb.length() > 0) { sb.append(','); } sb.append("@"); sb.append(domain); } return sb.toString(); } @Override public String toString() { return toRouteString(); } } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/address/Group.java0000644000000000000000000000654511702050526030150 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom.address; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; /** * A named group of zero or more mailboxes. */ public class Group extends Address { private static final long serialVersionUID = 1L; private final String name; private final MailboxList mailboxList; /** * @param name * The group name. * @param mailboxes * The mailboxes in this group. */ public Group(String name, MailboxList mailboxes) { if (name == null) throw new IllegalArgumentException(); if (mailboxes == null) throw new IllegalArgumentException(); this.name = name; this.mailboxList = mailboxes; } /** * @param name * The group name. * @param mailboxes * The mailboxes in this group. */ public Group(String name, Mailbox... mailboxes) { this(name, new MailboxList(Arrays.asList(mailboxes), true)); } /** * @param name * The group name. * @param mailboxes * The mailboxes in this group. */ public Group(String name, Collection mailboxes) { this(name, new MailboxList(new ArrayList(mailboxes), true)); } /** * Returns the group name. */ public String getName() { return name; } /** * Returns the mailboxes in this group. */ public MailboxList getMailboxes() { return mailboxList; } @Override protected void doAddMailboxesTo(List results) { for (Mailbox mailbox : mailboxList) { results.add(mailbox); } } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append(name); sb.append(':'); boolean first = true; for (Mailbox mailbox : mailboxList) { if (first) { first = false; } else { sb.append(','); } sb.append(' '); sb.append(mailbox); } sb.append(";"); return sb.toString(); } } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/address/MailboxList.java0000644000000000000000000000456411702050526031302 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom.address; import java.io.Serializable; import java.util.AbstractList; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * An immutable, random-access list of Mailbox objects. */ public class MailboxList extends AbstractList implements Serializable { private static final long serialVersionUID = 1L; private final List mailboxes; /** * @param mailboxes * A List that contains only Mailbox objects. * @param dontCopy * true iff it is not possible for the mailboxes list to be * modified by someone else. */ public MailboxList(List mailboxes, boolean dontCopy) { if (mailboxes != null) this.mailboxes = dontCopy ? mailboxes : new ArrayList( mailboxes); else this.mailboxes = Collections.emptyList(); } /** * The number of elements in this list. */ @Override public int size() { return mailboxes.size(); } /** * Gets an address. */ @Override public Mailbox get(int index) { return mailboxes.get(index); } } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/address/Mailbox.java0000644000000000000000000001535211702050526030443 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom.address; import java.util.Collections; import java.util.List; import java.util.Locale; import org.apache.james.mime4j.util.LangUtils; /** * Represents a single e-mail address. */ public class Mailbox extends Address { private static final long serialVersionUID = 1L; private static final DomainList EMPTY_ROUTE_LIST = new DomainList( Collections. emptyList(), true); private final String name; private final DomainList route; private final String localPart; private final String domain; /** * Creates a named mailbox with a route. Routes are obsolete. * * @param name * the name of the e-mail address. May be null. * @param route * The zero or more domains that make up the route. May be * null. * @param localPart * The part of the e-mail address to the left of the "@". * @param domain * The part of the e-mail address to the right of the "@". */ public Mailbox(String name, DomainList route, String localPart, String domain) { if (localPart == null) throw new IllegalArgumentException(); this.name = name == null || name.length() == 0 ? null : name; this.route = route == null ? EMPTY_ROUTE_LIST : route; this.localPart = localPart; this.domain = domain == null || domain.length() == 0 ? null : domain; } /** * Creates a named mailbox based on an unnamed mailbox. Package private; * internally used by Builder. */ Mailbox(String name, Mailbox baseMailbox) { this(name, baseMailbox.getRoute(), baseMailbox.getLocalPart(), baseMailbox.getDomain()); } /** * Creates an unnamed mailbox without a route. Routes are obsolete. * * @param localPart * The part of the e-mail address to the left of the "@". * @param domain * The part of the e-mail address to the right of the "@". */ public Mailbox(String localPart, String domain) { this(null, null, localPart, domain); } /** * Creates an unnamed mailbox with a route. Routes are obsolete. * * @param route * The zero or more domains that make up the route. May be * null. * @param localPart * The part of the e-mail address to the left of the "@". * @param domain * The part of the e-mail address to the right of the "@". */ public Mailbox(DomainList route, String localPart, String domain) { this(null, route, localPart, domain); } /** * Creates a named mailbox without a route. Routes are obsolete. * * @param name * the name of the e-mail address. May be null. * @param localPart * The part of the e-mail address to the left of the "@". * @param domain * The part of the e-mail address to the right of the "@". */ public Mailbox(String name, String localPart, String domain) { this(name, null, localPart, domain); } /** * Returns the name of the mailbox or null if it does not * have a name. */ public String getName() { return name; } /** * Returns the route list. If the mailbox does not have a route an empty * domain list is returned. */ public DomainList getRoute() { return route; } /** * Returns the left part of the e-mail address (before "@"). */ public String getLocalPart() { return localPart; } /** * Returns the right part of the e-mail address (after "@"). */ public String getDomain() { return domain; } /** * Returns the address in the form localPart@domain. * * @return the address part of this mailbox. */ public String getAddress() { if (domain == null) { return localPart; } else { return localPart + '@' + domain; } } @Override protected final void doAddMailboxesTo(List results) { results.add(this); } @Override public int hashCode() { int hash = LangUtils.HASH_SEED; hash = LangUtils.hashCode(hash, this.localPart); hash = LangUtils.hashCode(hash, this.domain != null ? this.domain.toLowerCase(Locale.US) : null); return hash; } /** * Indicates whether some other object is "equal to" this mailbox. *

* An object is considered to be equal to this mailbox if it is an instance * of class Mailbox that holds the same address as this one. * The domain is considered to be case-insensitive but the local-part is not * (because of RFC 5321: the local-part of a mailbox MUST BE treated * as case sensitive). * * @param obj * the object to test for equality. * @return true if the specified object is a * Mailbox that holds the same address as this one. */ @Override public boolean equals(Object obj) { if (obj == this) return true; if (!(obj instanceof Mailbox)) return false; Mailbox that = (Mailbox) obj; return LangUtils.equals(this.localPart, that.localPart) && LangUtils.equalsIgnoreCase(this.domain, that.domain); } @Override public String toString() { return getAddress(); } } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/address/Address.java0000644000000000000000000000405311702050526030431 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom.address; import java.io.Serializable; import java.util.List; /** * The abstract base for classes that represent RFC2822 addresses. This includes * groups and mailboxes. */ public abstract class Address implements Serializable { private static final long serialVersionUID = 634090661990433426L; /** * Adds any mailboxes represented by this address into the given List. Note * that this method has default (package) access, so a doAddMailboxesTo * method is needed to allow the behavior to be overridden by subclasses. */ final void addMailboxesTo(List results) { doAddMailboxesTo(results); } /** * Adds any mailboxes represented by this address into the given List. Must * be overridden by concrete subclasses. */ protected abstract void doAddMailboxesTo(List results); } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/address/AddressList.java0000644000000000000000000000653711702050526031276 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom.address; import java.io.Serializable; import java.util.AbstractList; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * An immutable, random-access list of Address objects. */ public class AddressList extends AbstractList

implements Serializable { private static final long serialVersionUID = 1L; private final List addresses; /** * @param addresses * A List that contains only Address objects. * @param dontCopy * true iff it is not possible for the addresses list to be * modified by someone else. */ public AddressList(List addresses, boolean dontCopy) { if (addresses != null) this.addresses = dontCopy ? addresses : new ArrayList
( addresses); else this.addresses = Collections.emptyList(); } /** * The number of elements in this list. */ @Override public int size() { return addresses.size(); } /** * Gets an address. */ @Override public Address get(int index) { return addresses.get(index); } /** * Returns a flat list of all mailboxes represented in this address list. * Use this if you don't care about grouping. */ public MailboxList flatten() { // in the common case, all addresses are mailboxes boolean groupDetected = false; for (Address addr : addresses) { if (!(addr instanceof Mailbox)) { groupDetected = true; break; } } if (!groupDetected) { @SuppressWarnings("unchecked") final List mailboxes = (List) addresses; return new MailboxList(mailboxes, true); } List results = new ArrayList(); for (Address addr : addresses) { addr.addMailboxesTo(results); } // copy-on-construct this time, because subclasses // could have held onto a reference to the results return new MailboxList(results, false); } } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/Multipart.java0000644000000000000000000001107511702050526027402 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom; import java.util.List; /** * A MIME multipart body (as defined in RFC 2045). A multipart body has a ordered list of * body parts. The multipart body also has a preamble and epilogue. The preamble consists of * whatever characters appear before the first body part while the epilogue consists of whatever * characters come after the last body part. */ public interface Multipart extends Body { /** * Gets the multipart sub-type. E.g. alternative (the * default) or parallel. See RFC 2045 for common sub-types * and their meaning. * * @return the multipart sub-type. */ String getSubType(); /** * Returns the number of body parts. * * @return number of Entity objects. */ int getCount(); /** * Gets the list of body parts. The list is immutable. * * @return the list of Entity objects. */ public List getBodyParts(); /** * Sets the list of body parts. * * @param bodyParts * the new list of Entity objects. */ void setBodyParts(List bodyParts); /** * Adds a body part to the end of the list of body parts. * * @param bodyPart * the body part. */ void addBodyPart(Entity bodyPart); /** * Inserts a body part at the specified position in the list of body parts. * * @param bodyPart * the body part. * @param index * index at which the specified body part is to be inserted. * @throws IndexOutOfBoundsException * if the index is out of range (index < 0 || index > * getCount()). */ void addBodyPart(Entity bodyPart, int index); /** * Removes the body part at the specified position in the list of body * parts. * * @param index * index of the body part to be removed. * @return the removed body part. * @throws IndexOutOfBoundsException * if the index is out of range (index < 0 || index >= * getCount()). */ Entity removeBodyPart(int index); /** * Replaces the body part at the specified position in the list of body * parts with the specified body part. * * @param bodyPart * body part to be stored at the specified position. * @param index * index of body part to replace. * @return the replaced body part. * @throws IndexOutOfBoundsException * if the index is out of range (index < 0 || index >= * getCount()). */ Entity replaceBodyPart(Entity bodyPart, int index); /** * Gets the preamble or null if the message has no preamble. * * @return the preamble. */ String getPreamble(); /** * Sets the preamble with a value or null to remove the preamble. * * @param preamble * the preamble. */ void setPreamble(String preamble); /** * Gets the epilogue or null if the message has no epilogue * * @return the epilogue. */ String getEpilogue(); /** * Sets the epilogue value, or remove it if the value passed is null. * * @param epilogue * the epilogue. */ void setEpilogue(String epilogue); } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/Disposable.java0000644000000000000000000000323711702050526027507 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom; /** * A Disposable is an object that should be disposed of explicitly * when it is no longer needed. * * The dispose method is invoked to release resources that the object is * holding (such as open files). */ public interface Disposable { /** * Free any resources this object is holding and prepares this object * for garbage collection. Once an object has been disposed of it can no * longer be used. */ void dispose(); } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/SingleBody.java0000644000000000000000000001166511702050526027465 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; /** * Abstract implementation of a single message body; that is, a body that does * not contain (directly or indirectly) any other child bodies. It also provides * the parent functionality required by bodies. */ public abstract class SingleBody implements Body { private Entity parent = null; /** * Sole constructor. */ protected SingleBody() { } /** * @see org.apache.james.mime4j.dom.Body#getParent() */ public Entity getParent() { return parent; } /** * @see org.apache.james.mime4j.dom.Body#setParent(org.apache.james.mime4j.dom.Entity) */ public void setParent(Entity parent) { this.parent = parent; } /** * Gets a InputStream which reads the bytes of the body. * * @return the stream, transfer decoded * @throws IOException * on I/O errors. */ public abstract InputStream getInputStream() throws IOException; /** * Writes this single body to the given stream. The default implementation copies * the input stream obtained by {@link #getInputStream()} to the specified output * stream. May be overwritten by a subclass to improve performance. * * @param out * the stream to write to. * @throws IOException * in case of an I/O error */ public void writeTo(OutputStream out) throws IOException { if (out == null) throw new IllegalArgumentException(); InputStream in = getInputStream(); SingleBody.copy(in, out); in.close(); } /** * Returns a copy of this SingleBody (optional operation). *

* The general contract of this method is as follows: *

    *
  • Invoking {@link #getParent()} on the copy returns null. * That means that the copy is detached from the parent entity of this * SingleBody. The copy may get attached to a different * entity later on.
  • *
  • The underlying content does not have to be copied. Instead it may be * shared between multiple copies of a SingleBody.
  • *
  • If the underlying content is shared by multiple copies the * implementation has to make sure that the content gets deleted when the * last copy gets disposed of (and not before that).
  • *
*

* This implementation always throws an * UnsupportedOperationException. * * @return a copy of this SingleBody. * @throws UnsupportedOperationException * if the copy operation is not supported by this * single body. */ public SingleBody copy() { throw new UnsupportedOperationException(); } /** * Subclasses should override this method if they have allocated resources * that need to be freed explicitly (e.g. cannot be simply reclaimed by the * garbage collector). * * The default implementation of this method does nothing. * * @see org.apache.james.mime4j.dom.Disposable#dispose() */ public void dispose() { } static final int DEFAULT_ENCODING_BUFFER_SIZE = 1024; /** * Copies the contents of one stream to the other. * @param in not null * @param out not null * @throws IOException */ private static void copy(final InputStream in, final OutputStream out) throws IOException { final byte[] buffer = new byte[DEFAULT_ENCODING_BUFFER_SIZE]; int inputLength; while (-1 != (inputLength = in.read(buffer))) { out.write(buffer, 0, inputLength); } } } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/FieldParser.java0000644000000000000000000000327711702050526027626 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom; import org.apache.james.mime4j.codec.DecodeMonitor; import org.apache.james.mime4j.dom.field.ParsedField; import org.apache.james.mime4j.stream.Field; /** * A parser or transformation process intended to convert raw (unstructured) {@link Field}s into * structured {@link ParsedField}s. */ public interface FieldParser { /** * Parses raw (unstructured) field and converts it into a structured field. */ T parse(Field rawField, DecodeMonitor monitor); } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/TextBody.java0000644000000000000000000000360011702050526027156 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom; import java.io.IOException; import java.io.Reader; /** * Encapsulates the contents of a text/* entity body. */ public abstract class TextBody extends SingleBody { /** * Sole constructor. */ protected TextBody() { } /** * Returns the MIME charset of this text body. * * @return the MIME charset. */ public abstract String getMimeCharset(); /** * Gets a Reader which may be used to read out the contents * of this body. * * @return the Reader. * @throws IOException * on I/O errors. */ public abstract Reader getReader() throws IOException; } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/MessageServiceFactory.java0000644000000000000000000000372111702050526031655 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom; import org.apache.james.mime4j.MimeException; /** * A MessageBuilderFactory is used to create EntityBuilder instances. * * MessageBuilderFactory.newInstance() is used to get access to an implementation * of MessageBuilderFactory. * Then the method newMessageBuilder is used to create a new EntityBuilder object. */ public abstract class MessageServiceFactory { public static MessageServiceFactory newInstance() throws MimeException { return ServiceLoader.load(MessageServiceFactory.class); } public abstract MessageBuilder newMessageBuilder(); public abstract MessageWriter newMessageWriter(); public abstract void setAttribute(String name, Object value) throws IllegalArgumentException; } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/Entity.java0000644000000000000000000001015111702050526026667 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom; /** * A MIME entity. An entity has a header and a body (as defined in RFC 2045). */ public interface Entity extends Disposable { /** * Gets the parent entity of this entity. * Returns null if this is the root entity. * * @return the parent or null. */ Entity getParent(); /** * Sets the parent entity of this entity. * * @param parent the parent entity or null if * this will be the root entity. */ void setParent(Entity parent); /** * Gets the entity header. * * @return the header. */ Header getHeader(); /** * Sets the entity header. * * @param header the header. */ void setHeader(Header header); /** * Gets the body of this entity. * * @return the body, */ Body getBody(); /** * Sets the body of this entity. * * @param body the body. * @throws IllegalStateException if the body has already been set. */ void setBody(Body body); /** * Removes and returns the body of this entity. The removed body may be * attached to another entity. If it is no longer needed it should be * {@link Disposable#dispose() disposed} of. * * @return the removed body or null if no body was set. */ Body removeBody(); /** * Determines if the MIME type of this Entity is * multipart/*. Since multipart-entities must have * a boundary parameter in the Content-Type field this * method returns false if no boundary exists. * * @return true on match, false otherwise. */ boolean isMultipart(); /** * Determines the MIME type of this Entity. The MIME type * is derived by looking at the parent's Content-Type field if no * Content-Type field is set for this Entity. * * @return the MIME type. */ String getMimeType(); /** * Determines the MIME character set encoding of this Entity. * * @return the MIME character set encoding. */ String getCharset(); /** * Determines the transfer encoding of this Entity. * * @return the transfer encoding. */ String getContentTransferEncoding(); /** * Return the disposition type of the content disposition of this * Entity. * * @return the disposition type or null if no disposition * type has been set. */ String getDispositionType(); /** * Returns the filename parameter of the content disposition of this * Entity. * * @return the filename parameter of the content disposition or * null if the filename has not been set. */ String getFilename(); } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/Body.java0000644000000000000000000000335111702050526026314 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom; /** * A body of an MIME entity (as defined in RFC 2045). *

* A body can be a {@link Message}, a {@link Multipart} or a {@link SingleBody}. * This interface should not be implemented directly by classes other than * those. */ public interface Body extends Disposable { /** * Gets the parent of this body. * * @return the parent. */ Entity getParent(); /** * Sets the parent of this body. * * @param parent * the parent. */ void setParent(Entity parent); } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/BinaryBody.java0000644000000000000000000000257411702050526027467 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom; /** * A body containing binary data. */ public abstract class BinaryBody extends SingleBody { /** * Sole constructor. */ protected BinaryBody() { } } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/ServiceLoader.java0000644000000000000000000000751711702050526030156 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; import java.util.Enumeration; /** * Utility class to load Service Providers (SPI). * This will deprecated as soon as mime4j will be upgraded to Java6 * as Java6 has javax.util.ServiceLoader as a core class. */ class ServiceLoader { private ServiceLoader() { } /** * Loads a Service Provider for the given interface/class (SPI). */ static T load(Class spiClass) { String spiResURI = "META-INF/services/" + spiClass.getName(); ClassLoader classLoader = spiClass.getClassLoader(); try { Enumeration resources = classLoader.getResources(spiResURI); while (resources.hasMoreElements()) { URL resource = resources.nextElement(); InputStream instream = resource.openStream(); try { BufferedReader reader = new BufferedReader(new InputStreamReader(instream)); String line; while ((line = reader.readLine()) != null) { line = line.trim(); int cmtIdx = line.indexOf('#'); if (cmtIdx != -1) { line = line.substring(0, cmtIdx); line = line.trim(); } if (line.length() == 0) { continue; } Class implClass = classLoader.loadClass(line); if (spiClass.isAssignableFrom(implClass)) { Object impl = implClass.newInstance(); return spiClass.cast(impl); } } reader.close(); } finally { instream.close(); } } return null; } catch (IOException ex) { throw new ServiceLoaderException(ex); } catch (ClassNotFoundException ex) { throw new ServiceLoaderException("Unknown SPI class '" + spiClass.getName() + "'", ex); } catch (IllegalAccessException ex) { // Not visible return null; } catch (InstantiationException ex) { throw new ServiceLoaderException("SPI class '" + spiClass.getName() + "' cannot be instantiated", ex); } } } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/field/0000755000000000000000000000000011702050526025635 5ustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/field/DateTimeField.java0000644000000000000000000000246711702050526031151 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom.field; import java.util.Date; public interface DateTimeField extends ParsedField { Date getDate(); } ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/field/UnstructuredField.javaapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/field/UnstructuredField.ja0000644000000000000000000000244611702050526031632 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom.field; public interface UnstructuredField extends ParsedField { String getValue(); } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/field/MailboxField.java0000644000000000000000000000253111702050526031040 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom.field; import org.apache.james.mime4j.dom.address.Mailbox; public interface MailboxField extends ParsedField { Mailbox getMailbox(); } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/field/ParsedField.java0000644000000000000000000000406611702050526030670 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom.field; import org.apache.james.mime4j.stream.Field; /** * A structured field that has been processed by a parsing routine. */ public interface ParsedField extends Field { /** * Returns true if this field is valid, i.e. no errors were * encountered while parsing the field value. * * @return true if this field is valid, false * otherwise. * @see #getParseException() */ boolean isValidField(); /** * Returns the exception that was thrown by the field parser while parsing * the field value. The result is null if the field is valid * and no errors were encountered. * * @return the exception that was thrown by the field parser or * null if the field is valid. */ ParseException getParseException(); } ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentLengthField.javaapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentLengthField.j0000644000000000000000000000265111702050526031534 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom.field; public interface ContentLengthField extends ParsedField { /** * Gets the content length value defined in this field. * * @return the content length value. */ long getContentLength(); } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/field/FieldName.java0000644000000000000000000000541411702050526030330 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom.field; /** * Constants for common header field names. */ public class FieldName { public static final String CONTENT_TYPE = "Content-Type"; public static final String CONTENT_LENGTH = "Content-Length"; public static final String CONTENT_TRANSFER_ENCODING = "Content-Transfer-Encoding"; public static final String CONTENT_DISPOSITION = "Content-Disposition"; public static final String CONTENT_ID = "Content-ID"; public static final String CONTENT_MD5 = "Content-MD5"; public static final String CONTENT_DESCRIPTION = "Content-Description"; public static final String CONTENT_LANGUAGE = "Content-Language"; public static final String CONTENT_LOCATION = "Content-Location"; public static final String MIME_VERSION = "MIME-Version"; public static final String DATE = "Date"; public static final String MESSAGE_ID = "Message-ID"; public static final String SUBJECT = "Subject"; public static final String FROM = "From"; public static final String SENDER = "Sender"; public static final String TO = "To"; public static final String CC = "Cc"; public static final String BCC = "Bcc"; public static final String REPLY_TO = "Reply-To"; public static final String RESENT_DATE = "Resent-Date"; public static final String RESENT_FROM = "Resent-From"; public static final String RESENT_SENDER = "Resent-Sender"; public static final String RESENT_TO = "Resent-To"; public static final String RESENT_CC = "Resent-Cc"; public static final String RESENT_BCC = "Resent-Bcc"; private FieldName() { } } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/field/ParseException.java0000644000000000000000000000426211702050526031435 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom.field; import org.apache.james.mime4j.MimeException; /** * This exception is thrown when parse errors are encountered. */ public class ParseException extends MimeException { private static final long serialVersionUID = 1L; /** * Constructs a new parse exception with the specified detail message. * * @param message * detail message */ protected ParseException(String message) { super(message); } /** * Constructs a new parse exception with the specified cause. * * @param cause * the cause */ protected ParseException(Throwable cause) { super(cause); } /** * Constructs a new parse exception with the specified detail message and * cause. * * @param message * detail message * @param cause * the cause */ protected ParseException(String message, Throwable cause) { super(message, cause); } } ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/field/MimeVersionField.javaapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/field/MimeVersionField.jav0000644000000000000000000000250511702050526031542 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom.field; public interface MimeVersionField extends ParsedField { int getMinorVersion(); int getMajorVersion(); } ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentLocationField.javaapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentLocationField0000644000000000000000000000270011702050526031626 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom.field; public interface ContentLocationField extends ParsedField { /** * Gets the content location defined in this field. * * @return the content location or null if not set. */ String getLocation(); } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentIdField.java0000644000000000000000000000265011702050526031336 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom.field; public interface ContentIdField extends ParsedField { /** * Gets the content ID defined in this field. * * @return the content ID or null if not set. */ String getId(); } ././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentDescriptionField.javaapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentDescriptionFi0000644000000000000000000000271411702050526031661 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom.field; public interface ContentDescriptionField extends ParsedField { /** * Gets the content description defined in this field. * * @return the content description or null if not set. */ String getDescription(); } ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/field/AddressListField.javaapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/field/AddressListField.jav0000644000000000000000000000255111702050526031527 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom.field; import org.apache.james.mime4j.dom.address.AddressList; public interface AddressListField extends ParsedField { AddressList getAddressList(); } ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/field/MailboxListField.javaapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/field/MailboxListField.jav0000644000000000000000000000255111702050526031535 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom.field; import org.apache.james.mime4j.dom.address.MailboxList; public interface MailboxListField extends ParsedField { MailboxList getMailboxList(); } ././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentDispositionField.javaapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentDispositionFi0000644000000000000000000001172211702050526031701 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom.field; import java.util.Date; import java.util.Map; public interface ContentDispositionField extends ParsedField { /** The inline disposition type. */ public static final String DISPOSITION_TYPE_INLINE = "inline"; /** The attachment disposition type. */ public static final String DISPOSITION_TYPE_ATTACHMENT = "attachment"; /** The name of the filename parameter. */ public static final String PARAM_FILENAME = "filename"; /** The name of the creation-date parameter. */ public static final String PARAM_CREATION_DATE = "creation-date"; /** The name of the modification-date parameter. */ public static final String PARAM_MODIFICATION_DATE = "modification-date"; /** The name of the read-date parameter. */ public static final String PARAM_READ_DATE = "read-date"; /** The name of the size parameter. */ public static final String PARAM_SIZE = "size"; /** * Gets the disposition type defined in this Content-Disposition field. * * @return the disposition type or an empty string if not set. */ String getDispositionType(); /** * Gets the value of a parameter. Parameter names are case-insensitive. * * @param name * the name of the parameter to get. * @return the parameter value or null if not set. */ String getParameter(String name); /** * Gets all parameters. * * @return the parameters. */ Map getParameters(); /** * Determines if the disposition type of this field matches the given one. * * @param dispositionType * the disposition type to match against. * @return true if the disposition type of this field * matches, false otherwise. */ boolean isDispositionType(String dispositionType); /** * Return true if the disposition type of this field is * inline, false otherwise. * * @return true if the disposition type of this field is * inline, false otherwise. */ boolean isInline(); /** * Return true if the disposition type of this field is * attachment, false otherwise. * * @return true if the disposition type of this field is * attachment, false otherwise. */ boolean isAttachment(); /** * Gets the value of the filename parameter if set. * * @return the filename parameter value or null * if not set. */ String getFilename(); /** * Gets the value of the creation-date parameter if set and * valid. * * @return the creation-date parameter value or * null if not set or invalid. */ Date getCreationDate(); /** * Gets the value of the modification-date parameter if set * and valid. * * @return the modification-date parameter value or * null if not set or invalid. */ Date getModificationDate(); /** * Gets the value of the read-date parameter if set and * valid. * * @return the read-date parameter value or null * if not set or invalid. */ Date getReadDate(); /** * Gets the value of the size parameter if set and valid. * * @return the size parameter value or -1 if * not set or invalid. */ long getSize(); } ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentTypeField.javaapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentTypeField.jav0000644000000000000000000000746411702050526031572 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom.field; import java.util.Map; public interface ContentTypeField extends ParsedField { /** The prefix of all multipart MIME types. */ public static final String TYPE_MULTIPART_PREFIX = "multipart/"; /** The multipart/digest MIME type. */ public static final String TYPE_MULTIPART_DIGEST = "multipart/digest"; /** The text/plain MIME type. */ public static final String TYPE_TEXT_PLAIN = "text/plain"; /** The message/rfc822 MIME type. */ public static final String TYPE_MESSAGE_RFC822 = "message/rfc822"; /** The name of the boundary parameter. */ public static final String PARAM_BOUNDARY = "boundary"; /** The name of the charset parameter. */ public static final String PARAM_CHARSET = "charset"; /** * Gets the MIME type defined in this Content-Type field. * * @return the MIME type or an empty string if not set. */ String getMimeType(); /** * Gets the media type defined in this Content-Type field. */ String getMediaType(); /** * Gets the subtype defined in this Content-Type field. */ String getSubType(); /** * Gets the value of a parameter. Parameter names are case-insensitive. * * @param name * the name of the parameter to get. * @return the parameter value or null if not set. */ String getParameter(String name); /** * Gets all parameters. * * @return the parameters. */ Map getParameters(); /** * Determines if the MIME type of this field matches the given one. * * @param mimeType * the MIME type to match against. * @return true if the MIME type of this field matches, * false otherwise. */ boolean isMimeType(String mimeType); /** * Determines if the MIME type of this field is multipart/*. * * @return true if this field is has a * multipart/* MIME type, false * otherwise. */ boolean isMultipart(); /** * Gets the value of the boundary parameter if set. * * @return the boundary parameter value or null * if not set. */ String getBoundary(); /** * Gets the value of the charset parameter if set. * * @return the charset parameter value or null * if not set. */ String getCharset(); } ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentLanguageField.javaapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentLanguageField0000644000000000000000000000271311702050526031605 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom.field; import java.util.List; public interface ContentLanguageField extends ParsedField { /** * Gets the content language(s) defined in this field. * * @return a list of content language(s). */ List getLanguages(); } ././@LongLink0000000000000000000000000000016200000000000011564 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentTransferEncodingField.javaapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentTransferEncod0000644000000000000000000000267211702050526031657 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom.field; public interface ContentTransferEncodingField extends ParsedField { /** * Gets the encoding defined in this field. * * @return the content ID or null if not set. */ String getEncoding(); } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentMD5Field.java0000644000000000000000000000270311702050526031366 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom.field; public interface ContentMD5Field extends ParsedField { /** * Gets the content MD5 raw value defined in this field. * * @return the content MD5 raw value or null if not set. */ String getMD5Raw(); } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/Header.java0000644000000000000000000000644511702050526026616 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom; import java.util.Iterator; import java.util.List; import org.apache.james.mime4j.stream.Field; /** * A header of an MIME entity (as defined in RFC 2045). */ public interface Header extends Iterable { /** * Adds a field to the end of the list of fields. * * @param field the field to add. */ void addField(Field field); /** * Gets the fields of this header. The returned list will not be * modifiable. * * @return the list of Field objects. */ List getFields(); /** * Gets a Field given a field name. If there are multiple * such fields defined in this header the first one will be returned. * * @param name the field name (e.g. From, Subject). * @return the field or null if none found. */ Field getField(String name); /** * Gets all Fields having the specified field name. * * @param name the field name (e.g. From, Subject). * @return the list of fields. */ List getFields(final String name); /** * Returns an iterator over the list of fields of this header. * * @return an iterator. */ Iterator iterator(); /** * Removes all Fields having the specified field name. * * @param name * the field name (e.g. From, Subject). * @return number of fields removed. */ int removeFields(String name); /** * Sets or replaces a field. This method is useful for header fields such as * Subject or Message-ID that should not occur more than once in a message. * * If this Header does not already contain a header field of * the same name as the given field then it is added to the end of the list * of fields (same behavior as {@link #addField(Field)}). Otherwise the * first occurrence of a field with the same name is replaced by the given * field and all further occurrences are removed. * * @param field the field to set. */ void setField(Field field); } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/MessageWriter.java0000644000000000000000000000362311702050526030202 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom; import java.io.IOException; import java.io.OutputStream; import org.apache.james.mime4j.stream.Field; /** * An interface to write out content of {@link Message} and other DOM elements to * an {@link OutputStream}. */ public interface MessageWriter { void writeMessage(Message message, OutputStream out) throws IOException; void writeBody(Body body, OutputStream out) throws IOException; void writeEntity(Entity entity, OutputStream out) throws IOException; void writeMultipart(Multipart multipart, OutputStream out) throws IOException; void writeField(Field field, OutputStream out) throws IOException; void writeHeader(Header header, OutputStream out) throws IOException; } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/datetime/0000755000000000000000000000000011702050526026346 5ustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/dom/datetime/DateTime.java0000644000000000000000000001172611702050526030714 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom.datetime; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.TimeZone; public class DateTime { private final Date date; private final int year; private final int month; private final int day; private final int hour; private final int minute; private final int second; private final int timeZone; public DateTime(String yearString, int month, int day, int hour, int minute, int second, int timeZone) { this.year = convertToYear(yearString); this.date = convertToDate(year, month, day, hour, minute, second, timeZone); this.month = month; this.day = day; this.hour = hour; this.minute = minute; this.second = second; this.timeZone = timeZone; } private int convertToYear(String yearString) { int year = Integer.parseInt(yearString); switch (yearString.length()) { case 1: case 2: if (year >= 0 && year < 50) return 2000 + year; else return 1900 + year; case 3: return 1900 + year; default: return year; } } public static Date convertToDate(int year, int month, int day, int hour, int minute, int second, int timeZone) { Calendar c = new GregorianCalendar(TimeZone.getTimeZone("GMT+0")); c.set(year, month - 1, day, hour, minute, second); c.set(Calendar.MILLISECOND, 0); if (timeZone != Integer.MIN_VALUE) { int minutes = ((timeZone / 100) * 60) + timeZone % 100; c.add(Calendar.MINUTE, -1 * minutes); } return c.getTime(); } public Date getDate() { return date; } public int getYear() { return year; } public int getMonth() { return month; } public int getDay() { return day; } public int getHour() { return hour; } public int getMinute() { return minute; } public int getSecond() { return second; } public int getTimeZone() { return timeZone; } public void print() { System.out.println(toString()); } @Override public String toString() { return getYear() + " " + getMonth() + " " + getDay() + "; " + getHour() + " " + getMinute() + " " + getSecond() + " " + getTimeZone(); } @Override public int hashCode() { final int PRIME = 31; int result = 1; result = PRIME * result + ((date == null) ? 0 : date.hashCode()); result = PRIME * result + day; result = PRIME * result + hour; result = PRIME * result + minute; result = PRIME * result + month; result = PRIME * result + second; result = PRIME * result + timeZone; result = PRIME * result + year; return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; final DateTime other = (DateTime) obj; if (date == null) { if (other.date != null) return false; } else if (!date.equals(other.date)) return false; if (day != other.day) return false; if (hour != other.hour) return false; if (minute != other.minute) return false; if (month != other.month) return false; if (second != other.second) return false; if (timeZone != other.timeZone) return false; if (year != other.year) return false; return true; } } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/0000755000000000000000000000000011702050530025051 5ustar rootroot././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/ContentDescriptionFieldImpl.javaapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/ContentDescriptionFieldI0000644000000000000000000000460711702050530031676 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field; import org.apache.james.mime4j.codec.DecodeMonitor; import org.apache.james.mime4j.dom.FieldParser; import org.apache.james.mime4j.dom.field.ContentDescriptionField; import org.apache.james.mime4j.stream.Field; /** * Represents a Content-Description field. */ public class ContentDescriptionFieldImpl extends AbstractField implements ContentDescriptionField { private boolean parsed = false; private String description; ContentDescriptionFieldImpl(Field rawField, DecodeMonitor monitor) { super(rawField, monitor); } private void parse() { parsed = true; String body = getBody(); if (body != null) { description = body.trim(); } else { description = null; } } public String getDescription() { if (!parsed) { parse(); } return description; } public static final FieldParser PARSER = new FieldParser() { public ContentDescriptionField parse(final Field rawField, final DecodeMonitor monitor) { return new ContentDescriptionFieldImpl(rawField, monitor); } }; } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/DateTimeFieldImpl.java0000644000000000000000000000610511702050530031200 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field; import java.io.StringReader; import java.util.Date; import org.apache.james.mime4j.codec.DecodeMonitor; import org.apache.james.mime4j.dom.FieldParser; import org.apache.james.mime4j.dom.field.DateTimeField; import org.apache.james.mime4j.field.datetime.parser.DateTimeParser; import org.apache.james.mime4j.field.datetime.parser.ParseException; import org.apache.james.mime4j.field.datetime.parser.TokenMgrError; import org.apache.james.mime4j.stream.Field; /** * Date-time field such as Date or Resent-Date. */ public class DateTimeFieldImpl extends AbstractField implements DateTimeField { private boolean parsed = false; private Date date; private ParseException parseException; DateTimeFieldImpl(Field rawField, DecodeMonitor monitor) { super(rawField, monitor); } /** * @see org.apache.james.mime4j.dom.field.DateTimeField#getDate() */ public Date getDate() { if (!parsed) parse(); return date; } /** * @see org.apache.james.mime4j.dom.field.DateTimeField#getParseException() */ @Override public ParseException getParseException() { if (!parsed) parse(); return parseException; } private void parse() { String body = getBody(); try { date = new DateTimeParser(new StringReader(body)).parseAll() .getDate(); } catch (ParseException e) { parseException = e; } catch (TokenMgrError e) { parseException = new ParseException(e.getMessage()); } parsed = true; } public static final FieldParser PARSER = new FieldParser() { public DateTimeField parse(final Field rawField, final DecodeMonitor monitor) { return new DateTimeFieldImpl(rawField, monitor); } }; } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/ContentIdFieldImpl.java0000644000000000000000000000443011702050530031372 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field; import org.apache.james.mime4j.codec.DecodeMonitor; import org.apache.james.mime4j.dom.FieldParser; import org.apache.james.mime4j.dom.field.ContentIdField; import org.apache.james.mime4j.stream.Field; /** * Represents a Content-Transfer-Encoding field. */ public class ContentIdFieldImpl extends AbstractField implements ContentIdField { private boolean parsed = false; private String id; ContentIdFieldImpl(Field rawField, DecodeMonitor monitor) { super(rawField, monitor); } private void parse() { parsed = true; String body = getBody(); if (body != null) { id = body.trim(); } else { id = null; } } public String getId() { if (!parsed) { parse(); } return id; } public static final FieldParser PARSER = new FieldParser() { public ContentIdField parse(final Field rawField, final DecodeMonitor monitor) { return new ContentIdFieldImpl(rawField, monitor); } }; } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/ContentMD5FieldImpl.java0000644000000000000000000000444611702050530031432 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field; import org.apache.james.mime4j.codec.DecodeMonitor; import org.apache.james.mime4j.dom.FieldParser; import org.apache.james.mime4j.dom.field.ContentMD5Field; import org.apache.james.mime4j.stream.Field; /** * Represents a Content-MD5 field. */ public class ContentMD5FieldImpl extends AbstractField implements ContentMD5Field { private boolean parsed = false; private String md5raw; ContentMD5FieldImpl(Field rawField, DecodeMonitor monitor) { super(rawField, monitor); } private void parse() { parsed = true; String body = getBody(); if (body != null) { md5raw = body.trim(); } else { md5raw = null; } } public String getMD5Raw() { if (!parsed) { parse(); } return md5raw; } public static final FieldParser PARSER = new FieldParser() { public ContentMD5Field parse(final Field rawField, final DecodeMonitor monitor) { return new ContentMD5FieldImpl(rawField, monitor); } }; } ././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/AddressListFieldLenientImpl.javaapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/AddressListFieldLenientI0000644000000000000000000000625411702050530031620 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field; import java.util.Collections; import org.apache.james.mime4j.codec.DecodeMonitor; import org.apache.james.mime4j.dom.FieldParser; import org.apache.james.mime4j.dom.address.AddressList; import org.apache.james.mime4j.dom.address.Mailbox; import org.apache.james.mime4j.dom.field.AddressListField; import org.apache.james.mime4j.field.address.LenientAddressBuilder; import org.apache.james.mime4j.stream.Field; import org.apache.james.mime4j.stream.ParserCursor; import org.apache.james.mime4j.stream.RawField; import org.apache.james.mime4j.util.ByteSequence; import org.apache.james.mime4j.util.ContentUtil; /** * Address list field such as To or Reply-To. */ public class AddressListFieldLenientImpl extends AbstractField implements AddressListField { private boolean parsed = false; private AddressList addressList; AddressListFieldLenientImpl(final Field rawField, final DecodeMonitor monitor) { super(rawField, monitor); } public AddressList getAddressList() { if (!parsed) parse(); return addressList; } private void parse() { parsed = true; RawField f = getRawField(); ByteSequence buf = f.getRaw(); int pos = f.getDelimiterIdx() + 1; if (buf == null) { String body = f.getBody(); if (body == null) { addressList = new AddressList(Collections.emptyList(), true); return; } buf = ContentUtil.encode(body); pos = 0; } ParserCursor cursor = new ParserCursor(pos, buf.length()); addressList = LenientAddressBuilder.DEFAULT.parseAddressList(buf, cursor); } public static final FieldParser PARSER = new FieldParser() { public AddressListField parse(final Field rawField, final DecodeMonitor monitor) { return new AddressListFieldLenientImpl(rawField, monitor); } }; } ././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/MimeVersionFieldLenientImpl.javaapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/MimeVersionFieldLenientI0000644000000000000000000000776711702050530031646 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field; import java.util.BitSet; import org.apache.james.mime4j.codec.DecodeMonitor; import org.apache.james.mime4j.dom.FieldParser; import org.apache.james.mime4j.dom.field.MimeVersionField; import org.apache.james.mime4j.stream.Field; import org.apache.james.mime4j.stream.ParserCursor; import org.apache.james.mime4j.stream.RawField; import org.apache.james.mime4j.stream.RawFieldParser; import org.apache.james.mime4j.util.ByteSequence; import org.apache.james.mime4j.util.ContentUtil; /** * Represents a MIME-Version field. */ public class MimeVersionFieldLenientImpl extends AbstractField implements MimeVersionField { private final static int FULL_STOP = '.'; private final static BitSet DELIM = RawFieldParser.INIT_BITSET(FULL_STOP); public static final int DEFAULT_MINOR_VERSION = 0; public static final int DEFAULT_MAJOR_VERSION = 1; private boolean parsed = false; private int major = DEFAULT_MAJOR_VERSION; private int minor = DEFAULT_MINOR_VERSION; MimeVersionFieldLenientImpl(Field rawField, DecodeMonitor monitor) { super(rawField, monitor); } private void parse() { parsed = true; major = DEFAULT_MAJOR_VERSION; minor = DEFAULT_MINOR_VERSION; RawField f = getRawField(); ByteSequence buf = f.getRaw(); int pos = f.getDelimiterIdx() + 1; if (buf == null) { String body = f.getBody(); if (body == null) { return; } buf = ContentUtil.encode(body); pos = 0; } RawFieldParser parser = RawFieldParser.DEFAULT; ParserCursor cursor = new ParserCursor(pos, buf.length()); String token1 = parser.parseValue(buf, cursor, DELIM); try { major = Integer.parseInt(token1); if (major < 0) { major = 0; } } catch (NumberFormatException ex) { } if (!cursor.atEnd() && buf.byteAt(cursor.getPos()) == FULL_STOP) { cursor.updatePos(cursor.getPos() + 1); } String token2 = parser.parseValue(buf, cursor, null); try { minor = Integer.parseInt(token2); if (minor < 0) { minor = 0; } } catch (NumberFormatException ex) { } } public int getMinorVersion() { if (!parsed) { parse(); } return minor; } public int getMajorVersion() { if (!parsed) { parse(); } return major; } public static final FieldParser PARSER = new FieldParser() { public MimeVersionField parse(final Field rawField, final DecodeMonitor monitor) { return new MimeVersionFieldLenientImpl(rawField, monitor); } }; } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/LenientFieldParser.java0000644000000000000000000002145711702050530031444 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field; import org.apache.james.mime4j.MimeException; import org.apache.james.mime4j.codec.DecodeMonitor; import org.apache.james.mime4j.dom.FieldParser; import org.apache.james.mime4j.dom.field.AddressListField; import org.apache.james.mime4j.dom.field.ContentDescriptionField; import org.apache.james.mime4j.dom.field.ContentDispositionField; import org.apache.james.mime4j.dom.field.ContentIdField; import org.apache.james.mime4j.dom.field.ContentLanguageField; import org.apache.james.mime4j.dom.field.ContentLengthField; import org.apache.james.mime4j.dom.field.ContentLocationField; import org.apache.james.mime4j.dom.field.ContentMD5Field; import org.apache.james.mime4j.dom.field.ContentTransferEncodingField; import org.apache.james.mime4j.dom.field.ContentTypeField; import org.apache.james.mime4j.dom.field.DateTimeField; import org.apache.james.mime4j.dom.field.FieldName; import org.apache.james.mime4j.dom.field.MailboxField; import org.apache.james.mime4j.dom.field.MailboxListField; import org.apache.james.mime4j.dom.field.MimeVersionField; import org.apache.james.mime4j.dom.field.ParsedField; import org.apache.james.mime4j.dom.field.UnstructuredField; import org.apache.james.mime4j.stream.Field; import org.apache.james.mime4j.stream.RawField; import org.apache.james.mime4j.stream.RawFieldParser; import org.apache.james.mime4j.util.ByteSequence; import org.apache.james.mime4j.util.ContentUtil; /** * Lenient implementation of the {@link FieldParser} interface with a high degree of tolerance * to non-severe MIME field format violations. */ public class LenientFieldParser extends DelegatingFieldParser { private static final FieldParser PARSER = new LenientFieldParser(); /** * Gets the default instance of this class. * * @return the default instance */ public static FieldParser getParser() { return PARSER; } /** * Parses the given byte sequence and returns an instance of the {@link ParsedField} class. * The type of the class returned depends on the field name; see {@link #parse(String)} for * a table of field names and their corresponding classes. * * @param raw the bytes to parse. * @param monitor decoding monitor used while parsing/decoding. * @return a parsed field. * @throws MimeException if the raw string cannot be split into field name and body. */ public static ParsedField parse( final ByteSequence raw, final DecodeMonitor monitor) throws MimeException { Field rawField = RawFieldParser.DEFAULT.parseField(raw); return PARSER.parse(rawField, monitor); } /** * Parses the given string and returns an instance of the Field class. * The type of the class returned depends on the field name. * * @param rawStr the string to parse. * @param monitor a DecodeMonitor object used while parsing/decoding. * @return a ParsedField instance. * @throws MimeException if the raw string cannot be split into field name and body. */ public static ParsedField parse( final String rawStr, final DecodeMonitor monitor) throws MimeException { ByteSequence raw = ContentUtil.encode(rawStr); RawField rawField = RawFieldParser.DEFAULT.parseField(raw); // Do not retain the original raw representation as the field // may require folding return PARSER.parse(rawField, monitor); } /** * Parses the given string and returns an instance of the {@link ParsedField} class. * The type of the class returned depends on the field name: *

* * * * * * * * * * * * * * * * * *
Class returnedField names
{@link ContentTypeField}Content-Type
{@link ContentLengthField}Content-Length
{@link ContentTransferEncodingField}Content-Transfer-Encoding
{@link ContentDispositionField}Content-Disposition
{@link ContentDescriptionField}Content-Description
{@link ContentIdField}Content-ID
{@link ContentMD5Field}Content-MD5
{@link ContentLanguageField}Content-Language
{@link ContentLocationField}Content-Location
{@link MimeVersionField}MIME-Version
{@link DateTimeField}Date, Resent-Date
{@link MailboxField}Sender, Resent-Sender
{@link MailboxListField}From, Resent-From
{@link AddressListField}To, Cc, Bcc, Reply-To, Resent-To, Resent-Cc, Resent-Bcc
{@link UnstructuredField}Subject and others
* * @param rawStr the string to parse. * @return a parsed field. * @throws MimeException if the raw string cannot be split into field name and body. */ public static ParsedField parse(final String rawStr) throws MimeException { return parse(rawStr, DecodeMonitor.SILENT); } public LenientFieldParser() { super(UnstructuredFieldImpl.PARSER); setFieldParser(FieldName.CONTENT_TYPE, ContentTypeFieldLenientImpl.PARSER); // lenient setFieldParser(FieldName.CONTENT_LENGTH, ContentLengthFieldImpl.PARSER); // default setFieldParser(FieldName.CONTENT_TRANSFER_ENCODING, ContentTransferEncodingFieldImpl.PARSER); // default setFieldParser(FieldName.CONTENT_DISPOSITION, ContentDispositionFieldLenientImpl.PARSER); // lenient setFieldParser(FieldName.CONTENT_ID, ContentIdFieldImpl.PARSER); // default setFieldParser(FieldName.CONTENT_MD5, ContentMD5FieldImpl.PARSER); // default setFieldParser(FieldName.CONTENT_DESCRIPTION, ContentDescriptionFieldImpl.PARSER); // default setFieldParser(FieldName.CONTENT_LANGUAGE, ContentLanguageFieldLenientImpl.PARSER); // lenient setFieldParser(FieldName.CONTENT_LOCATION, ContentLocationFieldLenientImpl.PARSER); // lenient setFieldParser(FieldName.MIME_VERSION, MimeVersionFieldImpl.PARSER); // lenient FieldParser dateTimeParser = DateTimeFieldLenientImpl.PARSER; setFieldParser(FieldName.DATE, dateTimeParser); setFieldParser(FieldName.RESENT_DATE, dateTimeParser); FieldParser mailboxListParser = MailboxListFieldLenientImpl.PARSER; setFieldParser(FieldName.FROM, mailboxListParser); setFieldParser(FieldName.RESENT_FROM, mailboxListParser); FieldParser mailboxParser = MailboxFieldLenientImpl.PARSER; setFieldParser(FieldName.SENDER, mailboxParser); setFieldParser(FieldName.RESENT_SENDER, mailboxParser); FieldParser addressListParser = AddressListFieldLenientImpl.PARSER; setFieldParser(FieldName.TO, addressListParser); setFieldParser(FieldName.RESENT_TO, addressListParser); setFieldParser(FieldName.CC, addressListParser); setFieldParser(FieldName.RESENT_CC, addressListParser); setFieldParser(FieldName.BCC, addressListParser); setFieldParser(FieldName.RESENT_BCC, addressListParser); setFieldParser(FieldName.REPLY_TO, addressListParser); } } ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/UnstructuredFieldImpl.javaapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/UnstructuredFieldImpl.ja0000644000000000000000000000461411702050530031667 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field; import org.apache.james.mime4j.codec.DecodeMonitor; import org.apache.james.mime4j.codec.DecoderUtil; import org.apache.james.mime4j.dom.FieldParser; import org.apache.james.mime4j.dom.field.UnstructuredField; import org.apache.james.mime4j.stream.Field; /** * Simple unstructured field such as Subject. */ public class UnstructuredFieldImpl extends AbstractField implements UnstructuredField { private boolean parsed = false; private String value; UnstructuredFieldImpl(Field rawField, DecodeMonitor monitor) { super(rawField, monitor); } /** * @see org.apache.james.mime4j.dom.field.UnstructuredField#getValue() */ public String getValue() { if (!parsed) parse(); return value; } private void parse() { String body = getBody(); value = DecoderUtil.decodeEncodedWords(body, monitor); parsed = true; } public static final FieldParser PARSER = new FieldParser() { public UnstructuredField parse(final Field rawField, final DecodeMonitor monitor) { return new UnstructuredFieldImpl(rawField, monitor); } }; } ././@LongLink0000000000000000000000000000016200000000000011564 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/ContentTransferEncodingFieldImpl.javaapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/ContentTransferEncodingF0000644000000000000000000000602211702050530031670 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field; import java.util.Locale; import org.apache.james.mime4j.codec.DecodeMonitor; import org.apache.james.mime4j.dom.FieldParser; import org.apache.james.mime4j.dom.field.ContentTransferEncodingField; import org.apache.james.mime4j.stream.Field; import org.apache.james.mime4j.util.MimeUtil; /** * Represents a Content-Transfer-Encoding field. */ public class ContentTransferEncodingFieldImpl extends AbstractField implements ContentTransferEncodingField { private boolean parsed = false; private String encoding; ContentTransferEncodingFieldImpl(Field rawField, DecodeMonitor monitor) { super(rawField, monitor); } private void parse() { parsed = true; String body = getBody(); if (body != null) { encoding = body.trim().toLowerCase(Locale.US); } else { encoding = null; } } /** * @see org.apache.james.mime4j.dom.field.ContentTransferEncodingField#getEncoding() */ public String getEncoding() { if (!parsed) { parse(); } return encoding; } /** * Gets the encoding of the given field if. Returns the default * 7bit if not set or if f is * null. * * @return the encoding. */ public static String getEncoding(ContentTransferEncodingField f) { if (f != null && f.getEncoding().length() != 0) { return f.getEncoding(); } return MimeUtil.ENC_7BIT; } public static final FieldParser PARSER = new FieldParser() { public ContentTransferEncodingField parse(final Field rawField, final DecodeMonitor monitor) { return new ContentTransferEncodingFieldImpl(rawField, monitor); } }; } ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/ContentLocationFieldImpl.javaapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/ContentLocationFieldImpl0000644000000000000000000000652011702050530031670 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field; import java.io.StringReader; import org.apache.james.mime4j.codec.DecodeMonitor; import org.apache.james.mime4j.dom.FieldParser; import org.apache.james.mime4j.dom.field.ContentLocationField; import org.apache.james.mime4j.field.structured.parser.ParseException; import org.apache.james.mime4j.field.structured.parser.StructuredFieldParser; import org.apache.james.mime4j.stream.Field; /** * Represents a Content-Location field. */ public class ContentLocationFieldImpl extends AbstractField implements ContentLocationField { private boolean parsed = false; private String location; private ParseException parseException; ContentLocationFieldImpl(Field rawField, DecodeMonitor monitor) { super(rawField, monitor); } private void parse() { parsed = true; String body = getBody(); location = null; if (body != null) { StringReader stringReader = new StringReader(body); StructuredFieldParser parser = new StructuredFieldParser(stringReader); try { // From RFC2017 3.1 /* * Extraction of the URL string from the URL-parameter is even simpler: * The enclosing quotes and any linear whitespace are removed and the * remaining material is the URL string. * Read more: http://www.faqs.org/rfcs/rfc2017.html#ixzz0aufO9nRL */ location = parser.parse().replaceAll("\\s", ""); } catch (ParseException ex) { parseException = ex; } } } public String getLocation() { if (!parsed) { parse(); } return location; } @Override public org.apache.james.mime4j.dom.field.ParseException getParseException() { return parseException; } public static final FieldParser PARSER = new FieldParser() { public ContentLocationField parse(final Field rawField, final DecodeMonitor monitor) { return new ContentLocationFieldImpl(rawField, monitor); } }; } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/DefaultFieldParser.java0000644000000000000000000002010411702050530031416 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field; import org.apache.james.mime4j.MimeException; import org.apache.james.mime4j.codec.DecodeMonitor; import org.apache.james.mime4j.dom.FieldParser; import org.apache.james.mime4j.dom.field.AddressListField; import org.apache.james.mime4j.dom.field.ContentDescriptionField; import org.apache.james.mime4j.dom.field.ContentDispositionField; import org.apache.james.mime4j.dom.field.ContentIdField; import org.apache.james.mime4j.dom.field.ContentLanguageField; import org.apache.james.mime4j.dom.field.ContentLengthField; import org.apache.james.mime4j.dom.field.ContentLocationField; import org.apache.james.mime4j.dom.field.ContentMD5Field; import org.apache.james.mime4j.dom.field.ContentTransferEncodingField; import org.apache.james.mime4j.dom.field.ContentTypeField; import org.apache.james.mime4j.dom.field.DateTimeField; import org.apache.james.mime4j.dom.field.FieldName; import org.apache.james.mime4j.dom.field.MailboxField; import org.apache.james.mime4j.dom.field.MailboxListField; import org.apache.james.mime4j.dom.field.MimeVersionField; import org.apache.james.mime4j.dom.field.ParsedField; import org.apache.james.mime4j.dom.field.UnstructuredField; import org.apache.james.mime4j.stream.Field; import org.apache.james.mime4j.stream.RawField; import org.apache.james.mime4j.stream.RawFieldParser; import org.apache.james.mime4j.util.ByteSequence; import org.apache.james.mime4j.util.ContentUtil; /** * Default (strict) implementation of the {@link FieldParser} interface. */ public class DefaultFieldParser extends DelegatingFieldParser { private static final FieldParser PARSER = new DefaultFieldParser(); /** * Gets the default instance of this class. * * @return the default instance */ public static FieldParser getParser() { return PARSER; } /** * Parses the given byte sequence and returns an instance of the {@link ParsedField} class. * The type of the class returned depends on the field name; see {@link #parse(String)} for * a table of field names and their corresponding classes. * * @param raw the bytes to parse. * @param monitor decoding monitor used while parsing/decoding. * @return a parsed field. * @throws MimeException if the raw string cannot be split into field name and body. */ public static ParsedField parse( final ByteSequence raw, final DecodeMonitor monitor) throws MimeException { Field rawField = RawFieldParser.DEFAULT.parseField(raw); return PARSER.parse(rawField, monitor); } /** * Parses the given string and returns an instance of the {@link ParsedField} class. * The type of the class returned depends on the field name: *

* * * * * * * * * * * * * * * * * *
Class returnedField names
{@link ContentTypeField}Content-Type
{@link ContentLengthField}Content-Length
{@link ContentTransferEncodingField}Content-Transfer-Encoding
{@link ContentDispositionField}Content-Disposition
{@link ContentDescriptionField}Content-Description
{@link ContentIdField}Content-ID
{@link ContentMD5Field}Content-MD5
{@link ContentLanguageField}Content-Language
{@link ContentLocationField}Content-Location
{@link MimeVersionField}MIME-Version
{@link DateTimeField}Date, Resent-Date
{@link MailboxField}Sender, Resent-Sender
{@link MailboxListField}From, Resent-From
{@link AddressListField}To, Cc, Bcc, Reply-To, Resent-To, Resent-Cc, Resent-Bcc
{@link UnstructuredField}Subject and others
* * @param rawStr the string to parse. * @return a parsed field. * @throws MimeException if the raw string cannot be split into field name and body. */ public static ParsedField parse( final String rawStr, final DecodeMonitor monitor) throws MimeException { ByteSequence raw = ContentUtil.encode(rawStr); RawField rawField = RawFieldParser.DEFAULT.parseField(raw); // Do not retain the original raw representation as the field // may require folding return PARSER.parse(rawField, monitor); } public static ParsedField parse(final String rawStr) throws MimeException { return parse(rawStr, DecodeMonitor.SILENT); } public DefaultFieldParser() { super(UnstructuredFieldImpl.PARSER); setFieldParser(FieldName.CONTENT_TYPE, ContentTypeFieldImpl.PARSER); setFieldParser(FieldName.CONTENT_LENGTH, ContentLengthFieldImpl.PARSER); setFieldParser(FieldName.CONTENT_TRANSFER_ENCODING, ContentTransferEncodingFieldImpl.PARSER); setFieldParser(FieldName.CONTENT_DISPOSITION, ContentDispositionFieldImpl.PARSER); setFieldParser(FieldName.CONTENT_ID, ContentIdFieldImpl.PARSER); setFieldParser(FieldName.CONTENT_MD5, ContentMD5FieldImpl.PARSER); setFieldParser(FieldName.CONTENT_DESCRIPTION, ContentDescriptionFieldImpl.PARSER); setFieldParser(FieldName.CONTENT_LANGUAGE, ContentLanguageFieldImpl.PARSER); setFieldParser(FieldName.CONTENT_LOCATION, ContentLocationFieldImpl.PARSER); setFieldParser(FieldName.MIME_VERSION, MimeVersionFieldImpl.PARSER); FieldParser dateTimeParser = DateTimeFieldImpl.PARSER; setFieldParser(FieldName.DATE, dateTimeParser); setFieldParser(FieldName.RESENT_DATE, dateTimeParser); FieldParser mailboxListParser = MailboxListFieldImpl.PARSER; setFieldParser(FieldName.FROM, mailboxListParser); setFieldParser(FieldName.RESENT_FROM, mailboxListParser); FieldParser mailboxParser = MailboxFieldImpl.PARSER; setFieldParser(FieldName.SENDER, mailboxParser); setFieldParser(FieldName.RESENT_SENDER, mailboxParser); FieldParser addressListParser = AddressListFieldImpl.PARSER; setFieldParser(FieldName.TO, addressListParser); setFieldParser(FieldName.RESENT_TO, addressListParser); setFieldParser(FieldName.CC, addressListParser); setFieldParser(FieldName.RESENT_CC, addressListParser); setFieldParser(FieldName.BCC, addressListParser); setFieldParser(FieldName.RESENT_BCC, addressListParser); setFieldParser(FieldName.REPLY_TO, addressListParser); } } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/address/0000755000000000000000000000000011702050530026476 5ustar rootroot././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/address/AddressFormatter.javaapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/address/AddressFormatter0000644000000000000000000001667511702050530031711 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field.address; import org.apache.james.mime4j.codec.EncoderUtil; import org.apache.james.mime4j.dom.address.Address; import org.apache.james.mime4j.dom.address.Group; import org.apache.james.mime4j.dom.address.Mailbox; /** * Default formatter for {@link Address} and its subclasses. */ public class AddressFormatter { public static final AddressFormatter DEFAULT = new AddressFormatter(); protected AddressFormatter() { super(); } /** * Formats the address as a human readable string, not including the route. * The resulting string is intended for display purposes only and cannot be * used for transport purposes. * * For example, if the unparsed address was * * <"Joe Cheng"@joecheng.com> * * this method would return * * * * which is not valid for transport; the local part would need to be * re-quoted. * * @param includeRoute * true if the route should be included if it * exists, false otherwise. */ public void format(final StringBuilder sb, final Address address, boolean includeRoute) { if (address == null) { return; } if (address instanceof Mailbox) { format(sb, (Mailbox) address, includeRoute); } else if (address instanceof Group) { format(sb, (Group) address, includeRoute); } else { throw new IllegalArgumentException("Unsuppported Address class: " + address.getClass()); } } /** * Returns a string representation of this address that can be used for * transport purposes. The route is never included in this representation * because routes are obsolete and RFC 5322 states that obsolete syntactic * forms MUST NOT be generated. */ public void encode(final StringBuilder sb, final Address address) { if (address == null) { return; } if (address instanceof Mailbox) { encode(sb, (Mailbox) address); } else if (address instanceof Group) { encode(sb, (Group) address); } else { throw new IllegalArgumentException("Unsuppported Address class: " + address.getClass()); } } public void format(final StringBuilder sb, final Mailbox mailbox, boolean includeRoute) { if (sb == null) { throw new IllegalArgumentException("StringBuilder may not be null"); } if (mailbox == null) { throw new IllegalArgumentException("Mailbox may not be null"); } includeRoute &= mailbox.getRoute() != null; boolean includeAngleBrackets = mailbox.getName() != null || includeRoute; if (mailbox.getName() != null) { sb.append(mailbox.getName()); sb.append(' '); } if (includeAngleBrackets) { sb.append('<'); } if (includeRoute) { sb.append(mailbox.getRoute().toRouteString()); sb.append(':'); } sb.append(mailbox.getLocalPart()); if (mailbox.getDomain() != null) { sb.append('@'); sb.append(mailbox.getDomain()); } if (includeAngleBrackets) { sb.append('>'); } } public String format(final Mailbox mailbox, boolean includeRoute) { StringBuilder sb = new StringBuilder(); format(sb, mailbox, includeRoute); return sb.toString(); } public void encode(final StringBuilder sb, final Mailbox mailbox) { if (sb == null) { throw new IllegalArgumentException("StringBuilder may not be null"); } if (mailbox == null) { throw new IllegalArgumentException("Mailbox may not be null"); } if (mailbox.getName() != null) { sb.append(EncoderUtil.encodeAddressDisplayName(mailbox.getName())); sb.append(" <"); } sb.append(EncoderUtil.encodeAddressLocalPart(mailbox.getLocalPart())); // domain = dot-atom / domain-literal // domain-literal = [CFWS] "[" *([FWS] dtext) [FWS] "]" [CFWS] // dtext = %d33-90 / %d94-126 if (mailbox.getDomain() != null) { sb.append('@'); sb.append(mailbox.getDomain()); } if (mailbox.getName() != null) { sb.append('>'); } } public String encode(final Mailbox mailbox) { StringBuilder sb = new StringBuilder(); encode(sb, mailbox); return sb.toString(); } public void format(final StringBuilder sb, final Group group, boolean includeRoute) { if (sb == null) { throw new IllegalArgumentException("StringBuilder may not be null"); } if (group == null) { throw new IllegalArgumentException("Group may not be null"); } sb.append(group.getName()); sb.append(':'); boolean first = true; for (Mailbox mailbox : group.getMailboxes()) { if (first) { first = false; } else { sb.append(','); } sb.append(' '); format(sb, mailbox, includeRoute); } sb.append(";"); } public String format(final Group group, boolean includeRoute) { StringBuilder sb = new StringBuilder(); format(sb, group, includeRoute); return sb.toString(); } public void encode(final StringBuilder sb, final Group group) { if (sb == null) { throw new IllegalArgumentException("StringBuilder may not be null"); } if (group == null) { throw new IllegalArgumentException("Group may not be null"); } sb.append(EncoderUtil.encodeAddressDisplayName(group.getName())); sb.append(':'); boolean first = true; for (Mailbox mailbox : group.getMailboxes()) { if (first) { first = false; } else { sb.append(','); } sb.append(' '); encode(sb, mailbox); } sb.append(';'); } public String encode(final Group group) { StringBuilder sb = new StringBuilder(); encode(sb, group); return sb.toString(); } } ././@LongLink0000000000000000000000000000015700000000000011570 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/address/LenientAddressBuilder.javaapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/address/LenientAddressBu0000644000000000000000000003245011702050530031620 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field.address; import java.util.ArrayList; import java.util.BitSet; import java.util.Collections; import java.util.List; import org.apache.james.mime4j.codec.DecodeMonitor; import org.apache.james.mime4j.codec.DecoderUtil; import org.apache.james.mime4j.dom.address.Address; import org.apache.james.mime4j.dom.address.AddressList; import org.apache.james.mime4j.dom.address.DomainList; import org.apache.james.mime4j.dom.address.Group; import org.apache.james.mime4j.dom.address.Mailbox; import org.apache.james.mime4j.stream.ParserCursor; import org.apache.james.mime4j.stream.RawFieldParser; import org.apache.james.mime4j.util.ByteSequence; import org.apache.james.mime4j.util.CharsetUtil; import org.apache.james.mime4j.util.ContentUtil; /** * Lenient (tolerant to non-critical format violations) builder for {@link Address} * and its subclasses. */ public class LenientAddressBuilder { private static final int AT = '@'; private static final int OPENING_BRACKET = '<'; private static final int CLOSING_BRACKET = '>'; private static final int COMMA = ','; private static final int COLON = ':'; private static final int SEMICOLON = ';'; private static final BitSet AT_AND_CLOSING_BRACKET = RawFieldParser.INIT_BITSET(AT, CLOSING_BRACKET); private static final BitSet CLOSING_BRACKET_ONLY = RawFieldParser.INIT_BITSET(CLOSING_BRACKET); private static final BitSet COMMA_ONLY = RawFieldParser.INIT_BITSET(COMMA); private static final BitSet COLON_ONLY = RawFieldParser.INIT_BITSET(COLON); private static final BitSet SEMICOLON_ONLY = RawFieldParser.INIT_BITSET(SEMICOLON); public static final LenientAddressBuilder DEFAULT = new LenientAddressBuilder(DecodeMonitor.SILENT); private final DecodeMonitor monitor; private final RawFieldParser parser; protected LenientAddressBuilder(final DecodeMonitor monitor) { super(); this.monitor = monitor; this.parser = new RawFieldParser(); } String parseDomain(final ByteSequence buf, final ParserCursor cursor, final BitSet delimiters) { StringBuilder dst = new StringBuilder(); while (!cursor.atEnd()) { char current = (char) (buf.byteAt(cursor.getPos()) & 0xff); if (delimiters != null && delimiters.get(current)) { break; } else if (CharsetUtil.isWhitespace(current)) { this.parser.skipWhiteSpace(buf, cursor); } else if (current == '(') { this.parser.skipComment(buf, cursor); } else { this.parser.copyContent(buf, cursor, delimiters, dst); } } return dst.toString(); } DomainList parseRoute(final ByteSequence buf, final ParserCursor cursor, final BitSet delimiters) { BitSet bitset = RawFieldParser.INIT_BITSET(COMMA, COLON); if (delimiters != null) { bitset.or(delimiters); } List domains = null; for (;;) { this.parser.skipAllWhiteSpace(buf, cursor); if (cursor.atEnd()) { break; } int pos = cursor.getPos(); int current = (char) (buf.byteAt(pos) & 0xff); if (current == AT) { cursor.updatePos(pos + 1); } else { break; } String s = parseDomain(buf, cursor, bitset); if (s != null && s.length() > 0) { if (domains == null) { domains = new ArrayList(); } domains.add(s); } if (cursor.atEnd()) { break; } pos = cursor.getPos(); current = (char) (buf.byteAt(pos) & 0xff); if (current == COMMA) { cursor.updatePos(pos + 1); continue; } else if (current == COLON) { cursor.updatePos(pos + 1); break; } else { break; } } return domains != null ? new DomainList(domains, true) : null; } private Mailbox createMailbox( final String name, final DomainList route, final String localPart, final String domain) { return new Mailbox( name != null ? DecoderUtil.decodeEncodedWords(name, this.monitor) : null, route, localPart, domain); } Mailbox parseMailboxAddress( final String openingText, final ByteSequence buf, final ParserCursor cursor) { if (cursor.atEnd()) { return createMailbox(null, null, openingText, null); } int pos = cursor.getPos(); char current = (char) (buf.byteAt(pos) & 0xff); if (current == OPENING_BRACKET) { cursor.updatePos(pos + 1); } else { return createMailbox(null, null, openingText, null); } DomainList domainList = parseRoute(buf, cursor, CLOSING_BRACKET_ONLY); String localPart = this.parser.parseValue(buf, cursor, AT_AND_CLOSING_BRACKET); if (cursor.atEnd()) { return createMailbox(openingText, domainList, localPart, null); } pos = cursor.getPos(); current = (char) (buf.byteAt(pos) & 0xff); if (current == AT) { cursor.updatePos(pos + 1); } else { return createMailbox(openingText, domainList, localPart, null); } String domain = parseDomain(buf, cursor, CLOSING_BRACKET_ONLY); if (cursor.atEnd()) { return createMailbox(openingText, domainList, localPart, domain); } pos = cursor.getPos(); current = (char) (buf.byteAt(pos) & 0xff); if (current == CLOSING_BRACKET) { cursor.updatePos(pos + 1); } else { return createMailbox(openingText, domainList, localPart, domain); } while (!cursor.atEnd()) { pos = cursor.getPos(); current = (char) (buf.byteAt(pos) & 0xff); if (CharsetUtil.isWhitespace(current)) { this.parser.skipWhiteSpace(buf, cursor); } else if (current == '(') { this.parser.skipComment(buf, cursor); } else { break; } } return createMailbox(openingText, domainList, localPart, domain); } private Mailbox createMailbox(final String localPart) { if (localPart != null && localPart.length() > 0) { return new Mailbox(null, null, localPart, null); } else { return null; } } public Mailbox parseMailbox( final ByteSequence buf, final ParserCursor cursor, final BitSet delimiters) { BitSet bitset = RawFieldParser.INIT_BITSET(AT, OPENING_BRACKET); if (delimiters != null) { bitset.or(delimiters); } String openingText = this.parser.parseValue(buf, cursor, bitset); if (cursor.atEnd()) { return createMailbox(openingText); } int pos = cursor.getPos(); char current = (char) (buf.byteAt(pos) & 0xff); if (current == OPENING_BRACKET) { // name form return parseMailboxAddress(openingText, buf, cursor); } else if (current == AT) { // localPart @ domain form cursor.updatePos(pos + 1); String localPart = openingText; String domain = parseDomain(buf, cursor, delimiters); return new Mailbox(null, null, localPart, domain); } else { return createMailbox(openingText); } } public Mailbox parseMailbox(final String text) { ByteSequence raw = ContentUtil.encode(text); ParserCursor cursor = new ParserCursor(0, text.length()); return parseMailbox(raw, cursor, null); } List parseMailboxes( final ByteSequence buf, final ParserCursor cursor, final BitSet delimiters) { BitSet bitset = RawFieldParser.INIT_BITSET(COMMA); if (delimiters != null) { bitset.or(delimiters); } List mboxes = new ArrayList(); while (!cursor.atEnd()) { int pos = cursor.getPos(); int current = (char) (buf.byteAt(pos) & 0xff); if (delimiters != null && delimiters.get(current)) { break; } else if (current == COMMA) { cursor.updatePos(pos + 1); } else { Mailbox mbox = parseMailbox(buf, cursor, bitset); if (mbox != null) { mboxes.add(mbox); } } } return mboxes; } public Group parseGroup(final ByteSequence buf, final ParserCursor cursor) { String name = this.parser.parseToken(buf, cursor, COLON_ONLY); if (cursor.atEnd()) { return new Group(name, Collections.emptyList()); } int pos = cursor.getPos(); int current = (char) (buf.byteAt(pos) & 0xff); if (current == COLON) { cursor.updatePos(pos + 1); } List mboxes = parseMailboxes(buf, cursor, SEMICOLON_ONLY); return new Group(name, mboxes); } public Group parseGroup(final String text) { ByteSequence raw = ContentUtil.encode(text); ParserCursor cursor = new ParserCursor(0, text.length()); return parseGroup(raw, cursor); } public Address parseAddress( final ByteSequence buf, final ParserCursor cursor, final BitSet delimiters) { BitSet bitset = RawFieldParser.INIT_BITSET(COLON, AT, OPENING_BRACKET); if (delimiters != null) { bitset.or(delimiters); } String openingText = this.parser.parseValue(buf, cursor, bitset); if (cursor.atEnd()) { return createMailbox(openingText); } int pos = cursor.getPos(); char current = (char) (buf.byteAt(pos) & 0xff); if (current == OPENING_BRACKET) { // name form return parseMailboxAddress(openingText, buf, cursor); } else if (current == AT) { // localPart @ domain form cursor.updatePos(pos + 1); String localPart = openingText; String domain = parseDomain(buf, cursor, delimiters); return new Mailbox(null, null, localPart, domain); } else if (current == COLON) { // group-name: localPart @ domain, name ; form cursor.updatePos(pos + 1); String name = openingText; List mboxes = parseMailboxes(buf, cursor, SEMICOLON_ONLY); if (!cursor.atEnd()) { pos = cursor.getPos(); current = (char) (buf.byteAt(pos) & 0xff); if (current == SEMICOLON) { cursor.updatePos(pos + 1); } } return new Group(name, mboxes); } else { return createMailbox(openingText); } } public Address parseAddress(final String text) { ByteSequence raw = ContentUtil.encode(text); ParserCursor cursor = new ParserCursor(0, text.length()); return parseAddress(raw, cursor, null); } public AddressList parseAddressList(final ByteSequence buf, final ParserCursor cursor) { List

addresses = new ArrayList
(); while (!cursor.atEnd()) { int pos = cursor.getPos(); int current = (char) (buf.byteAt(pos) & 0xff); if (current == COMMA) { cursor.updatePos(pos + 1); } else { Address address = parseAddress(buf, cursor, COMMA_ONLY); if (address != null) { addresses.add(address); } } } return new AddressList(addresses, false); } public AddressList parseAddressList(final String text) { ByteSequence raw = ContentUtil.encode(text); ParserCursor cursor = new ParserCursor(0, text.length()); return parseAddressList(raw, cursor); } } ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/address/AddressBuilder.javaapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/address/AddressBuilder.j0000644000000000000000000001164311702050530031552 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field.address; import java.io.StringReader; import org.apache.james.mime4j.codec.DecodeMonitor; import org.apache.james.mime4j.dom.address.Address; import org.apache.james.mime4j.dom.address.AddressList; import org.apache.james.mime4j.dom.address.Group; import org.apache.james.mime4j.dom.address.Mailbox; /** * Default (strict) builder for {@link Address} and its subclasses. */ public class AddressBuilder { public static final AddressBuilder DEFAULT = new AddressBuilder(); protected AddressBuilder() { super(); } /** * Parses the specified raw string into an address. * * @param rawAddressString * string to parse. * @param monitor the DecodeMonitor to be used while parsing/decoding * @return an Address object for the specified string. * @throws ParseException if the raw string does not represent a single address. */ public Address parseAddress(String rawAddressString, DecodeMonitor monitor) throws ParseException { AddressListParser parser = new AddressListParser(new StringReader( rawAddressString)); return Builder.getInstance().buildAddress(parser.parseAddress(), monitor); } public Address parseAddress(String rawAddressString) throws ParseException { return parseAddress(rawAddressString, DecodeMonitor.STRICT); } /** * Parse the address list string, such as the value of a From, To, Cc, Bcc, * Sender, or Reply-To header. * * The string MUST be unfolded already. * @param monitor the DecodeMonitor to be used while parsing/decoding */ public AddressList parseAddressList(String rawAddressList, DecodeMonitor monitor) throws ParseException { AddressListParser parser = new AddressListParser(new StringReader( rawAddressList)); return Builder.getInstance().buildAddressList(parser.parseAddressList(), monitor); } public AddressList parseAddressList(String rawAddressList) throws ParseException { return parseAddressList(rawAddressList, DecodeMonitor.STRICT); } /** * Parses the specified raw string into a mailbox address. * * @param rawMailboxString * string to parse. * @param monitor the DecodeMonitor to be used while parsing/decoding. * @return a Mailbox object for the specified string. * @throws ParseException * if the raw string does not represent a single mailbox * address. */ public Mailbox parseMailbox(String rawMailboxString, DecodeMonitor monitor) throws ParseException { AddressListParser parser = new AddressListParser(new StringReader( rawMailboxString)); return Builder.getInstance().buildMailbox(parser.parseMailbox(), monitor); } public Mailbox parseMailbox(String rawMailboxString) throws ParseException { return parseMailbox(rawMailboxString, DecodeMonitor.STRICT); } /** * Parses the specified raw string into a group address. * * @param rawGroupString * string to parse. * @return a Group object for the specified string. * @throws ParseException * if the raw string does not represent a single group address. */ public Group parseGroup(String rawGroupString, DecodeMonitor monitor) throws ParseException { Address address = parseAddress(rawGroupString, monitor); if (!(address instanceof Group)) throw new ParseException("Not a group address"); return (Group) address; } public Group parseGroup(String rawGroupString) throws ParseException { return parseGroup(rawGroupString, DecodeMonitor.STRICT); } } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/address/Builder.java0000644000000000000000000002056711702050526030746 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field.address; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.apache.james.mime4j.codec.DecodeMonitor; import org.apache.james.mime4j.codec.DecoderUtil; import org.apache.james.mime4j.dom.address.Address; import org.apache.james.mime4j.dom.address.AddressList; import org.apache.james.mime4j.dom.address.DomainList; import org.apache.james.mime4j.dom.address.Group; import org.apache.james.mime4j.dom.address.Mailbox; import org.apache.james.mime4j.dom.address.MailboxList; /** * Transforms the JJTree-generated abstract syntax tree into a graph of * org.apache.james.mime4j.dom.address objects. */ class Builder { private static Builder singleton = new Builder(); public static Builder getInstance() { return singleton; } public AddressList buildAddressList(ASTaddress_list node, DecodeMonitor monitor) throws ParseException { List
list = new ArrayList
(); for (int i = 0; i < node.jjtGetNumChildren(); i++) { ASTaddress childNode = (ASTaddress) node.jjtGetChild(i); Address address = buildAddress(childNode, monitor); list.add(address); } return new AddressList(list, true); } public Address buildAddress(ASTaddress node, DecodeMonitor monitor) throws ParseException { ChildNodeIterator it = new ChildNodeIterator(node); Node n = it.next(); if (n instanceof ASTaddr_spec) { return buildAddrSpec((ASTaddr_spec) n); } else if (n instanceof ASTangle_addr) { return buildAngleAddr((ASTangle_addr) n); } else if (n instanceof ASTphrase) { String name = buildString((ASTphrase) n, false); Node n2 = it.next(); if (n2 instanceof ASTgroup_body) { return new Group(name, buildGroupBody((ASTgroup_body) n2, monitor)); } else if (n2 instanceof ASTangle_addr) { try { name = DecoderUtil.decodeEncodedWords(name, monitor); } catch (IllegalArgumentException e) { throw new ParseException(e.getMessage()); } Mailbox mb = buildAngleAddr((ASTangle_addr) n2); return new Mailbox(name, mb.getRoute(), mb.getLocalPart(), mb.getDomain()); } else { throw new ParseException(); } } else { throw new ParseException(); } } private MailboxList buildGroupBody(ASTgroup_body node, DecodeMonitor monitor) throws ParseException { List results = new ArrayList(); ChildNodeIterator it = new ChildNodeIterator(node); while (it.hasNext()) { Node n = it.next(); if (n instanceof ASTmailbox) results.add(buildMailbox((ASTmailbox) n, monitor)); else throw new ParseException(); } return new MailboxList(results, true); } public Mailbox buildMailbox(ASTmailbox node, DecodeMonitor monitor) throws ParseException { ChildNodeIterator it = new ChildNodeIterator(node); Node n = it.next(); if (n instanceof ASTaddr_spec) { return buildAddrSpec((ASTaddr_spec) n); } else if (n instanceof ASTangle_addr) { return buildAngleAddr((ASTangle_addr) n); } else if (n instanceof ASTname_addr) { return buildNameAddr((ASTname_addr) n, monitor); } else { throw new ParseException(); } } private Mailbox buildNameAddr(ASTname_addr node, DecodeMonitor monitor) throws ParseException { ChildNodeIterator it = new ChildNodeIterator(node); Node n = it.next(); String name; if (n instanceof ASTphrase) { name = buildString((ASTphrase) n, false); } else { throw new ParseException(); } n = it.next(); if (n instanceof ASTangle_addr) { try { name = DecoderUtil.decodeEncodedWords(name, monitor); } catch (IllegalArgumentException e) { throw new ParseException(e.getMessage()); } Mailbox mb = buildAngleAddr((ASTangle_addr) n); return new Mailbox(name, mb.getRoute(), mb.getLocalPart(), mb.getDomain()); } else { throw new ParseException(); } } private Mailbox buildAngleAddr(ASTangle_addr node) throws ParseException { ChildNodeIterator it = new ChildNodeIterator(node); DomainList route = null; Node n = it.next(); if (n instanceof ASTroute) { route = buildRoute((ASTroute) n); n = it.next(); } else if (n instanceof ASTaddr_spec) { // do nothing } else throw new ParseException(); if (n instanceof ASTaddr_spec) return buildAddrSpec(route, (ASTaddr_spec) n); else throw new ParseException(); } private DomainList buildRoute(ASTroute node) throws ParseException { List results = new ArrayList(node.jjtGetNumChildren()); ChildNodeIterator it = new ChildNodeIterator(node); while (it.hasNext()) { Node n = it.next(); if (n instanceof ASTdomain) results.add(buildString((ASTdomain) n, true)); else throw new ParseException(); } return new DomainList(results, true); } private Mailbox buildAddrSpec(ASTaddr_spec node) { return buildAddrSpec(null, node); } private Mailbox buildAddrSpec(DomainList route, ASTaddr_spec node) { ChildNodeIterator it = new ChildNodeIterator(node); String localPart = buildString((ASTlocal_part) it.next(), true); String domain = buildString((ASTdomain) it.next(), true); return new Mailbox(route, localPart, domain); } private String buildString(SimpleNode node, boolean stripSpaces) { Token head = node.firstToken; Token tail = node.lastToken; StringBuilder out = new StringBuilder(); while (head != tail) { out.append(head.image); head = head.next; if (!stripSpaces) addSpecials(out, head.specialToken); } out.append(tail.image); return out.toString(); } private void addSpecials(StringBuilder out, Token specialToken) { if (specialToken != null) { addSpecials(out, specialToken.specialToken); out.append(specialToken.image); } } private static class ChildNodeIterator implements Iterator { private SimpleNode simpleNode; private int index; private int len; public ChildNodeIterator(SimpleNode simpleNode) { this.simpleNode = simpleNode; this.len = simpleNode.jjtGetNumChildren(); this.index = 0; } public void remove() { throw new UnsupportedOperationException(); } public boolean hasNext() { return index < len; } public Node next() { return simpleNode.jjtGetChild(index++); } } } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/address/BaseNode.java0000644000000000000000000000250011702050526031023 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field.address; public abstract class BaseNode implements Node { public Token firstToken; public Token lastToken; } ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/ContentLanguageFieldImpl.javaapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/ContentLanguageFieldImpl0000644000000000000000000000603111702050530031640 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field; import java.io.StringReader; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.apache.james.mime4j.codec.DecodeMonitor; import org.apache.james.mime4j.dom.FieldParser; import org.apache.james.mime4j.dom.field.ContentLanguageField; import org.apache.james.mime4j.field.language.parser.ContentLanguageParser; import org.apache.james.mime4j.field.language.parser.ParseException; import org.apache.james.mime4j.stream.Field; /** * Represents a Content-Transfer-Encoding field. */ public class ContentLanguageFieldImpl extends AbstractField implements ContentLanguageField { private boolean parsed = false; private List languages; private ParseException parseException; ContentLanguageFieldImpl(Field rawField, DecodeMonitor monitor) { super(rawField, monitor); } private void parse() { parsed = true; languages = Collections.emptyList(); String body = getBody(); if (body != null) { ContentLanguageParser parser = new ContentLanguageParser(new StringReader(body)); try { languages = parser.parse(); } catch (ParseException ex) { parseException = ex; } } } @Override public org.apache.james.mime4j.dom.field.ParseException getParseException() { return parseException; } public List getLanguages() { if (!parsed) { parse(); } return new ArrayList(languages); } public static final FieldParser PARSER = new FieldParser() { public ContentLanguageField parse(final Field rawField, final DecodeMonitor monitor) { return new ContentLanguageFieldImpl(rawField, monitor); } }; } ././@LongLink0000000000000000000000000000016100000000000011563 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/ContentLocationFieldLenientImpl.javaapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/ContentLocationFieldLeni0000644000000000000000000000651011702050530031655 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field; import org.apache.james.mime4j.codec.DecodeMonitor; import org.apache.james.mime4j.dom.FieldParser; import org.apache.james.mime4j.dom.field.ContentLocationField; import org.apache.james.mime4j.stream.Field; import org.apache.james.mime4j.stream.ParserCursor; import org.apache.james.mime4j.stream.RawField; import org.apache.james.mime4j.stream.RawFieldParser; import org.apache.james.mime4j.util.ByteSequence; import org.apache.james.mime4j.util.CharsetUtil; import org.apache.james.mime4j.util.ContentUtil; /** * Represents a Content-Location field. */ public class ContentLocationFieldLenientImpl extends AbstractField implements ContentLocationField { private boolean parsed = false; private String location; ContentLocationFieldLenientImpl(Field rawField, DecodeMonitor monitor) { super(rawField, monitor); } private void parse() { parsed = true; location = null; RawField f = getRawField(); ByteSequence buf = f.getRaw(); int pos = f.getDelimiterIdx() + 1; if (buf == null) { String body = f.getBody(); if (body == null) { return; } buf = ContentUtil.encode(body); pos = 0; } RawFieldParser parser = RawFieldParser.DEFAULT; ParserCursor cursor = new ParserCursor(pos, buf.length()); String token = parser.parseValue(buf, cursor, null); StringBuilder sb = new StringBuilder(token.length()); for (int i = 0; i < token.length(); i++) { char ch = token.charAt(i); if (!CharsetUtil.isWhitespace(ch)) { sb.append(ch); } } this.location = sb.toString(); } public String getLocation() { if (!parsed) { parse(); } return location; } public static final FieldParser PARSER = new FieldParser() { public ContentLocationField parse(final Field rawField, final DecodeMonitor monitor) { return new ContentLocationFieldLenientImpl(rawField, monitor); } }; } ././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/MailboxListFieldLenientImpl.javaapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/MailboxListFieldLenientI0000644000000000000000000000630611702050530031624 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field; import java.util.Collections; import org.apache.james.mime4j.codec.DecodeMonitor; import org.apache.james.mime4j.dom.FieldParser; import org.apache.james.mime4j.dom.address.Mailbox; import org.apache.james.mime4j.dom.address.MailboxList; import org.apache.james.mime4j.dom.field.MailboxListField; import org.apache.james.mime4j.field.address.LenientAddressBuilder; import org.apache.james.mime4j.stream.Field; import org.apache.james.mime4j.stream.ParserCursor; import org.apache.james.mime4j.stream.RawField; import org.apache.james.mime4j.util.ByteSequence; import org.apache.james.mime4j.util.ContentUtil; /** * Mailbox-list field such as From or Resent-From. */ public class MailboxListFieldLenientImpl extends AbstractField implements MailboxListField { private boolean parsed = false; private MailboxList mailboxList; MailboxListFieldLenientImpl(final Field rawField, final DecodeMonitor monitor) { super(rawField, monitor); } public MailboxList getMailboxList() { if (!parsed) { parse(); } return mailboxList; } private void parse() { parsed = true; RawField f = getRawField(); ByteSequence buf = f.getRaw(); int pos = f.getDelimiterIdx() + 1; if (buf == null) { String body = f.getBody(); if (body == null) { mailboxList = new MailboxList(Collections.emptyList(), true); return; } buf = ContentUtil.encode(body); pos = 0; } ParserCursor cursor = new ParserCursor(pos, buf.length()); mailboxList = LenientAddressBuilder.DEFAULT.parseAddressList(buf, cursor).flatten(); } public static final FieldParser PARSER = new FieldParser() { public MailboxListField parse(final Field rawField, final DecodeMonitor monitor) { return new MailboxListFieldLenientImpl(rawField, monitor); } }; } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/MailboxFieldImpl.java0000644000000000000000000000556611702050530031111 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field; import org.apache.james.mime4j.codec.DecodeMonitor; import org.apache.james.mime4j.dom.FieldParser; import org.apache.james.mime4j.dom.address.Mailbox; import org.apache.james.mime4j.dom.field.MailboxField; import org.apache.james.mime4j.field.address.AddressBuilder; import org.apache.james.mime4j.field.address.ParseException; import org.apache.james.mime4j.stream.Field; /** * Mailbox field such as Sender or Resent-Sender. */ public class MailboxFieldImpl extends AbstractField implements MailboxField { private boolean parsed = false; private Mailbox mailbox; private ParseException parseException; MailboxFieldImpl(Field rawField, DecodeMonitor monitor) { super(rawField, monitor); } /** * @see org.apache.james.mime4j.dom.field.MailboxField#getMailbox() */ public Mailbox getMailbox() { if (!parsed) parse(); return mailbox; } /** * @see org.apache.james.mime4j.dom.field.MailboxField#getParseException() */ @Override public ParseException getParseException() { if (!parsed) parse(); return parseException; } private void parse() { String body = getBody(); try { mailbox = AddressBuilder.DEFAULT.parseMailbox(body, monitor); } catch (ParseException e) { parseException = e; } parsed = true; } public static final FieldParser PARSER = new FieldParser() { public MailboxField parse(final Field rawField, final DecodeMonitor monitor) { return new MailboxFieldImpl(rawField, monitor); } }; } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/AbstractField.java0000644000000000000000000000615711702050530030434 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field; import org.apache.james.mime4j.codec.DecodeMonitor; import org.apache.james.mime4j.dom.field.ParseException; import org.apache.james.mime4j.dom.field.ParsedField; import org.apache.james.mime4j.stream.Field; import org.apache.james.mime4j.stream.RawField; import org.apache.james.mime4j.util.ByteSequence; /** * The base class of all field classes. */ public abstract class AbstractField implements ParsedField { protected final Field rawField; protected final DecodeMonitor monitor; protected AbstractField(final Field rawField, final DecodeMonitor monitor) { this.rawField = rawField; this.monitor = monitor != null ? monitor : DecodeMonitor.SILENT; } /** * Gets the name of the field (Subject, * From, etc). * * @return the field name. */ public String getName() { return rawField.getName(); } /** * Gets the unfolded, unparsed and possibly encoded (see RFC 2047) field * body string. * * @return the unfolded unparsed field body string. */ public String getBody() { return rawField.getBody(); } /** * Gets original (raw) representation of the field, if available, * null otherwise. */ public ByteSequence getRaw() { return rawField.getRaw(); } /** * @see ParsedField#isValidField() */ public boolean isValidField() { return getParseException() == null; } /** * @see ParsedField#getParseException() */ public ParseException getParseException() { return null; } protected RawField getRawField() { if (rawField instanceof RawField) { return ((RawField) rawField); } else { return new RawField(rawField.getName(), rawField.getBody()); } } @Override public String toString() { return rawField.toString(); } } ././@LongLink0000000000000000000000000000016400000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/ContentDispositionFieldLenientImpl.javaapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/ContentDispositionFieldL0000644000000000000000000001500511702050530031714 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.TimeZone; import org.apache.james.mime4j.codec.DecodeMonitor; import org.apache.james.mime4j.dom.FieldParser; import org.apache.james.mime4j.dom.field.ContentDispositionField; import org.apache.james.mime4j.stream.Field; import org.apache.james.mime4j.stream.NameValuePair; import org.apache.james.mime4j.stream.RawBody; import org.apache.james.mime4j.stream.RawField; import org.apache.james.mime4j.stream.RawFieldParser; /** * Represents a Content-Disposition field. */ public class ContentDispositionFieldLenientImpl extends AbstractField implements ContentDispositionField { private static final String DEFAULT_DATE_FORMAT = "EEE, dd MMM yyyy hh:mm:ss ZZZZ"; private final List datePatterns; private boolean parsed = false; private String dispositionType = ""; private Map parameters = new HashMap(); private boolean creationDateParsed; private Date creationDate; private boolean modificationDateParsed; private Date modificationDate; private boolean readDateParsed; private Date readDate; ContentDispositionFieldLenientImpl(final Field rawField, final Collection dateParsers, final DecodeMonitor monitor) { super(rawField, monitor); this.datePatterns = new ArrayList(); if (dateParsers != null) { this.datePatterns.addAll(dateParsers); } else { this.datePatterns.add(DEFAULT_DATE_FORMAT); } } public String getDispositionType() { if (!parsed) { parse(); } return dispositionType; } public String getParameter(String name) { if (!parsed) { parse(); } return parameters.get(name.toLowerCase()); } public Map getParameters() { if (!parsed) { parse(); } return Collections.unmodifiableMap(parameters); } public boolean isDispositionType(String dispositionType) { if (!parsed) { parse(); } return this.dispositionType.equalsIgnoreCase(dispositionType); } public boolean isInline() { if (!parsed) { parse(); } return dispositionType.equals(DISPOSITION_TYPE_INLINE); } public boolean isAttachment() { if (!parsed) { parse(); } return dispositionType.equals(DISPOSITION_TYPE_ATTACHMENT); } public String getFilename() { return getParameter(PARAM_FILENAME); } public Date getCreationDate() { if (!creationDateParsed) { creationDate = parseDate(PARAM_CREATION_DATE); creationDateParsed = true; } return creationDate; } public Date getModificationDate() { if (!modificationDateParsed) { modificationDate = parseDate(PARAM_MODIFICATION_DATE); modificationDateParsed = true; } return modificationDate; } public Date getReadDate() { if (!readDateParsed) { readDate = parseDate(PARAM_READ_DATE); readDateParsed = true; } return readDate; } public long getSize() { String value = getParameter(PARAM_SIZE); if (value == null) return -1; try { long size = Long.parseLong(value); return size < 0 ? -1 : size; } catch (NumberFormatException e) { return -1; } } private void parse() { parsed = true; RawField f = getRawField(); RawBody body = RawFieldParser.DEFAULT.parseRawBody(f); String main = body.getValue(); if (main != null) { dispositionType = main.toLowerCase(Locale.US); } else { dispositionType = null; } parameters.clear(); for (NameValuePair nmp: body.getParams()) { String name = nmp.getName().toLowerCase(Locale.US); parameters.put(name, nmp.getValue()); } } private Date parseDate(final String paramName) { String value = getParameter(paramName); if (value == null) { return null; } for (String datePattern: datePatterns) { try { SimpleDateFormat parser = new SimpleDateFormat(datePattern, Locale.US); parser.setTimeZone(TimeZone.getTimeZone("GMT")); parser.setLenient(true); return parser.parse(value); } catch (ParseException ignore) { } } if (monitor.isListening()) { monitor.warn(paramName + " parameter is invalid: " + value, paramName + " parameter is ignored"); } return null; } public static final FieldParser PARSER = new FieldParser() { public ContentDispositionField parse(final Field rawField, final DecodeMonitor monitor) { return new ContentDispositionFieldLenientImpl(rawField, null, monitor); } }; } ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/DelegatingFieldParser.javaapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/DelegatingFieldParser.ja0000644000000000000000000000533611702050530031560 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field; import java.util.HashMap; import java.util.Map; import org.apache.james.mime4j.codec.DecodeMonitor; import org.apache.james.mime4j.dom.FieldParser; import org.apache.james.mime4j.dom.field.ParsedField; import org.apache.james.mime4j.stream.Field; public class DelegatingFieldParser implements FieldParser { private final FieldParser defaultParser; private final Map> parsers; public DelegatingFieldParser(final FieldParser defaultParser) { super(); this.defaultParser = defaultParser; this.parsers = new HashMap>(); } /** * Sets the parser used for the field named name. * @param name the name of the field * @param parser the parser for fields named name */ public void setFieldParser(final String name, final FieldParser parser) { parsers.put(name.toLowerCase(), parser); } public FieldParser getParser(final String name) { final FieldParser field = parsers.get(name.toLowerCase()); if (field == null) { return defaultParser; } return field; } public ParsedField parse(final Field rawField, final DecodeMonitor monitor) { final FieldParser parser = getParser(rawField.getName()); return parser.parse(rawField, monitor); } } ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/AddressListFieldImpl.javaapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/AddressListFieldImpl.jav0000644000000000000000000000567711702050530031601 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field; import org.apache.james.mime4j.codec.DecodeMonitor; import org.apache.james.mime4j.dom.FieldParser; import org.apache.james.mime4j.dom.address.AddressList; import org.apache.james.mime4j.dom.field.AddressListField; import org.apache.james.mime4j.field.address.AddressBuilder; import org.apache.james.mime4j.field.address.ParseException; import org.apache.james.mime4j.stream.Field; /** * Address list field such as To or Reply-To. */ public class AddressListFieldImpl extends AbstractField implements AddressListField { private boolean parsed = false; private AddressList addressList; private ParseException parseException; AddressListFieldImpl(Field rawField, DecodeMonitor monitor) { super(rawField, monitor); } /** * @see org.apache.james.mime4j.dom.field.AddressListField#getAddressList() */ public AddressList getAddressList() { if (!parsed) parse(); return addressList; } /** * @see org.apache.james.mime4j.dom.field.AddressListField#getParseException() */ @Override public ParseException getParseException() { if (!parsed) parse(); return parseException; } private void parse() { String body = getBody(); try { addressList = AddressBuilder.DEFAULT.parseAddressList(body, monitor); } catch (ParseException e) { parseException = e; } parsed = true; } public static final FieldParser PARSER = new FieldParser() { public AddressListField parse(final Field rawField, final DecodeMonitor monitor) { return new AddressListFieldImpl(rawField, monitor); } }; } ././@LongLink0000000000000000000000000000016100000000000011563 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/ContentLanguageFieldLenientImpl.javaapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/ContentLanguageFieldLeni0000644000000000000000000000716411702050530031636 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field; import java.util.ArrayList; import java.util.BitSet; import java.util.List; import org.apache.james.mime4j.codec.DecodeMonitor; import org.apache.james.mime4j.dom.FieldParser; import org.apache.james.mime4j.dom.field.ContentLanguageField; import org.apache.james.mime4j.stream.Field; import org.apache.james.mime4j.stream.ParserCursor; import org.apache.james.mime4j.stream.RawField; import org.apache.james.mime4j.stream.RawFieldParser; import org.apache.james.mime4j.util.ByteSequence; import org.apache.james.mime4j.util.ContentUtil; /** * Represents a Content-Transfer-Encoding field. */ public class ContentLanguageFieldLenientImpl extends AbstractField implements ContentLanguageField { private final static int COMMA = ','; private final static BitSet DELIM = RawFieldParser.INIT_BITSET(COMMA); private boolean parsed = false; private List languages; ContentLanguageFieldLenientImpl(final Field rawField, final DecodeMonitor monitor) { super(rawField, monitor); } private void parse() { parsed = true; languages = new ArrayList(); RawField f = getRawField(); ByteSequence buf = f.getRaw(); int pos = f.getDelimiterIdx() + 1; if (buf == null) { String body = f.getBody(); if (body == null) { return; } buf = ContentUtil.encode(body); pos = 0; } RawFieldParser parser = RawFieldParser.DEFAULT; ParserCursor cursor = new ParserCursor(pos, buf.length()); for (;;) { String token = parser.parseToken(buf, cursor, DELIM); if (token.length() > 0) { languages.add(token); } if (cursor.atEnd()) { break; } else { pos = cursor.getPos(); if (buf.byteAt(pos) == COMMA) { cursor.updatePos(pos + 1); } } } } public List getLanguages() { if (!parsed) { parse(); } return new ArrayList(languages); } public static final FieldParser PARSER = new FieldParser() { public ContentLanguageField parse(final Field rawField, final DecodeMonitor monitor) { return new ContentLanguageFieldLenientImpl(rawField, monitor); } }; } apache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/Fields.java0000644000000000000000000006021211702050530027123 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field; import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.TimeZone; import java.util.regex.Pattern; import org.apache.james.mime4j.codec.DecodeMonitor; import org.apache.james.mime4j.codec.EncoderUtil; import org.apache.james.mime4j.dom.FieldParser; import org.apache.james.mime4j.dom.address.Address; import org.apache.james.mime4j.dom.address.Mailbox; import org.apache.james.mime4j.dom.field.AddressListField; import org.apache.james.mime4j.dom.field.ContentDispositionField; import org.apache.james.mime4j.dom.field.ContentTransferEncodingField; import org.apache.james.mime4j.dom.field.ContentTypeField; import org.apache.james.mime4j.dom.field.DateTimeField; import org.apache.james.mime4j.dom.field.FieldName; import org.apache.james.mime4j.dom.field.MailboxField; import org.apache.james.mime4j.dom.field.MailboxListField; import org.apache.james.mime4j.dom.field.ParsedField; import org.apache.james.mime4j.dom.field.UnstructuredField; import org.apache.james.mime4j.field.address.AddressFormatter; import org.apache.james.mime4j.stream.Field; import org.apache.james.mime4j.stream.RawField; import org.apache.james.mime4j.util.MimeUtil; /** * Factory for concrete {@link Field} instances. */ public class Fields { private static final Pattern FIELD_NAME_PATTERN = Pattern .compile("[\\x21-\\x39\\x3b-\\x7e]+"); private Fields() { } /** * Creates a Content-Type field from the specified raw field value. * The specified string gets folded into a multiple-line representation if * necessary but is otherwise taken as is. * * @param contentType * raw content type containing a MIME type and optional * parameters. * @return the newly created Content-Type field. */ public static ContentTypeField contentType(String contentType) { return parse(ContentTypeFieldImpl.PARSER, FieldName.CONTENT_TYPE, contentType); } /** * Creates a Content-Type field from the specified MIME type and * parameters. * * @param mimeType * a MIME type (such as "text/plain" or * "application/octet-stream"). * @param parameters * map containing content-type parameters such as * "boundary". * @return the newly created Content-Type field. */ public static ContentTypeField contentType(String mimeType, Map parameters) { if (!isValidMimeType(mimeType)) throw new IllegalArgumentException(); if (parameters == null || parameters.isEmpty()) { return parse(ContentTypeFieldImpl.PARSER, FieldName.CONTENT_TYPE, mimeType); } else { StringBuilder sb = new StringBuilder(mimeType); for (Map.Entry entry : parameters.entrySet()) { sb.append("; "); sb.append(EncoderUtil.encodeHeaderParameter(entry.getKey(), entry.getValue())); } String contentType = sb.toString(); return contentType(contentType); } } /** * Creates a Content-Transfer-Encoding field from the specified raw * field value. * * @param contentTransferEncoding * an encoding mechanism such as "7-bit" * or "quoted-printable". * @return the newly created Content-Transfer-Encoding field. */ public static ContentTransferEncodingField contentTransferEncoding( String contentTransferEncoding) { return parse(ContentTransferEncodingFieldImpl.PARSER, FieldName.CONTENT_TRANSFER_ENCODING, contentTransferEncoding); } /** * Creates a Content-Disposition field from the specified raw field * value. The specified string gets folded into a multiple-line * representation if necessary but is otherwise taken as is. * * @param contentDisposition * raw content disposition containing a disposition type and * optional parameters. * @return the newly created Content-Disposition field. */ public static ContentDispositionField contentDisposition( String contentDisposition) { return parse(ContentDispositionFieldImpl.PARSER, FieldName.CONTENT_DISPOSITION, contentDisposition); } /** * Creates a Content-Disposition field from the specified * disposition type and parameters. * * @param dispositionType * a disposition type (usually "inline" * or "attachment"). * @param parameters * map containing disposition parameters such as * "filename". * @return the newly created Content-Disposition field. */ public static ContentDispositionField contentDisposition( String dispositionType, Map parameters) { if (!isValidDispositionType(dispositionType)) throw new IllegalArgumentException(); if (parameters == null || parameters.isEmpty()) { return parse(ContentDispositionFieldImpl.PARSER, FieldName.CONTENT_DISPOSITION, dispositionType); } else { StringBuilder sb = new StringBuilder(dispositionType); for (Map.Entry entry : parameters.entrySet()) { sb.append("; "); sb.append(EncoderUtil.encodeHeaderParameter(entry.getKey(), entry.getValue())); } String contentDisposition = sb.toString(); return contentDisposition(contentDisposition); } } /** * Creates a Content-Disposition field from the specified * disposition type and filename. * * @param dispositionType * a disposition type (usually "inline" * or "attachment"). * @param filename * filename parameter value or null if the * parameter should not be included. * @return the newly created Content-Disposition field. */ public static ContentDispositionField contentDisposition( String dispositionType, String filename) { return contentDisposition(dispositionType, filename, -1, null, null, null); } /** * Creates a Content-Disposition field from the specified values. * * @param dispositionType * a disposition type (usually "inline" * or "attachment"). * @param filename * filename parameter value or null if the * parameter should not be included. * @param size * size parameter value or -1 if the parameter * should not be included. * @return the newly created Content-Disposition field. */ public static ContentDispositionField contentDisposition( String dispositionType, String filename, long size) { return contentDisposition(dispositionType, filename, size, null, null, null); } /** * Creates a Content-Disposition field from the specified values. * * @param dispositionType * a disposition type (usually "inline" * or "attachment"). * @param filename * filename parameter value or null if the * parameter should not be included. * @param size * size parameter value or -1 if the parameter * should not be included. * @param creationDate * creation-date parameter value or null if the * parameter should not be included. * @param modificationDate * modification-date parameter value or null if * the parameter should not be included. * @param readDate * read-date parameter value or null if the * parameter should not be included. * @return the newly created Content-Disposition field. */ public static ContentDispositionField contentDisposition( String dispositionType, String filename, long size, Date creationDate, Date modificationDate, Date readDate) { Map parameters = new HashMap(); if (filename != null) { parameters.put(ContentDispositionFieldImpl.PARAM_FILENAME, filename); } if (size >= 0) { parameters.put(ContentDispositionFieldImpl.PARAM_SIZE, Long .toString(size)); } if (creationDate != null) { parameters.put(ContentDispositionFieldImpl.PARAM_CREATION_DATE, MimeUtil.formatDate(creationDate, null)); } if (modificationDate != null) { parameters.put(ContentDispositionFieldImpl.PARAM_MODIFICATION_DATE, MimeUtil.formatDate(modificationDate, null)); } if (readDate != null) { parameters.put(ContentDispositionFieldImpl.PARAM_READ_DATE, MimeUtil .formatDate(readDate, null)); } return contentDisposition(dispositionType, parameters); } /** * Creates a Date field from the specified Date * value. The default time zone of the host is used to format the date. * * @param date * date value for the header field. * @return the newly created Date field. */ public static DateTimeField date(Date date) { return date0(FieldName.DATE, date, null); } /** * Creates a date field from the specified field name and Date * value. The default time zone of the host is used to format the date. * * @param fieldName * a field name such as Date or * Resent-Date. * @param date * date value for the header field. * @return the newly created date field. */ public static DateTimeField date(String fieldName, Date date) { checkValidFieldName(fieldName); return date0(fieldName, date, null); } /** * Creates a date field from the specified field name, Date * and TimeZone values. * * @param fieldName * a field name such as Date or * Resent-Date. * @param date * date value for the header field. * @param zone * the time zone to be used for formatting the date. * @return the newly created date field. */ public static DateTimeField date(String fieldName, Date date, TimeZone zone) { checkValidFieldName(fieldName); return date0(fieldName, date, zone); } /** * Creates a Message-ID field for the specified host name. * * @param hostname * host name to be included in the message ID or * null if no host name should be included. * @return the newly created Message-ID field. */ public static UnstructuredField messageId(String hostname) { String fieldValue = MimeUtil.createUniqueMessageId(hostname); return parse(UnstructuredFieldImpl.PARSER, FieldName.MESSAGE_ID, fieldValue); } /** * Creates a Subject field from the specified string value. The * specified string may contain non-ASCII characters. * * @param subject * the subject string. * @return the newly created Subject field. */ public static UnstructuredField subject(String subject) { int usedCharacters = FieldName.SUBJECT.length() + 2; String fieldValue = EncoderUtil.encodeIfNecessary(subject, EncoderUtil.Usage.TEXT_TOKEN, usedCharacters); return parse(UnstructuredFieldImpl.PARSER, FieldName.SUBJECT, fieldValue); } /** * Creates a Sender field for the specified mailbox address. * * @param mailbox * address to be included in the field. * @return the newly created Sender field. */ public static MailboxField sender(Mailbox mailbox) { return mailbox0(FieldName.SENDER, mailbox); } /** * Creates a From field for the specified mailbox address. * * @param mailbox * address to be included in the field. * @return the newly created From field. */ public static MailboxListField from(Mailbox mailbox) { return mailboxList0(FieldName.FROM, Collections.singleton(mailbox)); } /** * Creates a From field for the specified mailbox addresses. * * @param mailboxes * addresses to be included in the field. * @return the newly created From field. */ public static MailboxListField from(Mailbox... mailboxes) { return mailboxList0(FieldName.FROM, Arrays.asList(mailboxes)); } /** * Creates a From field for the specified mailbox addresses. * * @param mailboxes * addresses to be included in the field. * @return the newly created From field. */ public static MailboxListField from(Iterable mailboxes) { return mailboxList0(FieldName.FROM, mailboxes); } /** * Creates a To field for the specified mailbox or group address. * * @param address * mailbox or group address to be included in the field. * @return the newly created To field. */ public static AddressListField to(Address address) { return addressList0(FieldName.TO, Collections.singleton(address)); } /** * Creates a To field for the specified mailbox or group addresses. * * @param addresses * mailbox or group addresses to be included in the field. * @return the newly created To field. */ public static AddressListField to(Address... addresses) { return addressList0(FieldName.TO, Arrays.asList(addresses)); } /** * Creates a To field for the specified mailbox or group addresses. * * @param addresses * mailbox or group addresses to be included in the field. * @return the newly created To field. */ public static AddressListField to(Iterable
addresses) { return addressList0(FieldName.TO, addresses); } /** * Creates a Cc field for the specified mailbox or group address. * * @param address * mailbox or group address to be included in the field. * @return the newly created Cc field. */ public static AddressListField cc(Address address) { return addressList0(FieldName.CC, Collections.singleton(address)); } /** * Creates a Cc field for the specified mailbox or group addresses. * * @param addresses * mailbox or group addresses to be included in the field. * @return the newly created Cc field. */ public static AddressListField cc(Address... addresses) { return addressList0(FieldName.CC, Arrays.asList(addresses)); } /** * Creates a Cc field for the specified mailbox or group addresses. * * @param addresses * mailbox or group addresses to be included in the field. * @return the newly created Cc field. */ public static AddressListField cc(Iterable
addresses) { return addressList0(FieldName.CC, addresses); } /** * Creates a Bcc field for the specified mailbox or group address. * * @param address * mailbox or group address to be included in the field. * @return the newly created Bcc field. */ public static AddressListField bcc(Address address) { return addressList0(FieldName.BCC, Collections.singleton(address)); } /** * Creates a Bcc field for the specified mailbox or group addresses. * * @param addresses * mailbox or group addresses to be included in the field. * @return the newly created Bcc field. */ public static AddressListField bcc(Address... addresses) { return addressList0(FieldName.BCC, Arrays.asList(addresses)); } /** * Creates a Bcc field for the specified mailbox or group addresses. * * @param addresses * mailbox or group addresses to be included in the field. * @return the newly created Bcc field. */ public static AddressListField bcc(Iterable
addresses) { return addressList0(FieldName.BCC, addresses); } /** * Creates a Reply-To field for the specified mailbox or group * address. * * @param address * mailbox or group address to be included in the field. * @return the newly created Reply-To field. */ public static AddressListField replyTo(Address address) { return addressList0(FieldName.REPLY_TO, Collections.singleton(address)); } /** * Creates a Reply-To field for the specified mailbox or group * addresses. * * @param addresses * mailbox or group addresses to be included in the field. * @return the newly created Reply-To field. */ public static AddressListField replyTo(Address... addresses) { return addressList0(FieldName.REPLY_TO, Arrays.asList(addresses)); } /** * Creates a Reply-To field for the specified mailbox or group * addresses. * * @param addresses * mailbox or group addresses to be included in the field. * @return the newly created Reply-To field. */ public static AddressListField replyTo(Iterable
addresses) { return addressList0(FieldName.REPLY_TO, addresses); } /** * Creates a mailbox field from the specified field name and mailbox * address. Valid field names are Sender and * Resent-Sender. * * @param fieldName * the name of the mailbox field (Sender or * Resent-Sender). * @param mailbox * mailbox address for the field value. * @return the newly created mailbox field. */ public static MailboxField mailbox(String fieldName, Mailbox mailbox) { checkValidFieldName(fieldName); return mailbox0(fieldName, mailbox); } /** * Creates a mailbox-list field from the specified field name and mailbox * addresses. Valid field names are From and * Resent-From. * * @param fieldName * the name of the mailbox field (From or * Resent-From). * @param mailboxes * mailbox addresses for the field value. * @return the newly created mailbox-list field. */ public static MailboxListField mailboxList(String fieldName, Iterable mailboxes) { checkValidFieldName(fieldName); return mailboxList0(fieldName, mailboxes); } /** * Creates an address-list field from the specified field name and mailbox * or group addresses. Valid field names are To, * Cc, Bcc, Reply-To, * Resent-To, Resent-Cc and * Resent-Bcc. * * @param fieldName * the name of the mailbox field (To, * Cc, Bcc, Reply-To, * Resent-To, Resent-Cc or * Resent-Bcc). * @param addresses * mailbox or group addresses for the field value. * @return the newly created address-list field. */ public static AddressListField addressList(String fieldName, Iterable addresses) { checkValidFieldName(fieldName); return addressList0(fieldName, addresses); } private static DateTimeField date0(String fieldName, Date date, TimeZone zone) { final String formattedDate = MimeUtil.formatDate(date, zone); return parse(DateTimeFieldImpl.PARSER, fieldName, formattedDate); } private static MailboxField mailbox0(String fieldName, Mailbox mailbox) { String fieldValue = encodeAddresses(Collections.singleton(mailbox)); return parse(MailboxFieldImpl.PARSER, fieldName, fieldValue); } private static MailboxListField mailboxList0(String fieldName, Iterable mailboxes) { String fieldValue = encodeAddresses(mailboxes); return parse(MailboxListFieldImpl.PARSER, fieldName, fieldValue); } private static AddressListField addressList0(String fieldName, Iterable addresses) { String fieldValue = encodeAddresses(addresses); return parse(AddressListFieldImpl.PARSER, fieldName, fieldValue); } private static void checkValidFieldName(String fieldName) { if (!FIELD_NAME_PATTERN.matcher(fieldName).matches()) throw new IllegalArgumentException("Invalid field name"); } private static boolean isValidMimeType(String mimeType) { if (mimeType == null) return false; int idx = mimeType.indexOf('/'); if (idx == -1) return false; String type = mimeType.substring(0, idx); String subType = mimeType.substring(idx + 1); return EncoderUtil.isToken(type) && EncoderUtil.isToken(subType); } private static boolean isValidDispositionType(String dispositionType) { if (dispositionType == null) return false; return EncoderUtil.isToken(dispositionType); } private static F parse(FieldParser parser, String fieldName, String fieldBody) { RawField rawField = new RawField(fieldName, fieldBody); return parser.parse(rawField, DecodeMonitor.SILENT); } private static String encodeAddresses(Iterable addresses) { StringBuilder sb = new StringBuilder(); for (Address address : addresses) { if (sb.length() > 0) { sb.append(", "); } AddressFormatter.DEFAULT.encode(sb, address); } return sb.toString(); } } ././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/MailboxFieldLenientImpl.javaapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/MailboxFieldLenientImpl.0000644000000000000000000000572611702050530031564 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field; import org.apache.james.mime4j.codec.DecodeMonitor; import org.apache.james.mime4j.dom.FieldParser; import org.apache.james.mime4j.dom.address.Mailbox; import org.apache.james.mime4j.dom.field.MailboxField; import org.apache.james.mime4j.field.address.LenientAddressBuilder; import org.apache.james.mime4j.stream.Field; import org.apache.james.mime4j.stream.ParserCursor; import org.apache.james.mime4j.stream.RawField; import org.apache.james.mime4j.util.ByteSequence; import org.apache.james.mime4j.util.ContentUtil; /** * Mailbox field such as Sender or Resent-Sender. */ public class MailboxFieldLenientImpl extends AbstractField implements MailboxField { private boolean parsed = false; private Mailbox mailbox; MailboxFieldLenientImpl(final Field rawField, final DecodeMonitor monitor) { super(rawField, monitor); } public Mailbox getMailbox() { if (!parsed) { parse(); } return mailbox; } private void parse() { parsed = true; RawField f = getRawField(); ByteSequence buf = f.getRaw(); int pos = f.getDelimiterIdx() + 1; if (buf == null) { String body = f.getBody(); if (body == null) { return; } buf = ContentUtil.encode(body); pos = 0; } ParserCursor cursor = new ParserCursor(pos, buf.length()); mailbox = LenientAddressBuilder.DEFAULT.parseMailbox(buf, cursor, null); } public static final FieldParser PARSER = new FieldParser() { public MailboxField parse(final Field rawField, final DecodeMonitor monitor) { return new MailboxFieldLenientImpl(rawField, monitor); } }; } ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/DateTimeFieldLenientImpl.javaapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/DateTimeFieldLenientImpl0000644000000000000000000000734711702050530031610 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.List; import java.util.Locale; import java.util.TimeZone; import org.apache.james.mime4j.codec.DecodeMonitor; import org.apache.james.mime4j.dom.FieldParser; import org.apache.james.mime4j.dom.field.DateTimeField; import org.apache.james.mime4j.stream.Field; /** * Date-time field such as Date or Resent-Date. */ public class DateTimeFieldLenientImpl extends AbstractField implements DateTimeField { private static final String[] DEFAULT_DATE_FORMATS = { "EEE, dd MMM yyyy HH:mm:ss ZZZZ", "dd MMM yyyy HH:mm:ss ZZZZ"}; private final List datePatterns; private boolean parsed = false; private Date date; DateTimeFieldLenientImpl(final Field rawField, final Collection dateParsers, final DecodeMonitor monitor) { super(rawField, monitor); this.datePatterns = new ArrayList(); if (dateParsers != null) { this.datePatterns.addAll(dateParsers); } else { for (String pattern: DEFAULT_DATE_FORMATS) { this.datePatterns.add(pattern); } } } public Date getDate() { if (!parsed) { parse(); } return date; } private void parse() { parsed = true; date = null; String body = getBody(); for (String datePattern: datePatterns) { try { SimpleDateFormat parser = new SimpleDateFormat(datePattern, Locale.US); parser.setTimeZone(TimeZone.getTimeZone("GMT")); parser.setLenient(true); date = parser.parse(body); break; } catch (ParseException ignore) { } } } public static final FieldParser PARSER = new FieldParser() { public DateTimeField parse(final Field rawField, final DecodeMonitor monitor) { return new DateTimeFieldLenientImpl(rawField, null, monitor); } }; public static FieldParser createParser(final Collection dateParsers) { return new FieldParser() { public DateTimeField parse(final Field rawField, final DecodeMonitor monitor) { return new DateTimeFieldLenientImpl(rawField, dateParsers, monitor); } }; } } ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/MailboxListFieldImpl.javaapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/MailboxListFieldImpl.jav0000644000000000000000000000571511702050530031600 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field; import org.apache.james.mime4j.codec.DecodeMonitor; import org.apache.james.mime4j.dom.FieldParser; import org.apache.james.mime4j.dom.address.MailboxList; import org.apache.james.mime4j.dom.field.MailboxListField; import org.apache.james.mime4j.field.address.AddressBuilder; import org.apache.james.mime4j.field.address.ParseException; import org.apache.james.mime4j.stream.Field; /** * Mailbox-list field such as From or Resent-From. */ public class MailboxListFieldImpl extends AbstractField implements MailboxListField { private boolean parsed = false; private MailboxList mailboxList; private ParseException parseException; MailboxListFieldImpl(Field rawField, DecodeMonitor monitor) { super(rawField, monitor); } /** * @see org.apache.james.mime4j.dom.field.MailboxListField#getMailboxList() */ public MailboxList getMailboxList() { if (!parsed) parse(); return mailboxList; } /** * @see org.apache.james.mime4j.dom.field.MailboxListField#getParseException() */ @Override public ParseException getParseException() { if (!parsed) parse(); return parseException; } private void parse() { String body = getBody(); try { mailboxList = AddressBuilder.DEFAULT.parseAddressList(body, monitor).flatten(); } catch (ParseException e) { parseException = e; } parsed = true; } public static final FieldParser PARSER = new FieldParser() { public MailboxListField parse(final Field rawField, final DecodeMonitor monitor) { return new MailboxListFieldImpl(rawField, monitor); } }; } ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/MimeVersionFieldImpl.javaapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/MimeVersionFieldImpl.jav0000644000000000000000000000712711702050530031605 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field; import java.io.StringReader; import org.apache.james.mime4j.MimeException; import org.apache.james.mime4j.codec.DecodeMonitor; import org.apache.james.mime4j.dom.FieldParser; import org.apache.james.mime4j.dom.field.MimeVersionField; import org.apache.james.mime4j.field.mimeversion.parser.MimeVersionParser; import org.apache.james.mime4j.field.mimeversion.parser.ParseException; import org.apache.james.mime4j.stream.Field; /** * Represents a MIME-Version field. */ public class MimeVersionFieldImpl extends AbstractField implements MimeVersionField { public static final int DEFAULT_MINOR_VERSION = 0; public static final int DEFAULT_MAJOR_VERSION = 1; private boolean parsed = false; private int major = DEFAULT_MAJOR_VERSION; private int minor = DEFAULT_MINOR_VERSION; private ParseException parsedException; MimeVersionFieldImpl(Field rawField, DecodeMonitor monitor) { super(rawField, monitor); } private void parse() { parsed = true; major = DEFAULT_MAJOR_VERSION; minor = DEFAULT_MINOR_VERSION; String body = getBody(); if (body != null) { StringReader reader = new StringReader(body); MimeVersionParser parser = new MimeVersionParser(reader); try { parser.parse(); int v = parser.getMajorVersion(); if (v != MimeVersionParser.INITIAL_VERSION_VALUE) { major = v; } v = parser.getMinorVersion(); if (v != MimeVersionParser.INITIAL_VERSION_VALUE) { minor = v; } } catch (MimeException ex) { parsedException = new ParseException(ex); } } } public int getMinorVersion() { if (!parsed) { parse(); } return minor; } public int getMajorVersion() { if (!parsed) { parse(); } return major; } @Override public org.apache.james.mime4j.dom.field.ParseException getParseException() { return parsedException; } public static final FieldParser PARSER = new FieldParser() { public MimeVersionField parse(final Field rawField, final DecodeMonitor monitor) { return new MimeVersionFieldImpl(rawField, monitor); } }; } ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/ContentLengthFieldImpl.javaapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/ContentLengthFieldImpl.j0000644000000000000000000000563411702050530031576 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field; import org.apache.james.mime4j.codec.DecodeMonitor; import org.apache.james.mime4j.dom.FieldParser; import org.apache.james.mime4j.dom.field.ContentLengthField; import org.apache.james.mime4j.stream.Field; /** * Represents a Content-Length field. */ public class ContentLengthFieldImpl extends AbstractField implements ContentLengthField { private boolean parsed = false; private long contentLength; ContentLengthFieldImpl(Field rawField, DecodeMonitor monitor) { super(rawField, monitor); } private void parse() { parsed = true; contentLength = -1; String body = getBody(); if (body != null) { try { contentLength = Long.parseLong(body); if (contentLength < 0) { contentLength = -1; if (monitor.isListening()) { monitor.warn("Negative content length: " + body, "ignoring Content-Length header"); } } } catch (NumberFormatException e) { if (monitor.isListening()) { monitor.warn("Invalid content length: " + body, "ignoring Content-Length header"); } } } } public long getContentLength() { if (!parsed) { parse(); } return contentLength; } public static final FieldParser PARSER = new FieldParser() { public ContentLengthField parse(final Field rawField, final DecodeMonitor monitor) { return new ContentLengthFieldImpl(rawField, monitor); } }; } ././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/ContentTypeFieldLenientImpl.javaapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/ContentTypeFieldLenientI0000644000000000000000000001171211702050530031646 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field; import java.util.Collections; import java.util.HashMap; import java.util.Locale; import java.util.Map; import org.apache.james.mime4j.codec.DecodeMonitor; import org.apache.james.mime4j.dom.FieldParser; import org.apache.james.mime4j.dom.field.ContentTypeField; import org.apache.james.mime4j.stream.Field; import org.apache.james.mime4j.stream.NameValuePair; import org.apache.james.mime4j.stream.RawBody; import org.apache.james.mime4j.stream.RawField; import org.apache.james.mime4j.stream.RawFieldParser; /** * Represents a Content-Type field. */ public class ContentTypeFieldLenientImpl extends AbstractField implements ContentTypeField { private boolean parsed = false; private String mimeType = null; private String mediaType = null; private String subType = null; private Map parameters = new HashMap(); ContentTypeFieldLenientImpl(final Field rawField, final DecodeMonitor monitor) { super(rawField, monitor); } public String getMimeType() { if (!parsed) { parse(); } return mimeType; } public String getMediaType() { if (!parsed) { parse(); } return mediaType; } public String getSubType() { if (!parsed) { parse(); } return subType; } public String getParameter(String name) { if (!parsed) { parse(); } return parameters.get(name.toLowerCase()); } public Map getParameters() { if (!parsed) { parse(); } return Collections.unmodifiableMap(parameters); } public boolean isMimeType(String mimeType) { if (!parsed) { parse(); } return this.mimeType != null && this.mimeType.equalsIgnoreCase(mimeType); } public boolean isMultipart() { if (!parsed) { parse(); } return this.mimeType != null && mimeType.startsWith(TYPE_MULTIPART_PREFIX); } public String getBoundary() { return getParameter(PARAM_BOUNDARY); } public String getCharset() { return getParameter(PARAM_CHARSET); } private void parse() { parsed = true; RawField f = getRawField(); RawBody body = RawFieldParser.DEFAULT.parseRawBody(f); String main = body.getValue(); String type = null; String subtype = null; if (main != null) { main = main.toLowerCase().trim(); int index = main.indexOf('/'); boolean valid = false; if (index != -1) { type = main.substring(0, index).trim(); subtype = main.substring(index + 1).trim(); if (type.length() > 0 && subtype.length() > 0) { main = type + "/" + subtype; valid = true; } } if (!valid) { if (monitor.isListening()) { monitor.warn("Invalid Content-Type: " + body, "Content-Type value ignored"); } main = null; type = null; subtype = null; } } mimeType = main; mediaType = type; subType = subtype; parameters.clear(); for (NameValuePair nmp: body.getParams()) { String name = nmp.getName().toLowerCase(Locale.US); parameters.put(name, nmp.getValue()); } } public static final FieldParser PARSER = new FieldParser() { public ContentTypeField parse(final Field rawField, final DecodeMonitor monitor) { return new ContentTypeFieldLenientImpl(rawField, monitor); } }; } ././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/ContentDispositionFieldImpl.javaapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/ContentDispositionFieldI0000644000000000000000000002024111702050530031707 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field; import java.io.StringReader; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import org.apache.james.mime4j.codec.DecodeMonitor; import org.apache.james.mime4j.dom.FieldParser; import org.apache.james.mime4j.dom.field.ContentDispositionField; import org.apache.james.mime4j.field.contentdisposition.parser.ContentDispositionParser; import org.apache.james.mime4j.field.contentdisposition.parser.ParseException; import org.apache.james.mime4j.field.contentdisposition.parser.TokenMgrError; import org.apache.james.mime4j.field.datetime.parser.DateTimeParser; import org.apache.james.mime4j.stream.Field; /** * Represents a Content-Disposition field. */ public class ContentDispositionFieldImpl extends AbstractField implements ContentDispositionField { private boolean parsed = false; private String dispositionType = ""; private Map parameters = new HashMap(); private ParseException parseException; private boolean creationDateParsed; private Date creationDate; private boolean modificationDateParsed; private Date modificationDate; private boolean readDateParsed; private Date readDate; ContentDispositionFieldImpl(Field rawField, DecodeMonitor monitor) { super(rawField, monitor); } /** * Gets the exception that was raised during parsing of the field value, if * any; otherwise, null. */ @Override public ParseException getParseException() { if (!parsed) parse(); return parseException; } /** * @see org.apache.james.mime4j.dom.field.ContentDispositionField#getDispositionType() */ public String getDispositionType() { if (!parsed) parse(); return dispositionType; } /** * @see org.apache.james.mime4j.dom.field.ContentDispositionField#getParameter(java.lang.String) */ public String getParameter(String name) { if (!parsed) parse(); return parameters.get(name.toLowerCase()); } /** * @see org.apache.james.mime4j.dom.field.ContentDispositionField#getParameters() */ public Map getParameters() { if (!parsed) parse(); return Collections.unmodifiableMap(parameters); } /** * @see org.apache.james.mime4j.dom.field.ContentDispositionField#isDispositionType(java.lang.String) */ public boolean isDispositionType(String dispositionType) { if (!parsed) parse(); return this.dispositionType.equalsIgnoreCase(dispositionType); } /** * @see org.apache.james.mime4j.dom.field.ContentDispositionField#isInline() */ public boolean isInline() { if (!parsed) parse(); return dispositionType.equals(DISPOSITION_TYPE_INLINE); } /** * @see org.apache.james.mime4j.dom.field.ContentDispositionField#isAttachment() */ public boolean isAttachment() { if (!parsed) parse(); return dispositionType.equals(DISPOSITION_TYPE_ATTACHMENT); } /** * @see org.apache.james.mime4j.dom.field.ContentDispositionField#getFilename() */ public String getFilename() { return getParameter(PARAM_FILENAME); } /** * @see org.apache.james.mime4j.dom.field.ContentDispositionField#getCreationDate() */ public Date getCreationDate() { if (!creationDateParsed) { creationDate = parseDate(PARAM_CREATION_DATE); creationDateParsed = true; } return creationDate; } /** * @see org.apache.james.mime4j.dom.field.ContentDispositionField#getModificationDate() */ public Date getModificationDate() { if (!modificationDateParsed) { modificationDate = parseDate(PARAM_MODIFICATION_DATE); modificationDateParsed = true; } return modificationDate; } /** * @see org.apache.james.mime4j.dom.field.ContentDispositionField#getReadDate() */ public Date getReadDate() { if (!readDateParsed) { readDate = parseDate(PARAM_READ_DATE); readDateParsed = true; } return readDate; } /** * @see org.apache.james.mime4j.dom.field.ContentDispositionField#getSize() */ public long getSize() { String value = getParameter(PARAM_SIZE); if (value == null) return -1; try { long size = Long.parseLong(value); return size < 0 ? -1 : size; } catch (NumberFormatException e) { return -1; } } private Date parseDate(String paramName) { String value = getParameter(paramName); if (value == null) { monitor.warn("Parsing " + paramName + " null", "returning null"); return null; } try { return new DateTimeParser(new StringReader(value)).parseAll() .getDate(); } catch (org.apache.james.mime4j.field.datetime.parser.ParseException e) { if (monitor.isListening()) { monitor.warn(paramName + " parameter is invalid: " + value, paramName + " parameter is ignored"); } return null; } catch (TokenMgrError e) { monitor.warn(paramName + " parameter is invalid: " + value, paramName + "parameter is ignored"); return null; } } private void parse() { String body = getBody(); ContentDispositionParser parser = new ContentDispositionParser( new StringReader(body)); try { parser.parseAll(); } catch (ParseException e) { parseException = e; } catch (TokenMgrError e) { parseException = new ParseException(e.getMessage()); } final String dispositionType = parser.getDispositionType(); if (dispositionType != null) { this.dispositionType = dispositionType.toLowerCase(Locale.US); List paramNames = parser.getParamNames(); List paramValues = parser.getParamValues(); if (paramNames != null && paramValues != null) { final int len = Math.min(paramNames.size(), paramValues.size()); for (int i = 0; i < len; i++) { String paramName = paramNames.get(i).toLowerCase(Locale.US); String paramValue = paramValues.get(i); parameters.put(paramName, paramValue); } } } parsed = true; } public static final FieldParser PARSER = new FieldParser() { public ContentDispositionField parse(final Field rawField, final DecodeMonitor monitor) { return new ContentDispositionFieldImpl(rawField, monitor); } }; } ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/ContentTypeFieldImpl.javaapache-mime4j-project-0.7.2/dom/src/main/java/org/apache/james/mime4j/field/ContentTypeFieldImpl.jav0000644000000000000000000001650011702050530031617 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field; import java.io.StringReader; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.james.mime4j.codec.DecodeMonitor; import org.apache.james.mime4j.dom.FieldParser; import org.apache.james.mime4j.dom.field.ContentTypeField; import org.apache.james.mime4j.field.contenttype.parser.ContentTypeParser; import org.apache.james.mime4j.field.contenttype.parser.ParseException; import org.apache.james.mime4j.field.contenttype.parser.TokenMgrError; import org.apache.james.mime4j.stream.Field; /** * Represents a Content-Type field. */ public class ContentTypeFieldImpl extends AbstractField implements ContentTypeField { private boolean parsed = false; private String mimeType = null; private String mediaType = null; private String subType = null; private Map parameters = new HashMap(); private ParseException parseException; ContentTypeFieldImpl(Field rawField, DecodeMonitor monitor) { super(rawField, monitor); } /** * @see org.apache.james.mime4j.dom.field.ContentTypeField#getParseException() */ @Override public ParseException getParseException() { if (!parsed) parse(); return parseException; } /** * @see org.apache.james.mime4j.dom.field.ContentTypeField#getMimeType() */ public String getMimeType() { if (!parsed) parse(); return mimeType; } /** * @see org.apache.james.mime4j.dom.field.ContentTypeField#getMediaType() */ public String getMediaType() { if (!parsed) parse(); return mediaType; } /** * @see org.apache.james.mime4j.dom.field.ContentTypeField#getSubType() */ public String getSubType() { if (!parsed) parse(); return subType; } /** * @see org.apache.james.mime4j.dom.field.ContentTypeField#getParameter(java.lang.String) */ public String getParameter(String name) { if (!parsed) parse(); return parameters.get(name.toLowerCase()); } /** * @see org.apache.james.mime4j.dom.field.ContentTypeField#getParameters() */ public Map getParameters() { if (!parsed) parse(); return Collections.unmodifiableMap(parameters); } /** * @see org.apache.james.mime4j.dom.field.ContentTypeField#isMimeType(java.lang.String) */ public boolean isMimeType(String mimeType) { if (!parsed) parse(); return this.mimeType != null && this.mimeType.equalsIgnoreCase(mimeType); } /** * @see org.apache.james.mime4j.dom.field.ContentTypeField#isMultipart() */ public boolean isMultipart() { if (!parsed) parse(); return this.mimeType != null && mimeType.startsWith(TYPE_MULTIPART_PREFIX); } /** * @see org.apache.james.mime4j.dom.field.ContentTypeField#getBoundary() */ public String getBoundary() { return getParameter(PARAM_BOUNDARY); } /** * @see org.apache.james.mime4j.dom.field.ContentTypeField#getCharset() */ public String getCharset() { return getParameter(PARAM_CHARSET); } /** * Gets the MIME type defined in the child's Content-Type field or derives a * MIME type from the parent if child is null or hasn't got a * MIME type value set. If child's MIME type is multipart but no boundary * has been set the MIME type of child will be derived from the parent. * * @param child * the child. * @param parent * the parent. * @return the MIME type. */ public static String getMimeType(ContentTypeField child, ContentTypeField parent) { if (child == null || child.getMimeType() == null || child.isMultipart() && child.getBoundary() == null) { if (parent != null && parent.isMimeType(TYPE_MULTIPART_DIGEST)) { return TYPE_MESSAGE_RFC822; } else { return TYPE_TEXT_PLAIN; } } return child.getMimeType(); } /** * Gets the value of the charset parameter if set for the * given field. Returns the default us-ascii if not set or if * f is null. * * @return the charset parameter value. */ public static String getCharset(ContentTypeField f) { if (f != null) { String charset = f.getCharset(); if (charset != null && charset.length() > 0) { return charset; } } return "us-ascii"; } private void parse() { String body = getBody(); ContentTypeParser parser = new ContentTypeParser(new StringReader(body)); try { parser.parseAll(); } catch (ParseException e) { parseException = e; } catch (TokenMgrError e) { parseException = new ParseException(e.getMessage()); } mediaType = parser.getType(); subType = parser.getSubType(); if (mediaType != null && subType != null) { mimeType = (mediaType + "/" + subType).toLowerCase(); List paramNames = parser.getParamNames(); List paramValues = parser.getParamValues(); if (paramNames != null && paramValues != null) { final int len = Math.min(paramNames.size(), paramValues.size()); for (int i = 0; i < len; i++) { String paramName = paramNames.get(i).toLowerCase(); String paramValue = paramValues.get(i); parameters.put(paramName, paramValue); } } } parsed = true; } public static final FieldParser PARSER = new FieldParser() { public ContentTypeField parse(final Field rawField, final DecodeMonitor monitor) { return new ContentTypeFieldImpl(rawField, monitor); } }; } apache-mime4j-project-0.7.2/dom/src/main/resources/0000755000000000000000000000000011702050530020563 5ustar rootrootapache-mime4j-project-0.7.2/dom/src/main/resources/META-INF/0000755000000000000000000000000011702050530021723 5ustar rootrootapache-mime4j-project-0.7.2/dom/src/main/resources/META-INF/services/0000755000000000000000000000000011702050530023546 5ustar rootroot././@LongLink0000000000000000000000000000016700000000000011571 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/resources/META-INF/services/org.apache.james.mime4j.dom.MessageServiceFactoryapache-mime4j-project-0.7.2/dom/src/main/resources/META-INF/services/org.apache.james.mime4j.dom.Mes0000644000000000000000000000007111702050530031261 0ustar rootrootorg.apache.james.mime4j.message.MessageServiceFactoryImplapache-mime4j-project-0.7.2/dom/src/main/resources/META-INF/README0000644000000000000000000000237011702050530022605 0ustar rootrootCryptography Notice ------------------- This distribution includes cryptographic software. The country in which you currently reside may have restrictions on the import, possession, use, and/or re-export to another country, of encryption software. BEFORE using any encryption software, please check your country's laws, regulations and policies concerning the import, possession, or use, and re-export of encryption software, to see if this is permitted. See for more information. The U.S. Government Department of Commerce, Bureau of Industry and Security (BIS), has classified this software as Export Commodity Control Number (ECCN) 5D002.C.1, which includes information security software using or performing cryptographic functions with asymmetric algorithms. The form and manner of this Apache Software Foundation distribution makes it eligible for export under the License Exception ENC Technology Software Unrestricted (TSU) exception (see the BIS Export Administration Regulations, Section 740.13) for both object code and source code. The following provides more details on the included cryptographic software: Standard JRE functions allow encrypted storage apache-mime4j-project-0.7.2/dom/src/main/appended-resources/0000755000000000000000000000000011702050530022341 5ustar rootrootapache-mime4j-project-0.7.2/dom/src/main/appended-resources/supplemental-models.xml0000644000000000000000000000377111702050530027065 0ustar rootroot commons-io commons-io Apache Commons IO http://jakarta.apache.org/commons/io/ The Apache Software Foundation http://www.apache.org/ Apache License, Version 2.0 http://www.apache.org/licenses/LICENSE-2.0.html repo junit junit JUnit http://www.junit.org/ Kent Beck, Erich Gamma, and David Saff Common Public License Version 1.0 http://www.opensource.org/licenses/cpl.php apache-mime4j-project-0.7.2/dom/src/main/javacc/0000755000000000000000000000000011702050530020000 5ustar rootrootapache-mime4j-project-0.7.2/dom/src/main/javacc/org/0000755000000000000000000000000011702050530020567 5ustar rootrootapache-mime4j-project-0.7.2/dom/src/main/javacc/org/apache/0000755000000000000000000000000011702050530022010 5ustar rootrootapache-mime4j-project-0.7.2/dom/src/main/javacc/org/apache/james/0000755000000000000000000000000011702050530023107 5ustar rootrootapache-mime4j-project-0.7.2/dom/src/main/javacc/org/apache/james/mime4j/0000755000000000000000000000000011702050530024274 5ustar rootrootapache-mime4j-project-0.7.2/dom/src/main/javacc/org/apache/james/mime4j/field/0000755000000000000000000000000011702050530025357 5ustar rootrootapache-mime4j-project-0.7.2/dom/src/main/javacc/org/apache/james/mime4j/field/language/0000755000000000000000000000000011702050530027142 5ustar rootroot././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/javacc/org/apache/james/mime4j/field/language/ParseException.javaapache-mime4j-project-0.7.2/dom/src/main/javacc/org/apache/james/mime4j/field/language/ParseExceptio0000644000000000000000000001740411702050530031646 0ustar rootroot/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 3.0 */ /**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field.language.parser; /** * This exception is thrown when parse errors are encountered. * You can explicitly create objects of this exception type by * calling the method generateParseException in the generated * parser. * * Changes for Mime4J: * extends org.apache.james.mime4j.field.ParseException * added serialVersionUID * added constructor ParseException(Throwable) * default detail message is "Cannot parse field" */ public class ParseException extends org.apache.james.mime4j.dom.field.ParseException { private static final long serialVersionUID = 1L; /** * This constructor is used by the method "generateParseException" * in the generated parser. Calling this constructor generates * a new object of this type with the fields "currentToken", * "expectedTokenSequences", and "tokenImage" set. The boolean * flag "specialConstructor" is also set to true to indicate that * this constructor was used to create this object. * This constructor calls its super class with the empty string * to force the "toString" method of parent class "Throwable" to * print the error message in the form: * ParseException: */ public ParseException(Token currentTokenVal, int[][] expectedTokenSequencesVal, String[] tokenImageVal ) { super(""); specialConstructor = true; currentToken = currentTokenVal; expectedTokenSequences = expectedTokenSequencesVal; tokenImage = tokenImageVal; } /** * The following constructors are for use by you for whatever * purpose you can think of. Constructing the exception in this * manner makes the exception behave in the normal way - i.e., as * documented in the class "Throwable". The fields "errorToken", * "expectedTokenSequences", and "tokenImage" do not contain * relevant information. The JavaCC generated code does not use * these constructors. */ public ParseException() { super("Cannot parse field"); specialConstructor = false; } public ParseException(Throwable cause) { super(cause); specialConstructor = false; } public ParseException(String message) { super(message); specialConstructor = false; } /** * This variable determines which constructor was used to create * this object and thereby affects the semantics of the * "getMessage" method (see below). */ protected boolean specialConstructor; /** * This is the last token that has been consumed successfully. If * this object has been created due to a parse error, the token * followng this token will (therefore) be the first error token. */ public Token currentToken; /** * Each entry in this array is an array of integers. Each array * of integers represents a sequence of tokens (by their ordinal * values) that is expected at this point of the parse. */ public int[][] expectedTokenSequences; /** * This is a reference to the "tokenImage" array of the generated * parser within which the parse error occurred. This array is * defined in the generated ...Constants interface. */ public String[] tokenImage; /** * This method has the standard behavior when this object has been * created using the standard constructors. Otherwise, it uses * "currentToken" and "expectedTokenSequences" to generate a parse * error message and returns it. If this object has been created * due to a parse error, and you do not catch it (it gets thrown * from the parser), then this method is called during the printing * of the final stack trace, and hence the correct error message * gets displayed. */ public String getMessage() { if (!specialConstructor) { return super.getMessage(); } StringBuffer expected = new StringBuffer(); int maxSize = 0; for (int i = 0; i < expectedTokenSequences.length; i++) { if (maxSize < expectedTokenSequences[i].length) { maxSize = expectedTokenSequences[i].length; } for (int j = 0; j < expectedTokenSequences[i].length; j++) { expected.append(tokenImage[expectedTokenSequences[i][j]]).append(" "); } if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) { expected.append("..."); } expected.append(eol).append(" "); } String retval = "Encountered \""; Token tok = currentToken.next; for (int i = 0; i < maxSize; i++) { if (i != 0) retval += " "; if (tok.kind == 0) { retval += tokenImage[0]; break; } retval += add_escapes(tok.image); tok = tok.next; } retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn; retval += "." + eol; if (expectedTokenSequences.length == 1) { retval += "Was expecting:" + eol + " "; } else { retval += "Was expecting one of:" + eol + " "; } retval += expected.toString(); return retval; } /** * The end of line string for this machine. */ protected String eol = System.getProperty("line.separator", "\n"); /** * Used to convert raw characters to their escaped version * when these raw version cannot be used as part of an ASCII * string literal. */ protected String add_escapes(String str) { StringBuffer retval = new StringBuffer(); char ch; for (int i = 0; i < str.length(); i++) { switch (str.charAt(i)) { case 0 : continue; case '\b': retval.append("\\b"); continue; case '\t': retval.append("\\t"); continue; case '\n': retval.append("\\n"); continue; case '\f': retval.append("\\f"); continue; case '\r': retval.append("\\r"); continue; case '\"': retval.append("\\\""); continue; case '\'': retval.append("\\\'"); continue; case '\\': retval.append("\\\\"); continue; default: if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) { String s = "0000" + Integer.toString(ch, 16); retval.append("\\u" + s.substring(s.length() - 4, s.length())); } else { retval.append(ch); } continue; } } return retval.toString(); } } ././@LongLink0000000000000000000000000000016000000000000011562 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/javacc/org/apache/james/mime4j/field/language/ContentLanguageParser.jjapache-mime4j-project-0.7.2/dom/src/main/javacc/org/apache/james/mime4j/field/language/ContentLangua0000644000000000000000000001271311702050530031633 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ options { static=false; JDK_VERSION = "1.5"; OUTPUT_DIRECTORY = "../../../../../../../../../target/generated-sources/javacc"; } PARSER_BEGIN(ContentLanguageParser) /**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field.language.parser; import java.util.ArrayList; import java.util.List; public class ContentLanguageParser { private List languages = new ArrayList(); /** * Parses the input into a list of language tags. * @return list of language tag Strings */ public List parse() throws ParseException { try { return doParse(); } catch (TokenMgrError e) { // An issue with the TOKENiser // but it's not polite to throw an Error // when executing on a server throw new ParseException(e); } } } PARSER_END(ContentLanguageParser) private List doParse() : { } { language() ( "," language() )* {return languages;} } String language() : { Token token; StringBuffer languageTag = new StringBuffer(); String result; } { token = { languageTag.append(token.image); } ( "-" // This keeps TOKENising simple token = { languageTag.append('-'); languageTag.append(token.image); } | token = { languageTag.append('-'); languageTag.append(token.image); } )* { result = languageTag.toString(); languages.add(result); return result; } } SPECIAL_TOKEN : { < WS: ( [" ", "\t", "\r", "\n"] )+ > } TOKEN_MGR_DECLS : { // Keeps track of how many levels of comment nesting // we've encountered. This is only used when the 2nd // level is reached, for example ((this)), not (this). // This is because the outermost level must be treated // specially anyway, because the outermost ")" has a // different token type than inner ")" instances. int commentNest; } MORE : { // starts a comment "(" : INCOMMENT } SKIP : { // ends a comment < COMMENT: ")" > : DEFAULT // if this is ever changed to not be a SKIP, need // to make sure matchedToken.token = token.toString() // is called. } MORE : { < > { image.deleteCharAt(image.length() - 2); } | "(" { commentNest = 1; } : NESTED_COMMENT | < > } MORE : { < > { image.deleteCharAt(image.length() - 2); } | "(" { ++commentNest; } | ")" { --commentNest; if (commentNest == 0) SwitchTo(INCOMMENT); } | < > } // QUOTED STRINGS MORE : { "\"" { image.deleteCharAt(image.length() - 1); } : INQUOTEDSTRING } MORE : { < > { image.deleteCharAt(image.length() - 2); } | < (~["\"", "\\"])+ > } TOKEN : { < QUOTEDSTRING: "\"" > { matchedToken.image = image.substring(0, image.length() - 1); } : DEFAULT } TOKEN : { < DIGITS: ( ["0"-"9"] )+ > } TOKEN : { < ALPHA: ( ["a"-"z"] | ["A"-"Z"] )+ > } TOKEN : { } TOKEN : { < DOT: "." > } <*> TOKEN : { < #QUOTEDPAIR: "\\" > | < #ANY: ~[] > }apache-mime4j-project-0.7.2/dom/src/main/javacc/org/apache/james/mime4j/field/mimeversion/0000755000000000000000000000000011702050530027714 5ustar rootroot././@LongLink0000000000000000000000000000015700000000000011570 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/javacc/org/apache/james/mime4j/field/mimeversion/MimeVersionParser.jjapache-mime4j-project-0.7.2/dom/src/main/javacc/org/apache/james/mime4j/field/mimeversion/MimeVersio0000644000000000000000000001150511702050530031720 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ options { static=false; JDK_VERSION = "1.5"; OUTPUT_DIRECTORY = "../../../../../../../../../target/generated-sources/javacc"; } PARSER_BEGIN(MimeVersionParser) /**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field.mimeversion.parser; public class MimeVersionParser { public static final int INITIAL_VERSION_VALUE = -1; private int major=INITIAL_VERSION_VALUE; private int minor=INITIAL_VERSION_VALUE; public int getMinorVersion() { return minor; } public int getMajorVersion() { return major; } } PARSER_END(MimeVersionParser) void parseLine() : {} { parse() ["\r"] "\n" } void parseAll() : {} { parse() } void parse() : { Token major; Token minor; } { major= minor= { try { this.major = Integer.parseInt(major.image); this.minor = Integer.parseInt(minor.image); } catch (NumberFormatException e) { throw new ParseException(e.getMessage()); } } } SPECIAL_TOKEN : { < WS: ( [" ", "\t", "\r", "\n"] )+ > } TOKEN_MGR_DECLS : { // Keeps track of how many levels of comment nesting // we've encountered. This is only used when the 2nd // level is reached, for example ((this)), not (this). // This is because the outermost level must be treated // specially anyway, because the outermost ")" has a // different token type than inner ")" instances. int commentNest; } MORE : { // starts a comment "(" : INCOMMENT } SKIP : { // ends a comment < COMMENT: ")" > : DEFAULT // if this is ever changed to not be a SKIP, need // to make sure matchedToken.token = token.toString() // is called. } MORE : { < > { image.deleteCharAt(image.length() - 2); } | "(" { commentNest = 1; } : NESTED_COMMENT | < > } MORE : { < > { image.deleteCharAt(image.length() - 2); } | "(" { ++commentNest; } | ")" { --commentNest; if (commentNest == 0) SwitchTo(INCOMMENT); } | < > } // QUOTED STRINGS MORE : { "\"" { image.deleteCharAt(image.length() - 1); } : INQUOTEDSTRING } MORE : { < > { image.deleteCharAt(image.length() - 2); } | < (~["\"", "\\"])+ > } TOKEN : { < QUOTEDSTRING: "\"" > { matchedToken.image = image.substring(0, image.length() - 1); } : DEFAULT } TOKEN : { < DIGITS: ( ["0"-"9"] )+ > } TOKEN : { < DOT: "." > } <*> TOKEN : { < #QUOTEDPAIR: "\\" > | < #ANY: ~[] > }././@LongLink0000000000000000000000000000015600000000000011567 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/javacc/org/apache/james/mime4j/field/mimeversion/ParseException.javaapache-mime4j-project-0.7.2/dom/src/main/javacc/org/apache/james/mime4j/field/mimeversion/ParseExcep0000644000000000000000000001740711702050530031707 0ustar rootroot/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 3.0 */ /**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field.mimeversion.parser; /** * This exception is thrown when parse errors are encountered. * You can explicitly create objects of this exception type by * calling the method generateParseException in the generated * parser. * * Changes for Mime4J: * extends org.apache.james.mime4j.field.ParseException * added serialVersionUID * added constructor ParseException(Throwable) * default detail message is "Cannot parse field" */ public class ParseException extends org.apache.james.mime4j.dom.field.ParseException { private static final long serialVersionUID = 1L; /** * This constructor is used by the method "generateParseException" * in the generated parser. Calling this constructor generates * a new object of this type with the fields "currentToken", * "expectedTokenSequences", and "tokenImage" set. The boolean * flag "specialConstructor" is also set to true to indicate that * this constructor was used to create this object. * This constructor calls its super class with the empty string * to force the "toString" method of parent class "Throwable" to * print the error message in the form: * ParseException: */ public ParseException(Token currentTokenVal, int[][] expectedTokenSequencesVal, String[] tokenImageVal ) { super(""); specialConstructor = true; currentToken = currentTokenVal; expectedTokenSequences = expectedTokenSequencesVal; tokenImage = tokenImageVal; } /** * The following constructors are for use by you for whatever * purpose you can think of. Constructing the exception in this * manner makes the exception behave in the normal way - i.e., as * documented in the class "Throwable". The fields "errorToken", * "expectedTokenSequences", and "tokenImage" do not contain * relevant information. The JavaCC generated code does not use * these constructors. */ public ParseException() { super("Cannot parse field"); specialConstructor = false; } public ParseException(Throwable cause) { super(cause); specialConstructor = false; } public ParseException(String message) { super(message); specialConstructor = false; } /** * This variable determines which constructor was used to create * this object and thereby affects the semantics of the * "getMessage" method (see below). */ protected boolean specialConstructor; /** * This is the last token that has been consumed successfully. If * this object has been created due to a parse error, the token * followng this token will (therefore) be the first error token. */ public Token currentToken; /** * Each entry in this array is an array of integers. Each array * of integers represents a sequence of tokens (by their ordinal * values) that is expected at this point of the parse. */ public int[][] expectedTokenSequences; /** * This is a reference to the "tokenImage" array of the generated * parser within which the parse error occurred. This array is * defined in the generated ...Constants interface. */ public String[] tokenImage; /** * This method has the standard behavior when this object has been * created using the standard constructors. Otherwise, it uses * "currentToken" and "expectedTokenSequences" to generate a parse * error message and returns it. If this object has been created * due to a parse error, and you do not catch it (it gets thrown * from the parser), then this method is called during the printing * of the final stack trace, and hence the correct error message * gets displayed. */ public String getMessage() { if (!specialConstructor) { return super.getMessage(); } StringBuffer expected = new StringBuffer(); int maxSize = 0; for (int i = 0; i < expectedTokenSequences.length; i++) { if (maxSize < expectedTokenSequences[i].length) { maxSize = expectedTokenSequences[i].length; } for (int j = 0; j < expectedTokenSequences[i].length; j++) { expected.append(tokenImage[expectedTokenSequences[i][j]]).append(" "); } if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) { expected.append("..."); } expected.append(eol).append(" "); } String retval = "Encountered \""; Token tok = currentToken.next; for (int i = 0; i < maxSize; i++) { if (i != 0) retval += " "; if (tok.kind == 0) { retval += tokenImage[0]; break; } retval += add_escapes(tok.image); tok = tok.next; } retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn; retval += "." + eol; if (expectedTokenSequences.length == 1) { retval += "Was expecting:" + eol + " "; } else { retval += "Was expecting one of:" + eol + " "; } retval += expected.toString(); return retval; } /** * The end of line string for this machine. */ protected String eol = System.getProperty("line.separator", "\n"); /** * Used to convert raw characters to their escaped version * when these raw version cannot be used as part of an ASCII * string literal. */ protected String add_escapes(String str) { StringBuffer retval = new StringBuffer(); char ch; for (int i = 0; i < str.length(); i++) { switch (str.charAt(i)) { case 0 : continue; case '\b': retval.append("\\b"); continue; case '\t': retval.append("\\t"); continue; case '\n': retval.append("\\n"); continue; case '\f': retval.append("\\f"); continue; case '\r': retval.append("\\r"); continue; case '\"': retval.append("\\\""); continue; case '\'': retval.append("\\\'"); continue; case '\\': retval.append("\\\\"); continue; default: if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) { String s = "0000" + Integer.toString(ch, 16); retval.append("\\u" + s.substring(s.length() - 4, s.length())); } else { retval.append(ch); } continue; } } return retval.toString(); } } apache-mime4j-project-0.7.2/dom/src/main/javacc/org/apache/james/mime4j/field/contenttype/0000755000000000000000000000000011702050530027733 5ustar rootroot././@LongLink0000000000000000000000000000015700000000000011570 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/javacc/org/apache/james/mime4j/field/contenttype/ContentTypeParser.jjapache-mime4j-project-0.7.2/dom/src/main/javacc/org/apache/james/mime4j/field/contenttype/ContentTyp0000644000000000000000000001334211702050530031770 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ /** * RFC2045 Content-Type parser. * * Created 10/2/2004 * by Joe Cheng */ options { STATIC=false; LOOKAHEAD=1; JDK_VERSION = "1.5"; OUTPUT_DIRECTORY = "../../../../../../../../../target/generated-sources/javacc"; //DEBUG_PARSER=true; //DEBUG_TOKEN_MANAGER=true; } PARSER_BEGIN(ContentTypeParser) /**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field.contenttype.parser; import java.util.List; import java.util.ArrayList; public class ContentTypeParser { private String type; private String subtype; private List paramNames = new ArrayList(); private List paramValues = new ArrayList(); public String getType() { return type; } public String getSubType() { return subtype; } public List getParamNames() { return paramNames; } public List getParamValues() { return paramValues; } public static void main(String args[]) throws ParseException { while (true) { try { ContentTypeParser parser = new ContentTypeParser(System.in); parser.parseLine(); } catch (Exception x) { x.printStackTrace(); return; } } } } PARSER_END(ContentTypeParser) void parseLine() : {} { parse() ["\r"] "\n" } void parseAll() : {} { parse() } void parse() : { Token type; Token subtype; } { type= "/" subtype= { this.type = type.image; this.subtype = subtype.image; } ( ";" parameter() )* } void parameter() : { Token attrib; String val; } { attrib= "=" val=value() { paramNames.add(attrib.image); paramValues.add(val); } } String value() : {Token t;} { ( t= | t= | t= ) { return t.image; } } SPECIAL_TOKEN : { < WS: ( [" ", "\t"] )+ > } TOKEN_MGR_DECLS : { // Keeps track of how many levels of comment nesting // we've encountered. This is only used when the 2nd // level is reached, for example ((this)), not (this). // This is because the outermost level must be treated // specially anyway, because the outermost ")" has a // different token type than inner ")" instances. static int commentNest; } MORE : { // starts a comment "(" : INCOMMENT } SKIP : { // ends a comment < COMMENT: ")" > : DEFAULT // if this is ever changed to not be a SKIP, need // to make sure matchedToken.token = token.toString() // is called. } MORE : { < > { image.deleteCharAt(image.length() - 2); } | "(" { commentNest = 1; } : NESTED_COMMENT | < > } MORE : { < > { image.deleteCharAt(image.length() - 2); } | "(" { ++commentNest; } | ")" { --commentNest; if (commentNest == 0) SwitchTo(INCOMMENT); } | < > } // QUOTED STRINGS MORE : { "\"" { image.deleteCharAt(image.length() - 1); } : INQUOTEDSTRING } MORE : { < > { image.deleteCharAt(image.length() - 2); } | < (~["\"", "\\"])+ > } TOKEN : { < QUOTEDSTRING: "\"" > { matchedToken.image = image.substring(0, image.length() - 1); } : DEFAULT } TOKEN : { < DIGITS: ( ["0"-"9"] )+ > } TOKEN : { < ATOKEN: ( ~[" ", "\t", "(", ")", "<", ">", "@", ",", ";", ":", "\\", "\"", "/", "[", "]", "?", "="] )+ > } // GLOBALS <*> TOKEN : { < #QUOTEDPAIR: "\\" > | < #ANY: ~[] > } ././@LongLink0000000000000000000000000000015600000000000011567 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/javacc/org/apache/james/mime4j/field/contenttype/ParseException.javaapache-mime4j-project-0.7.2/dom/src/main/javacc/org/apache/james/mime4j/field/contenttype/ParseExcep0000644000000000000000000001740711702050530031726 0ustar rootroot/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 3.0 */ /**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field.contenttype.parser; /** * This exception is thrown when parse errors are encountered. * You can explicitly create objects of this exception type by * calling the method generateParseException in the generated * parser. * * Changes for Mime4J: * extends org.apache.james.mime4j.field.ParseException * added serialVersionUID * added constructor ParseException(Throwable) * default detail message is "Cannot parse field" */ public class ParseException extends org.apache.james.mime4j.dom.field.ParseException { private static final long serialVersionUID = 1L; /** * This constructor is used by the method "generateParseException" * in the generated parser. Calling this constructor generates * a new object of this type with the fields "currentToken", * "expectedTokenSequences", and "tokenImage" set. The boolean * flag "specialConstructor" is also set to true to indicate that * this constructor was used to create this object. * This constructor calls its super class with the empty string * to force the "toString" method of parent class "Throwable" to * print the error message in the form: * ParseException: */ public ParseException(Token currentTokenVal, int[][] expectedTokenSequencesVal, String[] tokenImageVal ) { super(""); specialConstructor = true; currentToken = currentTokenVal; expectedTokenSequences = expectedTokenSequencesVal; tokenImage = tokenImageVal; } /** * The following constructors are for use by you for whatever * purpose you can think of. Constructing the exception in this * manner makes the exception behave in the normal way - i.e., as * documented in the class "Throwable". The fields "errorToken", * "expectedTokenSequences", and "tokenImage" do not contain * relevant information. The JavaCC generated code does not use * these constructors. */ public ParseException() { super("Cannot parse field"); specialConstructor = false; } public ParseException(Throwable cause) { super(cause); specialConstructor = false; } public ParseException(String message) { super(message); specialConstructor = false; } /** * This variable determines which constructor was used to create * this object and thereby affects the semantics of the * "getMessage" method (see below). */ protected boolean specialConstructor; /** * This is the last token that has been consumed successfully. If * this object has been created due to a parse error, the token * followng this token will (therefore) be the first error token. */ public Token currentToken; /** * Each entry in this array is an array of integers. Each array * of integers represents a sequence of tokens (by their ordinal * values) that is expected at this point of the parse. */ public int[][] expectedTokenSequences; /** * This is a reference to the "tokenImage" array of the generated * parser within which the parse error occurred. This array is * defined in the generated ...Constants interface. */ public String[] tokenImage; /** * This method has the standard behavior when this object has been * created using the standard constructors. Otherwise, it uses * "currentToken" and "expectedTokenSequences" to generate a parse * error message and returns it. If this object has been created * due to a parse error, and you do not catch it (it gets thrown * from the parser), then this method is called during the printing * of the final stack trace, and hence the correct error message * gets displayed. */ public String getMessage() { if (!specialConstructor) { return super.getMessage(); } StringBuffer expected = new StringBuffer(); int maxSize = 0; for (int i = 0; i < expectedTokenSequences.length; i++) { if (maxSize < expectedTokenSequences[i].length) { maxSize = expectedTokenSequences[i].length; } for (int j = 0; j < expectedTokenSequences[i].length; j++) { expected.append(tokenImage[expectedTokenSequences[i][j]]).append(" "); } if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) { expected.append("..."); } expected.append(eol).append(" "); } String retval = "Encountered \""; Token tok = currentToken.next; for (int i = 0; i < maxSize; i++) { if (i != 0) retval += " "; if (tok.kind == 0) { retval += tokenImage[0]; break; } retval += add_escapes(tok.image); tok = tok.next; } retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn; retval += "." + eol; if (expectedTokenSequences.length == 1) { retval += "Was expecting:" + eol + " "; } else { retval += "Was expecting one of:" + eol + " "; } retval += expected.toString(); return retval; } /** * The end of line string for this machine. */ protected String eol = System.getProperty("line.separator", "\n"); /** * Used to convert raw characters to their escaped version * when these raw version cannot be used as part of an ASCII * string literal. */ protected String add_escapes(String str) { StringBuffer retval = new StringBuffer(); char ch; for (int i = 0; i < str.length(); i++) { switch (str.charAt(i)) { case 0 : continue; case '\b': retval.append("\\b"); continue; case '\t': retval.append("\\t"); continue; case '\n': retval.append("\\n"); continue; case '\f': retval.append("\\f"); continue; case '\r': retval.append("\\r"); continue; case '\"': retval.append("\\\""); continue; case '\'': retval.append("\\\'"); continue; case '\\': retval.append("\\\\"); continue; default: if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) { String s = "0000" + Integer.toString(ch, 16); retval.append("\\u" + s.substring(s.length() - 4, s.length())); } else { retval.append(ch); } continue; } } return retval.toString(); } } apache-mime4j-project-0.7.2/dom/src/main/javacc/org/apache/james/mime4j/field/contentdisposition/0000755000000000000000000000000011702050530031316 5ustar rootroot././@LongLink0000000000000000000000000000016500000000000011567 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/javacc/org/apache/james/mime4j/field/contentdisposition/ParseException.javaapache-mime4j-project-0.7.2/dom/src/main/javacc/org/apache/james/mime4j/field/contentdisposition/Par0000644000000000000000000001741611702050530031774 0ustar rootroot/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 3.0 */ /**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field.contentdisposition.parser; /** * This exception is thrown when parse errors are encountered. * You can explicitly create objects of this exception type by * calling the method generateParseException in the generated * parser. * * Changes for Mime4J: * extends org.apache.james.mime4j.field.ParseException * added serialVersionUID * added constructor ParseException(Throwable) * default detail message is "Cannot parse field" */ public class ParseException extends org.apache.james.mime4j.dom.field.ParseException { private static final long serialVersionUID = 1L; /** * This constructor is used by the method "generateParseException" * in the generated parser. Calling this constructor generates * a new object of this type with the fields "currentToken", * "expectedTokenSequences", and "tokenImage" set. The boolean * flag "specialConstructor" is also set to true to indicate that * this constructor was used to create this object. * This constructor calls its super class with the empty string * to force the "toString" method of parent class "Throwable" to * print the error message in the form: * ParseException: */ public ParseException(Token currentTokenVal, int[][] expectedTokenSequencesVal, String[] tokenImageVal ) { super(""); specialConstructor = true; currentToken = currentTokenVal; expectedTokenSequences = expectedTokenSequencesVal; tokenImage = tokenImageVal; } /** * The following constructors are for use by you for whatever * purpose you can think of. Constructing the exception in this * manner makes the exception behave in the normal way - i.e., as * documented in the class "Throwable". The fields "errorToken", * "expectedTokenSequences", and "tokenImage" do not contain * relevant information. The JavaCC generated code does not use * these constructors. */ public ParseException() { super("Cannot parse field"); specialConstructor = false; } public ParseException(Throwable cause) { super(cause); specialConstructor = false; } public ParseException(String message) { super(message); specialConstructor = false; } /** * This variable determines which constructor was used to create * this object and thereby affects the semantics of the * "getMessage" method (see below). */ protected boolean specialConstructor; /** * This is the last token that has been consumed successfully. If * this object has been created due to a parse error, the token * followng this token will (therefore) be the first error token. */ public Token currentToken; /** * Each entry in this array is an array of integers. Each array * of integers represents a sequence of tokens (by their ordinal * values) that is expected at this point of the parse. */ public int[][] expectedTokenSequences; /** * This is a reference to the "tokenImage" array of the generated * parser within which the parse error occurred. This array is * defined in the generated ...Constants interface. */ public String[] tokenImage; /** * This method has the standard behavior when this object has been * created using the standard constructors. Otherwise, it uses * "currentToken" and "expectedTokenSequences" to generate a parse * error message and returns it. If this object has been created * due to a parse error, and you do not catch it (it gets thrown * from the parser), then this method is called during the printing * of the final stack trace, and hence the correct error message * gets displayed. */ public String getMessage() { if (!specialConstructor) { return super.getMessage(); } StringBuffer expected = new StringBuffer(); int maxSize = 0; for (int i = 0; i < expectedTokenSequences.length; i++) { if (maxSize < expectedTokenSequences[i].length) { maxSize = expectedTokenSequences[i].length; } for (int j = 0; j < expectedTokenSequences[i].length; j++) { expected.append(tokenImage[expectedTokenSequences[i][j]]).append(" "); } if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) { expected.append("..."); } expected.append(eol).append(" "); } String retval = "Encountered \""; Token tok = currentToken.next; for (int i = 0; i < maxSize; i++) { if (i != 0) retval += " "; if (tok.kind == 0) { retval += tokenImage[0]; break; } retval += add_escapes(tok.image); tok = tok.next; } retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn; retval += "." + eol; if (expectedTokenSequences.length == 1) { retval += "Was expecting:" + eol + " "; } else { retval += "Was expecting one of:" + eol + " "; } retval += expected.toString(); return retval; } /** * The end of line string for this machine. */ protected String eol = System.getProperty("line.separator", "\n"); /** * Used to convert raw characters to their escaped version * when these raw version cannot be used as part of an ASCII * string literal. */ protected String add_escapes(String str) { StringBuffer retval = new StringBuffer(); char ch; for (int i = 0; i < str.length(); i++) { switch (str.charAt(i)) { case 0 : continue; case '\b': retval.append("\\b"); continue; case '\t': retval.append("\\t"); continue; case '\n': retval.append("\\n"); continue; case '\f': retval.append("\\f"); continue; case '\r': retval.append("\\r"); continue; case '\"': retval.append("\\\""); continue; case '\'': retval.append("\\\'"); continue; case '\\': retval.append("\\\\"); continue; default: if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) { String s = "0000" + Integer.toString(ch, 16); retval.append("\\u" + s.substring(s.length() - 4, s.length())); } else { retval.append(ch); } continue; } } return retval.toString(); } } ././@LongLink0000000000000000000000000000017500000000000011570 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/javacc/org/apache/james/mime4j/field/contentdisposition/ContentDispositionParser.jjapache-mime4j-project-0.7.2/dom/src/main/javacc/org/apache/james/mime4j/field/contentdisposition/Con0000644000000000000000000001313111702050530031757 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ /** * RFC2183 Content-Disposition parser. */ options { STATIC=false; LOOKAHEAD=1; JDK_VERSION = "1.5"; OUTPUT_DIRECTORY = "../../../../../../../../../target/generated-sources/javacc"; //DEBUG_PARSER=true; //DEBUG_TOKEN_MANAGER=true; } PARSER_BEGIN(ContentDispositionParser) /**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field.contentdisposition.parser; import java.util.List; import java.util.ArrayList; public class ContentDispositionParser { private String dispositionType; private List paramNames = new ArrayList(); private List paramValues = new ArrayList(); public String getDispositionType() { return dispositionType; } public List getParamNames() { return paramNames; } public List getParamValues() { return paramValues; } public static void main(String args[]) throws ParseException { while (true) { try { ContentDispositionParser parser = new ContentDispositionParser( System.in); parser.parseLine(); } catch (Exception x) { x.printStackTrace(); return; } } } } PARSER_END(ContentDispositionParser) void parseLine() : {} { parse() ["\r"] "\n" } void parseAll() : {} { parse() } void parse() : { Token dispositionType; } { dispositionType= { this.dispositionType = dispositionType.image; } ( ";" parameter() )* } void parameter() : { Token attrib; String val; } { attrib= "=" val=value() { paramNames.add(attrib.image); paramValues.add(val); } } String value() : {Token t;} { ( t= | t= | t= ) { return t.image; } } SPECIAL_TOKEN : { < WS: ( [" ", "\t"] )+ > } TOKEN_MGR_DECLS : { // Keeps track of how many levels of comment nesting // we've encountered. This is only used when the 2nd // level is reached, for example ((this)), not (this). // This is because the outermost level must be treated // specially anyway, because the outermost ")" has a // different token type than inner ")" instances. static int commentNest; } MORE : { // starts a comment "(" : INCOMMENT } SKIP : { // ends a comment < COMMENT: ")" > : DEFAULT // if this is ever changed to not be a SKIP, need // to make sure matchedToken.token = token.toString() // is called. } MORE : { < > { image.deleteCharAt(image.length() - 2); } | "(" { commentNest = 1; } : NESTED_COMMENT | < > } MORE : { < > { image.deleteCharAt(image.length() - 2); } | "(" { ++commentNest; } | ")" { --commentNest; if (commentNest == 0) SwitchTo(INCOMMENT); } | < > } // QUOTED STRINGS MORE : { "\"" { image.deleteCharAt(image.length() - 1); } : INQUOTEDSTRING } MORE : { < > { image.deleteCharAt(image.length() - 2); } | < (~["\"", "\\"])+ > } TOKEN : { < QUOTEDSTRING: "\"" > { matchedToken.image = image.substring(0, image.length() - 1); } : DEFAULT } TOKEN : { < DIGITS: ( ["0"-"9"] )+ > } TOKEN : { < ATOKEN: ( ~[" ", "\t", "(", ")", "<", ">", "@", ",", ";", ":", "\\", "\"", "/", "[", "]", "?", "="] )+ > } // GLOBALS <*> TOKEN : { < #QUOTEDPAIR: "\\" > | < #ANY: ~[] > } apache-mime4j-project-0.7.2/dom/src/main/javacc/org/apache/james/mime4j/field/structured/0000755000000000000000000000000011702050530027563 5ustar rootroot././@LongLink0000000000000000000000000000016200000000000011564 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/javacc/org/apache/james/mime4j/field/structured/StructuredFieldParser.jjapache-mime4j-project-0.7.2/dom/src/main/javacc/org/apache/james/mime4j/field/structured/StructuredF0000644000000000000000000001370711702050530031770 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ options { static=false; JDK_VERSION = "1.5"; OUTPUT_DIRECTORY = "../../../../../../../../../target/generated-sources/javacc"; //DEBUG_PARSER = true; //DEBUG_TOKEN_MANAGER = true; } PARSER_BEGIN(StructuredFieldParser) /**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field.structured.parser; /** * Parses generic structure fields. * Unfolds and removes comments. */ public class StructuredFieldParser { private boolean preserveFolding = false; /** * Should the \r\n folding sequence be preserved? */ public boolean isFoldingPreserved() { return preserveFolding; } /** * Sets whether the \r\n folding sequence should be preserved. */ public void setFoldingPreserved(boolean preserveFolding) { this.preserveFolding = preserveFolding; } /** * Unfolds the input and removes comments. * @return unfolded header value with comments removed */ public String parse() throws ParseException { try { return doParse(); } catch (TokenMgrError e) { // An issue with the TOKENiser // but it's not polite to throw an Error // when executing on a server throw new ParseException(e); } } } PARSER_END(StructuredFieldParser) private String doParse() : { Token t; StringBuffer buffer = new StringBuffer(50); boolean whitespace = false; boolean first = true; } { ( t = { if (first) { first = false; } else if (whitespace) { buffer.append(" "); whitespace = false; } buffer.append(t.image); } | t = { buffer.append(t.image); } | t = { if (first) { first = false; } else if (whitespace) { buffer.append(" "); whitespace = false; } buffer.append(t.image); } | t = { if (preserveFolding) buffer.append("\r\n"); } | t = { whitespace = true; } )* {return buffer.toString();} } TOKEN_MGR_DECLS : { // Keeps track of how many levels of comment nesting // we've encountered. This is only used when the 2nd // level is reached, for example ((this)), not (this). // This is because the outermost level must be treated // specially anyway, because the outermost ")" has a // different token type than inner ")" instances. int commentNest; } SKIP : { // starts a comment "(" : INCOMMENT } SKIP : { // ends a comment ")" : DEFAULT // if this is ever changed to not be a SKIP, need // to make sure matchedToken.token = token.toString() // is called. } SKIP : { "(" { commentNest = 1; } : NESTED_COMMENT } SKIP : { <~[ "(", ")" ]> } SKIP: { "(" { ++commentNest; } | ")" { --commentNest; if (commentNest == 0) SwitchTo(INCOMMENT); } } SKIP : { < > { image.deleteCharAt(image.length() - 2); } } SKIP: { <~[ "(", ")" ]> } // QUOTED STRINGS SKIP : { "\"" : INQUOTEDSTRING } MORE : { < > { image.deleteCharAt(image.length() - 2); } } TOKEN : { < STRING_CONTENT : (~["\"", "\\", "\r"])+ > // Preserve line break within quotes but not trailing white space | < FOLD: "\r\n" ( [" ", "\t"] )* > | < QUOTEDSTRING: "\"" > { matchedToken.image = image.substring(0, image.length() - 1); } : DEFAULT } TOKEN : { < WS: ( [" ", "\t", "\r", "\n"] )+ > } TOKEN : { < CONTENT: (~[" ", "\t", "\r", "\n", "(", "\""])+ > } <*> TOKEN : { < #QUOTEDPAIR: "\\" > | < #ANY: (~[])+ > }././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/javacc/org/apache/james/mime4j/field/structured/ParseException.javaapache-mime4j-project-0.7.2/dom/src/main/javacc/org/apache/james/mime4j/field/structured/ParseExcept0000644000000000000000000001740611702050530031741 0ustar rootroot/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 3.0 */ /**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field.structured.parser; /** * This exception is thrown when parse errors are encountered. * You can explicitly create objects of this exception type by * calling the method generateParseException in the generated * parser. * * Changes for Mime4J: * extends org.apache.james.mime4j.field.ParseException * added serialVersionUID * added constructor ParseException(Throwable) * default detail message is "Cannot parse field" */ public class ParseException extends org.apache.james.mime4j.dom.field.ParseException { private static final long serialVersionUID = 1L; /** * This constructor is used by the method "generateParseException" * in the generated parser. Calling this constructor generates * a new object of this type with the fields "currentToken", * "expectedTokenSequences", and "tokenImage" set. The boolean * flag "specialConstructor" is also set to true to indicate that * this constructor was used to create this object. * This constructor calls its super class with the empty string * to force the "toString" method of parent class "Throwable" to * print the error message in the form: * ParseException: */ public ParseException(Token currentTokenVal, int[][] expectedTokenSequencesVal, String[] tokenImageVal ) { super(""); specialConstructor = true; currentToken = currentTokenVal; expectedTokenSequences = expectedTokenSequencesVal; tokenImage = tokenImageVal; } /** * The following constructors are for use by you for whatever * purpose you can think of. Constructing the exception in this * manner makes the exception behave in the normal way - i.e., as * documented in the class "Throwable". The fields "errorToken", * "expectedTokenSequences", and "tokenImage" do not contain * relevant information. The JavaCC generated code does not use * these constructors. */ public ParseException() { super("Cannot parse field"); specialConstructor = false; } public ParseException(Throwable cause) { super(cause); specialConstructor = false; } public ParseException(String message) { super(message); specialConstructor = false; } /** * This variable determines which constructor was used to create * this object and thereby affects the semantics of the * "getMessage" method (see below). */ protected boolean specialConstructor; /** * This is the last token that has been consumed successfully. If * this object has been created due to a parse error, the token * followng this token will (therefore) be the first error token. */ public Token currentToken; /** * Each entry in this array is an array of integers. Each array * of integers represents a sequence of tokens (by their ordinal * values) that is expected at this point of the parse. */ public int[][] expectedTokenSequences; /** * This is a reference to the "tokenImage" array of the generated * parser within which the parse error occurred. This array is * defined in the generated ...Constants interface. */ public String[] tokenImage; /** * This method has the standard behavior when this object has been * created using the standard constructors. Otherwise, it uses * "currentToken" and "expectedTokenSequences" to generate a parse * error message and returns it. If this object has been created * due to a parse error, and you do not catch it (it gets thrown * from the parser), then this method is called during the printing * of the final stack trace, and hence the correct error message * gets displayed. */ public String getMessage() { if (!specialConstructor) { return super.getMessage(); } StringBuffer expected = new StringBuffer(); int maxSize = 0; for (int i = 0; i < expectedTokenSequences.length; i++) { if (maxSize < expectedTokenSequences[i].length) { maxSize = expectedTokenSequences[i].length; } for (int j = 0; j < expectedTokenSequences[i].length; j++) { expected.append(tokenImage[expectedTokenSequences[i][j]]).append(" "); } if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) { expected.append("..."); } expected.append(eol).append(" "); } String retval = "Encountered \""; Token tok = currentToken.next; for (int i = 0; i < maxSize; i++) { if (i != 0) retval += " "; if (tok.kind == 0) { retval += tokenImage[0]; break; } retval += add_escapes(tok.image); tok = tok.next; } retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn; retval += "." + eol; if (expectedTokenSequences.length == 1) { retval += "Was expecting:" + eol + " "; } else { retval += "Was expecting one of:" + eol + " "; } retval += expected.toString(); return retval; } /** * The end of line string for this machine. */ protected String eol = System.getProperty("line.separator", "\n"); /** * Used to convert raw characters to their escaped version * when these raw version cannot be used as part of an ASCII * string literal. */ protected String add_escapes(String str) { StringBuffer retval = new StringBuffer(); char ch; for (int i = 0; i < str.length(); i++) { switch (str.charAt(i)) { case 0 : continue; case '\b': retval.append("\\b"); continue; case '\t': retval.append("\\t"); continue; case '\n': retval.append("\\n"); continue; case '\f': retval.append("\\f"); continue; case '\r': retval.append("\\r"); continue; case '\"': retval.append("\\\""); continue; case '\'': retval.append("\\\'"); continue; case '\\': retval.append("\\\\"); continue; default: if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) { String s = "0000" + Integer.toString(ch, 16); retval.append("\\u" + s.substring(s.length() - 4, s.length())); } else { retval.append(ch); } continue; } } return retval.toString(); } } apache-mime4j-project-0.7.2/dom/src/main/javacc/org/apache/james/mime4j/field/datetime/0000755000000000000000000000000011702050530027153 5ustar rootroot././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/javacc/org/apache/james/mime4j/field/datetime/ParseException.javaapache-mime4j-project-0.7.2/dom/src/main/javacc/org/apache/james/mime4j/field/datetime/ParseExceptio0000644000000000000000000001740411702050530031657 0ustar rootroot/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 3.0 */ /**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field.datetime.parser; /** * This exception is thrown when parse errors are encountered. * You can explicitly create objects of this exception type by * calling the method generateParseException in the generated * parser. * * Changes for Mime4J: * extends org.apache.james.mime4j.field.ParseException * added serialVersionUID * added constructor ParseException(Throwable) * default detail message is "Cannot parse field" */ public class ParseException extends org.apache.james.mime4j.dom.field.ParseException { private static final long serialVersionUID = 1L; /** * This constructor is used by the method "generateParseException" * in the generated parser. Calling this constructor generates * a new object of this type with the fields "currentToken", * "expectedTokenSequences", and "tokenImage" set. The boolean * flag "specialConstructor" is also set to true to indicate that * this constructor was used to create this object. * This constructor calls its super class with the empty string * to force the "toString" method of parent class "Throwable" to * print the error message in the form: * ParseException: */ public ParseException(Token currentTokenVal, int[][] expectedTokenSequencesVal, String[] tokenImageVal ) { super(""); specialConstructor = true; currentToken = currentTokenVal; expectedTokenSequences = expectedTokenSequencesVal; tokenImage = tokenImageVal; } /** * The following constructors are for use by you for whatever * purpose you can think of. Constructing the exception in this * manner makes the exception behave in the normal way - i.e., as * documented in the class "Throwable". The fields "errorToken", * "expectedTokenSequences", and "tokenImage" do not contain * relevant information. The JavaCC generated code does not use * these constructors. */ public ParseException() { super("Cannot parse field"); specialConstructor = false; } public ParseException(Throwable cause) { super(cause); specialConstructor = false; } public ParseException(String message) { super(message); specialConstructor = false; } /** * This variable determines which constructor was used to create * this object and thereby affects the semantics of the * "getMessage" method (see below). */ protected boolean specialConstructor; /** * This is the last token that has been consumed successfully. If * this object has been created due to a parse error, the token * followng this token will (therefore) be the first error token. */ public Token currentToken; /** * Each entry in this array is an array of integers. Each array * of integers represents a sequence of tokens (by their ordinal * values) that is expected at this point of the parse. */ public int[][] expectedTokenSequences; /** * This is a reference to the "tokenImage" array of the generated * parser within which the parse error occurred. This array is * defined in the generated ...Constants interface. */ public String[] tokenImage; /** * This method has the standard behavior when this object has been * created using the standard constructors. Otherwise, it uses * "currentToken" and "expectedTokenSequences" to generate a parse * error message and returns it. If this object has been created * due to a parse error, and you do not catch it (it gets thrown * from the parser), then this method is called during the printing * of the final stack trace, and hence the correct error message * gets displayed. */ public String getMessage() { if (!specialConstructor) { return super.getMessage(); } StringBuffer expected = new StringBuffer(); int maxSize = 0; for (int i = 0; i < expectedTokenSequences.length; i++) { if (maxSize < expectedTokenSequences[i].length) { maxSize = expectedTokenSequences[i].length; } for (int j = 0; j < expectedTokenSequences[i].length; j++) { expected.append(tokenImage[expectedTokenSequences[i][j]]).append(" "); } if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) { expected.append("..."); } expected.append(eol).append(" "); } String retval = "Encountered \""; Token tok = currentToken.next; for (int i = 0; i < maxSize; i++) { if (i != 0) retval += " "; if (tok.kind == 0) { retval += tokenImage[0]; break; } retval += add_escapes(tok.image); tok = tok.next; } retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn; retval += "." + eol; if (expectedTokenSequences.length == 1) { retval += "Was expecting:" + eol + " "; } else { retval += "Was expecting one of:" + eol + " "; } retval += expected.toString(); return retval; } /** * The end of line string for this machine. */ protected String eol = System.getProperty("line.separator", "\n"); /** * Used to convert raw characters to their escaped version * when these raw version cannot be used as part of an ASCII * string literal. */ protected String add_escapes(String str) { StringBuffer retval = new StringBuffer(); char ch; for (int i = 0; i < str.length(); i++) { switch (str.charAt(i)) { case 0 : continue; case '\b': retval.append("\\b"); continue; case '\t': retval.append("\\t"); continue; case '\n': retval.append("\\n"); continue; case '\f': retval.append("\\f"); continue; case '\r': retval.append("\\r"); continue; case '\"': retval.append("\\\""); continue; case '\'': retval.append("\\\'"); continue; case '\\': retval.append("\\\\"); continue; default: if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) { String s = "0000" + Integer.toString(ch, 16); retval.append("\\u" + s.substring(s.length() - 4, s.length())); } else { retval.append(ch); } continue; } } return retval.toString(); } } ././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/main/javacc/org/apache/james/mime4j/field/datetime/DateTimeParser.jjapache-mime4j-project-0.7.2/dom/src/main/javacc/org/apache/james/mime4j/field/datetime/DateTimeParse0000644000000000000000000002121711702050530031570 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ /** * RFC2822 date parser. * * Created 9/28/2004 * by Joe Cheng */ options { STATIC=false; LOOKAHEAD=1; JDK_VERSION = "1.5"; OUTPUT_DIRECTORY = "../../../../../../../../../target/generated-sources/javacc"; //DEBUG_PARSER=true; //DEBUG_TOKEN_MANAGER=true; } PARSER_BEGIN(DateTimeParser) /**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field.datetime.parser; import org.apache.james.mime4j.dom.datetime.DateTime; public class DateTimeParser { private static final boolean ignoreMilitaryZoneOffset = true; public static void main(String args[]) throws ParseException { while (true) { try { DateTimeParser parser = new DateTimeParser(System.in); parser.parseLine(); } catch (Exception x) { x.printStackTrace(); return; } } } private static int parseDigits(Token token) { return Integer.parseInt(token.image, 10); } private static int getMilitaryZoneOffset(char c) { if (ignoreMilitaryZoneOffset) return 0; c = Character.toUpperCase(c); switch (c) { case 'A': return 1; case 'B': return 2; case 'C': return 3; case 'D': return 4; case 'E': return 5; case 'F': return 6; case 'G': return 7; case 'H': return 8; case 'I': return 9; case 'K': return 10; case 'L': return 11; case 'M': return 12; case 'N': return -1; case 'O': return -2; case 'P': return -3; case 'Q': return -4; case 'R': return -5; case 'S': return -6; case 'T': return -7; case 'U': return -8; case 'V': return -9; case 'W': return -10; case 'X': return -11; case 'Y': return -12; case 'Z': return 0; default: return 0; } } private static class Time { private int hour; private int minute; private int second; private int zone; public Time(int hour, int minute, int second, int zone) { this.hour = hour; this.minute = minute; this.second = second; this.zone = zone; } public int getHour() { return hour; } public int getMinute() { return minute; } public int getSecond() { return second; } public int getZone() { return zone; } } private static class Date { private String year; private int month; private int day; public Date(String year, int month, int day) { this.year = year; this.month = month; this.day = day; } public String getYear() { return year; } public int getMonth() { return month; } public int getDay() { return day; } } } PARSER_END(DateTimeParser) DateTime parseLine() : {DateTime dt;} { dt=date_time() ["\r"] "\n" { return dt; } } DateTime parseAll() : {DateTime dt;} { dt=date_time() { return dt; } } DateTime date_time() : {Date d; Time t;} { [ day_of_week() "," ] d=date() t=time() { return new DateTime( d.getYear(), d.getMonth(), d.getDay(), t.getHour(), t.getMinute(), t.getSecond(), t.getZone()); // time zone offset } } String day_of_week() : {} { ( "Mon" | "Tue" | "Wed" | "Thu" | "Fri" | "Sat" | "Sun" ) { return token.image; } } Date date() : {int d, m; String y;} { d=day() m=month() y=year() { return new Date(y, m, d); } } int day() : {Token t;} { t= { return parseDigits(t); } } int month() : {} { "Jan" { return 1; } | "Feb" { return 2; } | "Mar" { return 3; } | "Apr" { return 4; } | "May" { return 5; } | "Jun" { return 6; } | "Jul" { return 7; } | "Aug" { return 8; } | "Sep" { return 9; } | "Oct" { return 10; } | "Nov" { return 11; } | "Dec" { return 12; } } String year() : {Token t;} { t= { return t.image; } } Time time() : {int h, m, s=0, z;} { h=hour() ":" m=minute() [ ":" s=second() ] z=zone() { return new Time(h, m, s, z); } } int hour() : {Token t;} { t= { return parseDigits(t); } } int minute() : {Token t;} { t= { return parseDigits(t); } } int second() : {Token t;} { t= { return parseDigits(t); } } int zone() : { Token t, u; int z; } { ( t=< OFFSETDIR: ["+", "-"] > u= { z=parseDigits(u)*(t.image.equals("-") ? -1 : 1); } | z=obs_zone() ) { return z; } } int obs_zone() : {Token t; int z;} { ( "UT" { z=0; } | "GMT" { z=0; } | "EST" { z=-5; } | "EDT" { z=-4; } | "CST" { z=-6; } | "CDT" { z=-5; } | "MST" { z=-7; } | "MDT" { z=-6; } | "PST" { z=-8; } | "PDT" { z=-7; } | t=< MILITARY_ZONE: ["A"-"I","a"-"i","K"-"Z","k"-"z"] > { z=getMilitaryZoneOffset(t.image.charAt(0)); } ) { return z * 100; } } SPECIAL_TOKEN : { < WS: ( [" ", "\t"] )+ > } TOKEN_MGR_DECLS : { // Keeps track of how many levels of comment nesting // we've encountered. This is only used when the 2nd // level is reached, for example ((this)), not (this). // This is because the outermost level must be treated // specially anyway, because the outermost ")" has a // different token type than inner ")" instances. static int commentNest; } MORE : { // starts a comment "(" : INCOMMENT } SKIP : { // ends a comment < COMMENT: ")" > : DEFAULT // if this is ever changed to not be a SKIP, need // to make sure matchedToken.token = token.toString() // is called. } MORE : { < > { image.deleteCharAt(image.length() - 2); } | "(" { commentNest = 1; } : NESTED_COMMENT | < > } MORE : { < > { image.deleteCharAt(image.length() - 2); } | "(" { ++commentNest; } | ")" { --commentNest; if (commentNest == 0) SwitchTo(INCOMMENT); } | < > } TOKEN : { < DIGITS: ( ["0"-"9"] )+ > } // GLOBALS <*> TOKEN : { < #QUOTEDPAIR: "\\" > | < #ANY: ~[] > } apache-mime4j-project-0.7.2/dom/src/test/0000755000000000000000000000000011702050524016607 5ustar rootrootapache-mime4j-project-0.7.2/dom/src/test/java/0000755000000000000000000000000011702050524017530 5ustar rootrootapache-mime4j-project-0.7.2/dom/src/test/java/org/0000755000000000000000000000000011702050524020317 5ustar rootrootapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/0000755000000000000000000000000011702050524021540 5ustar rootrootapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/0000755000000000000000000000000011702050524022637 5ustar rootrootapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/0000755000000000000000000000000011702050526024026 5ustar rootrootapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/message/0000755000000000000000000000000011702050526025452 5ustar rootroot././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/message/StringInputStreamTest.javaapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/message/StringInputStreamTest.0000644000000000000000000001141311702050526031755 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.message; import java.io.IOException; import java.io.InputStream; import java.security.SecureRandom; import org.apache.james.mime4j.util.CharsetUtil; import junit.framework.TestCase; public class StringInputStreamTest extends TestCase { private static final String SWISS_GERMAN_HELLO = "Gr\374ezi_z\344m\344"; private static final String RUSSIAN_HELLO = "\u0412\u0441\u0435\u043C_\u043F\u0440\u0438\u0432\u0435\u0442"; private static final String TEST_STRING = "Hello and stuff " + SWISS_GERMAN_HELLO + " " + RUSSIAN_HELLO; private static final String LARGE_TEST_STRING; static { StringBuilder buffer = new StringBuilder(); for (int i=0; i<100; i++) { buffer.append(TEST_STRING); } LARGE_TEST_STRING = buffer.toString(); } private static void singleByteReadTest(final String testString) throws IOException { byte[] bytes = testString.getBytes(CharsetUtil.UTF_8.name()); InputStream in = new StringInputStream(testString, CharsetUtil.UTF_8); for (byte b : bytes) { int read = in.read(); assertTrue(read >= 0); assertTrue(read <= 255); assertEquals(b, (byte)read); } assertEquals(-1, in.read()); } private static void bufferedReadTest(final String testString) throws IOException { SecureRandom rnd = new SecureRandom(); byte[] expected = testString.getBytes(CharsetUtil.UTF_8.name()); InputStream in = new StringInputStream(testString, CharsetUtil.UTF_8); byte[] buffer = new byte[128]; int offset = 0; while (true) { int bufferOffset = rnd.nextInt(64); int bufferLength = rnd.nextInt(64); int read = in.read(buffer, bufferOffset, bufferLength); if (read == -1) { assertEquals(offset, expected.length); break; } else { assertTrue(read <= bufferLength); while (read > 0) { assertTrue(offset < expected.length); assertEquals(expected[offset], buffer[bufferOffset]); offset++; bufferOffset++; read--; } } } } public void testSingleByteRead() throws IOException { singleByteReadTest(TEST_STRING); } public void testLargeSingleByteRead() throws IOException { singleByteReadTest(LARGE_TEST_STRING); } public void testBufferedRead() throws IOException { bufferedReadTest(TEST_STRING); } public void testLargeBufferedRead() throws IOException { bufferedReadTest(LARGE_TEST_STRING); } public void testReadZero() throws Exception { InputStream r = new StringInputStream("test", CharsetUtil.UTF_8); byte[] bytes = new byte[30]; assertEquals(0, r.read(bytes, 0, 0)); } public void testSkip() throws Exception { InputStream r = new StringInputStream("test", CharsetUtil.UTF_8); r.skip(1); r.skip(2); assertEquals('t', r.read()); r.skip(100); assertEquals(-1, r.read()); } public void testMarkReset() throws Exception { InputStream r = new StringInputStream("test", CharsetUtil.UTF_8); r.skip(2); r.mark(0); assertEquals('s', r.read()); assertEquals('t', r.read()); assertEquals(-1, r.read()); r.reset(); assertEquals('s', r.read()); assertEquals('t', r.read()); assertEquals(-1, r.read()); r.reset(); r.reset(); } } ././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/message/MaximalBodyDescriptorTest.javaapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/message/MaximalBodyDescriptorT0000644000000000000000000003532711702050526032000 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.message; import java.io.ByteArrayInputStream; import java.text.SimpleDateFormat; import java.util.TimeZone; import junit.framework.TestCase; import org.apache.james.mime4j.ExampleMail; import org.apache.james.mime4j.stream.BodyDescriptor; import org.apache.james.mime4j.stream.BodyDescriptorBuilder; import org.apache.james.mime4j.stream.EntityState; import org.apache.james.mime4j.stream.MimeConfig; import org.apache.james.mime4j.stream.MimeTokenStream; import org.apache.james.mime4j.stream.RawField; public class MaximalBodyDescriptorTest extends TestCase { MimeTokenStream parser; @Override protected void setUp() throws Exception { super.setUp(); MimeConfig config = new MimeConfig(); config.setStrictParsing(true); parser = new MimeTokenStream(config, new DefaultBodyDescriptorBuilder(null)); } public void testAddField() throws Exception { /* * Make sure that only the first Content-Type header added is used. */ BodyDescriptorBuilder builder = new DefaultBodyDescriptorBuilder(); builder.addField(new RawField("Content-Type ", "text/plain; charset=ISO-8859-1")); BodyDescriptor bd = builder.build(); assertEquals("text/plain", bd.getMimeType()); assertEquals("ISO-8859-1", bd.getCharset()); builder.addField(new RawField("Content-Type ", "text/html; charset=us-ascii")); bd = builder.build(); assertEquals("text/plain", bd.getMimeType()); assertEquals("ISO-8859-1", bd.getCharset()); } public void testGetMimeType() throws Exception { BodyDescriptorBuilder builder = new DefaultBodyDescriptorBuilder(); builder.addField(new RawField("Content-Type ", "text/PLAIN")); BodyDescriptor bd = builder.build(); assertEquals("text/plain", bd.getMimeType()); builder.reset(); builder.addField(new RawField("content-type", " TeXt / html ")); bd = builder.build(); assertEquals("text/html", bd.getMimeType()); builder.reset(); builder.addField(new RawField("CONTENT-TYPE", " x-app/yada ; param = yada")); bd = builder.build(); assertEquals("x-app/yada", bd.getMimeType()); builder.reset(); builder.addField(new RawField("CONTENT-TYPE", " yada")); bd = builder.build(); assertEquals("text/plain", bd.getMimeType()); /* * Make sure that only the first Content-Type header added is used. */ builder.reset(); builder.addField(new RawField("Content-Type ", "text/plain")); bd = builder.build(); assertEquals("text/plain", bd.getMimeType()); builder.addField(new RawField("Content-Type ", "text/html")); bd = builder.build(); assertEquals("text/plain", bd.getMimeType()); /* * Implicit mime types. */ BodyDescriptorBuilder parent = new DefaultBodyDescriptorBuilder(); parent.addField(new RawField("Content-Type", "mutlipart/alternative; boundary=foo")); BodyDescriptorBuilder child = parent.newChild(); bd = child.build(); assertEquals("text/plain", bd.getMimeType()); child.addField(new RawField("Content-Type", " child/type")); bd = child.build(); assertEquals("child/type", bd.getMimeType()); parent.reset(); parent.addField(new RawField("Content-Type", "multipart/digest; boundary=foo")); child = parent.newChild(); bd = child.build(); assertEquals("message/rfc822", bd.getMimeType()); child.addField(new RawField("Content-Type", " child/type")); bd = child.build(); assertEquals("child/type", bd.getMimeType()); } public void testParameters() throws Exception { BodyDescriptorBuilder builder = new DefaultBodyDescriptorBuilder(); /* * Test charset. */ BodyDescriptor bd = builder.build(); assertEquals("us-ascii", bd.getCharset()); builder.addField(new RawField("Content-Type ", "text/type; charset=ISO-8859-1")); bd = builder.build(); assertEquals("ISO-8859-1", bd.getCharset()); builder.reset(); bd = builder.build(); assertEquals("us-ascii", bd.getCharset()); builder.addField(new RawField("Content-Type ", "text/type")); bd = builder.build(); assertEquals("us-ascii", bd.getCharset()); /* * Test boundary. */ builder.reset(); builder.addField(new RawField("Content-Type", "text/html; boundary=yada yada")); bd = builder.build(); assertNull(bd.getBoundary()); builder.reset(); builder.addField(new RawField("Content-Type", "multipart/yada; boundary=yada")); bd = builder.build(); assertEquals("yada", bd.getBoundary()); builder.reset(); builder.addField(new RawField("Content-Type", "multipart/yada; boUNdarY= \"ya \\\"\\\"\tda \\\"\"; " + "\tcharset\t = \"\\\"hepp\\\" =us\t-ascii\"")); bd = builder.build(); assertEquals("ya \"\"\tda \"", bd.getBoundary()); assertEquals("\"hepp\" =us\t-ascii", bd.getCharset()); } public void testGetContentLength() throws Exception { BodyDescriptorBuilder builder = new DefaultBodyDescriptorBuilder(); BodyDescriptor bd = builder.build(); assertEquals(-1, bd.getContentLength()); builder.addField(new RawField("Content-Length", "9901")); bd = builder.build(); assertEquals(9901, bd.getContentLength()); // only the first content-length counts builder.addField(new RawField("Content-Length", "1239901")); bd = builder.build(); assertEquals(9901, bd.getContentLength()); } public void testDoDefaultToUsAsciiWhenUntyped() throws Exception { BodyDescriptorBuilder builder = new DefaultBodyDescriptorBuilder(); builder.addField(new RawField("To", "me@example.org")); BodyDescriptor bd = builder.build(); assertEquals("us-ascii", bd.getCharset()); } public void testDoNotDefaultToUsAsciiForNonTextTypes() throws Exception { BodyDescriptorBuilder builder = new DefaultBodyDescriptorBuilder(); builder.addField(new RawField("Content-Type", "image/png; name=blob.png")); BodyDescriptor bd = builder.build(); assertNull(bd.getCharset()); } public void testMimeVersionDefault() throws Exception { MaximalBodyDescriptor descriptor = describe(ExampleMail.RFC822_SIMPLE_BYTES); assertEquals(1, descriptor.getMimeMajorVersion()); assertEquals(0, descriptor.getMimeMinorVersion()); } public void testMimeVersion() throws Exception { MaximalBodyDescriptor descriptor = describe(ExampleMail.ONE_PART_MIME_ASCII_COMMENT_IN_MIME_VERSION_BYTES); assertEquals(2, descriptor.getMimeMajorVersion()); assertEquals(4, descriptor.getMimeMinorVersion()); } public void testContentId() throws Exception { MaximalBodyDescriptor descriptor = describe(ExampleMail.ONE_PART_MIME_8859_BYTES); assertEquals(1, descriptor.getMimeMajorVersion()); assertEquals(0, descriptor.getMimeMinorVersion()); assertEquals(ExampleMail.CONTENT_ID, descriptor.getContentId()); } public void testContentDescription() throws Exception { MaximalBodyDescriptor descriptor = describe(ExampleMail.ONE_PART_MIME_8859_BYTES); assertEquals(1, descriptor.getMimeMajorVersion()); assertEquals(0, descriptor.getMimeMinorVersion()); assertEquals(ExampleMail.CONTENT_DESCRIPTION, descriptor.getContentDescription()); } public void testMimeVersionHeaderBreak() throws Exception { MaximalBodyDescriptor descriptor = describe(ExampleMail.ONE_PART_MIME_ASCII_MIME_VERSION_SPANS_TWO_LINES_BYTES); assertEquals(4, descriptor.getMimeMajorVersion()); assertEquals(1, descriptor.getMimeMinorVersion()); } public void testContentDispositionType() throws Exception { MaximalBodyDescriptor descriptor = describe(ExampleMail.ONE_PART_MIME_BASE64_LATIN1_BYTES); assertEquals("inline", descriptor.getContentDispositionType()); } public void testContentDispositionTypeCaseConversion() throws Exception { MaximalBodyDescriptor descriptor = describe(ExampleMail.ONE_PART_MIME_BASE64_LATIN1_BYTES); assertEquals("Should be converted to lower case", "inline", descriptor.getContentDispositionType()); assertNotNull(descriptor.getContentDispositionParameters()); assertEquals(0, descriptor.getContentDispositionParameters().size()); } public void testContentDispositionParameters() throws Exception { MaximalBodyDescriptor descriptor = describe(ExampleMail.ONE_PART_MIME_WITH_CONTENT_DISPOSITION_PARAMETERS_BYTES); assertEquals("inline", descriptor.getContentDispositionType()); assertNotNull(descriptor.getContentDispositionParameters()); assertEquals(3, descriptor.getContentDispositionParameters().size()); assertEquals("value", descriptor.getContentDispositionParameters().get("param")); assertEquals("1", descriptor.getContentDispositionParameters().get("one")); assertEquals("bar", descriptor.getContentDispositionParameters().get("foo")); } public void testContentDispositionStandardParameters() throws Exception { MaximalBodyDescriptor descriptor = describe(ExampleMail.MULTIPART_WITH_BINARY_ATTACHMENTS_BYTES, 1); assertEquals("attachment", descriptor.getContentDispositionType()); assertNotNull(descriptor.getContentDispositionParameters()); assertEquals(5, descriptor.getContentDispositionParameters().size()); assertEquals("blob.png", descriptor.getContentDispositionFilename()); SimpleDateFormat dateparser = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); dateparser.setTimeZone(TimeZone.getTimeZone("GMT")); assertEquals(dateparser.parse("2008-06-21 15:32:18"), descriptor.getContentDispositionModificationDate()); assertEquals(dateparser.parse("2008-06-20 10:15:09"), descriptor.getContentDispositionCreationDate()); assertEquals(dateparser.parse("2008-06-22 12:08:56"), descriptor.getContentDispositionReadDate()); assertEquals(10234, descriptor.getContentDispositionSize()); } public void testLanguageParameters() throws Exception { MaximalBodyDescriptor descriptor = describe(ExampleMail.MULTIPART_WITH_BINARY_ATTACHMENTS_BYTES, 3); assertNotNull(descriptor.getContentLanguage()); assertEquals(3, descriptor.getContentLanguage().size()); assertEquals("en", descriptor.getContentLanguage().get(0)); assertEquals("en-US", descriptor.getContentLanguage().get(1)); assertEquals("en-CA", descriptor.getContentLanguage().get(2)); } public void testContentLocationRelativeUrl() throws Exception { MaximalBodyDescriptor descriptor = describe(ExampleMail.MULTIPART_WITH_CONTENT_LOCATION_BYTES, 0); assertEquals("relative/url", descriptor.getContentLocation()); } public void testContentLocationAbsoluteUrl() throws Exception { MaximalBodyDescriptor descriptor = describe(ExampleMail.MULTIPART_WITH_CONTENT_LOCATION_BYTES, 1); assertEquals("http://www.example.org/absolute/rhubard.txt", descriptor.getContentLocation()); } public void testContentLocationWithComment() throws Exception { MaximalBodyDescriptor descriptor = describe(ExampleMail.MULTIPART_WITH_CONTENT_LOCATION_BYTES, 3); assertEquals("http://www.example.org/absolute/comments/rhubard.txt", descriptor.getContentLocation()); } public void testContentLocationFoldedUrl() throws Exception { MaximalBodyDescriptor descriptor = describe(ExampleMail.MULTIPART_WITH_CONTENT_LOCATION_BYTES, 4); assertEquals("http://www.example.org/this/is/a/very/long/url/split/over/two/lines/", descriptor.getContentLocation()); } public void testContentMD5Url() throws Exception { MaximalBodyDescriptor descriptor = describe(ExampleMail.ONE_PART_MIME_WITH_CONTENT_DISPOSITION_PARAMETERS_BYTES); assertEquals(ExampleMail.MD5_CONTENT, descriptor.getContentMD5Raw()); } private MaximalBodyDescriptor describe(byte[] mail, int zeroBasedPart) throws Exception { ByteArrayInputStream bias = new ByteArrayInputStream(mail); parser.parse(bias); EntityState state = parser.next(); while (state != EntityState.T_END_OF_STREAM && zeroBasedPart>=0) { state = parser.next(); if (state == EntityState.T_BODY) { --zeroBasedPart; } } assertEquals(EntityState.T_BODY, state); BodyDescriptor descriptor = parser.getBodyDescriptor(); assertNotNull(descriptor); assertTrue("Parser is maximal so body descriptor should be maximal", descriptor instanceof MaximalBodyDescriptor); return (MaximalBodyDescriptor) descriptor; } private MaximalBodyDescriptor describe(byte[] mail) throws Exception { ByteArrayInputStream bias = new ByteArrayInputStream(mail); parser.parse(bias); EntityState state = parser.next(); while (state != EntityState.T_BODY && state != EntityState.T_END_OF_STREAM) { state = parser.next(); } assertEquals(EntityState.T_BODY, state); BodyDescriptor descriptor = parser.getBodyDescriptor(); assertNotNull(descriptor); assertTrue("Parser is maximal so body descriptor should be maximal", descriptor instanceof MaximalBodyDescriptor); return (MaximalBodyDescriptor) descriptor; } } apache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/dom/0000755000000000000000000000000011702050526024605 5ustar rootrootapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/dom/EntityTest.java0000644000000000000000000001076211702050526027572 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom; import org.apache.james.mime4j.dom.Body; import org.apache.james.mime4j.dom.Entity; import org.apache.james.mime4j.dom.Header; import org.apache.james.mime4j.field.DefaultFieldParser; import org.apache.james.mime4j.message.BasicBodyFactory; import org.apache.james.mime4j.message.BodyPart; import org.apache.james.mime4j.message.HeaderImpl; import junit.framework.TestCase; public class EntityTest extends TestCase { public void testSetBody() throws Exception { Entity entity = new BodyPart(); assertNull(entity.getBody()); Body body = new BasicBodyFactory().textBody("test"); assertNull(body.getParent()); entity.setBody(body); assertSame(body, entity.getBody()); assertSame(entity, body.getParent()); } public void testSetBodyTwice() throws Exception { Entity entity = new BodyPart(); Body b1 = new BasicBodyFactory().textBody("foo"); Body b2 = new BasicBodyFactory().textBody("bar"); entity.setBody(b1); try { entity.setBody(b2); fail(); } catch (IllegalStateException expected) { } } public void testRemoveBody() throws Exception { Entity entity = new BodyPart(); Body body = new BasicBodyFactory().textBody("test"); entity.setBody(body); Body removed = entity.removeBody(); assertSame(body, removed); assertNull(entity.getBody()); assertNull(removed.getParent()); } public void testGetDispositionType() throws Exception { BodyPart entity = new BodyPart(); assertNull(entity.getDispositionType()); Header header = new HeaderImpl(); header.setField(DefaultFieldParser.parse("Content-Disposition: inline")); entity.setHeader(header); assertEquals("inline", entity.getDispositionType()); } public void testSetContentDispositionType() throws Exception { BodyPart entity = new BodyPart(); entity.setContentDisposition("attachment"); assertEquals("attachment", entity.getHeader().getField( "Content-Disposition").getBody()); } public void testSetContentDispositionTypeFilename() throws Exception { BodyPart entity = new BodyPart(); entity.setContentDisposition("attachment", "some file.dat"); assertEquals("attachment; filename=\"some file.dat\"", entity .getHeader().getField("Content-Disposition").getBody()); } public void testGetFilename() throws Exception { BodyPart entity = new BodyPart(); assertNull(entity.getFilename()); Header header = new HeaderImpl(); header.setField(DefaultFieldParser.parse("Content-Disposition: attachment; " + "filename=\"some file.dat\"")); entity.setHeader(header); assertEquals("some file.dat", entity.getFilename()); } public void testSetFilename() throws Exception { BodyPart entity = new BodyPart(); entity.setFilename("file name.ext"); assertEquals("attachment; filename=\"file name.ext\"", entity .getHeader().getField("Content-Disposition").getBody()); entity.setFilename(null); assertEquals("attachment", entity.getHeader().getField( "Content-Disposition").getBody()); } } apache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/dom/MessageTest.java0000644000000000000000000004714611702050526027710 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.TimeZone; import junit.framework.TestCase; import org.apache.commons.io.IOUtils; import org.apache.james.mime4j.dom.Header; import org.apache.james.mime4j.dom.Message; import org.apache.james.mime4j.dom.Multipart; import org.apache.james.mime4j.dom.SingleBody; import org.apache.james.mime4j.dom.address.Group; import org.apache.james.mime4j.dom.address.Mailbox; import org.apache.james.mime4j.dom.field.FieldName; import org.apache.james.mime4j.dom.field.MimeVersionField; import org.apache.james.mime4j.field.DefaultFieldParser; import org.apache.james.mime4j.field.address.AddressBuilder; import org.apache.james.mime4j.message.BodyPart; import org.apache.james.mime4j.message.HeaderImpl; import org.apache.james.mime4j.message.MessageImpl; import org.apache.james.mime4j.message.DefaultMessageBuilder; import org.apache.james.mime4j.message.DefaultMessageWriter; import org.apache.james.mime4j.message.MultipartImpl; public class MessageTest extends TestCase { private Header headerTextPlain = null; private Header headerMessageRFC822 = null; private Header headerEmpty = null; private Header headerMultipartMixed = null; private Header headerMultipartDigest = null; @Override public void setUp() throws Exception { headerTextPlain = new HeaderImpl(); headerMessageRFC822 = new HeaderImpl(); headerEmpty = new HeaderImpl(); headerMultipartMixed = new HeaderImpl(); headerMultipartDigest = new HeaderImpl(); headerTextPlain.addField( DefaultFieldParser.parse("Content-Type: text/plain")); headerMessageRFC822.addField( DefaultFieldParser.parse("Content-Type: message/RFC822")); headerMultipartMixed.addField( DefaultFieldParser.parse("Content-Type: multipart/mixed; boundary=foo")); headerMultipartDigest.addField( DefaultFieldParser.parse("Content-Type: multipart/digest; boundary=foo")); } public void testGetMimeType() { MessageImpl parent = null; MessageImpl child = null; parent = new MessageImpl(); child = new MessageImpl(); child.setParent(parent); parent.setHeader(headerMultipartDigest); child.setHeader(headerEmpty); assertEquals("multipart/digest, empty", "message/rfc822", child.getMimeType()); child.setHeader(headerTextPlain); assertEquals("multipart/digest, text/plain", "text/plain", child.getMimeType()); child.setHeader(headerMessageRFC822); assertEquals("multipart/digest, message/rfc822", "message/rfc822", child.getMimeType()); parent = new MessageImpl(); child = new MessageImpl(); child.setParent(parent); parent.setHeader(headerMultipartMixed); child.setHeader(headerEmpty); assertEquals("multipart/mixed, empty", "text/plain", child.getMimeType()); child.setHeader(headerTextPlain); assertEquals("multipart/mixed, text/plain", "text/plain", child.getMimeType()); child.setHeader(headerMessageRFC822); assertEquals("multipart/mixed, message/rfc822", "message/rfc822", child.getMimeType()); child = new MessageImpl(); child.setHeader(headerEmpty); assertEquals("null, empty", "text/plain", child.getMimeType()); child.setHeader(headerTextPlain); assertEquals("null, text/plain", "text/plain", child.getMimeType()); child.setHeader(headerMessageRFC822); assertEquals("null, message/rfc822", "message/rfc822", child.getMimeType()); } public void testIsMultipart() { MessageImpl m = new MessageImpl(); m.setHeader(headerEmpty); assertTrue("empty", !m.isMultipart()); m.setHeader(headerTextPlain); assertTrue("text/plain", !m.isMultipart()); m.setHeader(headerMultipartDigest); assertTrue("multipart/digest", m.isMultipart()); m.setHeader(headerMultipartMixed); assertTrue("multipart/mixed", m.isMultipart()); } public void testWriteTo() throws Exception { byte[] inputByte = getRawMessageAsByteArray(); DefaultMessageBuilder builder = new DefaultMessageBuilder(); DefaultMessageWriter writer = new DefaultMessageWriter(); Message m = builder.parseMessage(new ByteArrayInputStream(inputByte)); ByteArrayOutputStream out = new ByteArrayOutputStream(); writer.writeMessage(m, out); InputStream output = new ByteArrayInputStream(out.toByteArray()); int b = -1; int i = 0; while ((b = output.read()) != -1) { assertEquals("same byte", b, inputByte[i]); i++; } } public void testAddHeaderWriteTo() throws Exception { String headerName = "testheader"; String headerValue = "testvalue"; String testheader = headerName + ": " + headerValue; byte[] inputByte = getRawMessageAsByteArray(); DefaultMessageBuilder builder = new DefaultMessageBuilder(); DefaultMessageWriter writer = new DefaultMessageWriter(); Message m = builder.parseMessage(new ByteArrayInputStream(inputByte)); m.getHeader().addField(DefaultFieldParser.parse(testheader)); assertEquals("header added", m.getHeader().getField(headerName) .getBody(), headerValue); ByteArrayOutputStream out = new ByteArrayOutputStream(); writer.writeMessage(m, out); List lines = IOUtils.readLines((new BufferedReader( new InputStreamReader(new ByteArrayInputStream(out .toByteArray()))))); assertTrue("header added", lines.contains(testheader)); } public void testMimeVersion() throws Exception { MessageImpl m = new MessageImpl(); assertNotNull(m.getHeader()); MimeVersionField field = (MimeVersionField) m.getHeader().getField(FieldName.MIME_VERSION); assertNotNull(field); assertEquals(1, field.getMajorVersion()); assertEquals(0, field.getMinorVersion()); } public void testGetMessageId() throws Exception { MessageImpl m = new MessageImpl(); assertNull(m.getMessageId()); String id = ""; Header header = new HeaderImpl(); header.setField(DefaultFieldParser.parse("Message-ID: " + id)); m.setHeader(header); assertEquals(id, m.getMessageId()); } public void testCreateMessageId() throws Exception { MessageImpl m = new MessageImpl(); m.createMessageId("hostname"); String id = m.getMessageId(); assertNotNull(id); assertTrue(id.startsWith("")); } public void testGetSubject() throws Exception { MessageImpl m = new MessageImpl(); assertNull(m.getSubject()); String subject = "testing 1 2"; Header header = new HeaderImpl(); header.setField(DefaultFieldParser.parse("Subject: " + subject)); m.setHeader(header); assertEquals(subject, m.getSubject()); header.setField(DefaultFieldParser.parse("Subject: =?windows-1252?Q?99_=80?=")); assertEquals("99 \u20ac", m.getSubject()); } public void testSetSubject() throws Exception { MessageImpl m = new MessageImpl(); m.setSubject("Semmelbr\366sel"); assertEquals("Semmelbr\366sel", m.getSubject()); assertEquals("=?ISO-8859-1?Q?Semmelbr=F6sel?=", m.getHeader().getField( "Subject").getBody()); m.setSubject(null); assertNull(m.getHeader().getField("Subject")); } public void testGetDate() throws Exception { MessageImpl m = new MessageImpl(); assertNull(m.getDate()); Header header = new HeaderImpl(); header.setField(DefaultFieldParser.parse("Date: Thu, 1 Jan 1970 05:30:00 +0530")); m.setHeader(header); assertEquals(new Date(0), m.getDate()); } public void testSetDate() throws Exception { MessageImpl m = new MessageImpl(); m.setDate(new Date(86400000), TimeZone.getTimeZone("GMT")); assertEquals(new Date(86400000), m.getDate()); assertEquals("Fri, 2 Jan 1970 00:00:00 +0000", m.getHeader().getField( "Date").getBody()); m.setDate(null); assertNull(m.getHeader().getField("Date")); } public void testGetSender() throws Exception { MessageImpl m = new MessageImpl(); assertNull(m.getSender()); Header header = new HeaderImpl(); header.setField(DefaultFieldParser.parse("Sender: john.doe@example.net")); m.setHeader(header); assertEquals("john.doe@example.net", m.getSender().getAddress()); } public void testSetSender() throws Exception { MessageImpl m = new MessageImpl(); m.setSender(AddressBuilder.DEFAULT.parseMailbox("john.doe@example.net")); assertEquals("john.doe@example.net", m.getHeader().getField("Sender") .getBody()); m.setSender(null); assertNull(m.getHeader().getField("Sender")); } public void testGetFrom() throws Exception { MessageImpl m = new MessageImpl(); assertNull(m.getFrom()); Header header = new HeaderImpl(); header.setField(DefaultFieldParser.parse("From: john.doe@example.net")); m.setHeader(header); assertEquals("john.doe@example.net", m.getFrom().get(0).getAddress()); } public void testSetFrom() throws Exception { MessageImpl m = new MessageImpl(); Mailbox mailbox1 = AddressBuilder.DEFAULT.parseMailbox("john.doe@example.net"); Mailbox mailbox2 = AddressBuilder.DEFAULT.parseMailbox("jane.doe@example.net"); m.setFrom(mailbox1); assertEquals("john.doe@example.net", m.getHeader().getField("From") .getBody()); m.setFrom(mailbox1, mailbox2); assertEquals("john.doe@example.net, jane.doe@example.net", m .getHeader().getField("From").getBody()); m.setFrom(Arrays.asList(mailbox1, mailbox2)); assertEquals("john.doe@example.net, jane.doe@example.net", m .getHeader().getField("From").getBody()); m.setFrom((Mailbox) null); assertNull(m.getHeader().getField("From")); } public void testGetTo() throws Exception { MessageImpl m = new MessageImpl(); assertNull(m.getTo()); Header header = new HeaderImpl(); header.setField(DefaultFieldParser.parse("To: john.doe@example.net")); m.setHeader(header); assertEquals("john.doe@example.net", ((Mailbox) m.getTo().get(0)) .getAddress()); } public void testSetTo() throws Exception { MessageImpl m = new MessageImpl(); Mailbox mailbox1 = AddressBuilder.DEFAULT.parseMailbox("john.doe@example.net"); Mailbox mailbox2 = AddressBuilder.DEFAULT.parseMailbox("jane.doe@example.net"); Group group = new Group("Does", mailbox1, mailbox2); Mailbox mailbox3 = AddressBuilder.DEFAULT.parseMailbox("Mary Smith "); m.setTo(group); assertEquals("Does: john.doe@example.net, jane.doe@example.net;", m .getHeader().getField("To").getBody()); m.setTo(group, mailbox3); assertEquals("Does: john.doe@example.net, jane.doe@example.net;, " + "Mary Smith ", m.getHeader().getField("To") .getBody()); m.setTo(Arrays.asList(group, mailbox3)); assertEquals("Does: john.doe@example.net, jane.doe@example.net;, " + "Mary Smith ", m.getHeader().getField("To") .getBody()); m.setTo((Mailbox) null); assertNull(m.getHeader().getField("To")); } public void testGetCc() throws Exception { MessageImpl m = new MessageImpl(); assertNull(m.getCc()); Header header = new HeaderImpl(); header.setField(DefaultFieldParser.parse("Cc: john.doe@example.net")); m.setHeader(header); assertEquals("john.doe@example.net", ((Mailbox) m.getCc().get(0)) .getAddress()); } public void testSetCc() throws Exception { MessageImpl m = new MessageImpl(); Mailbox mailbox1 = AddressBuilder.DEFAULT.parseMailbox("john.doe@example.net"); Mailbox mailbox2 = AddressBuilder.DEFAULT.parseMailbox("jane.doe@example.net"); Group group = new Group("Does", mailbox1, mailbox2); Mailbox mailbox3 = AddressBuilder.DEFAULT.parseMailbox("Mary Smith "); m.setCc(group); assertEquals("Does: john.doe@example.net, jane.doe@example.net;", m .getHeader().getField("Cc").getBody()); m.setCc(group, mailbox3); assertEquals("Does: john.doe@example.net, jane.doe@example.net;, " + "Mary Smith ", m.getHeader().getField("Cc") .getBody()); m.setCc(Arrays.asList(group, mailbox3)); assertEquals("Does: john.doe@example.net, jane.doe@example.net;, " + "Mary Smith ", m.getHeader().getField("Cc") .getBody()); m.setCc((Mailbox) null); assertNull(m.getHeader().getField("Cc")); } public void testGetBcc() throws Exception { MessageImpl m = new MessageImpl(); assertNull(m.getBcc()); Header header = new HeaderImpl(); header.setField(DefaultFieldParser.parse("Bcc: john.doe@example.net")); m.setHeader(header); assertEquals("john.doe@example.net", ((Mailbox) m.getBcc().get(0)) .getAddress()); } public void testSetBcc() throws Exception { MessageImpl m = new MessageImpl(); Mailbox mailbox1 = AddressBuilder.DEFAULT.parseMailbox("john.doe@example.net"); Mailbox mailbox2 = AddressBuilder.DEFAULT.parseMailbox("jane.doe@example.net"); Group group = new Group("Does", mailbox1, mailbox2); Mailbox mailbox3 = AddressBuilder.DEFAULT.parseMailbox("Mary Smith "); m.setBcc(group); assertEquals("Does: john.doe@example.net, jane.doe@example.net;", m .getHeader().getField("Bcc").getBody()); m.setBcc(group, mailbox3); assertEquals("Does: john.doe@example.net, jane.doe@example.net;, " + "Mary Smith ", m.getHeader() .getField("Bcc").getBody()); m.setBcc(Arrays.asList(group, mailbox3)); assertEquals("Does: john.doe@example.net, jane.doe@example.net;, " + "Mary Smith ", m.getHeader() .getField("Bcc").getBody()); m.setBcc((Mailbox) null); assertNull(m.getHeader().getField("Bcc")); } public void testGetReplyTo() throws Exception { MessageImpl m = new MessageImpl(); assertNull(m.getReplyTo()); Header header = new HeaderImpl(); header.setField(DefaultFieldParser.parse("Reply-To: john.doe@example.net")); m.setHeader(header); assertEquals("john.doe@example.net", ((Mailbox) m.getReplyTo().get(0)) .getAddress()); } public void testSetReplyTo() throws Exception { MessageImpl m = new MessageImpl(); Mailbox mailbox1 = AddressBuilder.DEFAULT.parseMailbox("john.doe@example.net"); Mailbox mailbox2 = AddressBuilder.DEFAULT.parseMailbox("jane.doe@example.net"); Group group = new Group("Does", mailbox1, mailbox2); Mailbox mailbox3 = AddressBuilder.DEFAULT.parseMailbox("Mary Smith "); m.setReplyTo(group); assertEquals("Does: john.doe@example.net, jane.doe@example.net;", m .getHeader().getField("Reply-To").getBody()); m.setReplyTo(group, mailbox3); assertEquals("Does: john.doe@example.net, jane.doe@example.net;, " + "Mary Smith ", m.getHeader().getField( "Reply-To").getBody()); m.setReplyTo(Arrays.asList(group, mailbox3)); assertEquals("Does: john.doe@example.net, jane.doe@example.net;, " + "Mary Smith ", m.getHeader().getField( "Reply-To").getBody()); m.setReplyTo((Mailbox) null); assertNull(m.getHeader().getField("Reply-To")); } public void testDisposeGetsPropagatedToBody() throws Exception { DummyBody body1 = new DummyBody(); BodyPart part1 = new BodyPart(); part1.setHeader(headerEmpty); part1.setBody(body1); DummyBody body2 = new DummyBody(); BodyPart part2 = new BodyPart(); part2.setHeader(headerEmpty); part2.setBody(body2); Multipart mp = new MultipartImpl("mixed"); mp.addBodyPart(part1); mp.addBodyPart(part2); MessageImpl m = new MessageImpl(); m.setHeader(headerMultipartMixed); m.setBody(mp); assertFalse(body1.disposed); assertFalse(body2.disposed); m.dispose(); assertTrue(body1.disposed); assertTrue(body2.disposed); } private byte[] getRawMessageAsByteArray() { StringBuilder header = new StringBuilder(); StringBuilder body = new StringBuilder(); StringBuilder complete = new StringBuilder(); header.append("Date: Wed, 21 Feb 2007 11:09:27 +0100\r\n"); header.append("From: Test \r\n"); header.append("To: Norman Maurer \r\n"); header.append("Subject: Testmail\r\n"); header .append("Content-Type: text/plain; charset=ISO-8859-15; format=flowed\r\n"); header.append("Content-Transfer-Encoding: 8bit\r\n\r\n"); body.append("testbody\r\n"); complete.append(header); complete.append(body); return complete.toString().getBytes(); } private static final class DummyBody extends SingleBody { public boolean disposed = false; @Override public InputStream getInputStream() throws IOException { return new ByteArrayInputStream("dummy".getBytes("US-ASCII")); } @Override public void dispose() { disposed = true; } } } apache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/dom/MessageWriteToTest.java0000644000000000000000000001053411702050526031215 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import org.apache.james.mime4j.ExampleMail; import org.apache.james.mime4j.message.DefaultMessageBuilder; import org.apache.james.mime4j.message.DefaultMessageWriter; import junit.framework.TestCase; public class MessageWriteToTest extends TestCase { @Override protected void setUp() throws Exception { super.setUp(); } @Override protected void tearDown() throws Exception { super.tearDown(); } public void testSimpleMail() throws Exception { Message message = createMessage(ExampleMail.RFC822_SIMPLE_BYTES); assertFalse("Not multipart", message.isMultipart()); ByteArrayOutputStream out = new ByteArrayOutputStream(); DefaultMessageWriter writer = new DefaultMessageWriter(); writer.writeMessage(message, out); assertEquals(out.toByteArray(), ExampleMail.RFC822_SIMPLE_BYTES); } private void assertEquals(byte[] expected, byte[] actual) { StringBuilder buffer = new StringBuilder(expected.length); assertEquals(new String(expected), new String(actual)); assertEquals(expected.length, actual.length); for (int i = 0; i < actual.length; i++) { buffer.append((char)actual[i]); assertEquals("Mismatch@" + i, expected[i], actual[i]); } } public void testBinaryAttachment() throws Exception { Message message = createMessage(ExampleMail.MULTIPART_WITH_BINARY_ATTACHMENTS_BYTES); assertTrue("Is multipart", message.isMultipart()); ByteArrayOutputStream out = new ByteArrayOutputStream(); DefaultMessageWriter writer = new DefaultMessageWriter(); writer.writeMessage(message, out); assertEquals(ExampleMail.MULTIPART_WITH_BINARY_ATTACHMENTS_BYTES, out.toByteArray()); } public void testBinaryAttachmentNoPreamble() throws Exception { Message message = createMessage(ExampleMail.MULTIPART_WITH_BINARY_ATTACHMENTS_NOPREAMBLE_BYTES); assertTrue("Is multipart", message.isMultipart()); ByteArrayOutputStream out = new ByteArrayOutputStream(); DefaultMessageWriter writer = new DefaultMessageWriter(); writer.writeMessage(message, out); assertEquals(ExampleMail.MULTIPART_WITH_BINARY_ATTACHMENTS_NOPREAMBLE_BYTES, out.toByteArray()); } public void testBinaryAttachmentPreambleEpilogue() throws Exception { Message message = createMessage(ExampleMail.MULTIPART_WITH_BINARY_ATTACHMENTS_PREAMBLE_EPILOGUE_BYTES); assertTrue("Is multipart", message.isMultipart()); ByteArrayOutputStream out = new ByteArrayOutputStream(); DefaultMessageWriter writer = new DefaultMessageWriter(); writer.writeMessage(message, out); assertEquals(ExampleMail.MULTIPART_WITH_BINARY_ATTACHMENTS_PREAMBLE_EPILOGUE_BYTES, out.toByteArray()); } private Message createMessage(byte[] octets) throws Exception { ByteArrayInputStream in = new ByteArrayInputStream(octets); DefaultMessageBuilder builder = new DefaultMessageBuilder(); Message message = builder.parseMessage(in); return message; } } apache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/dom/MultipartFormTest.java0000644000000000000000000000735011702050526031122 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom; import java.io.ByteArrayOutputStream; import junit.framework.TestCase; import org.apache.james.mime4j.dom.Header; import org.apache.james.mime4j.dom.Multipart; import org.apache.james.mime4j.field.DefaultFieldParser; import org.apache.james.mime4j.message.BasicBodyFactory; import org.apache.james.mime4j.message.BodyPart; import org.apache.james.mime4j.message.HeaderImpl; import org.apache.james.mime4j.message.MessageImpl; import org.apache.james.mime4j.message.DefaultMessageWriter; import org.apache.james.mime4j.message.MultipartImpl; public class MultipartFormTest extends TestCase { public void testMultipartFormContent() throws Exception { BasicBodyFactory bodyFactory = new BasicBodyFactory(); MessageImpl message = new MessageImpl(); Header header = new HeaderImpl(); header.addField( DefaultFieldParser.parse("Content-Type: multipart/form-data; boundary=foo")); message.setHeader(header); Multipart multipart = new MultipartImpl("alternative"); multipart.setParent(message); BodyPart p1 = new BodyPart(); Header h1 = new HeaderImpl(); h1.addField(DefaultFieldParser.parse("Content-Type: text/plain")); p1.setHeader(h1); p1.setBody(bodyFactory.textBody("this stuff")); BodyPart p2 = new BodyPart(); Header h2 = new HeaderImpl(); h2.addField(DefaultFieldParser.parse("Content-Type: text/plain")); p2.setHeader(h2); p2.setBody(bodyFactory.textBody("that stuff")); BodyPart p3 = new BodyPart(); Header h3 = new HeaderImpl(); h3.addField(DefaultFieldParser.parse("Content-Type: text/plain")); p3.setHeader(h3); p3.setBody(bodyFactory.textBody("all kind of stuff")); multipart.addBodyPart(p1); multipart.addBodyPart(p2); multipart.addBodyPart(p3); ByteArrayOutputStream out = new ByteArrayOutputStream(); DefaultMessageWriter writer = new DefaultMessageWriter(); writer.writeMultipart(multipart, out); out.close(); String expected = "--foo\r\n" + "Content-Type: text/plain\r\n" + "\r\n" + "this stuff\r\n" + "--foo\r\n" + "Content-Type: text/plain\r\n" + "\r\n" + "that stuff\r\n" + "--foo\r\n" + "Content-Type: text/plain\r\n" + "\r\n" + "all kind of stuff\r\n" + "--foo--\r\n"; String s = out.toString("US-ASCII"); assertEquals(expected, s); } } ././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/dom/ExampleMessagesRoundtripTest.javaapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/dom/ExampleMessagesRoundtripTe0000644000000000000000000001272011702050526032015 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.net.JarURLConnection; import java.net.MalformedURLException; import java.net.URISyntaxException; import java.net.URL; import java.util.Enumeration; import java.util.jar.JarEntry; import java.util.jar.JarFile; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; import org.apache.james.mime4j.codec.CodecUtil; import org.apache.james.mime4j.dom.Message; import org.apache.james.mime4j.message.DefaultMessageBuilder; import org.apache.james.mime4j.message.DefaultMessageWriter; import org.apache.james.mime4j.stream.MimeConfig; /** * Creates a TestSuite running the test for each .msg file in the test resouce folder. * Allow running of a single test from Unit testing GUIs */ public class ExampleMessagesRoundtripTest extends TestCase { private URL url; public ExampleMessagesRoundtripTest(String name, URL url) { super(name); this.url = url; } @Override protected void runTest() throws Throwable { MimeConfig config = new MimeConfig(); if (getName().startsWith("malformedHeaderStartsBody")) { config.setMalformedHeaderStartsBody(true); } config.setMaxLineLen(-1); DefaultMessageBuilder builder = new DefaultMessageBuilder(); DefaultMessageWriter writer = new DefaultMessageWriter(); builder.setMimeEntityConfig(config); Message inputMessage = builder.parseMessage(url.openStream()); ByteArrayOutputStream out = new ByteArrayOutputStream(); writer.writeMessage(inputMessage, out); String s = url.toString(); URL msgout = new URL(s.substring(0, s.lastIndexOf('.')) + ".out"); try { ByteArrayOutputStream expectedstream = new ByteArrayOutputStream(); CodecUtil.copy(msgout.openStream(), expectedstream); assertEquals("Wrong Expected result", new String(expectedstream.toByteArray()), new String(out.toByteArray())); } catch (FileNotFoundException e) { FileOutputStream fos = new FileOutputStream(msgout.getPath()+".expected"); writer.writeMessage(inputMessage, fos); fos.close(); fail("Expected file created"); } } public static Test suite() throws IOException, URISyntaxException { return new ExampleMessagesRountripTestSuite(); } static class ExampleMessagesRountripTestSuite extends TestSuite { public ExampleMessagesRountripTestSuite() throws IOException, URISyntaxException { super(); addTests("/testmsgs"); addTests("/mimetools-testmsgs"); } private void addTests(String testsFolder) throws URISyntaxException, MalformedURLException, IOException { URL resource = ExampleMessagesRountripTestSuite.class.getResource(testsFolder); if (resource != null) { if (resource.getProtocol().equalsIgnoreCase("file")) { File dir = new File(resource.toURI()); File[] files = dir.listFiles(); for (File f : files) { if (f.getName().endsWith(".msg")) { addTest(new ExampleMessagesRoundtripTest(f.getName(), f.toURI().toURL())); } } } else if (resource.getProtocol().equalsIgnoreCase("jar")) { JarURLConnection conn = (JarURLConnection) resource.openConnection(); JarFile jar = conn.getJarFile(); for (Enumeration it = jar.entries(); it.hasMoreElements(); ) { JarEntry entry = it.nextElement(); String s = "/" + entry.toString(); File f = new File(s); if (s.startsWith(testsFolder) && s.endsWith(".msg")) { addTest(new ExampleMessagesRoundtripTest(f.getName(), new URL("jar:file:" + jar.getName() + "!" + s))); } } } } } } } apache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/dom/MessageParserTest.java0000644000000000000000000002161711702050526031060 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.JarURLConnection; import java.net.MalformedURLException; import java.net.URISyntaxException; import java.net.URL; import java.util.Enumeration; import java.util.List; import java.util.jar.JarEntry; import java.util.jar.JarFile; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; import org.apache.commons.io.IOUtils; import org.apache.james.mime4j.dom.BinaryBody; import org.apache.james.mime4j.dom.Body; import org.apache.james.mime4j.dom.Entity; import org.apache.james.mime4j.dom.Multipart; import org.apache.james.mime4j.dom.TextBody; import org.apache.james.mime4j.field.FieldsTest; import org.apache.james.mime4j.message.MessageImpl; import org.apache.james.mime4j.message.DefaultMessageBuilder; import org.apache.james.mime4j.stream.Field; import org.apache.james.mime4j.stream.MimeConfig; public class MessageParserTest extends TestCase { private URL url; public MessageParserTest(String name, URL url) { super(name); this.url = url; } public static Test suite() throws IOException, URISyntaxException { return new MessageParserTestSuite(); } static class MessageParserTestSuite extends TestSuite { public MessageParserTestSuite() throws IOException, URISyntaxException { addTests("/testmsgs"); addTests("/mimetools-testmsgs"); } private void addTests(String testsFolder) throws URISyntaxException, MalformedURLException, IOException { URL resource = MessageParserTestSuite.class.getResource(testsFolder); if (resource != null) { if (resource.getProtocol().equalsIgnoreCase("file")) { File dir = new File(resource.toURI()); File[] files = dir.listFiles(); for (File f : files) { if (f.getName().endsWith(".msg")) { addTest(new MessageParserTest(f.getName(), f.toURI().toURL())); } } } else if (resource.getProtocol().equalsIgnoreCase("jar")) { JarURLConnection conn = (JarURLConnection) resource.openConnection(); JarFile jar = conn.getJarFile(); for (Enumeration it = jar.entries(); it.hasMoreElements(); ) { JarEntry entry = it.nextElement(); String s = "/" + entry.toString(); File f = new File(s); if (s.startsWith(testsFolder) && s.endsWith(".msg")) { addTest(new MessageParserTest(f.getName(), new URL("jar:file:" + jar.getName() + "!" + s))); } } } } } } @Override protected void runTest() throws IOException { MimeConfig config = new MimeConfig(); if (getName().startsWith("malformedHeaderStartsBody")) { config.setMalformedHeaderStartsBody(true); } config.setMaxLineLen(-1); DefaultMessageBuilder builder = new DefaultMessageBuilder(); builder.setMimeEntityConfig(config); Message m = builder.parseMessage(url.openStream()); String s = url.toString(); String prefix = s.substring(0, s.lastIndexOf('.')); URL xmlFileUrl = new URL(prefix + "_decoded.xml"); String result = getStructure(m, prefix, "1"); try { String expected = IOUtils.toString(xmlFileUrl.openStream(), "ISO8859-1"); assertEquals(expected, result); } catch (FileNotFoundException ex) { IOUtils.write(result, new FileOutputStream(xmlFileUrl.getPath()+".expected"), "ISO8859-1"); fail("Expected file created."); } } private String escape(String s) { s = s.replaceAll("&", "&"); s = s.replaceAll("<", "<"); return s.replaceAll(">", ">"); } private String getStructure(Entity e, String prefix, String id) throws IOException { StringBuilder sb = new StringBuilder(); if (e instanceof MessageImpl) { sb.append("\r\n"); } else { sb.append("\r\n"); } sb.append("
\r\n"); for (Field field : e.getHeader().getFields()) { sb.append("\r\n" + escape(FieldsTest.decode(field)) + "\r\n"); } sb.append("
\r\n"); if (e.getBody() instanceof Multipart) { sb.append("\r\n"); Multipart multipart =(Multipart) e.getBody(); List parts = multipart.getBodyParts(); if (multipart.getPreamble() != null) { sb.append("\r\n"); sb.append(escape(multipart.getPreamble())); sb.append("\r\n"); } int i = 1; for (Entity bodyPart : parts) { sb.append(getStructure(bodyPart, prefix, id + "_" + (i++))); } if (multipart.getEpilogue() != null) { sb.append("\r\n"); sb.append(escape(multipart.getEpilogue())); sb.append("\r\n"); } sb.append("\r\n"); } else if (e.getBody() instanceof MessageImpl) { sb.append(getStructure((MessageImpl) e.getBody(), prefix, id + "_1")); } else { Body b = e.getBody(); String s = prefix + "_decoded_" + id + (b instanceof TextBody ? ".txt" : ".bin"); String tag = b instanceof TextBody ? "text-body" : "binary-body"; File f = new File(s); sb.append("<" + tag + " name=\"" + f.getName() + "\"/>\r\n"); URL expectedUrl = new URL(s); if (b instanceof TextBody) { String charset = e.getCharset(); if (charset == null) { charset = "ISO8859-1"; } String s2 = IOUtils.toString(((TextBody) b).getReader()); try { String s1 = IOUtils.toString(expectedUrl.openStream(), charset); assertEquals(f.getName(), s1, s2); } catch (FileNotFoundException ex) { IOUtils.write(s2, new FileOutputStream(expectedUrl.getPath()+".expected")); fail("Expected file created."); } } else { try { assertEqualsBinary(f.getName(), expectedUrl.openStream(), ((BinaryBody) b).getInputStream()); } catch (FileNotFoundException ex) { IOUtils.copy(((BinaryBody) b).getInputStream(), new FileOutputStream(expectedUrl.getPath()+".expected")); fail("Expected file created."); } } } if (e instanceof MessageImpl) { sb.append("
\r\n"); } else { sb.append("\r\n"); } return sb.toString(); } private void assertEqualsBinary(String msg, InputStream a, InputStream b) throws IOException { int pos = 0; while (true) { int b1 = a.read(); int b2 = b.read(); assertEquals(msg + " (Position " + (++pos) + ")", b1, b2); if (b1 == -1 || b2 == -1) { break; } } } } ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/dom/MessageCompleteMailTest.javaapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/dom/MessageCompleteMailTest.ja0000644000000000000000000000517311702050524031645 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom; import java.io.ByteArrayInputStream; import junit.framework.TestCase; import org.apache.james.mime4j.ExampleMail; import org.apache.james.mime4j.dom.Multipart; import org.apache.james.mime4j.message.DefaultMessageBuilder; public class MessageCompleteMailTest extends TestCase { @Override protected void setUp() throws Exception { super.setUp(); } @Override protected void tearDown() throws Exception { super.tearDown(); } public void testMultipartAlternative() throws Exception { Message message = createMessage(ExampleMail.MIME_MULTIPART_ALTERNATIVE_BYTES); assertTrue("Should be a multipart/alternative mail", message.isMultipart()); Multipart part = (Multipart)message.getBody(); assertEquals("alternative", part.getSubType()); } public void testMultipartMixed() throws Exception { Message message = createMessage(ExampleMail.MIME_MIXED_MULTIPART_VARIOUS_ENCODINGS_BYTES); assertTrue("Should be a multipart/mixed mail", message.isMultipart()); Multipart part = (Multipart)message.getBody(); assertEquals("mixed", part.getSubType()); } private Message createMessage(byte[] octets) throws Exception { ByteArrayInputStream in = new ByteArrayInputStream(octets); DefaultMessageBuilder builder = new DefaultMessageBuilder(); Message message = builder.parseMessage(in); return message; } } ././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/dom/MessageHeadlessParserTest.javaapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/dom/MessageHeadlessParserTest.0000644000000000000000000001241711702050526031665 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import junit.framework.TestCase; import org.apache.james.mime4j.dom.Multipart; import org.apache.james.mime4j.dom.TextBody; import org.apache.james.mime4j.dom.field.ContentTypeField; import org.apache.james.mime4j.dom.field.FieldName; import org.apache.james.mime4j.message.DefaultMessageBuilder; import org.apache.james.mime4j.stream.MimeConfig; public class MessageHeadlessParserTest extends TestCase { public void testMalformedHeaderShouldEndHeader() throws Exception { String headlessContent = "Subject: my subject\r\n" + "Hi, how are you?\r\n" + "This is a simple message with no CRLFCELF between headers and body.\r\n" + "ThisIsNotAnHeader: because this should be already in the body\r\n" + "\r\n" + "Instead this should be better parsed as a text/plain body\r\n"; MimeConfig config = new MimeConfig(); config.setMalformedHeaderStartsBody(true); DefaultMessageBuilder builder = new DefaultMessageBuilder(); builder.setMimeEntityConfig(config); Message message = builder.parseMessage( new ByteArrayInputStream(headlessContent.getBytes("UTF-8"))); assertEquals("text/plain", message.getMimeType()); assertEquals(1, message.getHeader().getFields().size()); BufferedReader reader = new BufferedReader(((TextBody) message.getBody()).getReader()); String firstLine = reader.readLine(); assertEquals("Hi, how are you?", firstLine); } public void testSimpleNonMimeTextHeadless() throws Exception { String headlessContent = "Hi, how are you?\r\n" + "This is a simple message with no headers. While mime messages should start with\r\n" + "header: headervalue\r\n" + "\r\n" + "Instead this should be better parsed as a text/plain body\r\n"; MimeConfig config = new MimeConfig(); config.setMalformedHeaderStartsBody(true); DefaultMessageBuilder builder = new DefaultMessageBuilder(); builder.setMimeEntityConfig(config); Message message = builder.parseMessage( new ByteArrayInputStream(headlessContent.getBytes("UTF-8"))); assertEquals("text/plain", message.getMimeType()); assertEquals(0, message.getHeader().getFields().size()); BufferedReader reader = new BufferedReader(((TextBody) message.getBody()).getReader()); String firstLine = reader.readLine(); assertEquals("Hi, how are you?", firstLine); } public void testMultipartFormContent() throws Exception { String contentType = "multipart/form-data; boundary=foo"; String headlessContent = "\r\n" + "--foo\r\nContent-Disposition: form-data; name=\"field01\"" + "\r\n" + "\r\n" + "this stuff\r\n" + "--foo\r\n" + "Content-Disposition: form-data; name=\"field02\"\r\n" + "\r\n" + "that stuff\r\n" + "--foo\r\n" + "Content-Disposition: form-data; name=\"field03\"; filename=\"mypic.jpg\"\r\n" + "Content-Type: image/jpeg\r\n" + "\r\n" + "all kind of stuff\r\n" + "--foo--\r\n"; MimeConfig config = new MimeConfig(); config.setHeadlessParsing(contentType); DefaultMessageBuilder builder = new DefaultMessageBuilder(); builder.setMimeEntityConfig(config); Message message = builder.parseMessage( new ByteArrayInputStream(headlessContent.getBytes("UTF-8"))); assertEquals("multipart/form-data", message.getMimeType()); assertEquals(1, message.getHeader().getFields().size()); ContentTypeField contentTypeField = ((ContentTypeField) message .getHeader().getField(FieldName.CONTENT_TYPE)); assertEquals("foo", contentTypeField.getBoundary()); Multipart multipart = (Multipart) message.getBody(); assertEquals(3, multipart.getCount()); } } ././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/dom/MessageServiceFactoryTest.javaapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/dom/MessageServiceFactoryTest.0000644000000000000000000000356111702050526031710 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom; import org.apache.james.mime4j.MimeException; import junit.framework.TestCase; public class MessageServiceFactoryTest extends TestCase { public void testNewInstance() throws MimeException { MessageServiceFactory factory = MessageServiceFactory.newInstance(); assertNotNull(factory); } public void testNewMessageBuilder() throws MimeException { MessageServiceFactory factory = MessageServiceFactory.newInstance(); assertNotNull(factory); MessageBuilder builder = factory.newMessageBuilder(); Message message = builder.newMessage(); assertNotNull(message); } } apache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/dom/MimeBuilderCopyTest.java0000644000000000000000000001636411702050526031353 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom; import java.util.Arrays; import java.util.List; import org.apache.james.mime4j.dom.Body; import org.apache.james.mime4j.dom.Entity; import org.apache.james.mime4j.dom.Header; import org.apache.james.mime4j.dom.Multipart; import org.apache.james.mime4j.field.DefaultFieldParser; import org.apache.james.mime4j.message.BasicBodyFactory; import org.apache.james.mime4j.message.BodyPart; import org.apache.james.mime4j.message.HeaderImpl; import org.apache.james.mime4j.message.MessageImpl; import org.apache.james.mime4j.message.DefaultMessageBuilder; import org.apache.james.mime4j.message.MultipartImpl; import org.apache.james.mime4j.stream.Field; import junit.framework.TestCase; public class MimeBuilderCopyTest extends TestCase { public void testCopyMessage() throws Exception { MessageImpl parent = new MessageImpl(); Header header = new HeaderImpl(); Body body = new BasicBodyFactory().textBody("test"); MessageImpl original = new MessageImpl(); original.setHeader(header); original.setBody(body); original.setParent(parent); DefaultMessageBuilder builder = new DefaultMessageBuilder(); Message copy = builder.copy(original); assertNotNull(copy.getHeader()); assertNotSame(header, copy.getHeader()); assertNotNull(copy.getBody()); assertNotSame(body, copy.getBody()); assertSame(copy, copy.getBody().getParent()); assertNull(copy.getParent()); } public void testCopyEmptyBodyPart() throws Exception { BodyPart original = new BodyPart(); DefaultMessageBuilder builder = new DefaultMessageBuilder(); BodyPart copy = builder.copy(original); assertNull(copy.getHeader()); assertNull(copy.getBody()); assertNull(copy.getParent()); } public void testCopyBodyPart() throws Exception { MessageImpl parent = new MessageImpl(); Header header = new HeaderImpl(); Body body = new BasicBodyFactory().textBody("test"); BodyPart original = new BodyPart(); original.setHeader(header); original.setBody(body); original.setParent(parent); DefaultMessageBuilder builder = new DefaultMessageBuilder(); BodyPart copy = builder.copy(original); assertNotNull(copy.getHeader()); assertNotSame(header, copy.getHeader()); assertNotNull(copy.getBody()); assertNotSame(body, copy.getBody()); assertSame(copy, copy.getBody().getParent()); assertNull(copy.getParent()); } public void testCopyEmptyMultipart() throws Exception { Multipart original = new MultipartImpl("mixed"); DefaultMessageBuilder builder = new DefaultMessageBuilder(); Multipart copy = builder.copy(original); assertSame(original.getPreamble(), copy.getPreamble()); assertSame(original.getEpilogue(), copy.getEpilogue()); assertSame(original.getSubType(), copy.getSubType()); assertTrue(copy.getBodyParts().isEmpty()); assertNull(copy.getParent()); } public void testCopyMultipart() throws Exception { MessageImpl parent = new MessageImpl(); BodyPart bodyPart = new BodyPart(); MultipartImpl original = new MultipartImpl("mixed"); original.setPreamble("preamble"); original.setEpilogue("epilogue"); original.setParent(parent); original.addBodyPart(bodyPart); DefaultMessageBuilder builder = new DefaultMessageBuilder(); Multipart copy = builder.copy(original); assertSame(original.getPreamble(), copy.getPreamble()); assertSame(original.getEpilogue(), copy.getEpilogue()); assertSame(original.getSubType(), copy.getSubType()); assertEquals(1, copy.getBodyParts().size()); assertNull(copy.getParent()); Entity bodyPartCopy = copy.getBodyParts().iterator().next(); assertNotSame(bodyPart, bodyPartCopy); assertSame(parent, bodyPart.getParent()); assertNull(bodyPartCopy.getParent()); } public void testCopyMultipartMessage() throws Exception { BodyPart bodyPart1 = new BodyPart(); BodyPart bodyPart2 = new BodyPart(); Multipart multipart = new MultipartImpl("mixed"); multipart.addBodyPart(bodyPart1); multipart.addBodyPart(bodyPart2); MessageImpl original = new MessageImpl(); original.setHeader(new HeaderImpl()); original.setBody(multipart); DefaultMessageBuilder builder = new DefaultMessageBuilder(); Message copy = builder.copy(original); Multipart multipartCopy = (Multipart) copy.getBody(); List bodyParts = multipartCopy.getBodyParts(); Entity bodyPartCopy1 = bodyParts.get(0); Entity bodyPartCopy2 = bodyParts.get(1); assertNotSame(bodyPart1, bodyPartCopy1); assertEquals(original, bodyPart1.getParent()); assertEquals(copy, bodyPartCopy1.getParent()); assertNotSame(bodyPart2, bodyPartCopy2); assertEquals(original, bodyPart2.getParent()); assertEquals(copy, bodyPartCopy2.getParent()); } public void testCopyHeader() throws Exception { Field f1 = DefaultFieldParser.parse("name1: value1"); Field f2 = DefaultFieldParser.parse("name2: value"); Field f3 = DefaultFieldParser.parse("name1: value2"); Header original = new HeaderImpl(); original.addField(f1); original.addField(f2); original.addField(f3); DefaultMessageBuilder builder = new DefaultMessageBuilder(); Header copy = builder.copy(original); // copy must have same fields as original assertEquals(Arrays.asList(f1, f2, f3), copy.getFields()); assertEquals(Arrays.asList(f1, f3), copy.getFields("name1")); // modify original original.removeFields("name1"); assertEquals(Arrays.asList(f2), original.getFields()); // copy may not be affected assertEquals(Arrays.asList(f1, f2, f3), copy.getFields()); assertEquals(Arrays.asList(f1, f3), copy.getFields("name1")); } } apache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/dom/HeaderTest.java0000644000000000000000000001433611702050526027507 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.dom; import junit.framework.TestCase; import org.apache.commons.io.output.ByteArrayOutputStream; import org.apache.james.mime4j.dom.Header; import org.apache.james.mime4j.field.DefaultFieldParser; import org.apache.james.mime4j.message.HeaderImpl; import org.apache.james.mime4j.message.DefaultMessageWriter; import org.apache.james.mime4j.stream.Field; import org.apache.james.mime4j.util.ByteArrayBuffer; import org.apache.james.mime4j.util.ContentUtil; public class HeaderTest extends TestCase { public static final String SUBJECT = "Subject: test"; public static final String TO = "To: anyuser "; public void testHeader() throws Exception { Header header = new HeaderImpl(); header.addField(DefaultFieldParser.parse(SUBJECT)); header.addField(DefaultFieldParser.parse(TO)); assertNotNull("Subject found", header.getField("Subject")); assertNotNull("To found", header.getField("To")); assertEquals("Headers equals", SUBJECT + "\r\n" + TO + "\r\n", header .toString()); } private static final String SWISS_GERMAN_HELLO = "Gr\374ezi_z\344m\344"; public void testWriteSpecialCharacters() throws Exception { String hello = SWISS_GERMAN_HELLO; Header header = new HeaderImpl(); header.addField(DefaultFieldParser.parse("Hello: " + hello)); Field field = header.getField("Hello"); assertNotNull(field); // field.getBody is already a 7 bit ASCII string, after MIME4J-151 // assertEquals(hello, field.getBody()); assertEquals(SWISS_GERMAN_HELLO, field.getBody()); ByteArrayOutputStream outstream = new ByteArrayOutputStream(); DefaultMessageWriter writer = new DefaultMessageWriter(); writer.writeHeader(header, outstream); byte[] b = outstream.toByteArray(); ByteArrayBuffer buf = new ByteArrayBuffer(b.length); buf.append(b, 0, b.length); String s = ContentUtil.decode(buf); assertEquals("Hello: " + SWISS_GERMAN_HELLO + "\r\n\r\n", s); } public void testRemoveFields() throws Exception { Header header = new HeaderImpl(); header.addField(DefaultFieldParser.parse("Received: from foo by bar for james")); header.addField(DefaultFieldParser.parse("Content-type: text/plain; charset=US-ASCII")); header.addField(DefaultFieldParser.parse("ReCeIvEd: from bar by foo for james")); assertEquals(3, header.getFields().size()); assertEquals(2, header.getFields("received").size()); assertEquals(1, header.getFields("Content-Type").size()); assertEquals(2, header.removeFields("rEcEiVeD")); assertEquals(1, header.getFields().size()); assertEquals(0, header.getFields("received").size()); assertEquals(1, header.getFields("Content-Type").size()); assertEquals("Content-type", header.getFields().get(0).getName()); } public void testRemoveNonExistantField() throws Exception { Header header = new HeaderImpl(); header.addField(DefaultFieldParser.parse("Received: from foo by bar for james")); header.addField(DefaultFieldParser.parse("Content-type: text/plain; charset=US-ASCII")); header.addField(DefaultFieldParser.parse("ReCeIvEd: from bar by foo for james")); assertEquals(0, header.removeFields("noSuchField")); assertEquals(3, header.getFields().size()); assertEquals(2, header.getFields("received").size()); assertEquals(1, header.getFields("Content-Type").size()); } public void testSetField() throws Exception { Header header = new HeaderImpl(); header.addField(DefaultFieldParser.parse("From: mime4j@james.apache.org")); header.addField(DefaultFieldParser.parse("Received: from foo by bar for james")); header.addField(DefaultFieldParser.parse("Content-type: text/plain; charset=US-ASCII")); header.addField(DefaultFieldParser.parse("ReCeIvEd: from bar by foo for james")); header.setField(DefaultFieldParser.parse("received: from nobody by noone for james")); assertEquals(3, header.getFields().size()); assertEquals(1, header.getFields("received").size()); assertEquals("From", header.getFields().get(0).getName()); assertEquals("received", header.getFields().get(1).getName()); assertEquals("Content-type", header.getFields().get(2).getName()); } public void testSetNonExistantField() throws Exception { Header header = new HeaderImpl(); header.addField(DefaultFieldParser.parse("Received: from foo by bar for james")); header.addField(DefaultFieldParser.parse("Content-type: text/plain; charset=US-ASCII")); header.addField(DefaultFieldParser.parse("ReCeIvEd: from bar by foo for james")); header.setField(DefaultFieldParser.parse("Message-ID: ")); assertEquals(4, header.getFields().size()); assertEquals(1, header.getFields("message-id").size()); assertEquals("Message-ID", header.getFields().get(3).getName()); } } apache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/0000755000000000000000000000000011702050526025111 5ustar rootroot././@LongLink0000000000000000000000000000016400000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/LenientContentDispositionFieldTest.javaapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/LenientContentDispositio0000644000000000000000000001573311702050526032045 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field; import java.util.Date; import junit.framework.TestCase; import org.apache.james.mime4j.MimeException; import org.apache.james.mime4j.dom.field.ContentDispositionField; import org.apache.james.mime4j.stream.RawField; import org.apache.james.mime4j.stream.RawFieldParser; import org.apache.james.mime4j.util.ByteSequence; import org.apache.james.mime4j.util.ContentUtil; public class LenientContentDispositionFieldTest extends TestCase { static ContentDispositionField parse(final String s) throws MimeException { ByteSequence raw = ContentUtil.encode(s); RawField rawField = RawFieldParser.DEFAULT.parseField(raw); return ContentDispositionFieldLenientImpl.PARSER.parse(rawField, null); } public void testDispositionTypeWithSemiColonNoParams() throws Exception { ContentDispositionField f = parse("Content-Disposition: inline;"); assertEquals("inline", f.getDispositionType()); } public void testGetDispositionType() throws Exception { ContentDispositionField f = parse("Content-Disposition: attachment"); assertEquals("attachment", f.getDispositionType()); f = parse("content-disposition: InLiNe "); assertEquals("inline", f.getDispositionType()); f = parse("CONTENT-DISPOSITION: x-yada ;" + " param = yada"); assertEquals("x-yada", f.getDispositionType()); f = parse("CONTENT-DISPOSITION: "); assertEquals("", f.getDispositionType()); } public void testGetParameter() throws Exception { ContentDispositionField f = parse("CONTENT-DISPOSITION: inline ;" + " filename=yada yada"); assertEquals("yada yada", f.getParameter("filename")); f = parse("Content-Disposition: x-yada;" + " fileNAme= \"ya:\\\"*da\"; " + "\tSIZE\t = 1234"); assertEquals("ya:\"*da", f.getParameter("filename")); assertEquals("1234", f.getParameter("size")); f = parse("Content-Disposition: x-yada; " + "fileNAme= \"ya \\\"\\\"\tda \\\"\"; " + "\tx-Yada\t = \"\\\"hepp\\\" =us\t-ascii\""); assertEquals("ya \"\"\tda \"", f.getParameter("filename")); assertEquals("\"hepp\" =us\t-ascii", f.getParameter("x-yada")); } public void testIsDispositionType() throws Exception { ContentDispositionField f = parse("Content-Disposition:INline"); assertTrue(f.isDispositionType("InLiNe")); assertFalse(f.isDispositionType("NiLiNe")); assertTrue(f.isInline()); assertFalse(f.isAttachment()); f = parse("Content-Disposition: attachment"); assertTrue(f.isDispositionType("ATTACHMENT")); assertFalse(f.isInline()); assertTrue(f.isAttachment()); f = parse("Content-Disposition: x-something"); assertTrue(f.isDispositionType("x-SomeThing")); assertFalse(f.isInline()); assertFalse(f.isAttachment()); } public void testGetFilename() throws Exception { ContentDispositionField f = parse("Content-Disposition: inline; filename=yada.txt"); assertEquals("yada.txt", f.getFilename()); f = parse("Content-Disposition: inline; filename=yada yada.txt"); assertEquals("yada yada.txt", f.getFilename()); f = parse("Content-Disposition: inline; filename=\"yada yada.txt\""); assertEquals("yada yada.txt", f.getFilename()); f = parse("Content-Disposition: inline"); assertNull(f.getFilename()); } public void testGetCreationDate() throws Exception { ContentDispositionField f = parse("Content-Disposition: inline; " + "creation-date=\"Tue, 01 Jan 1970 00:00:00 +0000\""); assertEquals(new Date(0), f.getCreationDate()); f = parse("Content-Disposition: inline; " + "creation-date=Tue, 01 Jan 1970 00:00:00 +0000"); assertEquals(new Date(0), f.getCreationDate()); f = parse("Content-Disposition: attachment"); assertNull(f.getCreationDate()); } public void testGetModificationDate() throws Exception { ContentDispositionField f = parse("Content-Disposition: inline; " + "modification-date=\"Tue, 01 Jan 1970 00:00:00 +0000\""); assertEquals(new Date(0), f.getModificationDate()); f = parse("Content-Disposition: inline; " + "modification-date=\"Wed, 12 Feb 1997 16:29:51 -0500\""); assertEquals(new Date(855782991000l), f.getModificationDate()); f = parse("Content-Disposition: inline; " + "modification-date=yesterday"); assertNull(f.getModificationDate()); f = parse("Content-Disposition: attachment"); assertNull(f.getModificationDate()); } public void testGetReadDate() throws Exception { ContentDispositionField f = parse("Content-Disposition: inline; " + "read-date=\"Tue, 01 Jan 1970 00:00:00 +0000\""); assertEquals(new Date(0), f.getReadDate()); f = parse("Content-Disposition: inline; read-date="); assertNull(f.getReadDate()); f = parse("Content-Disposition: attachment"); assertNull(f.getReadDate()); } public void testGetSize() throws Exception { ContentDispositionField f = parse("Content-Disposition: attachment; size=0"); assertEquals(0, f.getSize()); f = parse("Content-Disposition: attachment; size=matters"); assertEquals(-1, f.getSize()); f = parse("Content-Disposition: attachment"); assertEquals(-1, f.getSize()); f = parse("Content-Disposition: attachment; size=-12"); assertEquals(-1, f.getSize()); f = parse("Content-Disposition: attachment; size=12"); assertEquals(12, f.getSize()); } } ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/ContentLocationFieldTest.javaapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/ContentLocationFieldTest0000644000000000000000000000545511702050526031754 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field; import org.apache.james.mime4j.MimeException; import org.apache.james.mime4j.dom.field.ContentLocationField; import org.apache.james.mime4j.stream.RawField; import org.apache.james.mime4j.stream.RawFieldParser; import org.apache.james.mime4j.util.ByteSequence; import org.apache.james.mime4j.util.ContentUtil; import junit.framework.TestCase; public class ContentLocationFieldTest extends TestCase { static ContentLocationField parse(final String s) throws MimeException { ByteSequence raw = ContentUtil.encode(s); RawField rawField = RawFieldParser.DEFAULT.parseField(raw); return ContentLocationFieldImpl.PARSER.parse(rawField, null); } public void testGetSimpleLocation() throws Exception { ContentLocationField f = parse("Content-Location: stuff"); String location = f.getLocation(); assertEquals("stuff", location); } public void testGetQuotedLocation() throws Exception { ContentLocationField f = parse("Content-Location: \" stuff \""); String location = f.getLocation(); assertEquals("stuff", location); } public void testGetLocationWithBlanks() throws Exception { ContentLocationField f = parse("Content-Location: this / that \t/what not"); String location = f.getLocation(); assertEquals("this/that/whatnot", location); } public void testGetLocationWithCommens() throws Exception { ContentLocationField f = parse("Content-Location: this(blah) / that (yada) /what not"); String location = f.getLocation(); assertEquals("this/that/whatnot", location); } } ././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/LenientContentTypeFieldTest.javaapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/LenientContentTypeFieldT0000644000000000000000000001003711702050526031720 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field; import org.apache.james.mime4j.MimeException; import org.apache.james.mime4j.dom.field.ContentTypeField; import org.apache.james.mime4j.stream.RawField; import org.apache.james.mime4j.stream.RawFieldParser; import org.apache.james.mime4j.util.ByteSequence; import org.apache.james.mime4j.util.ContentUtil; import junit.framework.TestCase; public class LenientContentTypeFieldTest extends TestCase { static ContentTypeField parse(final String s) throws MimeException { ByteSequence raw = ContentUtil.encode(s); RawField rawField = RawFieldParser.DEFAULT.parseField(raw); return ContentTypeFieldLenientImpl.PARSER.parse(rawField, null); } public void testMimeTypeWithSemiColonNoParams() throws Exception { ContentTypeField f = parse("Content-Type: text/html;"); assertEquals("text/html", f.getMimeType()); } public void testMimeTypeWithMultipleSemiColon() throws Exception { ContentTypeField f = parse("Content-Type: text/html;;;"); assertEquals("text/html", f.getMimeType()); assertEquals(1, f.getParameters().size()); } public void testMimeTypeWithNonameParam() throws Exception { ContentTypeField f = parse("Content-Type: text/html;=stuff"); assertEquals("text/html", f.getMimeType()); assertEquals(1, f.getParameters().size()); assertEquals("stuff", f.getParameter("")); } public void testGetMimeType() throws Exception { ContentTypeField f = parse("Content-Type: text/PLAIN"); assertEquals("text/plain", f.getMimeType()); f = parse("content-type: TeXt / html "); assertEquals("text/html", f.getMimeType()); f = parse("CONTENT-TYPE: x-app/yada ;" + " param = yada"); assertEquals("x-app/yada", f.getMimeType()); f = parse("CONTENT-TYPE: yada"); assertEquals(null, f.getMimeType()); } public void testGetParameter() throws Exception { ContentTypeField f = parse("CONTENT-TYPE: text / html ;" + " boundary=yada yada"); assertEquals("yada yada", f.getParameter("boundary")); f = parse("Content-Type: x-app/yada;" + " boUNdarY= \"ya:\\\"*da\"; " + "\tcharset\t = us-ascii"); assertEquals("ya:\"*da", f.getParameter("boundary")); assertEquals("us-ascii", f.getParameter("charset")); f = parse("Content-Type: x-app/yada; " + "boUNdarY= \"ya \\\"\\\"\tda \\\"\"; " + "\tcharset\t = \"\\\"hepp\\\" =us\t-ascii\""); assertEquals("ya \"\"\tda \"", f.getParameter("boundary")); assertEquals("\"hepp\" =us\t-ascii", f.getParameter("charset")); } } apache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/mimeversion/0000755000000000000000000000000011702050526027446 5ustar rootroot././@LongLink0000000000000000000000000000016300000000000011565 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/mimeversion/MimeVersionParserTest.javaapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/mimeversion/MimeVersionP0000644000000000000000000000604111702050526031747 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field.mimeversion; import java.io.StringReader; import junit.framework.TestCase; import org.apache.james.mime4j.field.mimeversion.parser.MimeVersionParser; import org.apache.james.mime4j.field.mimeversion.parser.ParseException; public class MimeVersionParserTest extends TestCase { @Override protected void setUp() throws Exception { super.setUp(); } @Override protected void tearDown() throws Exception { super.tearDown(); } public void testPlainLine() throws Exception { check("2.4", 2, 4); check("25.344", 25, 344); check("0.1", 0, 1); check("123234234.0", 123234234, 0); } public void testLineWithComments() throws Exception { check("2(A comment).4", 2, 4); check("2(.8).4", 2, 4); check("(A comment)2.4", 2, 4); check("2.4(A comment)", 2, 4); check("2.(A comment)4", 2, 4); } public void testLineWithNestedComments() throws Exception { check("2(4.45 ( Another ()comment () blah (Wobble(mix)))Whatever).4", 2, 4); } public void testEmptyLine() throws Exception { try { parse("(This is just a comment)"); fail("Expected exception to be thrown"); } catch (ParseException e) { //expected } } private void check(String input, int expectedMajorVersion, int expectedMinorVersion) throws Exception { MimeVersionParser parser = parse(input); assertEquals("Major version number", expectedMajorVersion, parser.getMajorVersion()); assertEquals("Minor version number", expectedMinorVersion, parser.getMinorVersion()); } private MimeVersionParser parse(String input) throws ParseException { MimeVersionParser parser = new MimeVersionParser(new StringReader(input)); parser.parseAll(); return parser; } } ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/MimeVersionParserTest.javaapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/MimeVersionParserTest.ja0000644000000000000000000000620311702050526031700 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field; import junit.framework.TestCase; import org.apache.james.mime4j.MimeException; import org.apache.james.mime4j.dom.field.MimeVersionField; import org.apache.james.mime4j.stream.RawField; import org.apache.james.mime4j.stream.RawFieldParser; import org.apache.james.mime4j.util.ByteSequence; import org.apache.james.mime4j.util.ContentUtil; public class MimeVersionParserTest extends TestCase { static MimeVersionField parse(final String s) throws MimeException { ByteSequence raw = ContentUtil.encode(s); RawField rawField = RawFieldParser.DEFAULT.parseField(raw); return MimeVersionFieldImpl.PARSER.parse(rawField, null); } static void check(String input, int expectedMajorVersion, int expectedMinorVersion) throws Exception { MimeVersionField f = parse("MIME-Version: " + input); assertEquals("Major version number", expectedMajorVersion, f.getMajorVersion()); assertEquals("Minor version number", expectedMinorVersion, f.getMinorVersion()); } public void testPlainLine() throws Exception { check("2.4", 2, 4); check("25.344", 25, 344); check("0.1", 0, 1); check("123234234.0", 123234234, 0); } public void testLineWithComments() throws Exception { check("2(A comment).4", 2, 4); check("2(.8).4", 2, 4); check("(A comment)2.4", 2, 4); check("2.4(A comment)", 2, 4); check("2.(A comment)4", 2, 4); } public void testLineWithNestedComments() throws Exception { check("2(4.45 ( Another ()comment () blah (Wobble(mix)))Whatever).4", 2, 4); } public void testEmptyLine() throws Exception { MimeVersionField f = parse("MIME-Version: (This is just a comment)"); assertEquals(MimeVersionFieldImpl.DEFAULT_MAJOR_VERSION, f.getMajorVersion()); assertEquals(MimeVersionFieldImpl.DEFAULT_MINOR_VERSION, f.getMinorVersion()); assertNotNull(f.getParseException()); } } ././@LongLink0000000000000000000000000000015600000000000011567 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/LenientMimeVersionParserTest.javaapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/LenientMimeVersionParser0000644000000000000000000000775211702050526032000 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field; import junit.framework.TestCase; import org.apache.james.mime4j.MimeException; import org.apache.james.mime4j.dom.field.MimeVersionField; import org.apache.james.mime4j.stream.RawField; import org.apache.james.mime4j.stream.RawFieldParser; import org.apache.james.mime4j.util.ByteSequence; import org.apache.james.mime4j.util.ContentUtil; public class LenientMimeVersionParserTest extends TestCase { static MimeVersionField parse(final String s) throws MimeException { ByteSequence raw = ContentUtil.encode(s); RawField rawField = RawFieldParser.DEFAULT.parseField(raw); return MimeVersionFieldLenientImpl.PARSER.parse(rawField, null); } static void check(String input, int expectedMajorVersion, int expectedMinorVersion) throws Exception { MimeVersionField f = parse("MIME-Version: " + input); assertEquals("Major version number", expectedMajorVersion, f.getMajorVersion()); assertEquals("Minor version number", expectedMinorVersion, f.getMinorVersion()); } public void testPlainLine() throws Exception { check("2.4", 2, 4); check("25.344", 25, 344); check("0.1", 0, 1); check("123234234.0", 123234234, 0); } public void testLineWithComments() throws Exception { check("2(A comment).4", 2, 4); check("2(.8).4", 2, 4); check("(A comment)2.4", 2, 4); check("2.4(A comment)", 2, 4); check("2.(A comment)4", 2, 4); } public void testLineWithNestedComments() throws Exception { check("2(4.45 ( Another ()comment () blah (Wobble(mix)))Whatever).4", 2, 4); } public void testMalformed1() throws Exception { MimeVersionField f = parse("MIME-Version: 5 "); assertEquals(5, f.getMajorVersion()); assertEquals(MimeVersionFieldImpl.DEFAULT_MINOR_VERSION, f.getMinorVersion()); assertNull(f.getParseException()); } public void testMalformed2() throws Exception { MimeVersionField f = parse("MIME-Version: 5. "); assertEquals(5, f.getMajorVersion()); assertEquals(MimeVersionFieldImpl.DEFAULT_MINOR_VERSION, f.getMinorVersion()); assertNull(f.getParseException()); } public void testMalformed3() throws Exception { MimeVersionField f = parse("MIME-Version: .5 "); assertEquals(MimeVersionFieldImpl.DEFAULT_MAJOR_VERSION, f.getMajorVersion()); assertEquals(5, f.getMinorVersion()); assertNull(f.getParseException()); } public void testMalformed4() throws Exception { MimeVersionField f = parse("MIME-Version: crap "); assertEquals(MimeVersionFieldImpl.DEFAULT_MAJOR_VERSION, f.getMajorVersion()); assertEquals(MimeVersionFieldImpl.DEFAULT_MINOR_VERSION, f.getMinorVersion()); assertNull(f.getParseException()); } } ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/ContentLanguageFieldTest.javaapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/ContentLanguageFieldTest0000644000000000000000000000626411702050526031726 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field; import java.util.List; import org.apache.james.mime4j.MimeException; import org.apache.james.mime4j.dom.field.ContentLanguageField; import org.apache.james.mime4j.stream.RawField; import org.apache.james.mime4j.stream.RawFieldParser; import org.apache.james.mime4j.util.ByteSequence; import org.apache.james.mime4j.util.ContentUtil; import junit.framework.TestCase; public class ContentLanguageFieldTest extends TestCase { static ContentLanguageField parse(final String s) throws MimeException { ByteSequence raw = ContentUtil.encode(s); RawField rawField = RawFieldParser.DEFAULT.parseField(raw); return ContentLanguageFieldImpl.PARSER.parse(rawField, null); } public void testGetLanguage() throws Exception { ContentLanguageField f = parse("Content-Language: en, de"); List langs = f.getLanguages(); assertNotNull(langs); assertEquals(2, langs.size()); assertEquals("en", langs.get(0)); assertEquals("de", langs.get(1)); } public void testGetLanguageWithComments() throws Exception { ContentLanguageField f = parse("Content-Language: en (yada yada), (blah blah)de"); List langs = f.getLanguages(); assertNotNull(langs); assertEquals(2, langs.size()); assertEquals("en", langs.get(0)); assertEquals("de", langs.get(1)); } public void testGetLanguageWithUnderscore() throws Exception { ContentLanguageField f = parse("Content-Language: en, en_GB (Great Britain)"); List langs = f.getLanguages(); assertNotNull(langs); assertEquals(0, langs.size()); assertNotNull(f.getParseException()); } public void testGetLanguageWithEmptyElement() throws Exception { ContentLanguageField f = parse("Content-Language: en,, de"); List langs = f.getLanguages(); assertNotNull(langs); assertEquals(0, langs.size()); assertNotNull(f.getParseException()); } } apache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/address/0000755000000000000000000000000011702050526026536 5ustar rootroot././@LongLink0000000000000000000000000000016300000000000011565 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/address/LenientAddressBuilderTest.javaapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/address/LenientAddressBu0000644000000000000000000004465011702050526031665 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field.address; import java.util.List; import junit.framework.TestCase; import org.apache.james.mime4j.dom.address.Address; import org.apache.james.mime4j.dom.address.AddressList; import org.apache.james.mime4j.dom.address.DomainList; import org.apache.james.mime4j.dom.address.Group; import org.apache.james.mime4j.dom.address.Mailbox; import org.apache.james.mime4j.dom.address.MailboxList; import org.apache.james.mime4j.stream.ParserCursor; import org.apache.james.mime4j.stream.RawFieldParser; import org.apache.james.mime4j.util.ByteSequence; import org.apache.james.mime4j.util.ContentUtil; public class LenientAddressBuilderTest extends TestCase { private LenientAddressBuilder parser; @Override protected void setUp() throws Exception { parser = LenientAddressBuilder.DEFAULT; } public void testParseDomain() throws Exception { String s = "machine (comment). example (dot). com ; more stuff"; ByteSequence raw = ContentUtil.encode(s); ParserCursor cursor = new ParserCursor(0, s.length()); String domain = parser.parseDomain(raw, cursor, RawFieldParser.INIT_BITSET(';')); assertEquals("machine.example.com", domain); } public void testParseMailboxAddress() throws Exception { String s = "< some one @ some host . some where . com >"; ByteSequence raw = ContentUtil.encode(s); ParserCursor cursor = new ParserCursor(0, s.length()); Mailbox mailbox = parser.parseMailboxAddress(null, raw, cursor); assertEquals("some one@somehost.somewhere.com", mailbox.getAddress()); } public void testParseMailboxNullAddress() throws Exception { String s = "<>"; ByteSequence raw = ContentUtil.encode(s); ParserCursor cursor = new ParserCursor(0, s.length()); Mailbox mailbox = parser.parseMailboxAddress(null, raw, cursor); assertEquals("", mailbox.getAddress()); } public void testParseMailboxEmptyAddress() throws Exception { String s = "< >"; ByteSequence raw = ContentUtil.encode(s); ParserCursor cursor = new ParserCursor(0, s.length()); Mailbox mailbox = parser.parseMailboxAddress(null, raw, cursor); assertEquals("", mailbox.getAddress()); } public void testParseAddressQuotedLocalPart() throws Exception { String s = "< \"some one\" @ some host . some where . com >"; ByteSequence raw = ContentUtil.encode(s); ParserCursor cursor = new ParserCursor(0, s.length()); Mailbox mailbox = parser.parseMailboxAddress(null, raw, cursor); assertEquals("some one@somehost.somewhere.com", mailbox.getAddress()); } public void testParseAddressTruncated() throws Exception { String s = "< some one "; ByteSequence raw = ContentUtil.encode(s); ParserCursor cursor = new ParserCursor(0, s.length()); Mailbox mailbox = parser.parseMailboxAddress(null, raw, cursor); assertEquals("some one", mailbox.getAddress()); } public void testParseAddressTrailingComments() throws Exception { String s = "< someone@somehost.somewhere.com > (garbage) ; "; ByteSequence raw = ContentUtil.encode(s); ParserCursor cursor = new ParserCursor(0, s.length()); Mailbox mailbox = parser.parseMailboxAddress(null, raw, cursor); assertEquals("someone@somehost.somewhere.com", mailbox.getAddress()); assertEquals(';', raw.byteAt(cursor.getPos())); } public void testParseAddressTrailingGarbage() throws Exception { String s = "< someone@somehost.somewhere.com > garbage) ; "; ByteSequence raw = ContentUtil.encode(s); ParserCursor cursor = new ParserCursor(0, s.length()); Mailbox mailbox = parser.parseMailboxAddress(null, raw, cursor); assertEquals("someone@somehost.somewhere.com", mailbox.getAddress()); assertEquals('g', raw.byteAt(cursor.getPos())); } public void testParseRoute() throws Exception { String s = " @a, @b, @c :me@home"; ByteSequence raw = ContentUtil.encode(s); ParserCursor cursor = new ParserCursor(0, s.length()); DomainList route = parser.parseRoute(raw, cursor, null); assertNotNull(route); assertEquals(3, route.size()); assertEquals("a", route.get(0)); assertEquals("b", route.get(1)); assertEquals("c", route.get(2)); assertEquals('m', raw.byteAt(cursor.getPos())); } public void testParseAddressStartingWithAt() throws Exception { String s = "<@somehost.com@somehost.com>"; ByteSequence raw = ContentUtil.encode(s); ParserCursor cursor = new ParserCursor(0, s.length()); Mailbox mailbox = parser.parseMailboxAddress(null, raw, cursor); assertEquals("", mailbox.getLocalPart()); assertEquals(null, mailbox.getDomain()); DomainList route = mailbox.getRoute(); assertNotNull(route); assertEquals(1, route.size()); assertEquals("somehost.com@somehost.com", route.get(0)); } public void testParseNoRoute() throws Exception { String s = "stuff"; ByteSequence raw = ContentUtil.encode(s); ParserCursor cursor = new ParserCursor(0, s.length()); DomainList route = parser.parseRoute(raw, cursor, null); assertNull(route); } public void testParseMailbox() throws Exception { Mailbox mailbox1 = parser.parseMailbox("John Doe "); assertEquals("John Doe", mailbox1.getName()); assertEquals("jdoe", mailbox1.getLocalPart()); assertEquals("machine.example", mailbox1.getDomain()); Mailbox mailbox2 = parser.parseMailbox("Mary Smith \t \t\t "); assertEquals("Mary Smith", mailbox2.getName()); assertEquals("mary", mailbox2.getLocalPart()); assertEquals("example.net", mailbox2.getDomain()); Mailbox mailbox3 = parser.parseMailbox("john.doe@acme.org"); assertNull(mailbox3.getName()); assertEquals("john.doe@acme.org", mailbox3.getAddress()); Mailbox mailbox4 = parser.parseMailbox("Mary Smith "); assertEquals("Mary Smith", mailbox4.getName()); assertEquals("mary@example.net", mailbox4.getAddress()); // non-ascii should be allowed in quoted strings Mailbox mailbox5 = parser.parseMailbox( "\"Hans M\374ller\" "); assertEquals("Hans M\374ller", mailbox5.getName()); assertEquals("hans.mueller@acme.org", mailbox5.getAddress()); } public void testParseMailboxEncoded() throws ParseException { Mailbox mailbox1 = parser.parseMailbox("=?ISO-8859-1?B?c3R1ZmY=?= "); assertEquals("stuff", mailbox1.getName()); assertEquals("stuff", mailbox1.getLocalPart()); assertEquals("localhost.localdomain", mailbox1.getDomain()); } public void testParseMailboxNonASCII() throws Exception { Mailbox mailbox1 = parser.parseMailbox( "Hans M\374ller "); assertEquals("Hans M\374ller", mailbox1.getName()); assertEquals("hans.mueller@acme.org", mailbox1.getAddress()); } public void testParsePartialQuotes() throws Exception { Mailbox mailbox1 = parser.parseMailbox( "Hans \"M\374ller\" is a good fella "); assertEquals("Hans M\374ller is a good fella", mailbox1.getName()); assertEquals("hans.mueller@acme.org", mailbox1.getAddress()); } public void testParseMailboxObsoleteSynatax() throws Exception { Mailbox mailbox1 = parser.parseMailbox("< (route)(obsolete) " + "@host1.domain1 , @host2 . domain2: foo@bar.org>"); assertEquals(null, mailbox1.getName()); assertEquals("foo", mailbox1.getLocalPart()); assertEquals("bar.org", mailbox1.getDomain()); DomainList domainList = mailbox1.getRoute(); assertNotNull(domainList); assertEquals(2, domainList.size()); assertEquals("host1.domain1", domainList.get(0)); assertEquals("host2.domain2", domainList.get(1)); } public void testParseMailboxEmpty() throws Exception { Mailbox mailbox1 = parser.parseMailbox(" "); assertNull(mailbox1); } public void testParseMailboxList() throws Exception { String s = "a , b, ,,, c, d,;garbage"; ByteSequence raw = ContentUtil.encode(s); ParserCursor cursor = new ParserCursor(0, s.length()); List mailboxes = parser.parseMailboxes(raw, cursor, RawFieldParser.INIT_BITSET(';')); assertEquals(4, mailboxes.size()); Mailbox mailbox1 = mailboxes.get(0); assertEquals("a", mailbox1.getAddress()); Mailbox mailbox2 = mailboxes.get(1); assertEquals("b", mailbox2.getAddress()); Mailbox mailbox3 = mailboxes.get(2); assertEquals("c", mailbox3.getAddress()); Mailbox mailbox4 = mailboxes.get(3); assertEquals("d", mailbox4.getAddress()); assertEquals(';', raw.byteAt(cursor.getPos())); } public void testParseMailboxListEmpty() throws Exception { String s = " "; ByteSequence raw = ContentUtil.encode(s); ParserCursor cursor = new ParserCursor(0, s.length()); List mailboxes = parser.parseMailboxes(raw, cursor, RawFieldParser.INIT_BITSET(';')); assertEquals(0, mailboxes.size()); } public void testParseGroup() throws Exception { String s = "group: john.doe@acme.org, Mary Smith "; ByteSequence raw = ContentUtil.encode(s); ParserCursor cursor = new ParserCursor(0, s.length()); Group group = parser.parseGroup(raw, cursor); assertEquals("group", group.getName()); MailboxList mailboxes = group.getMailboxes(); assertEquals(2, mailboxes.size()); Mailbox mailbox1 = mailboxes.get(0); assertNull(mailbox1.getName()); assertEquals("john.doe@acme.org", mailbox1.getAddress()); Mailbox mailbox2 = mailboxes.get(1); assertEquals("Mary Smith", mailbox2.getName()); assertEquals("mary@example.net", mailbox2.getAddress()); } public void testParseInvalidGroup() throws Exception { Group group = parser.parseGroup("john.doe@acme.org"); assertEquals("john.doe@acme.org", group.getName()); MailboxList mailboxes = group.getMailboxes(); assertEquals(0, mailboxes.size()); } public void testParseAddress() throws Exception { Address address = parser.parseAddress("Mary Smith "); assertTrue(address instanceof Mailbox); Mailbox mbox = (Mailbox) address; assertEquals("Mary Smith", mbox.getName()); assertEquals("mary@example.net", mbox.getAddress()); address = parser.parseAddress("group: Mary Smith ;"); assertTrue(address instanceof Group); Group group = (Group) address; assertEquals("group", group.getName()); MailboxList mailboxes = group.getMailboxes(); assertEquals(1, mailboxes.size()); mbox = mailboxes.get(0); assertEquals("Mary Smith", mbox.getName()); assertEquals("mary@example.net", mbox.getAddress()); } public void testParseAddressList() throws Exception { AddressList addrList1 = parser.parseAddressList("John Doe "); assertEquals(1, addrList1.size()); Mailbox mailbox1 = (Mailbox)addrList1.get(0); assertEquals("John Doe", mailbox1.getName()); assertEquals("jdoe", mailbox1.getLocalPart()); assertEquals("machine.example", mailbox1.getDomain()); AddressList addrList2 = parser.parseAddressList("Mary Smith \t \t\t "); assertEquals(1, addrList2.size()); Mailbox mailbox2 = (Mailbox)addrList2.get(0); assertEquals("Mary Smith", mailbox2.getName()); assertEquals("mary", mailbox2.getLocalPart()); assertEquals("example.net", mailbox2.getDomain()); } public void testEmptyGroup() throws Exception { AddressList addrList = parser.parseAddressList("undisclosed-recipients:;"); assertEquals(1, addrList.size()); Group group = (Group)addrList.get(0); assertEquals(0, group.getMailboxes().size()); assertEquals("undisclosed-recipients", group.getName()); } public void testMessyGroupAndMailbox() throws Exception { AddressList addrList = parser.parseAddressList( "Marketing folks : Jane Smith < jane @ example . net >," + " \" Jack \\\"Jackie\\\" Jones \" < jjones@example.com > (comment(comment)); ,, (comment) ," + " <@example . net,@example(ignore\\)).com:(ignore)john@(ignore)example.net>"); assertEquals(2, addrList.size()); Group group = (Group)addrList.get(0); assertEquals("Marketing folks", group.getName()); assertEquals(2, group.getMailboxes().size()); Mailbox mailbox1 = group.getMailboxes().get(0); Mailbox mailbox2 = group.getMailboxes().get(1); assertEquals("Jane Smith", mailbox1.getName()); assertEquals("jane", mailbox1.getLocalPart()); assertEquals("example.net", mailbox1.getDomain()); assertEquals(" Jack \"Jackie\" Jones ", mailbox2.getName()); assertEquals("jjones", mailbox2.getLocalPart()); assertEquals("example.com", mailbox2.getDomain()); Mailbox mailbox = (Mailbox)addrList.get(1); assertEquals("john", mailbox.getLocalPart()); assertEquals("example.net", mailbox.getDomain()); assertEquals(2, mailbox.getRoute().size()); assertEquals("example.net", mailbox.getRoute().get(0)); assertEquals("example.com", mailbox.getRoute().get(1)); } public void testEmptyAddressList() throws Exception { assertEquals(0, parser.parseAddressList("").size()); assertEquals(0, parser.parseAddressList(" \t \t ").size()); assertEquals(0, parser.parseAddressList(" \t , , , ,,, , \t ").size()); } public void testSimpleForm() throws Exception { AddressList addrList = parser.parseAddressList("\"a b c d e f g\" (comment) @example.net"); assertEquals(1, addrList.size()); Mailbox mailbox = (Mailbox)addrList.get(0); assertEquals("a b c d e f g", mailbox.getLocalPart()); assertEquals("example.net", mailbox.getDomain()); } public void testFlatten() throws Exception { AddressList addrList = parser.parseAddressList("dev : one@example.com, two@example.com; , ,,, marketing:three@example.com ,four@example.com;, five@example.com"); assertEquals(3, addrList.size()); assertEquals(5, addrList.flatten().size()); } public void testTortureTest() throws Exception { // Source: http://mailformat.dan.info/headers/from.html // (Commented out pending confirmation of legality--I think the local-part is illegal.) // AddressList.parse("\"Guy Macon\" "); // Taken mostly from RFC822. // Just make sure these are recognized as legal address lists; // there shouldn't be any aspect of the RFC that is tested here // but not in the other unit tests. parser.parseAddressList("Alfred Neuman "); parser.parseAddressList("Neuman@BBN-TENEXA"); parser.parseAddressList("\"George, Ted\" "); parser.parseAddressList("Wilt . (the Stilt) Chamberlain@NBA.US"); // NOTE: In RFC822 8.1.5, the following example did not have "Galloping Gourmet" // in double-quotes. I can only assume this was a typo, since 6.2.4 specifically // disallows spaces in unquoted local-part. parser.parseAddressList(" Gourmets: Pompous Person ," + " Childs@WGBH.Boston, \"Galloping Gourmet\"@" + " ANT.Down-Under (Australian National Television)," + " Cheapie@Discount-Liquors;," + " Cruisers: Port@Portugal, Jones@SEA;," + " Another@Somewhere.SomeOrg"); // NOTE: In RFC822 8.3.3, the following example ended with a lone ">" after // Tops-20-Host. I can only assume this was a typo, since 6.1 clearly shows // ">" requires a matching "<". parser.parseAddressList("Important folk:" + " Tom Softwood ," + " \"Sam Irving\"@Other-Host;," + " Standard Distribution:" + " /main/davis/people/standard@Other-Host," + " \"standard.dist.3\"@Tops-20-Host;"); // The following are from a Usenet post by Dan J. Bernstein: // http://groups.google.com/groups?selm=1996Aug1418.21.01.28081%40koobera.math.uic.edu parser.parseAddressList("\":sysmail\"@ Some-Group.\t Some-Org, Muhammed.(I am the greatest) Ali @(the)Vegas.WBA"); parser.parseAddressList("me@home.com (comment (nested (deeply\\))))"); parser.parseAddressList("mailing list: me@home.com, route two , them@play.com ;"); } } apache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/address/AddressTest.java0000644000000000000000000001246211702050526031633 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field.address; import org.apache.james.mime4j.MimeException; import org.apache.james.mime4j.dom.address.AddressList; import org.apache.james.mime4j.dom.address.DomainList; import org.apache.james.mime4j.dom.address.Mailbox; import org.apache.james.mime4j.dom.address.MailboxList; import org.apache.james.mime4j.field.address.ParseException; import java.util.ArrayList; import java.util.List; import junit.framework.TestCase; public class AddressTest extends TestCase { public void testExceptionTree() { // make sure that our ParseException extends MimeException. assertTrue(MimeException.class.isAssignableFrom(ParseException.class)); } public void testNullConstructorAndBadUsage() { AddressList al = new AddressList(null, false); assertEquals(0, al.size()); try { al.get(-1); fail("Expected index out of bound exception!"); } catch (IndexOutOfBoundsException e) { } try { al.get(0); fail("Expected index out of bound exception!"); } catch (IndexOutOfBoundsException e) { } } public void testEmptyDomainList() { DomainList dl = new DomainList(null, false); assertEquals(0, dl.size()); try { dl.get(-1); fail("Expected index out of bound exception!"); } catch (IndexOutOfBoundsException e) { } try { dl.get(0); fail("Expected index out of bound exception!"); } catch (IndexOutOfBoundsException e) { } } public void testDomainList() { List al = new ArrayList(); al.add("example.com"); // shared arraylist DomainList dl = new DomainList(al, true); assertEquals(1, dl.size()); al.add("foo.example.com"); assertEquals(2, dl.size()); // cloned arraylist DomainList dlcopy = new DomainList(al, false); assertEquals(2, dlcopy.size()); al.add("bar.example.com"); assertEquals(2, dlcopy.size()); // check route string assertEquals("@example.com,@foo.example.com", dlcopy.toRouteString()); } public void testEmptyMailboxList() { MailboxList ml = new MailboxList(null, false); assertEquals(0, ml.size()); try { ml.get(-1); fail("Expected index out of bound exception!"); } catch (IndexOutOfBoundsException e) { } try { ml.get(0); fail("Expected index out of bound exception!"); } catch (IndexOutOfBoundsException e) { } } public void testMailboxList() { List al = new ArrayList(); al.add(new Mailbox("local","example.com")); // shared arraylist MailboxList ml = new MailboxList(al, true); assertEquals(1, ml.size()); al.add(new Mailbox("local2", "foo.example.com")); assertEquals(2, ml.size()); // cloned arraylist MailboxList mlcopy = new MailboxList(al, false); assertEquals(2, mlcopy.size()); al.add(new Mailbox("local3", "bar.example.com")); assertEquals(2, mlcopy.size()); } public void testMailboxEquals() throws Exception { Mailbox m1 = new Mailbox("john.doe", "acme.org"); Mailbox m2 = new Mailbox("john doe", "acme.org"); Mailbox m3 = new Mailbox("john.doe", "Acme.Org"); Mailbox m4 = new Mailbox("john.doe", null); assertTrue(m1.equals(m1)); assertFalse(m1.equals(m2)); assertTrue(m1.equals(m3)); assertFalse(m1.equals(m4)); assertFalse(m1.equals(null)); } public void testMailboxHashCode() throws Exception { Mailbox m1 = new Mailbox("john.doe", "acme.org"); Mailbox m2 = new Mailbox("john doe", "acme.org"); Mailbox m3 = new Mailbox("john.doe", "Acme.Org"); Mailbox m4 = new Mailbox("john.doe", null); assertTrue(m1.hashCode() == m1.hashCode()); assertFalse(m1.hashCode() == m2.hashCode()); assertTrue(m1.hashCode() == m3.hashCode()); assertFalse(m1.hashCode() == m4.hashCode()); } } ././@LongLink0000000000000000000000000000016300000000000011565 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/address/DefaultAddressBuilderTest.javaapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/address/DefaultAddressBu0000644000000000000000000003253711702050526031654 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field.address; import org.apache.james.mime4j.dom.address.Address; import org.apache.james.mime4j.dom.address.AddressList; import org.apache.james.mime4j.dom.address.DomainList; import org.apache.james.mime4j.dom.address.Group; import org.apache.james.mime4j.dom.address.Mailbox; import org.apache.james.mime4j.dom.address.MailboxList; import org.apache.james.mime4j.field.address.ParseException; import java.util.ArrayList; import java.util.List; import junit.framework.TestCase; public class DefaultAddressBuilderTest extends TestCase { private AddressBuilder parser; @Override protected void setUp() throws Exception { parser = AddressBuilder.DEFAULT; } public void testParseMailbox() throws ParseException { Mailbox mailbox1 = parser.parseMailbox("John Doe "); assertEquals("John Doe", mailbox1.getName()); assertEquals("jdoe", mailbox1.getLocalPart()); assertEquals("machine.example", mailbox1.getDomain()); Mailbox mailbox2 = parser.parseMailbox("Mary Smith \t \t\t "); assertEquals("Mary Smith", mailbox2.getName()); assertEquals("mary", mailbox2.getLocalPart()); assertEquals("example.net", mailbox2.getDomain()); Mailbox mailbox3 = parser.parseMailbox("john.doe@acme.org"); assertNull(mailbox3.getName()); assertEquals("john.doe@acme.org", mailbox3.getAddress()); Mailbox mailbox4 = parser.parseMailbox("Mary Smith "); assertEquals("Mary Smith", mailbox4.getName()); assertEquals("mary@example.net", mailbox4.getAddress()); // non-ascii should be allowed in quoted strings Mailbox mailbox5 = parser.parseMailbox( "\"Hans M\374ller\" "); assertEquals("Hans M\374ller", mailbox5.getName()); assertEquals("hans.mueller@acme.org", mailbox5.getAddress()); } public void testParseMailboxEncoded() throws ParseException { Mailbox mailbox1 = parser.parseMailbox("=?ISO-8859-1?B?c3R1ZmY=?= "); assertEquals("stuff", mailbox1.getName()); assertEquals("stuff", mailbox1.getLocalPart()); assertEquals("localhost.localdomain", mailbox1.getDomain()); } public void testParseMailboxObsoleteSynatax() throws ParseException { Mailbox mailbox1 = parser.parseMailbox("< (route)(obsolete) " + "@host1.domain1 , @host2 . domain2: foo@bar.org>"); assertEquals(null, mailbox1.getName()); assertEquals("foo", mailbox1.getLocalPart()); assertEquals("bar.org", mailbox1.getDomain()); DomainList domainList = mailbox1.getRoute(); assertNotNull(domainList); assertEquals(2, domainList.size()); assertEquals("host1.domain1", domainList.get(0)); assertEquals("host2.domain2", domainList.get(1)); } public void testParseInvalidMailbox() throws Exception { try { parser.parseMailbox("g: Mary Smith ;"); fail(); } catch (ParseException expected) { } try { parser.parseMailbox("Mary Smith , hans.mueller@acme.org"); fail(); } catch (ParseException expected) { } } public void testParseAddressList() throws ParseException { AddressList addrList1 = parser.parseAddressList("John Doe "); assertEquals(1, addrList1.size()); Mailbox mailbox1 = (Mailbox)addrList1.get(0); assertEquals("John Doe", mailbox1.getName()); assertEquals("jdoe", mailbox1.getLocalPart()); assertEquals("machine.example", mailbox1.getDomain()); AddressList addrList2 = parser.parseAddressList("Mary Smith \t \t\t "); assertEquals(1, addrList2.size()); Mailbox mailbox2 = (Mailbox)addrList2.get(0); assertEquals("Mary Smith", mailbox2.getName()); assertEquals("mary", mailbox2.getLocalPart()); assertEquals("example.net", mailbox2.getDomain()); } public void testEmptyGroup() throws ParseException { AddressList addrList = parser.parseAddressList("undisclosed-recipients:;"); assertEquals(1, addrList.size()); Group group = (Group)addrList.get(0); assertEquals(0, group.getMailboxes().size()); assertEquals("undisclosed-recipients", group.getName()); } public void testMessyGroupAndMailbox() throws ParseException { AddressList addrList = parser.parseAddressList( "Marketing folks : Jane Smith < jane @ example . net >," + " \" Jack \\\"Jackie\\\" Jones \" < jjones@example.com > (comment(comment)); ,, (comment) ," + " <@example . net,@example(ignore\\)).com:(ignore)john@(ignore)example.net>"); assertEquals(2, addrList.size()); Group group = (Group)addrList.get(0); assertEquals("Marketing folks", group.getName()); assertEquals(2, group.getMailboxes().size()); Mailbox mailbox1 = group.getMailboxes().get(0); Mailbox mailbox2 = group.getMailboxes().get(1); assertEquals("Jane Smith", mailbox1.getName()); assertEquals("jane", mailbox1.getLocalPart()); assertEquals("example.net", mailbox1.getDomain()); assertEquals(" Jack \"Jackie\" Jones ", mailbox2.getName()); assertEquals("jjones", mailbox2.getLocalPart()); assertEquals("example.com", mailbox2.getDomain()); Mailbox mailbox = (Mailbox)addrList.get(1); assertEquals("john", mailbox.getLocalPart()); assertEquals("example.net", mailbox.getDomain()); assertEquals(2, mailbox.getRoute().size()); assertEquals("example.net", mailbox.getRoute().get(0)); assertEquals("example.com", mailbox.getRoute().get(1)); } public void testEmptyAddressList() throws ParseException { assertEquals(0, parser.parseAddressList(" \t \t ").size()); assertEquals(0, parser.parseAddressList(" \t , , , ,,, , \t ").size()); } public void testSimpleForm() throws ParseException { AddressList addrList = parser.parseAddressList("\"a b c d e f g\" (comment) @example.net"); assertEquals(1, addrList.size()); Mailbox mailbox = (Mailbox)addrList.get(0); assertEquals("a b c d e f g", mailbox.getLocalPart()); assertEquals("example.net", mailbox.getDomain()); } public void testFlatten() throws ParseException { AddressList addrList = parser.parseAddressList("dev : one@example.com, two@example.com; , ,,, marketing:three@example.com ,four@example.com;, five@example.com"); assertEquals(3, addrList.size()); assertEquals(5, addrList.flatten().size()); } public void testTortureTest() throws ParseException { // Source: http://mailformat.dan.info/headers/from.html // (Commented out pending confirmation of legality--I think the local-part is illegal.) // AddressList.parse("\"Guy Macon\" "); // Taken mostly from RFC822. // Just make sure these are recognized as legal address lists; // there shouldn't be any aspect of the RFC that is tested here // but not in the other unit tests. parser.parseAddressList("Alfred Neuman "); parser.parseAddressList("Neuman@BBN-TENEXA"); parser.parseAddressList("\"George, Ted\" "); parser.parseAddressList("Wilt . (the Stilt) Chamberlain@NBA.US"); // NOTE: In RFC822 8.1.5, the following example did not have "Galloping Gourmet" // in double-quotes. I can only assume this was a typo, since 6.2.4 specifically // disallows spaces in unquoted local-part. parser.parseAddressList(" Gourmets: Pompous Person ," + " Childs@WGBH.Boston, \"Galloping Gourmet\"@" + " ANT.Down-Under (Australian National Television)," + " Cheapie@Discount-Liquors;," + " Cruisers: Port@Portugal, Jones@SEA;," + " Another@Somewhere.SomeOrg"); // NOTE: In RFC822 8.3.3, the following example ended with a lone ">" after // Tops-20-Host. I can only assume this was a typo, since 6.1 clearly shows // ">" requires a matching "<". parser.parseAddressList("Important folk:" + " Tom Softwood ," + " \"Sam Irving\"@Other-Host;," + " Standard Distribution:" + " /main/davis/people/standard@Other-Host," + " \"standard.dist.3\"@Tops-20-Host;"); // The following are from a Usenet post by Dan J. Bernstein: // http://groups.google.com/groups?selm=1996Aug1418.21.01.28081%40koobera.math.uic.edu parser.parseAddressList("\":sysmail\"@ Some-Group.\t Some-Org, Muhammed.(I am the greatest) Ali @(the)Vegas.WBA"); parser.parseAddressList("me@home.com (comment (nested (deeply\\))))"); parser.parseAddressList("mailing list: me@home.com, route two , them@play.com ;"); } public void testLexicalError() { // ensure that TokenMgrError doesn't get thrown try { parser.parseAddressList(")"); fail("Expected parsing error"); } catch (ParseException e) { } } public void testAddressList() throws ParseException { AddressList addlist = parser.parseAddressList("foo@example.com, bar@example.com, third@example.com"); List
al = new ArrayList
(); al.add(addlist.get(0)); // shared arraylist AddressList dl = new AddressList(al, true); assertEquals(1, dl.size()); al.add(addlist.get(1)); assertEquals(2, dl.size()); // cloned arraylist AddressList dlcopy = new AddressList(al, false); assertEquals(2, dlcopy.size()); al.add(addlist.get(2)); assertEquals(2, dlcopy.size()); // check route string assertEquals(2, dlcopy.flatten().size()); } public void testParseAddress() throws Exception { Address address = parser.parseAddress("Mary Smith "); assertTrue(address instanceof Mailbox); assertEquals("Mary Smith", ((Mailbox) address).getName()); assertEquals("mary@example.net", ((Mailbox) address).getAddress()); address = parser.parseAddress("group: Mary Smith ;"); assertTrue(address instanceof Group); assertEquals("group", ((Group) address).getName()); assertEquals("Mary Smith", ((Group) address).getMailboxes().get(0) .getName()); assertEquals("mary@example.net", ((Group) address).getMailboxes() .get(0).getAddress()); } public void testParseInvalidAddress() throws Exception { try { parser.parseGroup("john.doe@acme.org, jane.doe@acme.org"); fail(); } catch (ParseException expected) { } } public void testParseGroup() throws Exception { Group group = parser.parseGroup( "group: john.doe@acme.org, Mary Smith ;"); assertEquals("group", group.getName()); MailboxList mailboxes = group.getMailboxes(); assertEquals(2, mailboxes.size()); Mailbox mailbox1 = mailboxes.get(0); assertNull(mailbox1.getName()); assertEquals("john.doe@acme.org", mailbox1.getAddress()); Mailbox mailbox2 = mailboxes.get(1); assertEquals("Mary Smith", mailbox2.getName()); assertEquals("mary@example.net", mailbox2.getAddress()); } public void testParseInvalidGroup() throws Exception { try { parser.parseGroup("john.doe@acme.org"); fail(); } catch (ParseException expected) { } try { parser.parseGroup("g1: john.doe@acme.org;, g2: mary@example.net;"); fail(); } catch (ParseException expected) { } } } ././@LongLink0000000000000000000000000000016500000000000011567 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/address/DefaultAddressFormatterTest.javaapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/address/DefaultAddressFo0000644000000000000000000001011411702050526031635 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field.address; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import junit.framework.TestCase; import org.apache.james.mime4j.dom.address.DomainList; import org.apache.james.mime4j.dom.address.Group; import org.apache.james.mime4j.dom.address.Mailbox; import org.apache.james.mime4j.dom.address.MailboxList; public class DefaultAddressFormatterTest extends TestCase { private AddressFormatter formatter; @Override protected void setUp() throws Exception { formatter = AddressFormatter.DEFAULT; } public void testGroupSerialization() { List al = new ArrayList(); al.add(new Mailbox("test", "example.com")); al.add(new Mailbox("Foo!", "foo", "example.com")); DomainList dl = new DomainList(new ArrayList( Arrays.asList(new String[] {"foo.example.com"})), true); Mailbox mailbox = new Mailbox("Foo Bar", dl, "foo2", "example.com"); assertSame(dl, mailbox.getRoute()); al.add(mailbox); Group g = new Group("group", new MailboxList(al, false)); String s = formatter.format(g, false); assertEquals("group: test@example.com, Foo! , Foo Bar ;", s); } public void testMailboxGetEncodedString() throws Exception { Mailbox m1 = new Mailbox("john.doe", "acme.org"); assertEquals("john.doe@acme.org", formatter.encode(m1)); Mailbox m2 = new Mailbox("john doe", "acme.org"); assertEquals("\"john doe\"@acme.org", formatter.encode(m2)); Mailbox m3 = new Mailbox("John Doe", "john.doe", "acme.org"); assertEquals("John Doe ", formatter.encode(m3)); Mailbox m4 = new Mailbox("John Doe @Home", "john.doe", "acme.org"); assertEquals("\"John Doe @Home\" ", formatter.encode(m4)); Mailbox m5 = new Mailbox("Hans M\374ller", "hans.mueller", "acme.org"); assertEquals("=?ISO-8859-1?Q?Hans_M=FCller?= ", formatter.encode(m5)); } public void testGroupGetEncodedString() throws Exception { List al = new ArrayList(); al.add(new Mailbox("test", "example.com")); al.add(new Mailbox("Foo!", "foo", "example.com")); al.add(new Mailbox("Hans M\374ller", "hans.mueller", "acme.org")); Group g = new Group("group @work", new MailboxList(al, false)); assertEquals("\"group @work\": test@example.com, " + "Foo! , =?ISO-8859-1?Q?Hans_M=FCller?=" + " ;", formatter.encode(g)); } public void testEmptyGroupGetEncodedString() throws Exception { MailboxList emptyMailboxes = new MailboxList(null, true); Group g = new Group("Undisclosed recipients", emptyMailboxes); assertEquals("Undisclosed recipients:;", formatter.encode(g)); } } ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/LenientDateTimeFieldTest.javaapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/LenientDateTimeFieldTest0000644000000000000000000000467411702050526031666 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field; import java.util.Date; import org.apache.james.mime4j.MimeException; import org.apache.james.mime4j.dom.field.DateTimeField; import org.apache.james.mime4j.stream.RawField; import org.apache.james.mime4j.stream.RawFieldParser; import org.apache.james.mime4j.util.ByteSequence; import org.apache.james.mime4j.util.ContentUtil; import junit.framework.TestCase; public class LenientDateTimeFieldTest extends TestCase { static DateTimeField parse(final String s) throws MimeException { ByteSequence raw = ContentUtil.encode(s); RawField rawField = RawFieldParser.DEFAULT.parseField(raw); return DateTimeFieldLenientImpl.PARSER.parse(rawField, null); } public void testDateDST() throws Exception { DateTimeField f = parse("Date: Wed, 16 Jul 2008 17:12:33 +0200"); assertEquals(new Date(1216221153000L), f.getDate()); } public void testDateDSTNoDayOfWeek() throws Exception { DateTimeField f = parse("Date: 16 Jul 2008 17:12:33 +0200"); assertEquals(new Date(1216221153000L), f.getDate()); } public void testdd() throws Exception { DateTimeField f = parse("Date: Thu, 01 Jan 1970 12:00:00 +0000"); assertEquals(43200000L, f.getDate().getTime()); } } ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/UnstructuredFieldTest.javaapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/UnstructuredFieldTest.ja0000644000000000000000000000374511702050526031751 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field; import org.apache.james.mime4j.dom.field.UnstructuredField; import org.apache.james.mime4j.field.DefaultFieldParser; import junit.framework.TestCase; public class UnstructuredFieldTest extends TestCase { public void testGetBody() throws Exception { UnstructuredField f = null; f = (UnstructuredField) DefaultFieldParser.parse("Subject: Yada\r\n yada yada\r\n"); assertEquals("Testing folding value 1", "Yada yada yada", f.getValue()); f = (UnstructuredField) DefaultFieldParser.parse("Subject: \r\n\tyada"); assertEquals("Testing folding value 2", " \tyada", f.getValue()); f = (UnstructuredField) DefaultFieldParser.parse("Subject:yada"); assertEquals("Testing value without a leading ' '", "yada", f.getValue()); } } ././@LongLink0000000000000000000000000000016100000000000011563 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/LenientContentLocationFieldTest.javaapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/LenientContentLocationFi0000644000000000000000000000547311702050526031746 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field; import org.apache.james.mime4j.MimeException; import org.apache.james.mime4j.dom.field.ContentLocationField; import org.apache.james.mime4j.stream.RawField; import org.apache.james.mime4j.stream.RawFieldParser; import org.apache.james.mime4j.util.ByteSequence; import org.apache.james.mime4j.util.ContentUtil; import junit.framework.TestCase; public class LenientContentLocationFieldTest extends TestCase { static ContentLocationField parse(final String s) throws MimeException { ByteSequence raw = ContentUtil.encode(s); RawField rawField = RawFieldParser.DEFAULT.parseField(raw); return ContentLocationFieldLenientImpl.PARSER.parse(rawField, null); } public void testGetSimpleLocation() throws Exception { ContentLocationField f = parse("Content-Location: stuff"); String location = f.getLocation(); assertEquals("stuff", location); } public void testGetQuotedLocation() throws Exception { ContentLocationField f = parse("Content-Location: \" stuff \""); String location = f.getLocation(); assertEquals("stuff", location); } public void testGetLocationWithBlanks() throws Exception { ContentLocationField f = parse("Content-Location: this / that \t/what not"); String location = f.getLocation(); assertEquals("this/that/whatnot", location); } public void testGetLocationWithCommens() throws Exception { ContentLocationField f = parse("Content-Location: this(blah) / that (yada) /what not"); String location = f.getLocation(); assertEquals("this/that/whatnot", location); } } ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/ContentTypeFieldTest.javaapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/ContentTypeFieldTest.jav0000644000000000000000000001142311702050526031674 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field; import org.apache.james.mime4j.MimeException; import org.apache.james.mime4j.dom.field.ContentTypeField; import org.apache.james.mime4j.field.ContentTypeFieldImpl; import org.apache.james.mime4j.stream.RawField; import org.apache.james.mime4j.stream.RawFieldParser; import org.apache.james.mime4j.util.ByteSequence; import org.apache.james.mime4j.util.ContentUtil; import junit.framework.TestCase; public class ContentTypeFieldTest extends TestCase { static ContentTypeField parse(final String s) throws MimeException { ByteSequence raw = ContentUtil.encode(s); RawField rawField = RawFieldParser.DEFAULT.parseField(raw); return ContentTypeFieldImpl.PARSER.parse(rawField, null); } public void testMimeTypeWithSemiColonNoParams() throws Exception { ContentTypeField f = parse("Content-Type: text/html;"); assertEquals("text/html", f.getMimeType()); } public void testGetMimeType() throws Exception { ContentTypeField f = parse("Content-Type: text/PLAIN"); assertEquals("text/plain", f.getMimeType()); f = parse("content-type: TeXt / html "); assertEquals("text/html", f.getMimeType()); f = parse("CONTENT-TYPE: x-app/yada ;" + " param = yada"); assertEquals("x-app/yada", f.getMimeType()); f = parse("CONTENT-TYPE: yada"); assertEquals(null, f.getMimeType()); } public void testGetMimeTypeStatic() throws Exception { ContentTypeField child = parse("Content-Type: child/type");; ContentTypeField parent = parse("Content-Type: parent/type"); assertEquals("child/type", ContentTypeFieldImpl.getMimeType(child, parent)); child = null; parent = parse("Content-Type: parent/type"); assertEquals("text/plain", ContentTypeFieldImpl.getMimeType(child, parent)); parent = parse("Content-Type: multipart/digest"); assertEquals("message/rfc822", ContentTypeFieldImpl.getMimeType(child, parent)); child = parse("Content-Type:"); parent = parse("Content-Type: parent/type"); assertEquals("text/plain", ContentTypeFieldImpl.getMimeType(child, parent)); parent = parse("Content-Type: multipart/digest"); assertEquals("message/rfc822", ContentTypeFieldImpl.getMimeType(child, parent)); } public void testGetCharsetStatic() throws Exception { ContentTypeField f = parse("Content-Type: some/type; charset=iso8859-1"); assertEquals("iso8859-1", ContentTypeFieldImpl.getCharset(f)); f = parse("Content-Type: some/type;"); assertEquals("us-ascii", ContentTypeFieldImpl.getCharset(f)); } public void testGetParameter() throws Exception { ContentTypeField f = parse("CONTENT-TYPE: text / html ;" + " boundary=yada yada"); assertEquals("yada", f.getParameter("boundary")); f = parse("Content-Type: x-app/yada;" + " boUNdarY= \"ya:\\\"*da\"; " + "\tcharset\t = us-ascii"); assertEquals("ya:\"*da", f.getParameter("boundary")); assertEquals("us-ascii", f.getParameter("charset")); f = parse("Content-Type: x-app/yada; " + "boUNdarY= \"ya \\\"\\\"\tda \\\"\"; " + "\tcharset\t = \"\\\"hepp\\\" =us\t-ascii\""); assertEquals("ya \"\"\tda \"", f.getParameter("boundary")); assertEquals("\"hepp\" =us\t-ascii", f.getParameter("charset")); } } apache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/contenttype/0000755000000000000000000000000011702050526027465 5ustar rootroot././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/contenttype/ContentTypeTest.javaapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/contenttype/ContentTypeT0000644000000000000000000000471611702050526032020 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field.contenttype; import org.apache.james.mime4j.MimeException; import org.apache.james.mime4j.field.contenttype.parser.ContentTypeParser; import org.apache.james.mime4j.field.contenttype.parser.ParseException; import java.io.StringReader; import junit.framework.TestCase; public class ContentTypeTest extends TestCase { public void testExceptionTree() { // make sure that our ParseException extends MimeException. assertTrue(MimeException.class.isAssignableFrom(ParseException.class)); } public void testContentType() throws ParseException { test("one/two; three = four", "one", "two"); test("one/(foo)two; three = \"four\"", "one", "two"); test("one(foo)/two; three = (foo) four", "one", "two"); test("one/two; three = four", "one", "two"); // TODO: add more tests } private void test(String val, String expectedType, String expectedSubtype) throws ParseException { ContentTypeParser parser = new ContentTypeParser(new StringReader(val)); parser.parseAll(); String type = parser.getType(); String subtype = parser.getSubType(); assertEquals(expectedType, type); assertEquals(expectedSubtype, subtype); } } ././@LongLink0000000000000000000000000000016100000000000011563 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/LenientContentLanguageFieldTest.javaapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/LenientContentLanguageFi0000644000000000000000000000700511702050526031712 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field; import java.util.List; import org.apache.james.mime4j.MimeException; import org.apache.james.mime4j.dom.field.ContentLanguageField; import org.apache.james.mime4j.stream.RawField; import org.apache.james.mime4j.stream.RawFieldParser; import org.apache.james.mime4j.util.ByteSequence; import org.apache.james.mime4j.util.ContentUtil; import junit.framework.TestCase; public class LenientContentLanguageFieldTest extends TestCase { static ContentLanguageField parse(final String s) throws MimeException { ByteSequence raw = ContentUtil.encode(s); RawField rawField = RawFieldParser.DEFAULT.parseField(raw); return ContentLanguageFieldLenientImpl.PARSER.parse(rawField, null); } public void testGetLanguage() throws Exception { ContentLanguageField f = parse("Content-Language: en, de"); List langs = f.getLanguages(); assertNotNull(langs); assertEquals(2, langs.size()); assertEquals("en", langs.get(0)); assertEquals("de", langs.get(1)); } public void testGetLanguageEmpty() throws Exception { ContentLanguageField f = parse("Content-Language: "); List langs = f.getLanguages(); assertNotNull(langs); assertEquals(0, langs.size()); } public void testGetLanguageWithComments() throws Exception { ContentLanguageField f = parse("Content-Language: en (yada yada), (blah blah)de"); List langs = f.getLanguages(); assertNotNull(langs); assertEquals(2, langs.size()); assertEquals("en", langs.get(0)); assertEquals("de", langs.get(1)); } public void testGetLanguageWithUnderscore() throws Exception { ContentLanguageField f = parse("Content-Language: en, en_GB (Great Britain)"); List langs = f.getLanguages(); assertNotNull(langs); assertEquals(2, langs.size()); assertEquals("en", langs.get(0)); assertEquals("en_GB", langs.get(1)); } public void testGetLanguageWithEmptyElement() throws Exception { ContentLanguageField f = parse("Content-Language: en,, de,"); List langs = f.getLanguages(); assertNotNull(langs); assertEquals(2, langs.size()); assertEquals("en", langs.get(0)); assertEquals("de", langs.get(1)); } } apache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/contentdisposition/0000755000000000000000000000000011702050526031050 5ustar rootroot././@LongLink0000000000000000000000000000017300000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/contentdisposition/ContentDispositionTest.javaapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/contentdisposition/Conte0000644000000000000000000000317411702050526032050 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field.contentdisposition; import junit.framework.TestCase; import org.apache.james.mime4j.MimeException; import org.apache.james.mime4j.field.contentdisposition.parser.ParseException; public class ContentDispositionTest extends TestCase { public void testExceptionTree() { // make sure that our ParseException extends MimeException. assertTrue(MimeException.class.isAssignableFrom(ParseException.class)); } } ././@LongLink0000000000000000000000000000016200000000000011564 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/ContentTransferEncodingFieldTest.javaapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/ContentTransferEncodingF0000644000000000000000000000603011702050526031727 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field; import org.apache.james.mime4j.MimeException; import org.apache.james.mime4j.dom.field.ContentTransferEncodingField; import org.apache.james.mime4j.field.ContentTransferEncodingFieldImpl; import org.apache.james.mime4j.stream.RawField; import org.apache.james.mime4j.stream.RawFieldParser; import org.apache.james.mime4j.util.ByteSequence; import org.apache.james.mime4j.util.ContentUtil; import junit.framework.TestCase; public class ContentTransferEncodingFieldTest extends TestCase { static ContentTransferEncodingField parse(final String s) throws MimeException { ByteSequence raw = ContentUtil.encode(s); RawField rawField = RawFieldParser.DEFAULT.parseField(raw); return ContentTransferEncodingFieldImpl.PARSER.parse(rawField, null); } public void testGetEncoding() throws Exception { ContentTransferEncodingField f = parse("Content-Transfer-Encoding: 8bit"); assertEquals("8bit", f.getEncoding()); f = parse("Content-Transfer-Encoding: BaSE64 "); assertEquals("base64", f.getEncoding()); f = parse("Content-Transfer-Encoding: "); assertEquals("", f.getEncoding()); f = parse("Content-Transfer-Encoding:"); assertEquals("", f.getEncoding()); } public void testGetEncodingStatic() throws Exception { ContentTransferEncodingField f = parse("Content-Transfer-Encoding: 8bit"); assertEquals("8bit", ContentTransferEncodingFieldImpl.getEncoding(f)); f = null; assertEquals("7bit", ContentTransferEncodingFieldImpl.getEncoding(f)); f = parse("Content-Transfer-Encoding: "); assertEquals("7bit", ContentTransferEncodingFieldImpl.getEncoding(f)); f = parse("Content-Transfer-Encoding:"); assertEquals("7bit", ContentTransferEncodingFieldImpl.getEncoding(f)); } } apache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/structured/0000755000000000000000000000000011702050526027315 5ustar rootroot././@LongLink0000000000000000000000000000016600000000000011570 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/structured/StructuredFieldParserTest.javaapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/structured/StructuredFie0000644000000000000000000000600611702050526032032 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field.structured; import java.io.StringReader; import junit.framework.TestCase; import org.apache.james.mime4j.field.structured.parser.StructuredFieldParser; public class StructuredFieldParserTest extends TestCase { @Override protected void setUp() throws Exception { super.setUp(); } @Override protected void tearDown() throws Exception { super.tearDown(); } public void testSimpleField() throws Exception { final String string = "Field Value"; assertEquals(string, parse(string)); } public void testTrim() throws Exception { final String string = "Field Value"; assertEquals(string, parse(" \t\r\n" + string + " \t\r\n ")); } public void testFolding() throws Exception { assertEquals("Field Value", parse("Field \t\r\n Value")); } public void testQuotedString() throws Exception { assertEquals("Field Value", parse("\"Field Value\"")); assertEquals("Field\t\r\nValue", parse("\"Field\t\r\nValue\"")); assertEquals("Field\t\r\nValue", parse("\"Field\t\r\n \t Value\"")); } public void testComments() throws Exception { assertEquals("Field", parse("Fi(This is a comment)eld")); assertEquals("Field Value", parse("Fi(This is a comment)eld (A (very (nested) )comment)Value")); } public void testQuotedInComments() throws Exception { assertEquals("Fi(This is a comment)eld", parse("\"Fi(This is a comment)eld\"")); assertEquals("Field Value", parse("Fi(This is a comment)eld (A (very (nested) )comment)Value")); } private String parse(String in) throws Exception { StructuredFieldParser parser = new StructuredFieldParser(new StringReader(in)); parser.setFoldingPreserved(true); return parser.parse(); } } ././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/ContentDispositionFieldTest.javaapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/ContentDispositionFieldT0000644000000000000000000001566011702050526031773 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field; import java.util.Date; import junit.framework.TestCase; import org.apache.james.mime4j.MimeException; import org.apache.james.mime4j.dom.field.ContentDispositionField; import org.apache.james.mime4j.stream.RawField; import org.apache.james.mime4j.stream.RawFieldParser; import org.apache.james.mime4j.util.ByteSequence; import org.apache.james.mime4j.util.ContentUtil; public class ContentDispositionFieldTest extends TestCase { static ContentDispositionField parse(final String s) throws MimeException { ByteSequence raw = ContentUtil.encode(s); RawField rawField = RawFieldParser.DEFAULT.parseField(raw); return ContentDispositionFieldImpl.PARSER.parse(rawField, null); } public void testDispositionTypeWithSemiColonNoParams() throws Exception { ContentDispositionField f = parse("Content-Disposition: inline;"); assertEquals("inline", f.getDispositionType()); } public void testGetDispositionType() throws Exception { ContentDispositionField f = parse("Content-Disposition: attachment"); assertEquals("attachment", f.getDispositionType()); f = parse("content-disposition: InLiNe "); assertEquals("inline", f.getDispositionType()); f = parse("CONTENT-DISPOSITION: x-yada ;" + " param = yada"); assertEquals("x-yada", f.getDispositionType()); f = parse("CONTENT-DISPOSITION: "); assertEquals("", f.getDispositionType()); } public void testGetParameter() throws Exception { ContentDispositionField f = parse("CONTENT-DISPOSITION: inline ;" + " filename=yada yada"); assertEquals("yada", f.getParameter("filename")); f = parse("Content-Disposition: x-yada;" + " fileNAme= \"ya:\\\"*da\"; " + "\tSIZE\t = 1234"); assertEquals("ya:\"*da", f.getParameter("filename")); assertEquals("1234", f.getParameter("size")); f = parse("Content-Disposition: x-yada; " + "fileNAme= \"ya \\\"\\\"\tda \\\"\"; " + "\tx-Yada\t = \"\\\"hepp\\\" =us\t-ascii\""); assertEquals("ya \"\"\tda \"", f.getParameter("filename")); assertEquals("\"hepp\" =us\t-ascii", f.getParameter("x-yada")); } public void testIsDispositionType() throws Exception { ContentDispositionField f = parse("Content-Disposition:INline"); assertTrue(f.isDispositionType("InLiNe")); assertFalse(f.isDispositionType("NiLiNe")); assertTrue(f.isInline()); assertFalse(f.isAttachment()); f = parse("Content-Disposition: attachment"); assertTrue(f.isDispositionType("ATTACHMENT")); assertFalse(f.isInline()); assertTrue(f.isAttachment()); f = parse("Content-Disposition: x-something"); assertTrue(f.isDispositionType("x-SomeThing")); assertFalse(f.isInline()); assertFalse(f.isAttachment()); } public void testGetFilename() throws Exception { ContentDispositionField f = parse("Content-Disposition: inline; filename=yada.txt"); assertEquals("yada.txt", f.getFilename()); f = parse("Content-Disposition: inline; filename=yada yada.txt"); assertEquals("yada", f.getFilename()); f = parse("Content-Disposition: inline; filename=\"yada yada.txt\""); assertEquals("yada yada.txt", f.getFilename()); f = parse("Content-Disposition: inline"); assertNull(f.getFilename()); } public void testGetCreationDate() throws Exception { ContentDispositionField f = parse("Content-Disposition: inline; " + "creation-date=\"Tue, 01 Jan 1970 00:00:00 +0000\""); assertEquals(new Date(0), f.getCreationDate()); f = parse("Content-Disposition: inline; " + "creation-date=Tue, 01 Jan 1970 00:00:00 +0000"); assertNull(f.getCreationDate()); f = parse("Content-Disposition: attachment"); assertNull(f.getCreationDate()); } public void testGetModificationDate() throws Exception { ContentDispositionField f = parse("Content-Disposition: inline; " + "modification-date=\"Tue, 01 Jan 1970 00:00:00 +0000\""); assertEquals(new Date(0), f.getModificationDate()); f = parse("Content-Disposition: inline; " + "modification-date=\"Wed, 12 Feb 1997 16:29:51 -0500\""); assertEquals(new Date(855782991000l), f.getModificationDate()); f = parse("Content-Disposition: inline; " + "modification-date=yesterday"); assertNull(f.getModificationDate()); f = parse("Content-Disposition: attachment"); assertNull(f.getModificationDate()); } public void testGetReadDate() throws Exception { ContentDispositionField f = parse("Content-Disposition: inline; " + "read-date=\"Tue, 01 Jan 1970 00:00:00 +0000\""); assertEquals(new Date(0), f.getReadDate()); f = parse("Content-Disposition: inline; read-date="); assertNull(f.getReadDate()); f = parse("Content-Disposition: attachment"); assertNull(f.getReadDate()); } public void testGetSize() throws Exception { ContentDispositionField f = parse("Content-Disposition: attachment; size=0"); assertEquals(0, f.getSize()); f = parse("Content-Disposition: attachment; size=matters"); assertEquals(-1, f.getSize()); f = parse("Content-Disposition: attachment"); assertEquals(-1, f.getSize()); f = parse("Content-Disposition: attachment; size=-12"); assertEquals(-1, f.getSize()); f = parse("Content-Disposition: attachment; size=12"); assertEquals(12, f.getSize()); } } apache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/FieldsTest.java0000644000000000000000000004252311702050526030030 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field; import java.io.IOException; import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.TimeZone; import junit.framework.TestCase; import org.apache.james.mime4j.dom.address.Group; import org.apache.james.mime4j.dom.address.Mailbox; import org.apache.james.mime4j.dom.field.AddressListField; import org.apache.james.mime4j.dom.field.ContentDispositionField; import org.apache.james.mime4j.dom.field.ContentTransferEncodingField; import org.apache.james.mime4j.dom.field.ContentTypeField; import org.apache.james.mime4j.dom.field.DateTimeField; import org.apache.james.mime4j.dom.field.MailboxField; import org.apache.james.mime4j.dom.field.MailboxListField; import org.apache.james.mime4j.field.Fields; import org.apache.james.mime4j.field.address.AddressBuilder; import org.apache.james.mime4j.stream.Field; import org.apache.james.mime4j.util.ByteSequence; import org.apache.james.mime4j.util.ContentUtil; import org.apache.james.mime4j.util.MimeUtil; public class FieldsTest extends TestCase { public void testContentTypeString() throws Exception { ContentTypeField field = Fields.contentType("multipart/mixed; " + "boundary=\"-=Part.0.37877968dd4f6595.11eccf0271c" + ".2dce5678cbc933d5=-\""); assertTrue(field.isValidField()); String expectedRaw = "Content-Type: multipart/mixed;\r\n " + "boundary=\"-=Part.0.37877968dd4f6595.11eccf0271c" + ".2dce5678cbc933d5=-\""; assertEquals(expectedRaw, decode(field)); } public void testContentTypeStringParameters() throws Exception { Map parameters = new HashMap(); parameters.put("boundary", "-=Part.0.37877968dd4f6595.11eccf0271c.2dce5678cbc933d5=-"); ContentTypeField field = Fields.contentType("multipart/mixed", parameters); assertTrue(field.isValidField()); String expectedRaw = "Content-Type: multipart/mixed;\r\n " + "boundary=\"-=Part.0.37877968dd4f6595.11eccf0271c" + ".2dce5678cbc933d5=-\""; assertEquals(expectedRaw, decode(field)); } public void testContentTypeStringParametersWithSpaces() throws Exception { Map parameters = new HashMap(); parameters.put("param", "value with space chars"); ContentTypeField field = Fields.contentType("multipart/mixed", parameters); assertTrue(field.isValidField()); String expectedRaw = "Content-Type: multipart/mixed; " + "param=\"value with space chars\""; assertEquals(expectedRaw, decode(field)); } public void testContentTypeStringNullParameters() throws Exception { ContentTypeField field = Fields.contentType("text/plain", null); assertTrue(field.isValidField()); String expectedRaw = "Content-Type: text/plain"; assertEquals(expectedRaw, decode(field)); } public void testInvalidContentType() throws Exception { ContentTypeField field = Fields.contentType("multipart/mixed; " + "boundary=-=Part.0.37877968dd4f6595.11eccf0271c" + ".2dce5678cbc933d5=-"); assertFalse(field.isValidField()); assertEquals("multipart/mixed", field.getMimeType()); } public void testContentTransferEncoding() throws Exception { ContentTransferEncodingField field = Fields .contentTransferEncoding("base64"); assertTrue(field.isValidField()); assertEquals("Content-Transfer-Encoding: base64", decode(field)); } public void testContentDispositionString() throws Exception { ContentDispositionField field = Fields.contentDisposition("inline; " + "filename=\"testing 1 2.dat\"; size=12345; " + "creation-date=\"Thu, 1 Jan 1970 00:00:00 +0000\""); assertTrue(field.isValidField()); String expectedRaw = "Content-Disposition: inline; filename=" + "\"testing 1 2.dat\"; size=12345;\r\n creation-date=" + "\"Thu, 1 Jan 1970 00:00:00 +0000\""; assertEquals(expectedRaw, decode(field)); } public void testContentDispositionStringParameters() throws Exception { Map parameters = new HashMap(); parameters.put("creation-date", MimeUtil.formatDate(new Date(0), TimeZone.getTimeZone("GMT"))); ContentDispositionField field = Fields.contentDisposition("attachment", parameters); assertTrue(field.isValidField()); String expectedRaw = "Content-Disposition: attachment; " + "creation-date=\"Thu, 1 Jan 1970 00:00:00\r\n +0000\""; assertEquals(expectedRaw, decode(field)); assertEquals(new Date(0), field.getCreationDate()); } public void testContentDispositionStringNullParameters() throws Exception { ContentDispositionField field = Fields.contentDisposition("inline", (Map) null); assertTrue(field.isValidField()); String expectedRaw = "Content-Disposition: inline"; assertEquals(expectedRaw, decode(field)); } public void testContentDispositionFilename() throws Exception { ContentDispositionField field = Fields.contentDisposition("attachment", "some file.dat"); assertTrue(field.isValidField()); assertEquals("attachment", field.getDispositionType()); assertEquals("some file.dat", field.getFilename()); } public void testContentDispositionFilenameSize() throws Exception { ContentDispositionField field = Fields.contentDisposition("attachment", "some file.dat", 300); assertTrue(field.isValidField()); assertEquals("attachment", field.getDispositionType()); assertEquals("some file.dat", field.getFilename()); assertEquals(300, field.getSize()); } public void testContentDispositionFilenameSizeDate() throws Exception { ContentDispositionField field = Fields.contentDisposition("attachment", "some file.dat", 300, new Date(1000), new Date(2000), new Date( 3000)); assertTrue(field.isValidField()); assertEquals("attachment", field.getDispositionType()); assertEquals("some file.dat", field.getFilename()); assertEquals(300, field.getSize()); assertEquals(new Date(1000), field.getCreationDate()); assertEquals(new Date(2000), field.getModificationDate()); assertEquals(new Date(3000), field.getReadDate()); } public void testInvalidContentDisposition() throws Exception { ContentDispositionField field = Fields.contentDisposition("inline; " + "filename=some file.dat"); assertFalse(field.isValidField()); assertEquals("inline", field.getDispositionType()); } public void testDateStringDateTimeZone() throws Exception { DateTimeField field = Fields.date("Date", new Date(0), TimeZone .getTimeZone("GMT")); assertTrue(field.isValidField()); assertEquals("Date: Thu, 1 Jan 1970 00:00:00 +0000", decode(field )); assertEquals(new Date(0), field.getDate()); field = Fields.date("Resent-Date", new Date(0), TimeZone .getTimeZone("GMT+1")); assertTrue(field.isValidField()); assertEquals("Resent-Date: Thu, 1 Jan 1970 01:00:00 +0100", decode(field)); assertEquals(new Date(0), field.getDate()); } public void testDateDST() throws Exception { long millis = 1216221153000l; DateTimeField field = Fields.date("Date", new Date(millis), TimeZone .getTimeZone("CET")); assertTrue(field.isValidField()); assertEquals("Date: Wed, 16 Jul 2008 17:12:33 +0200", decode(field )); assertEquals(new Date(millis), field.getDate()); } public void testMessageId() throws Exception { Field messageId = Fields.messageId("acme.org"); String raw = decode(messageId); assertTrue(raw.startsWith("Message-ID: ")); } public void testSubject() throws Exception { assertEquals("Subject: ", decode(Fields.subject(""))); assertEquals("Subject: test", decode(Fields.subject("test"))); assertEquals("Subject: =?ISO-8859-1?Q?Sm=F8rebr=F8d?=", decode(Fields .subject("Sm\370rebr\370d"))); String seventyEight = "12345678901234567890123456789012345678901234567890123456789012345678"; assertEquals("Subject:\r\n " + seventyEight, decode(Fields.subject( seventyEight))); String seventyNine = seventyEight + "9"; String expected = "Subject: =?US-ASCII?Q?1234567890123456789012345678901234?=" + "\r\n =?US-ASCII?Q?56789012345678901234567890123456789?="; assertEquals(expected, decode(Fields.subject(seventyNine))); } public void testSender() throws Exception { MailboxField field = Fields.sender(AddressBuilder.DEFAULT .parseMailbox("JD ")); assertEquals("Sender: JD ", decode(field)); } public void testFrom() throws Exception { Mailbox mailbox1 = AddressBuilder.DEFAULT.parseMailbox("JD "); Mailbox mailbox2 = AddressBuilder.DEFAULT.parseMailbox("Mary Smith "); MailboxListField field = Fields.from(mailbox1); assertEquals("From: JD ", decode(field)); field = Fields.from(mailbox1, mailbox2); assertEquals("From: JD , " + "Mary Smith ", decode(field)); field = Fields.from(Arrays.asList(mailbox1, mailbox2)); assertEquals("From: JD , " + "Mary Smith ", decode(field)); } public void testTo() throws Exception { Mailbox mailbox1 = AddressBuilder.DEFAULT.parseMailbox("JD "); Mailbox mailbox2 = AddressBuilder.DEFAULT.parseMailbox("jane.doe@example.org"); Mailbox mailbox3 = AddressBuilder.DEFAULT.parseMailbox("Mary Smith "); Group group = new Group("The Does", mailbox1, mailbox2); AddressListField field = Fields.to(group); assertEquals("To: The Does: JD , " + "jane.doe@example.org;", decode(field)); field = Fields.to(group, mailbox3); assertEquals("To: The Does: JD , " + "jane.doe@example.org;, Mary Smith\r\n ", decode(field)); field = Fields.to(Arrays.asList(group, mailbox3)); assertEquals("To: The Does: JD , " + "jane.doe@example.org;, Mary Smith\r\n ", decode(field)); } public void testCc() throws Exception { Mailbox mailbox1 = AddressBuilder.DEFAULT.parseMailbox("JD "); Mailbox mailbox2 = AddressBuilder.DEFAULT.parseMailbox("jane.doe@example.org"); Mailbox mailbox3 = AddressBuilder.DEFAULT.parseMailbox("Mary Smith "); Group group = new Group("The Does", mailbox1, mailbox2); AddressListField field = Fields.cc(group); assertEquals("Cc: The Does: JD , " + "jane.doe@example.org;", decode(field)); field = Fields.cc(group, mailbox3); assertEquals("Cc: The Does: JD , " + "jane.doe@example.org;, Mary Smith\r\n ", decode(field)); field = Fields.cc(Arrays.asList(group, mailbox3)); assertEquals("Cc: The Does: JD , " + "jane.doe@example.org;, Mary Smith\r\n ", decode(field)); } public void testBcc() throws Exception { Mailbox mailbox1 = AddressBuilder.DEFAULT.parseMailbox("JD "); Mailbox mailbox2 = AddressBuilder.DEFAULT.parseMailbox("jane.doe@example.org"); Mailbox mailbox3 = AddressBuilder.DEFAULT.parseMailbox("Mary Smith "); Group group = new Group("The Does", mailbox1, mailbox2); AddressListField field = Fields.bcc(group); assertEquals("Bcc: The Does: JD , " + "jane.doe@example.org;", decode(field)); field = Fields.bcc(group, mailbox3); assertEquals("Bcc: The Does: JD , " + "jane.doe@example.org;, Mary Smith\r\n ", decode(field)); field = Fields.bcc(Arrays.asList(group, mailbox3)); assertEquals("Bcc: The Does: JD , " + "jane.doe@example.org;, Mary Smith\r\n ", decode(field)); } public void testReplyTo() throws Exception { Mailbox mailbox1 = AddressBuilder.DEFAULT.parseMailbox("JD "); Mailbox mailbox2 = AddressBuilder.DEFAULT.parseMailbox("jane.doe@example.org"); Mailbox mailbox3 = AddressBuilder.DEFAULT.parseMailbox("Mary Smith "); Group group = new Group("The Does", mailbox1, mailbox2); AddressListField field = Fields.replyTo(group); assertEquals("Reply-To: The Does: JD , " + "jane.doe@example.org;", decode(field)); field = Fields.replyTo(group, mailbox3); assertEquals("Reply-To: The Does: JD , " + "jane.doe@example.org;, Mary\r\n Smith ", decode(field)); field = Fields.replyTo(Arrays.asList(group, mailbox3)); assertEquals("Reply-To: The Does: JD , " + "jane.doe@example.org;, Mary\r\n Smith ", decode(field)); } public void testMailbox() throws Exception { MailboxField field = Fields.mailbox("Resent-Sender", AddressBuilder.DEFAULT .parseMailbox("JD ")); assertEquals("Resent-Sender: JD ", decode(field)); } public void testMailboxList() throws Exception { Mailbox mailbox1 = AddressBuilder.DEFAULT.parseMailbox("JD "); Mailbox mailbox2 = AddressBuilder.DEFAULT.parseMailbox("Mary Smith "); MailboxListField field = Fields.mailboxList("Resent-From", Arrays .asList(mailbox1, mailbox2)); assertEquals("Resent-From: JD , " + "Mary Smith ", decode(field)); } public void testAddressList() throws Exception { Mailbox mailbox1 = AddressBuilder.DEFAULT.parseMailbox("JD "); Mailbox mailbox2 = AddressBuilder.DEFAULT.parseMailbox("jane.doe@example.org"); Mailbox mailbox3 = AddressBuilder.DEFAULT.parseMailbox("Mary Smith "); Group group = new Group("The Does", mailbox1, mailbox2); AddressListField field = Fields.addressList("Resent-To", Arrays.asList( group, mailbox3)); assertEquals("Resent-To: The Does: JD , " + "jane.doe@example.org;, Mary\r\n Smith ", decode(field)); } public void testInvalidFieldName() throws Exception { try { Fields.date("invalid field name", new Date()); fail(); } catch (IllegalArgumentException expected) { } } public static String decode(Field f) throws IOException { String s = null; ByteSequence raw = f.getRaw(); if (raw != null) { s = ContentUtil.decode(raw); } if (s == null) { StringBuilder buf = new StringBuilder(); buf.append(f.getName()); buf.append(": "); String body = f.getBody(); if (body != null) { buf.append(body); } s = MimeUtil.fold(buf.toString(), 0); } return s; } } apache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/datetime/0000755000000000000000000000000011702050526026705 5ustar rootroot././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/datetime/DateTimeTest.javaapache-mime4j-project-0.7.2/dom/src/test/java/org/apache/james/mime4j/field/datetime/DateTimeTest.ja0000644000000000000000000001136011702050526031556 0ustar rootroot/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.mime4j.field.datetime; import junit.framework.TestCase; import org.apache.james.mime4j.MimeException; import org.apache.james.mime4j.field.datetime.parser.DateTimeParser; import org.apache.james.mime4j.field.datetime.parser.ParseException; import java.io.StringReader; public class DateTimeTest extends TestCase { public void testExceptionTree() { // make sure that our ParseException extends MimeException. assertTrue(MimeException.class.isAssignableFrom(ParseException.class)); } public void testNormalDate() throws ParseException { new DateTimeParser(new StringReader("Fri, 21 Nov 1997 09:55:06 -0600")).parseAll(); new DateTimeParser(new StringReader("21 Nov 97 09:55:06 GMT")).parseAll(); ensureAllEqual(new String[] { "Fri, 21 Nov 1997 09:55:06 -0600", // baseline "Fri, 21 Nov 97 09:55:06 -0600", // 2-digit year "Fri, 21 Nov 097 09:55:06 -0600", // 3-digit year "Fri, 21 Nov 1997 10:55:06 -0500", // shift time zone "Fri, 21 Nov 1997 19:25:06 +0330", // shift time zone "21 Nov 1997 09:55:06 -0600" // omit day of week }); ensureAllEqual(new String[] { "Thu, 16 Sep 2019 14:37:22 +0000", // baseline "Thu, 16 Sep 19 14:37:22 +0000", // 2-digit year "Thu, 16 Sep 119 14:37:22 +0000", // 3-digit year "Thu, 16 Sep 2019 14:37:22 -0000", // minus-zero zone "Thu, 16 Sep 2019 14:37:22 GMT", // alternate zone "Thu, 16 Sep 2019 14:37:22 UT" // alternate zone }); ensureAllEqual(new String[] { "Fri, 21 Nov 1997 12:00:00 GMT", "Fri, 21 Nov 1997 07:00:00 EST", "Fri, 21 Nov 1997 08:00:00 EDT", "Fri, 21 Nov 1997 06:00:00 CST", "Fri, 21 Nov 1997 07:00:00 CDT", "Fri, 21 Nov 1997 05:00:00 MST", "Fri, 21 Nov 1997 06:00:00 MDT", "Fri, 21 Nov 1997 04:00:00 PST", "Fri, 21 Nov 1997 05:00:00 PDT", // make sure military zones are ignored, per RFC2822 instructions "Fri, 21 Nov 1997 12:00:00 A", "Fri, 21 Nov 1997 12:00:00 B", "Fri, 21 Nov 1997 12:00:00 C", "Fri, 21 Nov 1997 12:00:00 D", "Fri, 21 Nov 1997 12:00:00 E", "Fri, 21 Nov 1997 12:00:00 F", "Fri, 21 Nov 1997 12:00:00 G", "Fri, 21 Nov 1997 12:00:00 H", "Fri, 21 Nov 1997 12:00:00 I", "Fri, 21 Nov 1997 12:00:00 K", "Fri, 21 Nov 1997 12:00:00 L", "Fri, 21 Nov 1997 12:00:00 M", "Fri, 21 Nov 1997 12:00:00 N", "Fri, 21 Nov 1997 12:00:00 O", "Fri, 21 Nov 1997 12:00:00 P", "Fri, 21 Nov 1997 12:00:00 Q", "Fri, 21 Nov 1997 12:00:00 R", "Fri, 21 Nov 1997 12:00:00 S", "Fri, 21 Nov 1997 12:00:00 T", "Fri, 21 Nov 1997 12:00:00 U", "Fri, 21 Nov 1997 12:00:00 V", "Fri, 21 Nov 1997 12:00:00 W", "Fri, 21 Nov 1997 12:00:00 X", "Fri, 21 Nov 1997 12:00:00 Y", "Fri, 21 Nov 1997 12:00:00 Z", }); } private void ensureAllEqual(String[] dateStrings) throws ParseException { for (int i = 0; i < dateStrings.length - 1; i++) { assertEquals( new DateTimeParser(new StringReader(dateStrings[i])).parseAll().getDate().getTime(), new DateTimeParser(new StringReader(dateStrings[i + 1])).parseAll().getDate().getTime() ); } } } apache-mime4j-project-0.7.2/dom/src/reporting-site/0000755000000000000000000000000011702050530020600 5ustar rootrootapache-mime4j-project-0.7.2/dom/src/reporting-site/site.xml0000644000000000000000000000175611702050530022277 0ustar rootroot apache-mime4j-project-0.7.2/dom/pom.xml0000644000000000000000000000643011702050530016356 0ustar rootroot 4.0.0 apache-mime4j-project org.apache.james 0.7.2 ../pom.xml apache-mime4j-dom Apache JAMES Mime4j (DOM) Java MIME Document Object Model org.apache.james apache-mime4j-core ${project.version} compile org.apache.james apache-mime4j-core ${project.version} test-jar test junit junit jar test true commons-io commons-io test true org.codehaus.mojo javacc-maven-plugin generate-jjtree generate-sources jjtree-javacc generate-javacc generate-sources javacc apache-mime4j-project-0.7.2/pom.xml0000644000000000000000000002312211702050542015577 0ustar rootroot 4.0.0 james-project org.apache.james 1.8 apache-mime4j-project 0.7.2 pom Apache JAMES Mime4j Project Java stream based MIME message parser http://james.apache.org/mime4j 2004 core dom storage benchmark examples assemble scm:svn:http://svn.apache.org/repos/asf/james/mime4j/tags/apache-mime4j-project-0.7.2 scm:svn:https://svn.apache.org/repos/asf/james/mime4j/tags/apache-mime4j-project-0.7.2 http://svn.apache.org/viewvc/james/mime4j/tags/apache-mime4j-project-0.7.2 http://issues.apache.org/jira/browse/MIME4J mime4j-website scpexe://people.apache.org/www/james.apache.org/mime4j/ 1.5 commons-logging commons-logging 1.1.1 log4j log4j 1.2.14 test junit junit 3.8.2 jar test true commons-io commons-io 1.4 test true org.apache.felix maven-bundle-plugin 2.3.4 org.apache.rat apache-rat-plugin true verify check NOTICE.* LICENSE.* **/main/resources/long-multipart.msg **/main/resources/META-INF/services/org.apache.james.mime4j.dom.MessageServiceFactory **/test/resources/testmsgs/* **/test/resources/mimetools-testmsgs/* release.properties dist/**/* **/.* .*/**/* org.apache.maven.plugins maven-jar-plugin ${project.build.outputDirectory}/META-INF/MANIFEST.MF Apache Mime4j ${project.version} The Apache Software Foundation Apache Mime4j ${project.version} The Apache Software Foundation org.apache ${project.url} org.apache.maven.plugins maven-javadoc-plugin true org.apache.james.mime4j.field.address.parser:org.apache.james.mime4j.field.contentdisposition.parser:org.apache.james.mime4j.field.contenttype.parser:org.apache.james.mime4j.field.datetime.parser:org.apache.james.mime4j.field.language.parser:org.apache.james.mime4j.field.mimeversion.parser:org.apache.james.mime4j.field.structured.parser org.apache.maven.plugins maven-remote-resources-plugin process org.apache:apache-jar-resource-bundle:1.4 true org.apache.maven.plugins maven-source-plugin attach-sources jar org.apache.felix maven-bundle-plugin bundle-manifest process-classes manifest true org.apache.james.mime4j.* *;scope=runtime apache-mime4j-project-0.7.2/README0000644000000000000000000000237011702050542015144 0ustar rootrootCryptography Notice ------------------- This distribution includes cryptographic software. The country in which you currently reside may have restrictions on the import, possession, use, and/or re-export to another country, of encryption software. BEFORE using any encryption software, please check your country's laws, regulations and policies concerning the import, possession, or use, and re-export of encryption software, to see if this is permitted. See for more information. The U.S. Government Department of Commerce, Bureau of Industry and Security (BIS), has classified this software as Export Commodity Control Number (ECCN) 5D002.C.1, which includes information security software using or performing cryptographic functions with asymmetric algorithms. The form and manner of this Apache Software Foundation distribution makes it eligible for export under the License Exception ENC Technology Software Unrestricted (TSU) exception (see the BIS Export Administration Regulations, Section 740.13) for both object code and source code. The following provides more details on the included cryptographic software: Standard JRE functions allow encrypted storage