SAP R/3 форум ABAP консультантов
Russian ABAP Developer's Club

Home - FAQ - Search - Memberlist - Usergroups - Profile - Log in to check your private messages - Register - Log in - English
Blogs - Weblogs News

Отправка сообщений с вложенными файлами



 
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> Programming Techniques | Приемы программирования -> Mail
View previous topic :: View next topic  
Author Message
John Doe
Модератор
Модератор


Age: 45
Joined: 05 Nov 2007
Posts: 725
Location: КраснАдар

PostPosted: Thu Jan 22, 2009 10:53 am    Post subject: Отправка сообщений с вложенными файлами Reply with quote

Нашел интересный сервис в ерп2005 на основе класса cl_bcs.
Особенно понравилась легкость и информативность кода, к примеру, при создании вложений через метод add_attachment. Мне кажется, что это более понятное решение для отправки, чем старые модули so_**send*.

Попробовал использовать для отправки сообщений с вложениями. Это, конечно, похоже на изобретение велосипеда, но мне понравилось. Завернул все в функциональный модуль.
Code:
FUNCTION zcfa_send_mail.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*"  IMPORTING
*"     REFERENCE(I_SUBJECT) TYPE  SO_OBJ_DES
*"     REFERENCE(IT_MAILTEXT) TYPE  BCSY_TEXT
*"     REFERENCE(I_SMTP_ADDRESS) TYPE  AD_SMTPADR
*"     REFERENCE(I_XLS_FILENAME) TYPE  SO_OBJ_DES OPTIONAL
*"     REFERENCE(IT_XLS_CONTENT) TYPE  BCSY_TEXT OPTIONAL
*"----------------------------------------------------------------------

  CONSTANTS: cs_tab TYPE x VALUE '09'.

  DATA: send_request TYPE REF TO cl_bcs,
        document TYPE REF TO cl_document_bcs,
        sender TYPE REF TO cl_sapuser_bcs,
        recipient TYPE REF TO if_recipient_bcs,
        exception_info TYPE REF TO if_os_exception_info,
        bcs_exception TYPE REF TO cx_bcs.

  DATA : lv_xstring TYPE xstring.
  DATA : it_binary TYPE solix_tab.

  TRY.
* Create persistent send request
      send_request = cl_bcs=>create_persistent( ).

* Create document
      document = cl_document_bcs=>create_document(
        i_type = 'RAW'
        i_text = it_mailtext
        i_subject = i_subject ).

* Create attachment
      IF i_xls_filename IS NOT INITIAL.

        CALL FUNCTION 'SCMS_TEXT_TO_XSTRING'
          IMPORTING
            buffer   = lv_xstring
          TABLES
            text_tab = it_xls_content
          EXCEPTIONS
            failed   = 1
            OTHERS   = 2.
        IF sy-subrc <> 0.
          MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
          WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
        ENDIF.

        CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
          EXPORTING
            buffer     = lv_xstring
          TABLES
            binary_tab = it_binary.

        CALL METHOD document->add_attachment
          EXPORTING
            i_attachment_type    = 'EXT'
            i_attachment_subject = i_xls_filename
            i_att_content_hex    = it_binary. "it_xls_content.
      ENDIF.

* Add document to send request
      CALL METHOD send_request->set_document( document ).

* Get sender object
      sender = cl_sapuser_bcs=>create( sy-uname ).

* Add sender
      CALL METHOD send_request->set_sender
        EXPORTING
          i_sender = sender.

* Create recipient
      recipient = cl_cam_address_bcs=>create_internet_address( i_smtp_address ).

* Add recipient with its respective attributes to send request
      CALL METHOD send_request->add_recipient
        EXPORTING
          i_recipient  = recipient
          i_express    = ' '
          i_copy       = ' '
          i_blind_copy = ' '.

* Send document
      CALL METHOD send_request->send( ).
*      COMMIT WORK.

    CATCH cx_bcs INTO bcs_exception.
*      RAISE EXCEPTION bcs_exception.
  ENDTRY.


ENDFUNCTION.
Back to top
View user's profile Send private message Blog
John Doe
Модератор
Модератор


Age: 45
Joined: 05 Nov 2007
Posts: 725
Location: КраснАдар

PostPosted: Wed Feb 11, 2009 6:09 pm    Post subject: Reply with quote

Небольшое дополнение, выявленное в ходе эксплуатации. Файл создается в кодировке UTF-8 по-умолчанию. Чтобы сменить кодировку, нужно добавить параметр при вызове функции SCMS_TEXT_TO_XSTRING.
Code:
        CALL FUNCTION 'SCMS_TEXT_TO_XSTRING'
          EXPORTING
            mimetype = 'charset=windows-1251'
          IMPORTING
            buffer   = lv_xstring
          TABLES
            text_tab = it_xls_content
          EXCEPTIONS
            failed   = 1
            OTHERS   = 2.

Доступную кодировку можно посмотреть в табличке TCP00A с видом атрибута H "HTTP-имя".
Back to top
View user's profile Send private message Blog
tdebug
Участник
Участник



Joined: 26 Feb 2009
Posts: 6

PostPosted: Thu Feb 26, 2009 2:21 pm    Post subject: Reply with quote

Отправка потом происходит обычным способом? Т.е. попадает в очередь которую нужно отправлять через транзакцию SCOT?
Только что попробовал запустить, функция работает но очередь пустая, ни одного email..
Back to top
View user's profile Send private message
John Doe
Модератор
Модератор


Age: 45
Joined: 05 Nov 2007
Posts: 725
Location: КраснАдар

PostPosted: Thu Feb 26, 2009 3:49 pm    Post subject: Reply with quote

Да, обычным способом, через SCOT. Раскомментируйте COMMIT WORK в теле ФМ - я обычно его в вызывающих программах пишу.
Back to top
View user's profile Send private message Blog
tdebug
Участник
Участник



Joined: 26 Feb 2009
Posts: 6

PostPosted: Thu Feb 26, 2009 6:03 pm    Post subject: Reply with quote

Работает. Изменил только параметр I_SMTP_ADDRESS на внутреннюю таблицу и добавил один LOOP, чтобы можно было указать сразу несколько адресатов.

Code:

    LOOP AT I_SMTP_ADDRESS INTO i_smtp_address_line.

* Create recipient
      recipient = cl_cam_address_bcs=>create_internet_address( i_smtp_address_line ).

    CALL METHOD send_request->add_recipient
        EXPORTING
          i_recipient  = recipient
          i_express    = ' '
          i_copy       = ' '
          i_blind_copy = ' '.

     ENDLOOP.



Надеюсь так правильно? По крайней мере работает. В очередь правда добавляется количество емайлов кратное количеству адресатов, я сначала думал что отправится каждому отдельно, но отправилось сразу всем т.е. вроде ок.
Спасибо!
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> Programming Techniques | Приемы программирования -> Mail All times are GMT + 4 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum


All product names are trademarks of their respective companies. SAPNET.RU websites are in no way affiliated with SAP AG.
SAP, SAP R/3, R/3 software, mySAP, ABAP, BAPI, xApps, SAP NetWeaver and any other are registered trademarks of SAP AG.
Every effort is made to ensure content integrity. Use information on this site at your own risk.