Создание вложения к сообщению
Область применения: Outlook 2013 | Outlook 2016
Вложение сообщения — это некоторые дополнительные данные, такие как файл, другое сообщение или объект OLE, которые можно отправить или сохранить вместе с сообщением. Каждое вложение имеет коллекцию свойств, которые идентифицируют его и описывают его тип и способ отрисовки. Как и у получателей, доступ к вложениям сообщений можно получить только через сообщение, к которому они принадлежат. Поэтому, чтобы вложение было пригодным для использования, его сообщение должно быть открыто.
Создание вложения сообщения
Вызовите метод IMessage::CreateAttach сообщения и передайте null в качестве идентификатора интерфейса. CreateAttach возвращает число, которое однозначно идентифицирует новое вложение в сообщении. Номер вложения хранится в свойстве PR_ATTACH_NUM (PidTagAttachNumber) и действителен только до тех пор, пока открыто сообщение, содержащее вложение.
Вызовите IMAPIProp::SetProps , чтобы задать PR_ATTACH_METHOD (PidTagAttachMethod), чтобы указать, как получить доступ к вложению. PR_ATTACH_METHOD является обязательным. Задайте для него значение:
ATTACH_BY_VALUE, если вложение является двоичными данными.
ATTACH_BY_REFERENCE, ATTACH_BY_REF_RESOLVE или ATTACH_BY_REF_ONLY, если вложение является файлом.
ATTACH_EMBEDDED_MSG, если вложение является сообщением.
ATTACH_OLE, если вложение является объектом OLE.
Задайте соответствующее свойство данных вложения:
PR_ATTACH_DATA_BIN (PidTagAttachDataBinary) для двоичных данных и объектов OLE 1.
PR_ATTACH_PATHNAME (PidTagAttachPathname) для файлов.
PR_ATTACH_DATA_OBJ (PidTagAttachDataObject) для сообщений и объектов OLE 2.
Задайте PR_ATTACH_RENDERING (PidTagAttachRendering) для хранения графического представления вложения для файловых или двоичных вложений. Не устанавливайте его для объектов OLE, в которых данные отрисовки хранятся внутри, или для вложенных сообщений.
Задайте PR_RENDERING_POSITION (PidTagRenderingPosition), чтобы указать, где должно отображаться вложение. PR_RENDERING_POSITION применяется только к клиентам, которые задают свойство PR_BODY . Если вы поддерживаете только PR_RTF_COMPRESSED, поместите в сжатый поток следующие сведения о заполнителях:
\objattph
Чтобы задать PR_RENDERING_POSITION, назначьте число, представляющее порядковое смещение в символах, с первым символом PR_BODY равным 0, если необходимо знать, где в сообщении отображается вложение, или 0xFFFFFFFF, если вложения не отображаются в пределах PR_BODY.
Задайте PR_ATTACH_FILENAME (PidTagAttachFilename), чтобы указать короткое имя файла для вложения файла, и PR_ATTACH_LONG_FILENAME (PidTagAttachLongFilename), чтобы указать имя файла, поддерживаемое на платформе, обрабатывающей формат длинного имени файла. Оба свойства являются необязательными. Однако если задать PR_ATTACH_LONG_FILENAME, также задать PR_ATTACH_FILENAME.
Задайте PR_DISPLAY_NAME (PidTagDisplayName), чтобы указать имя вложения, которое может отображаться в диалоговом окне. PR_DISPLAY_NAME является необязательным.
Настройка PR_ATTACH_DATA_BIN
Вызовите IMAPIProp::OpenProperty , чтобы открыть свойство с помощью интерфейса IStream .
Если файл содержит данные и он открыт или требуется явный контроль над размером буфера, вызовите IStream::Write в цикле, чтобы поместить данные в поток.
Другой вариант — вызвать OpenStreamOnFile , чтобы создать поток для доступа к файлу данных, а затем вызвать метод IStream::CopyTo этого потока, чтобы скопировать данные в поток, возвращенный OpenProperty.
Вызовите метод IStream::Commit нового потока.
Настройка PR_ATTACH_DATA_OBJ
Вызовите IMAPIProp::OpenProperty , чтобы открыть свойство с интерфейсом IStreamDocfile , чтобы создать поток, работающий со структурированным хранилищем. IStreamDocfile реализуется поставщиками хранилища сообщений, чтобы предоставить клиентам более высокопроизводительный способ хранения и извлечения структурированного хранилища. Интерфейс IStreamDocfile совпадает с интерфейсом IStream, но содержимое потока гарантированно будет отформатировано как структурированное хранилище. Если этот вызов выполнен успешно, создайте поток, выполнив те же действия, которые описаны для настройки PR_ATTACH_DATA_BIN.
Если сбой OpenProperty :
Снова вызовите OpenProperty , запросив IStorage.
Вызовите StgOpenStorage , чтобы открыть объект OLE и вернуть объект хранилища.
Вызовите метод IStorage::CopyTo возвращенного объекта хранилища, чтобы скопировать его в объект хранилища, возвращенный из OpenProperty.
Вызовите метод IStorage::Commit нового объекта хранилища.
Настройка PR_ATTACH_PATHNAME
Выделите структуру SPropValue , задав элементу ulPropTagзначение PR_ATTACH_PATHNAME а элементу Value.LPSZ — символьную строку, представляющую имя файла.
Вызовите метод IMAPIProp::SetProps вложения.
Примечание.
Если платформа поддерживает длинные имена файлов, задайте как PR_ATTACH_PATHNAME , так и PR_ATTACH_LONG_PATHNAME. Возможно, потребуется выполнить вызов операционной системы, чтобы получить короткое имя файла.