SAP 메일전송 기능

***** 함수를 이용하는 방법

1. Function : “SO_NEW_DOCUMENT_ATT_SEND_API1” 

[#M_소스코드 보기|접어두기..|

DATA: w_subject LIKE sodocchgi1,
      i_pack_list LIKE sopcklsti1 OCCURS 1 WITH HEADER LINE,
      i_objhead LIKE solisti1 OCCURS 1 WITH HEADER LINE,
      i_contents_text LIKE solisti1 OCCURS 10 WITH HEADER LINE,      "FOR MAIL CONTENTS
      i_contents_bin TYPE STANDARD TABLE OF solisti1 WITH HEADER LINE, 
      i_contents_hex TYPE STANDARD TABLE OF solix WITH HEADER LINE,    "for attachment
      i_receiver LIKE somlreci1 OCCURS 1 WITH HEADER LINE,
      content_out LIKE solisti1 OCCURS 0 WITH HEADER LINE.
DATA: li_contents_hex TYPE STANDARD TABLE OF solix WITH HEADER LINE.
  lv_hex1 = cl_abap_char_utilities=>cr_lf.

*Create the body of the attachment file of the mail INTO li_contents_bin-line SEPARATED BY lc_tab.
  CONCATENATE li_contents_bin-line lv_hex1 INTO li_contents_bin-line.
  APPEND li_contents_bin.

*Converting the table contents for attachment to xstring 
  LOOP AT li_contents_bin.
    CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
      EXPORTING
        text           = li_contents_bin-line
      IMPORTING
        buffer         = li_contents-line
     EXCEPTIONS
       failed         = 1
       OTHERS         = 2.

*Converting the table contents from xstring to binary
    CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
      EXPORTING
        buffer                = li_contents-line
*        APPEND_TO_TABLE       = 'I_CONTENTS_HEX'
      TABLES
        binary_tab            = li_contents_hex.
              
    LOOP AT li_contents_hex.
      APPEND li_contents_hex TO i_contents_hex .
    ENDLOOP.

* FM called for sending the mail to the intended recipients
  CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
    EXPORTING
      document_data                    = w_subject
      put_in_outbox                    = 'X'
      commit_work                      = 'X'
    IMPORTING
      sent_to_all                      = sent_to_all
    TABLES
      packing_list                     = i_pack_list
      object_header                    = i_objhead
      contents_hex                     = i_contents_hex
      contents_txt                     = i_contents_text
      receivers                        = i_receiver.

_M#]

출처 : SDN

2. Function : “SO_DOCUMENT_SEND_API1”

[#M_소스코드 보기|접어두기..|

*
*&---------------------------------------------------------------------*
*& Report  ZSPOOLTOPDF                                                 *
*&                                                                     *
*&---------------------------------------------------------------------*
*& Converts spool request into PDF document and emails it to           *
*& recipicant.                                                         *
*&                                                                     *
*& Execution                                                           *
*& ---------                                                           *
*& This program must be run as a background job in-order for the write *
*& commands to create a Spool request rather than be displayed on      *
*& screen                                                              *
*&---------------------------------------------------------------------*
REPORT  zspooltopdf.

PARAMETER: p_email1 LIKE somlreci1-receiver
                                    DEFAULT 'abap@sapdev.co.uk',
           p_sender LIKE somlreci1-receiver
                                    DEFAULT 'abap@sapdev.co.uk',
           p_delspl  AS CHECKBOX.

*DATA DECLARATION
DATA: gd_recsize TYPE i.

* Spool IDs
TYPES: BEGIN OF t_tbtcp.
        INCLUDE STRUCTURE tbtcp.
TYPES: END OF t_tbtcp.
DATA: it_tbtcp TYPE STANDARD TABLE OF t_tbtcp INITIAL SIZE 0,
      wa_tbtcp TYPE t_tbtcp.

* Job Runtime Parameters
DATA: gd_eventid LIKE tbtcm-eventid,
      gd_eventparm LIKE tbtcm-eventparm,
      gd_external_program_active LIKE tbtcm-xpgactive,
      gd_jobcount LIKE tbtcm-jobcount,
      gd_jobname LIKE tbtcm-jobname,
      gd_stepcount LIKE tbtcm-stepcount,
      gd_error    TYPE sy-subrc,
      gd_reciever TYPE sy-subrc.


DATA:  w_recsize TYPE i.

DATA: gd_subject   LIKE sodocchgi1-obj_descr,
      it_mess_bod LIKE solisti1 OCCURS 0 WITH HEADER LINE,
      it_mess_att LIKE solisti1 OCCURS 0 WITH HEADER LINE,
      gd_sender_type     LIKE soextreci1-adr_typ,
      gd_attachment_desc TYPE so_obj_nam,
      gd_attachment_name TYPE so_obj_des.

* Spool to PDF conversions
DATA: gd_spool_nr LIKE tsp01-rqident,
      gd_destination LIKE rlgrap-filename,
      gd_bytecount LIKE tst01-dsize,
      gd_buffer TYPE string.

* Binary store for PDF
DATA: BEGIN OF it_pdf_output OCCURS 0.
        INCLUDE STRUCTURE tline.
DATA: END OF it_pdf_output.

CONSTANTS: c_dev LIKE  sy-sysid VALUE 'DEV',
           c_no(1)     TYPE c   VALUE ' ',
           c_device(4) TYPE c   VALUE 'LOCL'.

************************************************************************
*START-OF-SELECTION.
START-OF-SELECTION.

* Write statement to represent report output. Spool request is created
* if write statement is executed in background. This could also be an
* ALV grid which would be converted to PDF without any extra effort
  WRITE 'Hello World'.
  new-page.
  commit work.
  new-page print off.

  IF sy-batch EQ 'X'.
    PERFORM get_job_details.
    PERFORM obtain_spool_id.

************************************
*** Alternative way could be to submit another program and store spool
*** id into memory, will be stored in sy-spono.
*submit ZSPOOLTOPDF2
*        to sap-spool
*        spool parameters   %_print
*        archive parameters %_print
*        without spool dynpro
*        and return.
************************************

* Get spool id from program called above
*  IMPORT w_spool_nr FROM MEMORY ID 'SPOOLTOPDF'.

    PERFORM convert_spool_to_pdf.
    PERFORM process_email.

    if p_delspl EQ 'X'.
      PERFORM delete_spool.
    endif.

    IF sy-sysid = c_dev.
      wait up to 5 seconds.
      SUBMIT rsconn01 WITH mode   = 'INT'
                      WITH output = 'X'
                      AND RETURN.
    ENDIF.
  ELSE.
    SKIP.
    WRITE:/ 'Program must be executed in background in-order for spool',
            'request to be created.'.
  ENDIF.


*---------------------------------------------------------------------*
*       FORM obtain_spool_id                                          *
*---------------------------------------------------------------------*
FORM obtain_spool_id.
  CHECK NOT ( gd_jobname IS INITIAL ).
  CHECK NOT ( gd_jobcount IS INITIAL ).

  SELECT * FROM  tbtcp
                 INTO TABLE it_tbtcp
                 WHERE      jobname     = gd_jobname
                 AND        jobcount    = gd_jobcount
                 AND        stepcount   = gd_stepcount
                 AND        listident   <> '0000000000'
                 ORDER BY   jobname
                            jobcount
                            stepcount.

  READ TABLE it_tbtcp INTO wa_tbtcp INDEX 1.
  IF sy-subrc = 0.
    message s004(zdd) with gd_spool_nr.
    gd_spool_nr = wa_tbtcp-listident.
    MESSAGE s004(zdd) WITH gd_spool_nr.
  ELSE.
    MESSAGE s005(zdd).
  ENDIF.
ENDFORM.


*---------------------------------------------------------------------*
*       FORM get_job_details                                          *
*---------------------------------------------------------------------*
FORM get_job_details.
* Get current job details
  CALL FUNCTION 'GET_JOB_RUNTIME_INFO'
       IMPORTING
            eventid                 = gd_eventid
            eventparm               = gd_eventparm
            external_program_active = gd_external_program_active
            jobcount                = gd_jobcount
            jobname                 = gd_jobname
            stepcount               = gd_stepcount
       EXCEPTIONS
            no_runtime_info         = 1
            OTHERS                  = 2.
ENDFORM.


*---------------------------------------------------------------------*
*       FORM convert_spool_to_pdf                                     *
*---------------------------------------------------------------------*
FORM convert_spool_to_pdf.

  CALL FUNCTION 'CONVERT_ABAPSPOOLJOB_2_PDF'
       EXPORTING
            src_spoolid              = gd_spool_nr
            no_dialog                = c_no
            dst_device               = c_device
       IMPORTING
            pdf_bytecount            = gd_bytecount
       TABLES
            pdf                      = it_pdf_output
       EXCEPTIONS
            err_no_abap_spooljob     = 1
            err_no_spooljob          = 2
            err_no_permission        = 3
            err_conv_not_possible    = 4
            err_bad_destdevice       = 5
            user_cancelled           = 6
            err_spoolerror           = 7
            err_temseerror           = 8
            err_btcjob_open_failed   = 9
            err_btcjob_submit_failed = 10
            err_btcjob_close_failed  = 11
            OTHERS                   = 12.

  CHECK sy-subrc = 0.

* Transfer the 132-long strings to 255-long strings
  LOOP AT it_pdf_output.
    TRANSLATE it_pdf_output USING ' ~'.
    CONCATENATE gd_buffer it_pdf_output INTO gd_buffer.
  ENDLOOP.

  TRANSLATE gd_buffer USING '~ '.

  DO.
    it_mess_att = gd_buffer.
    APPEND it_mess_att.
    SHIFT gd_buffer LEFT BY 255 PLACES.
    IF gd_buffer IS INITIAL.
      EXIT.
    ENDIF.
  ENDDO.
ENDFORM.


*---------------------------------------------------------------------*
*       FORM process_email                                            *
*---------------------------------------------------------------------*
FORM process_email.
  DESCRIBE TABLE it_mess_att LINES gd_recsize.
  CHECK gd_recsize > 0.
  PERFORM send_email USING p_email1.
*  perform send_email using p_email2.
ENDFORM.


*---------------------------------------------------------------------*
*       FORM send_email                                               *
*---------------------------------------------------------------------*
*  -->  p_email                                                       *
*---------------------------------------------------------------------*
FORM send_email USING p_email.
  CHECK NOT ( p_email IS INITIAL ).

  REFRESH it_mess_bod.

* Default subject matter
  gd_subject         = 'Subject'.
  gd_attachment_desc = 'Attachname'.
*  CONCATENATE 'attach_name' ' ' INTO gd_attachment_name.
  it_mess_bod        = 'Message Body text, line 1'.
  APPEND it_mess_bod.
  it_mess_bod        = 'Message Body text, line 2...'.
  APPEND it_mess_bod.

* If no sender specified - default blank
  IF p_sender EQ space.
    gd_sender_type  = space.
  ELSE.
    gd_sender_type  = 'INT'.
  ENDIF.


* Send file by email as .xls speadsheet
  PERFORM send_file_as_email_attachment
                               tables it_mess_bod
                                      it_mess_att
                                using p_email
                                      'Example .xls documnet attachment'
                                      'PDF'
                                      gd_attachment_name
                                      gd_attachment_desc
                                      p_sender
                                      gd_sender_type
                             changing gd_error
                                      gd_reciever.
ENDFORM.


*---------------------------------------------------------------------*
*       FORM delete_spool                                             *
*---------------------------------------------------------------------*
FORM delete_spool.
  DATA: ld_spool_nr TYPE tsp01_sp0r-rqid_char.

  ld_spool_nr = gd_spool_nr.

  CHECK p_delspl <> c_no.
  CALL FUNCTION 'RSPO_R_RDELETE_SPOOLREQ'
       EXPORTING
            spoolid = ld_spool_nr.
ENDFORM.


*&---------------------------------------------------------------------*
*&      Form  SEND_FILE_AS_EMAIL_ATTACHMENT
*&---------------------------------------------------------------------*
*       Send email
*----------------------------------------------------------------------*
FORM send_file_as_email_attachment tables it_message
                                          it_attach
                                    using p_email
                                          p_mtitle
                                          p_format
                                          p_filename
                                          p_attdescription
                                          p_sender_address
                                          p_sender_addres_type
                                 changing p_error
                                          p_reciever.


  DATA: ld_error    TYPE sy-subrc,
        ld_reciever TYPE sy-subrc,
        ld_mtitle LIKE sodocchgi1-obj_descr,
        ld_email LIKE  somlreci1-receiver,
        ld_format TYPE  so_obj_tp ,
        ld_attdescription TYPE  so_obj_nam ,
        ld_attfilename TYPE  so_obj_des ,
        ld_sender_address LIKE  soextreci1-receiver,
        ld_sender_address_type LIKE  soextreci1-adr_typ,
        ld_receiver LIKE  sy-subrc.

data:   t_packing_list like sopcklsti1 occurs 0 with header line,
        t_contents like solisti1 occurs 0 with header line,
        t_receivers like somlreci1 occurs 0 with header line,
        t_attachment like solisti1 occurs 0 with header line,
        t_object_header like solisti1 occurs 0 with header line,
        w_cnt type i,
        w_sent_all(1) type c,
        w_doc_data like sodocchgi1.


  ld_email   = p_email.
  ld_mtitle = p_mtitle.
  ld_format              = p_format.
  ld_attdescription      = p_attdescription.
  ld_attfilename         = p_filename.
  ld_sender_address      = p_sender_address.
  ld_sender_address_type = p_sender_addres_type.


* Fill the document data.
  w_doc_data-doc_size = 1.

* Populate the subject/generic message attributes
  w_doc_data-obj_langu = sy-langu.
  w_doc_data-obj_name  = 'SAPRPT'.
  w_doc_data-obj_descr = ld_mtitle .
  w_doc_data-sensitivty = 'F'.

* Fill the document data and get size of attachment
  CLEAR w_doc_data.
  READ TABLE it_attach INDEX w_cnt.
  w_doc_data-doc_size =
     ( w_cnt - 1 ) * 255 + STRLEN( it_attach ).
  w_doc_data-obj_langu  = sy-langu.
  w_doc_data-obj_name   = 'SAPRPT'.
  w_doc_data-obj_descr  = ld_mtitle.
  w_doc_data-sensitivty = 'F'.
  CLEAR t_attachment.
  REFRESH t_attachment.
  t_attachment[] = it_attach[].

* Describe the body of the message
  CLEAR t_packing_list.
  REFRESH t_packing_list.
  t_packing_list-transf_bin = space.
  t_packing_list-head_start = 1.
  t_packing_list-head_num = 0.
  t_packing_list-body_start = 1.
  DESCRIBE TABLE it_message LINES t_packing_list-body_num.
  t_packing_list-doc_type = 'RAW'.
  APPEND t_packing_list.

* Create attachment notification
  t_packing_list-transf_bin = 'X'.
  t_packing_list-head_start = 1.
  t_packing_list-head_num   = 1.
  t_packing_list-body_start = 1.

  DESCRIBE TABLE t_attachment LINES t_packing_list-body_num.
  t_packing_list-doc_type   =  ld_format.
  t_packing_list-obj_descr  =  ld_attdescription.
  t_packing_list-obj_name   =  ld_attfilename.
  t_packing_list-doc_size   =  t_packing_list-body_num * 255.
  APPEND t_packing_list.

* Add the recipients email address
  CLEAR t_receivers.
  REFRESH t_receivers.
  t_receivers-receiver = ld_email.
  t_receivers-rec_type = 'U'.
  t_receivers-com_type = 'INT'.
  t_receivers-notif_del = 'X'.
  t_receivers-notif_ndel = 'X'.
  APPEND t_receivers.

  CALL FUNCTION 'SO_DOCUMENT_SEND_API1'
       EXPORTING
            document_data              = w_doc_data
            put_in_outbox              = 'X'
            sender_address             = ld_sender_address
            sender_address_type        = ld_sender_address_type
            commit_work                = 'X'
       IMPORTING
            sent_to_all                = w_sent_all
       TABLES
            packing_list               = t_packing_list
            contents_bin               = t_attachment
            contents_txt               = it_message
            receivers                  = t_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.

* Populate zerror return code
  ld_error = sy-subrc.

* Populate zreceiver return code
  LOOP AT t_receivers.
    ld_receiver = t_receivers-retrn_code.
  ENDLOOP.
ENDFORM.

_M#]

3. Function : “SO_DOCUMENT_SEND_API1” 관련 파라미터


 – NOTIF_DEL : 발송 성공시, 발신자에게 메일 송신.




 – 기타 옵션 : http://www.se80.co.uk/saptables/s/soml/somlreci1.htm

***** Class를 이용하는 방법

1. Class CL_BCS를 활용.

[#M_소스코드 보기|접기|

CLASS CA_SAPUSER_BCS     DEFINITION LOAD.

  CLASS CL_CAM_ADDRESS_BCS DEFINITION LOAD.

  DATA: SEND_REQUEST       TYPE REF TO CL_BCS.

  DATA: DOCUMENT           TYPE REF TO CL_DOCUMENT_BCS.

  DATA: ATTACHMENT         TYPE REF TO CL_DOCUMENT_BCS.

  DATA: SENDER             TYPE REF TO CL_SAPUSER_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.

  DATA: NUM_ROWS           TYPE I.

  DATA: TEXTLENGTH         TYPE SO_OBJ_LEN.

  TRY.

* Create persistent send request

    SEND_REQUEST = CL_BCS=>CREATE_PERSISTENT( ).

* Create document

     DATA: ROW                TYPE SOLI.

     DATA: L_MAILTEXT         TYPE BCSY_TEXT.

    CALL FUNCTION ‘SCMS_STRING_TO_FTEXT’

      EXPORTING

        TEXT      = MAIL_CONTENTS

      TABLES

        FTEXT_TAB = L_MAILTEXT.

    DESCRIBE TABLE L_MAILTEXT LINES NUM_ROWS.

    NUM_ROWS = NUM_ROWS * 255.

    MOVE NUM_ROWS TO TEXTLENGTH.

    DATA: SUBJECT TYPE SO_OBJ_DES.

    SUBJECT = MAIL_SUBJECT.

    DOCUMENT = CL_DOCUMENT_BCS=>CREATE_DOCUMENT(

                        I_TYPE    = ‘HTM’

                        I_TEXT    = L_MAILTEXT

                        I_LENGTH  = TEXTLENGTH

                        I_SUBJECT = SUBJECT ).

* 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

    DATA: C_ADDRESS TYPE ADR6-SMTP_ADDR.

    MOVE MAIL_REVADDR TO C_ADDRESS.

    RECIPIENT = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS(

                                              C_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 = ‘ ‘.

**************TEST dh.woo…

      DATA: LS_SOOS1 TYPE SOOS1.

      DATA: LCL_RESULT TYPE REF TO IF_RECIPIENT_BCS.

      LS_SOOS1-NOT_DELI = ‘X’.

      LS_SOOS1-RECESC = ‘U’.

      LS_SOOS1-DELIVER = ‘ ‘.

      LS_SOOS1-READ = ‘ ‘.

      LS_SOOS1-RECEXTNAM = ’email’.

      LCL_RESULT = CL_SEND_REQUEST_BCS=>CREATE_RECIPIENT_FROM_SOOS1( LS_SOOS1 ).

**************

* Send document

    CALL METHOD SEND_REQUEST->SEND( ).

    COMMIT WORK.

    DATA : MSGID TYPE SYMSGID.

    CATCH CX_BCS INTO BCS_EXCEPTION.

      EXIT.

  ENDTRY.

_M#]

Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments