Примеры работы SO_NEW_DOCUMENT_SEND_API1 (отправка сообщений)

Автор Uukrul, Грудень 05, 2007, 02:25:58 ПП

Попередня тема - Наступна тема

0 Користувачі і 1 Гість дивляться цю тему.

Sed0Y

#25
"Ошибка БД при <INSERT INTO KPRO> <>"
Данный ФМ лезит в РФЦ...
эта ошибка была из-за неверной настройки HTTP_SERV в этом манданте..

Если хотите узнать под какой настройкой у вас лезит, поставьте остановку в ФМе "SCMS_HTTP_CREATE_TABLE"
и посмотрите на переменную "CREP_ID"
А дальше Таблицы в связке: SDOKSTCA-STOR_REP - > CREP_HTTP-CREP_ID

ну и Настройка тут(рис. so_new_document_send_api1.png)

ysichov

Цитата: Sed0Y від Грудень 18, 2012, 12:19:07 ПП
позже (может уже в следующем году) выложу, нужно их подготовить - а то нет времени...

А пока такой вопрос, а как сделать, что бы письмо отправлялось от другого имени (которое будет постоянное)
к примеру [email protected], не меняя sy-uname?


lv_sender = '[email protected]'.

    CALL FUNCTION 'SO_DOCUMENT_SEND_API1'
      EXPORTING
        document_data              = wa_docdata
        put_in_outbox              = 'X'
        sender_address             = lv_sender " space "
        sender_address_type        = 'INT' "space
        commit_work                = 'X'
      TABLES
        packing_list               = lt_objpack
        object_header              = lt_objhead
        contents_txt               = lt_objtxt
        receivers                  = lt_reclist
      EXCEPTIONS
        too_many_receivers         = 1
        document_not_sent          = 2
        document_type_not_exist    = 3
        operation_no_authorization = 4
        parameter_error            = 5
        x_error                    = 6
        enqueue_error              = 7
        OTHERS                     = 8.

Sed0Y


Sed0Y

Еще такой вопрос:
можно как-то перенаправить письмо, чтобы оно шло по другому SMTP хосту?

Sed0Y

Ну или через RFC?

Кста, тут хорошая статья как настроить RFC http://scn.sap.com/thread/477925

Sed0Y

#30
Наткнулся на один прикол касательно вложения документа. Для меня это было ново..
Если у пользователя нет этой настройки (см. рис) то к письму не будет приатачен документ.

В тр su01

Uukrul

Цитата: Sed0Y від Січень 16, 2013, 12:06:32 ПП
Если у пользователя нет этой настройки (см. рис) то к письму не будет приатачен документ.
Т.е. не задано устройство вывода по умолчанию? Или не задан немедленный вывод? Так как эти параметры доступны пользователю для изменений.

Sed0Y

#32
Цитата: Uukrul від Січень 16, 2013, 12:26:41 ПП
Т.е. не задано устройство вывода по умолчанию? Или не задан немедленный вывод? Так как эти параметры доступны пользователю для изменений.

Да, хорошо подметили - если не задано устройство вывода по умолчанию то не будет приатачен документ.
Подмечу - если отправка происходит в фоне то и фонового пользователя это тоже касается.

Sed0Y

Итак, как обещал.
Начну с cl_bcs

У меня была задача СМАРТФОРМ отправлять почтой.
Выбрал данный метод потому что, много плюсов, один из них это тема письма больше 50символов, и немедленная отправка без дерганья тр SCOT :)

  DATA:
        l_function_module_name  TYPE rs38l_fnam.
* parameters for generated function module
  DATA:
        ls_output_options       TYPE ssfcompop,
        ls_control_parameters   TYPE ssfctrlop.

