Добрый день, случайно наткнулся на свою же тему, решил ответить. Необходимо было получить вложения из входящих писем MS Outlook. Задача свелась к использованию оле-объекта Outlook.Application. Ниже подпрограммка вытыскивания вложений из писем определенной папки и сохранение локально в темповую папкку.
FORM get_mail_ole USING ps_setting TYPE ty_setting " предварит настройки p_pathname TYPE localfile p_ext TYPE text10 p_mail TYPE text50 CHANGING p_res TYPE i.
DATA: lo_outlook TYPE ole2_object, lo_ns TYPE ole2_object, lo_fldr TYPE ole2_object, lo_message TYPE ole2_object, lo_attachments TYPE ole2_object, lo_item_att TYPE ole2_object.
DATA l_filename TYPE localfile. DATA l_cont(4) TYPE n. DATA l_ctr TYPE i. DATA l_attachcnt TYPE i. DATA l_len_name TYPE i. DATA l_len_ext TYPE i. DATA l_senderemail TYPE text50.
l_len_ext = strlen( p_ext ). l_cont = 1. DO 1 TIMES. IF ps_setting-outlook_folder_obj IS INITIAL. " папка еще не выбрана CREATE OBJECT lo_outlook 'Outlook.Application'.
CALL METHOD OF lo_outlook 'GetNamespace' = lo_ns EXPORTING #1 = 'MAPI'. CHECK sy-subrc EQ 0.
CALL METHOD OF lo_ns 'PickFolder' = lo_fldr. CHECK sy-subrc EQ 0. CHECK lo_fldr-handle > 0. ELSE. lo_fldr = ps_setting-outlook_folder_obj. ENDIF.
DO. CALL METHOD OF lo_fldr 'Items' = lo_message EXPORTING #1 = sy-index. IF sy-subrc = 0. CALL METHOD OF lo_message 'Attachments' = lo_attachments. DO. CALL METHOD OF lo_attachments 'Item' = lo_item_att EXPORTING #1 = sy-index. IF sy-subrc = 0. GET PROPERTY OF lo_item_att 'Filename' = l_filename. CHECK sy-subrc EQ 0. CLEAR: l_len_name. l_len_name = strlen( l_filename ). CHECK l_len_name > l_len_ext. l_len_name = l_len_name - l_len_ext. * предпочтительней проверить сначала по маске файла CHECK l_filename+l_len_name(l_len_ext) = p_ext. * тут проверим отправителя GET PROPERTY OF lo_message 'SenderEmailAddress' = l_senderemail. SET LOCALE LANGUAGE sy-langu. TRANSLATE l_senderemail TO UPPER CASE. CHECK l_senderemail = p_mail. CONCATENATE l_cont l_filename INTO l_filename SEPARATED BY '_'. CONCATENATE p_pathname l_filename INTO l_filename SEPARATED BY '\'. CALL METHOD OF lo_item_att 'SaveAsFile' EXPORTING #1 = l_filename. CHECK sy-subrc EQ 0. l_cont = l_cont + 1. ELSE. EXIT. ENDIF. ENDDO. ELSE. EXIT. ENDIF. ENDDO.
FREE OBJECT: lo_outlook, lo_ns, lo_fldr, lo_message, lo_attachments, lo_item_att.
p_res = 1. ENDDO.
FREE OBJECT: lo_outlook, lo_ns, lo_message, lo_attachments, lo_item_att.
IF ps_setting-outlook_folder_obj IS INITIAL. FREE OBJECT: lo_fldr. ENDIF. ENDFORM.
как видно из подпрограммы папка может быть заранее задана в ps_setting-outlook_folder_obj. Но хранить в настройках (таблицах) можно путь к данной папке. Ниже подпрограмма определения оле объекта папки по пути.
*" EXPORTING *" REFERENCE(E_RES) TYPE CHAR1 *" REFERENCE(E_FOLDER) TYPE OBJ_RECORD *" CHANGING *" REFERENCE(C_NAME) TYPE TEXT100 OPTIONAL *"----------------------------------------------------------------------
DATA: lo_outlook TYPE ole2_object, lo_ns TYPE ole2_object, lo_fldr TYPE ole2_object, lo_fldr2 TYPE ole2_object. DATA l_name_folder TYPE text100. DATA l_name TYPE text100. DATA: BEGIN OF lt_name OCCURS 0, name TYPE text100, END OF lt_name. DATA l_i TYPE i. DATA l_name_tmp TYPE text100. *--------------------------------
e_res = 0. "предустановим "Ошибка"
DO 1 TIMES. * CREATE OBJECT lo_outlook 'Outlook.Application'. CHECK sy-subrc EQ 0. * CALL METHOD OF lo_outlook 'GetNamespace' = lo_ns EXPORTING #1 = 'MAPI'. CHECK sy-subrc EQ 0. * CASE c_name. * если имя не задано то выберем WHEN ''. e_res = 2. "предустановим "Не выбран" * CALL METHOD OF lo_ns 'PickFolder' = lo_fldr2. CHECK sy-subrc EQ 0. CHECK lo_fldr2-handle > 0. GET PROPERTY OF lo_fldr2 'FullFolderPath' = l_name_folder. CHECK sy-subrc EQ 0. e_folder = lo_fldr2. c_name = l_name_folder. e_res = 1. * имя задано найдем WHEN OTHERS. e_res = 3. "предустановим "Не найден" * CHECK c_name(2) = '\\'. SPLIT c_name AT '\' INTO TABLE lt_name. DELETE lt_name WHERE name = '\' OR name = space. LOOP AT lt_name. l_name_tmp = lt_name-name. CONCATENATE '\\' l_name_tmp INTO l_name_tmp. DELETE lt_name. EXIT. ENDLOOP.
*- цикл поиска папки lo_fldr = lo_ns.
DO. l_i = l_i + 1.
CALL METHOD OF lo_fldr 'Folders' = lo_fldr2 EXPORTING #1 = l_i. IF sy-subrc NE 0. EXIT. ENDIF. *-- путь к папке GET PROPERTY OF lo_fldr2 'FullFolderPath' = l_name_folder. IF sy-subrc NE 0. EXIT. ENDIF. *--сравним часть заданного пути, с путем тек. папки IF l_name_folder = l_name_tmp. *--- если равны то IF c_name = l_name_folder. *---- если заданный путь = путь тек. папки *---- то ОК e_res = 1. e_folder = lo_fldr2. EXIT. ELSE. *---- если заданный путь <> путь тек. папки *---- то прибавляем след, часть заданного пути CLEAR l_i. lo_fldr = lo_fldr2. LOOP AT lt_name. CONCATENATE l_name_tmp '\' lt_name-name INTO l_name_tmp. DELETE lt_name. EXIT. ENDLOOP. ENDIF. ENDIF. ENDDO. *- ENDCASE. ENDDO.
FREE OBJECT: lo_outlook, lo_ns, lo_fldr. IF e_res <> 1. FREE OBJECT lo_fldr2. ENDIF.
PS надеюсь кому нить пригодится
|
|