새 PST 생성, 하위 폴더 및 메시지 추가

기존 PST 파일을 구문 분석하는 것뿐만 아니라, Aspose.Email은 처음부터 PST 파일을 생성할 수 있는 방법을 제공합니다. 이 문서에서는 Outlook PST 파일을 만들고 그에 하위 폴더를 추가하는 방법을 보여줍니다.

  1. 새 PST 파일 만들기.
  2. 폴더의 컨테이너 클래스 변경.
  3. 성능 향상을 위한 일괄 메시지 추가

다음 사용 PersonalStorage 클래스를 사용해 로컬 디스크의 특정 위치에 PST 파일을 생성합니다. 처음부터 PST 파일을 만들려면:

  1. 다음을 사용하여 PST를 생성합니다 PersonalStorage.create() 메서드.
  2. Root 폴더에 접근한 뒤 호출하여 PST 파일 루트에 하위 폴더를 추가합니다. addSubFolder() 메서드.

다음 코드 스니펫은 PST 파일을 생성하고 Inbox라는 하위 폴더를 추가하는 방법을 보여줍니다.

// Create new PST
try (PersonalStorage pst = PersonalStorage.create(path, FileFormatVersion.Unicode)) {
    // Add new folder "Test"
    pst.getRootFolder().addSubFolder("Inbox");
}

OutputStream을 사용하여 2GB 초과 PST 만들기

Aspose.Email 사용자는 PersonalStorage 생성자를 사용해 PST 내부 캐시를 최적화할 수 있습니다:

  • blockSize - 캐시 버퍼를 확장하기 위한 최적 블록 크기(바이트).
PersonalStorage create(OutputStream stream, int blockSize, /*FileFormatVersion*/int version)

메시지 크기 및 생성된 PST 파일 크기 감소

Aspose.Email은 본문 콘텐츠를 압축하는 기능을 제공하여 메시지 크기를 줄이는 데 도움이 됩니다. 이는 큰 메시지를 전송하거나 제한된 대역폭·스토리지 환경에서 특히 유용합니다. 이를 위해 라이브러리는 다음 메서드에 포함된 compression 매개변수를 제공합니다:

아래 코드 스니펫은 MAPI 메시지 본문을 설정하면서 RTF 압축을 사용하는 방법을 보여줍니다:

MapiMessage msg = new MapiMessage("from@doamin.com", "to@domain.com", "subject", "body");
// set the html body and keep it compressed
// this will reduce the message size
msg.setBodyContent(htmlBody, BodyContentType.Html, true);

SeekableByteChannel 스트림 기반 PersonalStorage 생성

Aspose.Email for Java를 사용하면 java.nio.channels를 이용해 개인 저장소(PST) 파일을 작업할 수 있습니다. SeekableByteChannel 스트림을 사용하여 PersonalStorage 인스턴스를 생성할 수 있습니다. 다음 코드 스니펫은 FileChannel 스트림을 기반으로 PersonalStorage 인스턴스를 만들고, 루트 폴더에 "messageFolder"라는 하위 폴더를 추가한 뒤, "messageFolder" 디렉터리의 파일에서 메시지를 가져오는 방법을 보여줍니다:

try (RandomAccessFile raf = new RandomAccessFile("test.pst", "rw")) {
    FileChannel channel = raf.getChannel();
    try (PersonalStorage pst = PersonalStorage.create(channel, FileFormatVersion.Unicode)) {
        FolderInfo messageFolder = pst.getRootFolder().addSubFolder("messageFolder");

        for (File f : new File("messageFolder").listFiles()) {
            messageFolder.addMessage(MapiMessage.load(f.getAbsolutePath()));
        }
    }
}

폴더 컨테이너 클래스 변경

때때로 폴더 클래스를 변경해야 할 필요가 있습니다. 일반적인 예로 서로 다른 유형(약속, 메시지 등)의 메시지를 동일한 폴더에 추가하는 경우가 있습니다. 이러한 경우 폴더에 있는 모든 요소가 올바르게 표시되도록 폴더 클래스를 변경해야 합니다. 아래 코드 스니펫은 이 목적을 위해 PST에서 폴더의 컨테이너 클래스를 변경하는 방법을 보여줍니다.

try (PersonalStorage pst = PersonalStorage.fromFile("PersonalStorage1.pst")) {
    FolderInfo folder = pst.getRootFolder().getSubFolder("Inbox");

    folder.changeContainerClass("IPF.Note");
}

성능 향상을 위한 일괄 메시지 추가

PST에 개별 메시지를 추가하면 디스크 I/O가 증가하여 성능이 저하될 수 있습니다. 성능 향상을 위해 메시지를 일괄 모드로 PST에 추가하면 I/O 작업을 최소화할 수 있습니다. addMessages(Iterable messages) 메서드를 사용하면 메시지를 일괄 추가할 수 있으며 다음 시나리오에서 사용할 수 있습니다. 또한, MessageAdded 폴더에 메시지가 추가될 때 발생하는 이벤트.

다른 PST에서 메시지 추가

다른 PST에서 메시지를 추가하려면, 다음을 사용합니다: FolderInfo.enumerateMapiMessages() 값을 반환하는 메서드 Iterable<MapiMessage>:

try (PersonalStorage srcPst = PersonalStorage.fromFile("source.pst", false)) {
    try (PersonalStorage destPst = PersonalStorage.fromFile("destination.pst")) {

        // Get the folder by name
        FolderInfo srcFolder = srcPst.getRootFolder().getSubFolder("SomeFolder");
        FolderInfo destFolder = destPst.getRootFolder().getSubFolder("SomeFolder");

        destFolder.MessageAdded.add(new MessageAddedEventHandler() {
            // Handles the MessageAdded event.
            public void invoke(Object sender, MessageAddedEventArgs e) {
                System.out.println("Added: " + e.getEntryId());
            }
        });
        destFolder.addMessages(srcFolder.enumerateMapiMessages());
    }
}

디렉터리에서 메시지 추가

디렉터리에서 메시지를 추가하려면, 다음을 생성합니다: getMessages(String pathToDir) 값을 반환하는 메서드 Iterable<MapiMessage>:

// Read messages from directory.
static Iterable<MapiMessage> getMessages (String pathToDir)
{
    return Arrays.stream(listDirectory(pathToDir, "*.msg"))
            .map(MapiMessage::load).collect(Collectors.toList());
}

try ( PersonalStorage pst = PersonalStorage.fromFile("storage.pst")) {
    FolderInfo folder = pst.getRootFolder().getSubFolder("SomeFolder");
    folder.MessageAdded.add(new MessageAddedEventHandler() {
        // Handles the MessageAdded event.
        public void invoke(Object sender, MessageAddedEventArgs e) {
            System.out.println("Added: " + e.getEntryId());
        }
    });
    folder.addMessages(getMessages("MessageDirectory"));
}