" тут получаем имя смартфомы
  CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
    EXPORTING
      formname           = 'SMARTFORM_NAME'
    IMPORTING
      fm_name            = l_function_module_name
    EXCEPTIONS
      no_form            = 1
      no_function_module = 2
      others             = 3.
  ls_control_parameters-no_dialog = 'X'.
  ls_control_parameters-getotf    = 'X'.

     CALL FUNCTION l_function_module_name
        EXPORTING
          control_parameters = ls_control_parameters
          output_options     = ls_output_options
          user_settings      = space
        IMPORTING
          job_output_info    = ls_output_data
        EXCEPTIONS
          formatting_error   = 1
          internal_error     = 2
          send_error         = 3
          user_canceled      = 4
          others             = 5.
.
DATA:
        itab_message_body TYPE TABLE OF solisti1 WITH HEADER LINE,
        l_bin_size        LIKE sood-objlen,
        lv_xstring        TYPE xstring,
        itab_lines        TYPE TABLE OF tline,
        itab_otf          TYPE TABLE OF itcoo.

     itab_otf[] = ls_output_data-otfdata[]

  CALL FUNCTION 'CONVERT_OTF'
    EXPORTING
      format                = 'PDF'
      max_linewidth         = 132
    IMPORTING
      bin_filesize          = l_bin_size "#EC NEEDED
      bin_file              = lv_xstring
    TABLES
      otf                   = itab_otf
      lines                 = itab_lines
    EXCEPTIONS
      err_max_linewidth     = 1
      err_format            = 2
      err_conv_not_possible = 3
      OTHERS                = 4.

  CALL FUNCTION 'ZSEND_EMAIL'
    EXPORTING
      lines_xstring       = lv_xstring
      sender_email_from   = gl_email_from   " email FROM
      recipient_email_to  = gl_email_adress " email TO
      title_email         = lv_title_email
    IMPORTING
      result              = lv_senemail_res
    TABLES
      contents_text       = itab_message_body. " текст тела письма




FUNCTION ZSEND_EMAIL.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*"  IMPORTING
*"     REFERENCE(LINES_XSTRING) TYPE  XSTRING
*"     REFERENCE(SENDER_EMAIL_FROM) TYPE  ADR6-SMTP_ADDR
*"     REFERENCE(RECIPIENT_EMAIL_TO) TYPE  ADR6-SMTP_ADDR
*"     REFERENCE(TITLE_EMAIL) TYPE  STRING OPTIONAL
*"     REFERENCE(TYPE_ATACH_DOC) TYPE  SO_OBJ_TP DEFAULT 'PDF'
*"     REFERENCE(NAME_ATACH_DOC) TYPE  SO_OBJ_DES DEFAULT 'SomeName'
*"  EXPORTING
*"     REFERENCE(RESULT) TYPE  I
*"  TABLES
*"      CONTENTS_BIN STRUCTURE  SOLISTI1 OPTIONAL
*"      CONTENTS_TEXT STRUCTURE  SOLISTI1 OPTIONAL
*"----------------------------------------------------------------------

DATA:
      zes_keg_email_documents_row   TYPE zes_keg_email_documents_row OCCURS 0 WITH HEADER LINE,
      zes_keg_email_recipients_row  TYPE zes_keg_email_recipients_row OCCURS 0 WITH HEADER LINE.

  zes_keg_email_documents_row-type            = type_atach_doc.
  zes_keg_email_documents_row-subject         = name_atach_doc.
  zes_keg_email_documents_row-content_text[]  = contents_text[].
  APPEND zes_keg_email_documents_row.

  zes_keg_email_recipients_row-c_address = recipient_email_to.
  zes_keg_email_recipients_row-i_express = 'X'.
  APPEND zes_keg_email_recipients_row.

  CALL FUNCTION 'ZEMAIL_WITH_CL_BCS'
    EXPORTING
      sender_address_from    = sender_email_from
      title_email            = title_email
      lines_xstring          = lines_xstring
      documents              = zes_keg_email_documents_row[]
      recipients             = zes_keg_email_recipients_row[]
    IMPORTING
      result                 = result.


ENDFUNCTION.





