SAP Program/ABAP

so_object_send를 이용한 mail 전송

유부사모 2017. 10. 11. 10:15


so_object_send function을 이용하면 sender에 internet email을 지정하여 전송할 수 있다.




FUNCTION zcm_send_mail.
*"----------------------------------------------------------------------
*"*"Local interface:
*"  IMPORTING
*"     VALUE(IS_SENDER) TYPE  ZQMS_038
*"     VALUE(IV_TITLE) TYPE  ZWF_TITLECO
*"     VALUE(IV_RETURN) TYPE  CHAR1 OPTIONAL
*"  EXPORTING
*"     VALUE(EV_RESULT) TYPE  CHAR1
*"     VALUE(EV_ERR_MSG) TYPE  STRING
*"  TABLES
*"      T_RECEIVER TYPE  ZQMY_0001
*"      T_BODY STRUCTURE  W3HTML
*"  EXCEPTIONS
*"      INVALID_USER_ERROR
*"      NO_EMAILID
*"      INVALID_EMPLOYEE_NUMBER
*"      INVALID_MYSINGLEID
*"      INVALID_ID_TYPE
*"      INVALID_WF_OBJECT
*"----------------------------------------------------------------------

  DATA lv_object_hd     TYPE sood1.
  DATA lv_object_type          TYPE sood-objtp.
  DATA lv_originator  TYPE soos1-recextnam,
         lv_origin_type TYPE soos1-recesc.

  DATA lt_objcont       TYPE STANDARD TABLE OF soli WITH HEADER LINE.
  DATA lt_receivers     TYPE STANDARD TABLE OF soos1 WITH HEADER LINE.
  DATA lt_packing_list  TYPE STANDARD TABLE OF soxpl WITH HEADER LINE.
*
  DATAlv_lines     TYPE i,
        lo_ex_system TYPE REF TO cx_ai_system_fault,
        lo_ex_app    TYPE REF TO cx_ai_application_fault.

  CLEAR ev_resultev_err_msg", ls_en_request.

*--------------------------------------------------------------------*
* 0. Check Input Value
*--------------------------------------------------------------------*
  IF t_receiver[] IS INITIAL ).
    ev_err_msg 'Enter mail receiver (required field)'.
    ev_result  'E'.
    EXIT.
  ELSEIF t_body[] IS INITIAL ).
    ev_err_msg 'Enter mail body (required field)'.
    ev_result  'E'.
    EXIT.
  ENDIF.

*  PERFORM check_mailuser USING    is_sender  iv_return
*                         CHANGING ev_err_msg.
*  IF ev_err_msg IS NOT INITIAL.
*    ev_result = c_e.  EXIT.
*  ENDIF.

*--------------------------------------------------------------------*
* 3. Set Mail Body
*--------------------------------------------------------------------*
  CLEAR lv_object_hd.
  lv_object_hd-objla  sy-langu.
  lv_object_hd-objdes iv_title.
  lv_object_hd-objnam 'MESSAGE'.
  lv_object_hd-objsns 'O'.
  lv_object_hd-file_ext 'HTM'.
  lv_object_hd-objpri '1'.
  lv_object_hd-objcp  'X'.

  lv_object_type 'RAW'.

  LOOP AT t_body.

    lt_objcont-line t_body.
    APPEND lt_objcontCLEAR lt_objcont.

  ENDLOOP.

*  READ TABLE t_body INDEX 1.
*  SEARCH t_body FOR '<HTML>' IN CHARACTER MODE STARTING AT 1 ENDING AT 10.
*  IF sy-subrc EQ 0.
*    ls_en_request-header_helper_csvo-b_html_content_check = 'true'.
*  ENDIF.


*--------------------------------------------------------------------*
* 4. Set Recipient Info
*--------------------------------------------------------------------*
*   i_seq_id (필수값) - 일련번호 (0부터 순차적으로 증가)
*   rec_type (필수값) - 수신형태 (t : 수신, c : 참조, b : 비밀참조)
*   rec_addr (필수값) - 수신자메일주소

  CLEARlt_receiverslt_receivers[].
  LOOP AT t_receiver.

*    PERFORM check_mailuser USING    t_receiver  iv_return
*                           CHANGING ev_err_msg.
*    IF ev_err_msg IS NOT INITIAL  AND iv_return IS INITIAL.
*      ev_result = 'E'.
*      EXIT.
*    ENDIF.

    TRANSLATE  t_receiver-emailid TO LOWER CASE.
    lt_receivers-recextnam  t_receiver-emailid.
    lt_receivers-sndart 'INT'.
    lt_receivers-sndpri '1'.
    lt_receivers-recesc 'U'.

    APPEND lt_receiversCLEAR lt_receivers.
  ENDLOOP.

  lv_originator is_sender-emailid.
  lv_origin_type 'U'.

  CHECK ev_result NE 'E'.

*--------------------------------------------------------------------*
* 5. Set Resource Info
*--------------------------------------------------------------------*
*   email    (필수값) - 발신자메일주소
*   locale   (필수값) - 로케일정보 (ko_KR : 한국, 중국 : zh_CN, 일본 : ja_JP, 나머지 : en_US)
*   encoding (필수값) - 메일인코딩정보 (euc-kr 또는 utf-8)

*--------------------------------------------------------------------*
* 6. Send Mail
*--------------------------------------------------------------------*
*************************&&메일을 전송하는 FUNCTION.....

  TRY.

      CALL FUNCTION 'SO_OBJECT_SEND'
        EXPORTING
          object_hd_change           lv_object_hd
          object_type                lv_object_type
          owner                      sy-uname
          originator                 lv_originator
          originator_type            lv_origin_type
        TABLES
          objcont                    lt_objcont
          receivers                  lt_receivers
        EXCEPTIONS
          active_user_not_exist      1
          communication_failure      2
          component_not_available    3
          folder_not_exist           4
          folder_no_authorization    5
          forwarder_not_exist        6
          note_not_exist             7
          object_not_exist           8
          object_not_sent            9
          object_no_authorization    10
          object_type_not_exist      11
          operation_no_authorization 12
          owner_not_exist            13
          parameter_error            14
          substitute_not_active      15
          substitute_not_defined     16
          system_failure             17
          too_much_receivers         18
          user_not_exist             19
          originator_not_exist       20
          x_error                    21.
    CATCH cx_ai_system_fault INTO lo_ex_system.
      ev_result  'E'.
      ev_err_msg lo_ex_system->if_message~get_text).
    CATCH cx_ai_application_fault INTO lo_ex_app.
      ev_result  'E'.
      ev_err_msg lo_ex_app->if_message~get_text).
  ENDTRY.

  IF sy-subrc 0.
    "SO_OBJECT_SEND 사용시에는 commit work 해줘야 함.
    COMMIT WORK.

    ev_result 'S'.
    EXIT.
  ELSE.
    ev_result sy-subrc.
    EXIT.
  ENDIF.

ENDFUNCTION.