REPORT z_email_abap_report.
*---------------------------------------------------------------------*
* E-mail an Abap report                                               *
*---------------------------------------------------------------------*
* Author : Michel PIOUD - Updated 24 Dec 07                           *
* HomePage : http://www.oocities.org/mpioud                          *
*---------------------------------------------------------------------*

DATA : w_name TYPE sos04-l_adr_name.

SELECT-OPTIONS :
* Recipient address
  s_name FOR w_name DEFAULT sy-uname NO INTERVALS.

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

* E-mail Abap report
  PERFORM f_send_mail.

*---------------------------------------------------------------------*
* Form f_send_mail
*---------------------------------------------------------------------*
FORM f_send_mail.

* Data Declaration
  DATA:
    l_datum(10),
    ls_docdata    TYPE sodocchgi1,
    ls_objpack    TYPE sopcklsti1,
    lt_objpack    TYPE TABLE OF sopcklsti1,
    lt_objhead    TYPE TABLE OF solisti1,
    ls_objtxt     TYPE solisti1,
    lt_objtxt     TYPE TABLE OF solisti1,
    ls_objbin     TYPE solisti1,
    lt_objbin     TYPE TABLE OF solisti1,
    ls_reclist    TYPE somlreci1,
    lt_reclist    TYPE TABLE OF somlreci1,
    lt_listobject TYPE TABLE OF abaplist,

    l_tab_lines TYPE i,
    l_att_type  TYPE soodk-objtp.

  WRITE sy-datum TO l_datum.
  IF sy-saprl >= '700'.
    SUBMIT bcalv_fullscreen_demo_classic
           EXPORTING LIST TO MEMORY AND RETURN.
  ELSE.
* List of Users According to Logon Date and Password Change
* NOTE: Create ALI/OTF Document in Spool
    SUBMIT rsusr200 WITH valid = 'X'
                    WITH notvalid = space
                    WITH unlocked = 'X'
                    WITH locked = space
               EXPORTING LIST TO MEMORY AND RETURN.
  ENDIF.

* Read list from memory into table
  CALL FUNCTION 'LIST_FROM_MEMORY'
    TABLES
      listobject = lt_listobject
    EXCEPTIONS
      not_found  = 1
      OTHERS     = 2.

  IF sy-subrc <> 0.
*   Error in function module &1
    MESSAGE ID '61' TYPE 'E' NUMBER '731'
       WITH 'LIST_FROM_MEMORY'.
  ENDIF.

* Because listobject is of size RAW(1000)
* and objbin is of size CHAR(255) we make this table copy
  CALL FUNCTION 'TABLE_COMPRESS'
    TABLES
      in             = lt_listobject
      out            = lt_objbin
    EXCEPTIONS
      compress_error = 1
      OTHERS         = 2.

  IF sy-subrc <> 0.
*   Error in function module &1
    MESSAGE ID '61' TYPE 'E' NUMBER '731'
       WITH 'TABLE_COMPRESS'.
  ENDIF.

* NOTE: Creation of attachment is finished yet.
* For your report, the attachment should be placed into table
* objtxt for plain text or
* objbin for binary content.
* Now create the message and send the document.
* Create Message Body
* Title and Description
  ls_docdata-obj_name = 'USERS_LIST'.
  CONCATENATE 'List of Users' sy-sysid '-' l_datum          "#EC *
         INTO ls_docdata-obj_descr SEPARATED BY space.

* Main Text
  ls_objtxt = 'List of Users According to Logon Date' &
              ' and Password Change'.                       "#EC *
  APPEND ls_objtxt TO lt_objtxt.
* Write Packing List (Main)
  DESCRIBE TABLE lt_objtxt LINES l_tab_lines.
  READ TABLE lt_objtxt INDEX l_tab_lines INTO ls_objtxt.
  ls_docdata-doc_size = ( l_tab_lines - 1 ) * 255 + STRLEN( ls_objtxt ).
  CLEAR ls_objpack-transf_bin.
  ls_objpack-head_start = 1.
  ls_objpack-head_num = 0.
  ls_objpack-body_start = 1.
  ls_objpack-body_num = l_tab_lines.
  ls_objpack-doc_type = 'RAW'.
  APPEND ls_objpack TO lt_objpack.

* Create Message Attachment
* Write Packing List (Attachment)
  l_att_type = 'ALI'.
  DESCRIBE TABLE lt_objbin LINES l_tab_lines.
  READ TABLE lt_objbin INDEX l_tab_lines INTO ls_objbin.
  ls_objpack-doc_size = ( l_tab_lines - 1 ) * 255 + STRLEN( ls_objbin ).
  ls_objpack-transf_bin = 'X'.
  ls_objpack-head_start = 1.
  ls_objpack-head_num = 0.
  ls_objpack-body_start = 1.
  ls_objpack-body_num = l_tab_lines.
  ls_objpack-doc_type = l_att_type.
  ls_objpack-obj_name = 'ATTACHMENT'.
  ls_objpack-obj_descr = 'List_of_Users'.                   "#EC *
  APPEND ls_objpack TO lt_objpack.

* Create receiver list
  LOOP AT s_name.
    ls_reclist-receiver = s_name-low.
    ls_reclist-rec_type = 'B'.
    APPEND ls_reclist TO lt_reclist.
  ENDLOOP.

* Send Message
  CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
    EXPORTING
      document_data              = ls_docdata
      put_in_outbox              = 'X'
    TABLES
      packing_list               = lt_objpack
      object_header              = lt_objhead
      contents_bin               = lt_objbin
      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.

  IF sy-subrc = 0.
*   Document sent
    MESSAGE ID 'SO' TYPE 'S' NUMBER '022'.
  ELSE.
*   Document <&> could not be sent
    MESSAGE ID 'SO' TYPE 'S' NUMBER '023'
       WITH ls_docdata-obj_name.
  ENDIF.

ENDFORM.                               " F_SEND_MAIL
***************** END OF PROGRAM Z_EMAIL_ABAP_REPORT ******************