FUNCTION ZEMAIL_WITH_CL_BCS.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*"  IMPORTING
*"     REFERENCE(SENDER_ADDRESS_FROM) TYPE  ADR6-SMTP_ADDR
*"     REFERENCE(TITLE_EMAIL) TYPE  STRING OPTIONAL
*"     REFERENCE(LINES_XSTRING) TYPE  XSTRING OPTIONAL
*"     REFERENCE(DOCUMENTS) TYPE  ZES_KEG_EMAIL_DOCUMENTS OPTIONAL
*"     REFERENCE(RECIPIENTS) TYPE  ZES_KEG_EMAIL_RECIPIENTS OPTIONAL
*"     REFERENCE(CONTENT_TYPE) TYPE  SO_OBJ_TP DEFAULT 'HTM'
*"  EXPORTING
*"     REFERENCE(RESULT) TYPE  I
*"  RAISING
*"      CX_BCS
*"----------------------------------------------------------------------

*----------------------------------------------------------------------*
* CLASS-DEFINITIONS                                                    *
*----------------------------------------------------------------------*
  DATA: send_request       TYPE REF TO cl_bcs.
  DATA: document           TYPE REF TO cl_document_bcs.
*  DATA: sender             TYPE REF TO cl_sapuser_bcs.
  DATA: sender             TYPE REF TO cl_cam_address_bcs.
  DATA: recipient          TYPE REF TO if_recipient_bcs.
  DATA: exception_info     TYPE REF TO if_os_exception_info,
        bcs_exception      TYPE REF TO cx_bcs.

*----------------------------------------------------------------------*
* INTERNAL TABLES                                                      *
*----------------------------------------------------------------------*
  DATA: l_mailtext TYPE soli_tab.
  DATA: l_mailhex  TYPE solix_tab.
*  DATA: iaddsmtp   TYPE bapiadsmtp OCCURS 0 WITH HEADER LINE.
  DATA: ireturn    TYPE bapiret2 OCCURS 0 WITH HEADER LINE.

*----------------------------------------------------------------------*
* VARIABLES                                                            *
*----------------------------------------------------------------------*
  DATA: mail_line       LIKE LINE OF l_mailtext.
  DATA: mailx_line      LIKE LINE OF l_mailhex.
  DATA: la_doc_line     LIKE LINE OF documents.
  DATA: recipients_line LIKE LINE OF recipients.
*  DATA: bapiadsmtp      TYPE bapiadsmtp.
  DATA: lv_mail_from    TYPE adr6-smtp_addr.
  DATA: first(1)        TYPE c.
  DATA: la_contents     TYPE soli.
  DATA: conlengths      TYPE so_obj_len.
  DATA: lv_pdf_content  TYPE solix_tab.
*----------------------------------------------------------------------*
* CONSTANTS                                                            *
*----------------------------------------------------------------------*
  CLASS cl_cam_address_bcs DEFINITION LOAD.
  CLASS cl_abap_char_utilities DEFINITION LOAD.

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

      CLEAR first.

      lv_pdf_content = cl_document_bcs=>xstring_to_solix( lines_xstring ).

      LOOP AT documents INTO la_doc_line.
* Build the Main Document
          IF la_doc_line-content_hex[] IS INITIAL.
            DESCRIBE TABLE la_doc_line-content_text[] LINES conlengths.
            READ TABLE la_doc_line-content_text[] INTO la_contents INDEX conlengths.
            conlengths = ( conlengths - 1 ) * 255 + STRLEN( la_contents ).

            document = cl_document_bcs=>create_document(
                                i_type    = content_type
                                i_text    = la_doc_line-content_text[]
                                i_length  = conlengths
                                i_subject = la_doc_line-subject ).
            IF NOT lv_pdf_content IS INITIAL.
                document->add_attachment(
                                   i_attachment_type    = la_doc_line-type " add PDF attachment
                                   i_attachment_subject = la_doc_line-subject
                                   i_att_content_hex    = lv_pdf_content ).
            ENDIF.
          ELSE.
* Add Attachment
            document->add_attachment(
                               i_attachment_type    = la_doc_line-type
                               i_attachment_subject = la_doc_line-subject
                               i_att_content_hex    = la_doc_line-content_hex ).
          ENDIF.
      ENDLOOP.

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

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

* Add sender
      send_request->set_sender( sender ).

* Create recipient TO
      LOOP AT recipients INTO recipients_line.
        IF recipients_line-c_address IS INITIAL.
            recipients_line-c_address = '[email protected]'.
        ENDIF.

        recipient = cl_cam_address_bcs=>create_internet_address( recipients_line-c_address ).
* Add recipient with its respective attributes to send request
        send_request->add_recipient(
            i_recipient  = recipient
            i_express    = recipients_line-i_express
            i_copy       = recipients_line-i_copy
            i_blind_copy = recipients_line-i_blind_copy
            i_no_forward = recipients_line-i_no_foward ).

      ENDLOOP.

* subject line more than 50 chars
      send_request->set_message_subject( title_email ).

* set send immediately flag
      send_request->set_send_immediately( 'X' ).

* Send document
      send_request->send( ).

      COMMIT WORK AND WAIT.

    CATCH cx_bcs INTO bcs_exception.
      RESULT = 10.
*      RAISE EXCEPTION bcs_exception.

  ENDTRY.
ENDFUNCTION.



"*---------------- ВТОРОЙ СПОСОБ ----------------------*"
"*---------------- SO_DOCUMENT_SEND_API1 ---------*"
  itab_otf[] = ls_output_data-otfdata[].

  CALL FUNCTION 'CONVERT_OTF_2_PDF'
    IMPORTING
      bin_filesize           = bin_filesize
    TABLES
      OTF                    = itab_otf
      DOCTAB_ARCHIVE         = itab_docs
      LINES                  = itab_lines
            .

  CALL FUNCTION 'SX_TABLE_LINE_WIDTH_CHANGE'
  EXPORTING
    line_width_dst              = '255'
  TABLES
    content_in                  = itab_lines
    content_out                 = itab_pdf
  EXCEPTIONS
    err_line_width_src_too_long = 1
    err_line_width_dst_too_long = 2
    err_conv_failed             = 3
    OTHERS                      = 4.




FUNCTION ZEMAIL_WITH_API.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*"  IMPORTING
*"     REFERENCE(SENDER_MAIL_FROM) TYPE  SOMLRECI1-RECEIVER
*"     REFERENCE(RECIPIENT_MAIL_TO) TYPE  SOMLRECI1-RECEIVER
*"     REFERENCE(NAME_EMAIL50) TYPE  SO_OBJ_DES
*"     REFERENCE(TYPE_BODY_TEXT) TYPE  SO_OBJ_TP DEFAULT 'HTM'
*"     REFERENCE(TYPE_ATACH_DOC) TYPE  SO_OBJ_TP DEFAULT 'PDF'
*"     REFERENCE(NAME_ATACH_DOC) TYPE  SO_OBJ_DES DEFAULT 'SomeName'
*"  EXPORTING
*"     REFERENCE(RESULT) TYPE  I
*"  TABLES
*"      CONTENTS_BIN STRUCTURE  SOLISTI1 OPTIONAL " сам атач
*"      MESSAGE_BODY STRUCTURE  SOLISTI1 OPTIONAL " тело
*"----------------------------------------------------------------------


DATA:
      v_lines_bin         TYPE i VALUE 0,
      v_lines_rec         TYPE i,
      v_lines_txt         TYPE i,
      la_doc_data         TYPE sodocchgi1,
      lt_receivers        LIKE somlreci1 OCCURS 0 WITH HEADER LINE,
      lt_packlist         LIKE sopcklsti1 OCCURS 0 WITH HEADER LINE,
      la_document_data         TYPE sodocchgi1.

*-- Assign the Email id and User id to  Whom you want to Send  -------------&
  REFRESH lt_receivers.
  lt_receivers-receiver   = recipient_mail_to. "&---- Assign Email id
  lt_receivers-rec_type   = 'U'.               "&---- Send to External Email id
  lt_receivers-com_type   = 'INT'.
  lt_receivers-notif_del  = 'X'.
  lt_receivers-notif_ndel = 'X'.
  APPEND lt_receivers.
*& - END of  Assign the Email id and User id to  Whom you want to Send  --&

"&--- Read the Number of lines in the Internal Table
  DESCRIBE TABLE lt_receivers LINES v_lines_rec.
  IF v_lines_rec IS NOT INITIAL.

      DESCRIBE TABLE message_body LINES v_lines_txt.
      READ TABLE message_body INDEX v_lines_txt.

      la_doc_data-obj_name    = 'SMARTFORM'.
      la_doc_data-expiry_dat  = sy-datum + 10.
      la_doc_data-obj_descr   = name_email50.
      la_doc_data-sensitivty  = 'F'.
      la_doc_data-doc_size    = v_lines_txt * 255.
*      la_doc_data-doc_size    = ( v_lines_bin - 1 ) * 255 + STRLEN( contents_bin ).
      la_doc_data-obj_langu   = sy-langu.

*     Describe the body of the message
      REFRESH lt_packlist.
      lt_packlist-transf_bin = space.
      lt_packlist-head_start = 1.
      lt_packlist-head_num   = 0.
      lt_packlist-body_start = 1.
      lt_packlist-body_num   = v_lines_txt.
      lt_packlist-doc_type   = type_body_text."'RAW'.
      APPEND lt_packlist.

*       Packing for PDF.
      IF NOT contents_bin IS INITIAL.
        DESCRIBE TABLE contents_bin LINES v_lines_bin.
      ENDIF.
      lt_packlist-transf_bin = 'X'.
      lt_packlist-head_start = 1.
      lt_packlist-head_num   = 1.
      lt_packlist-body_start = 1.
      lt_packlist-body_num   = v_lines_bin.
      lt_packlist-doc_type   = type_atach_doc. "'PDF'.
      lt_packlist-obj_name   = 'smart'.
      lt_packlist-obj_descr  = name_atach_doc.
      lt_packlist-doc_size   = v_lines_bin * 255.
      APPEND lt_packlist.

      CALL FUNCTION 'SO_DOCUMENT_SEND_API1'
        EXPORTING
          document_data                   = la_doc_data
          sender_address                  = sender_mail_from
          sender_address_type             = 'INT'
          put_in_outbox                   = 'X'
          commit_work                     = 'X'
         TABLES
           packing_list                   = lt_packlist
           contents_bin                   = contents_bin
           contents_txt                   = message_body
           receivers                      = lt_receivers
         EXCEPTIONS
           too_many_receivers             = 1
           document_not_sent              = 2
           document_type_not_exist        = 3
           operation_no_authorization     = 4
           parameter_error                = 5
           x_error                        = 6
           enqueue_error                  = 7
           OTHERS                         = 8 .

      result = sy-subrc.

  ENDIF. "&---- END of Check the Sender Email id or SAP User id is got or not.

ENDFUNCTION.


Uukrul


salmaner

Всем доброго времени суток!

Коллеги, мы отправили письмо с транзакцией. Но пользователю не понравилось что надо
открывать письмо и далее идти в меню и нажимать Документ->Выполнить (Ctrl+F6).
Пользователь хочет по двойному клику по письму что бы запускалась транзакция.
На сколько я знаю, это можно сделать если через Work-Flow.
Из примера описания данного фм-ника видно что можно передать параметр объекта
wfl like sood-objtp value 'WFL', " WorkFlow.

Вопрос как создать объект WorkFlow программно и добавить в таблицу object_content?
Или можно как то заставить открываться транзакцию по двойному клику?