Wednesday, July 24, 2013

ABAP Email Program

TABLES: SOMLRECI1.

TYPES BEGIN OF TY_HEADER,
         VAL TYPE STRING,
         MAT TYPE STRING,
         SDC TYPE STRING,
         SDS TYPE STRING,
         BAT TYPE STRING,
        END OF TY_HEADER.

DATA :   T_HEADER TYPE STANDARD TABLE OF TY_HEADER INITIAL SIZE 1,
         W_HEADER TYPE TY_HEADER,
         T_MAIL TYPE STANDARD TABLE OF TY_HEADER INITIAL SIZE 1,
         W_MAIL TYPE TY_HEADER.

DATA P_ATTACH   TYPE  RLGRAP-FILENAME.
SELECT-OPTIONS: S_MAILID  FOR SOMLRECI1-RECEIVER NO INTERVALS NO-DISPLAY.

DATA PATH TYPE STRING.


*----------------------------------------------------------------------*
*                     GLOBAL DATA DECLARATION                          *
*----------------------------------------------------------------------*
DATA: T_MAILHEX   TYPE STANDARD TABLE OF SOLIX,
      T_CONTENTS  TYPE STANDARD TABLE OF SOLISTI1,
      WA_CONTENTS TYPE SOLISTI1,
      W_FILE      TYPE DSVASDOCID,
      W_EXTN(5)   TYPE C,
      W_MAIL_SUBJ TYPE STRING,
      W_DOCUMENT  TYPE REF TO CL_DOCUMENT_BCS.

*----------------------------------------------------------------------*
*                     CONSTANTS DECLARATION                            *
*----------------------------------------------------------------------*
CONSTANTS:
*-- Constants used in the body of the Email (HTML)
C_HTM         TYPE CHAR3   VALUE 'HTM',
C_STYLE_START TYPE CHAR255 VALUE '<FONT face=Arial size=2>',
C_NEW_LINE    TYPE CHAR255 VALUE '<br>',
*C_LINK_START  TYPE CHAR128 VALUE '<A href="www.google.com">',
*C_LINK_TEXT   TYPE CHAR32  VALUE 'Link for learning HTML',
*C_LINK_END    TYPE CHAR4   VALUE '</A>',
C_SPACE(6)    TYPE C       VALUE '&nbsp;',

*-- Used as an Example for displaying space between texts in Email body
C_EMP1(6)     TYPE C       VALUE 101001,
C_EMP2(6)     TYPE C       VALUE 101002,
C_EMP3(6)     TYPE C       VALUE 101003.




FORM MAIL_HEAD.
  LOOP AT T_RESULT INTO WA_RESULT.

    W_MAIL-VAL = WA_RESULT-FLAG.
    W_MAIL-MAT = WA_RESULT-MATNR.
    W_MAIL-SDC = WA_RESULT-SDCLST.
    W_MAIL-SDS = WA_RESULT-LTEXT.
    W_MAIL-BAT = WA_RESULT-CHARG.
    W_MAIL-ORD = WA_RESULT-AUFNR.

    APPEND W_MAIL TO T_MAIL.
    CLEAR WA_RESULT.

  ENDLOOP.



  CLEAR  W_HEADER.
  W_HEADER-VAL = 'Valid'.
  W_HEADER-MAT = 'Material No'.
  W_HEADER-SDC = 'material Class'.
  W_HEADER-SDS = 'material Stage'.
  W_HEADER-BAT = 'Batch No'.
  W_HEADER-ORD = 'Order No'.
  W_HEADER-OPR = 'Operation'.

  APPEND W_HEADER TO T_HEADER.


CALL METHOD CL_GUI_FRONTEND_SERVICES=>GET_DESKTOP_DIRECTORY
  CHANGING
    DESKTOP_DIRECTORY    = PATH
  EXCEPTIONS
    CNTL_ERROR           = 1
    ERROR_NO_GUI         = 2
    NOT_SUPPORTED_BY_GUI = 3
    OTHERS               4
        .
IF SY-SUBRC <> 0.
ENDIF.

CALL METHOD CL_GUI_CFW=>UPDATE_VIEW.

IF P_VORNR EQ '1'.
  CONCATENATE PATH '\Order_Confirmation.XLS' INTO PATH.
ELSEIF P_VORNR EQ '2'.
  CONCATENATE PATH '\First_Inspection_Confirmations.XLS' INTO PATH.
ELSEIF P_VORNR EQ '3'.
  CONCATENATE PATH '\Second_Inspection_Confirmations.XLS' INTO PATH.
ELSEIF P_VORNR EQ '4'.
  CONCATENATE PATH '\Third_Inspection_Confirmations.XLS' INTO PATH.
ELSEIF P_VORNR EQ '5'.
  CONCATENATE PATH '\DC_Confirmations.XLS' INTO PATH.
ENDIF.

  CALL FUNCTION 'GUI_DOWNLOAD'
    EXPORTING
      FILENAME                = PATH
      FILETYPE                = 'ASC'
      APPEND                  ' '
      WRITE_FIELD_SEPARATOR   = 'X'
    TABLES
      DATA_TAB                = T_HEADER
    EXCEPTIONS
      OTHERS                  22.
  IF SY-SUBRC <> 0.
* Implement suitable error handling here
  ENDIF.


  CALL FUNCTION 'GUI_DOWNLOAD'
    EXPORTING
      FILENAME                = PATH
      FILETYPE                = 'ASC'
      APPEND                  'X'
      WRITE_FIELD_SEPARATOR   = 'X'
    TABLES
      DATA_TAB                = T_MAIL
    EXCEPTIONS
      OTHERS                  22.
  IF SY-SUBRC <> 0.
*    Implement suitable error handling here
  ENDIF.


P_ATTACH = PATH.

CLEAR S_MAILID.
S_MAILID-SIGN   = 'I'.
S_MAILID-OPTION = 'EQ'.
S_MAILID-LOW    = 'abc@gmail.com'.
APPEND S_MAILID.

CLEAR S_MAILID.
S_MAILID-SIGN   = 'I'.
S_MAILID-OPTION = 'EQ'.
S_MAILID-LOW    = 'def@gmail.com'.
APPEND S_MAILID.

CLEAR S_MAILID.

ENDFORM.


*&--------------------------------------------------------------------*
*& Form Name      : File_path
*&--------------------------------------------------------------------*
*& Description    : F4 help for File Name / Path
*&--------------------------------------------------------------------*
*& Parameters     : FP_FILE  --> File Name
*&--------------------------------------------------------------------*
FORM FILE_PATH USING FP_FILE TYPE ANY.
*-- Selects the directory list
  CALL FUNCTION 'F4_DXFILENAME_4_DYNP'
    EXPORTING
      DYNPFIELD_FILENAME = FP_FILE
      DYNAME             = SY-CPROG
      DYNUMB             = SY-DYNNR
      FILETYPE           = 'P'
      LOCATION           = 'P'
      SERVER             = SPACE.

ENDFORM.                    " file_path
*&---------------------------------------------------------------------*
*& Form Name     : Upload_Data                                         *
*&---------------------------------------------------------------------*
*& Description   : Upload data into SAP from Presentation Server       *
*&---------------------------------------------------------------------*
*& Parameters    : None                                                *
*&---------------------------------------------------------------------*
FORM UPLOAD_DATA.
*-- Local data declaration
  DATA: L_FILE  TYPE STRING,
        L_INDEX TYPE SY-TABIX,
*-- For holding the split file name
        TL_SPLITFILE TYPE STANDARD TABLE OF RLGRAP-FILENAME,
        WL_SPLITFILE TYPE RLGRAP-FILENAME.

  L_FILE = P_ATTACH.

**-- Function module to split the Filename and Extension from the Path
  CALL FUNCTION 'CH_SPLIT_FILENAME'
    EXPORTING
      COMPLETE_FILENAME = L_FILE
    IMPORTING
      EXTENSION         = W_EXTN
      NAME              = W_FILE.

*-- Split the filename at '.'
  SPLIT L_FILE AT '.' INTO TABLE TL_SPLITFILE.
  DESCRIBE TABLE TL_SPLITFILE LINES L_INDEX.

*-- In case the filename contains more than one dot
  IF L_INDEX GT 2.
    CLEAR: WL_SPLITFILE, W_EXTN.
*-- Get the Extension of the file
    READ TABLE TL_SPLITFILE INTO WL_SPLITFILE INDEX L_INDEX.
    W_EXTN = WL_SPLITFILE.
    DELETE TL_SPLITFILE INDEX L_INDEX.
    DELETE TL_SPLITFILE INDEX 1.
    CLEAR WL_SPLITFILE.
*-- Get the Actual filename
    LOOP AT TL_SPLITFILE INTO WL_SPLITFILE.
      CONCATENATE '.' WL_SPLITFILE INTO WL_SPLITFILE.
    ENDLOOP.
    CONCATENATE W_FILE WL_SPLITFILE INTO W_FILE.
  ENDIF.

  CONDENSE W_EXTN.

*-- Upload File
  CALL FUNCTION 'GUI_UPLOAD'
    EXPORTING
      FILENAME                = L_FILE
      FILETYPE                = 'BIN'
    TABLES
      DATA_TAB                = T_MAILHEX
    EXCEPTIONS
      FILE_OPEN_ERROR         = 1
      FILE_READ_ERROR         = 2
      NO_BATCH                = 3
      GUI_REFUSE_FILETRANSFER = 4
      INVALID_TYPE            = 5
      NO_AUTHORITY            = 6
      UNKNOWN_ERROR           = 7
      BAD_DATA_FORMAT         = 8
      HEADER_NOT_ALLOWED      = 9
      SEPARATOR_NOT_ALLOWED   = 10
      HEADER_TOO_LONG         = 11
      UNKNOWN_DP_ERROR        = 12
      ACCESS_DENIED           = 13
      DP_OUT_OF_MEMORY        = 14
      DISK_FULL               = 15
      DP_TIMEOUT              = 16
      OTHERS                  17.

  IF SY-SUBRC IS NOT INITIAL.
    MESSAGE I999(YMSG) WITH 'Error in reading file for upload'(002)
    W_FILE.
  ENDIF.
ENDFORM.                    " upload_data

*&---------------------------------------------------------------------*
*& Form Name     : frame_mail_body                                     *
*&---------------------------------------------------------------------*
*& Description   : To frame the body part of the Email to be sent      *
*&---------------------------------------------------------------------*
*& Parameters    : None                                                *
*&---------------------------------------------------------------------*
FORM FRAME_MAIL_BODY.
*-- Local data declaration to hold the textpool
  DATA: TL_TEXTPOOL TYPE STANDARD TABLE OF TEXTPOOL,
        WL_TEXTPOOL TYPE TEXTPOOL.

*-- Read the Entire Textpool into an Internal table
  READ TEXTPOOL SY-REPID INTO TL_TEXTPOOL LANGUAGE SY-LANGU.
  IF SY-SUBRC IS INITIAL.
    SORT TL_TEXTPOOL BY ID KEY.
  ENDIF.

*-- Font start
  CLEAR WA_CONTENTS.
  WA_CONTENTS-LINE = C_STYLE_START.
  APPEND WA_CONTENTS TO T_CONTENTS.

*-- New line
  CLEAR WA_CONTENTS.
  WA_CONTENTS-LINE = C_NEW_LINE.
  APPEND WA_CONTENTS TO T_CONTENTS.

*-- Program name : Email Attachment
  CLEAR: WL_TEXTPOOL, WA_CONTENTS.
  READ TABLE TL_TEXTPOOL INTO WL_TEXTPOOL
                         WITH KEY ID 'I' KEY 'T02'
                         BINARY SEARCH.
  IF SY-SUBRC EQ 0.
    WA_CONTENTS-LINE = WL_TEXTPOOL-ENTRY.
*-- "#" Present in the Text Element will be replaced by the below value
    REPLACE: '#' WITH 'Email Attachment' INTO WA_CONTENTS-LINE.
    APPEND WA_CONTENTS TO T_CONTENTS.
  ENDIF.

*-- New line
  CLEAR WA_CONTENTS.
  WA_CONTENTS-LINE = C_NEW_LINE.
  APPEND WA_CONTENTS TO T_CONTENTS.
*-- New line
  CLEAR WA_CONTENTS.
  WA_CONTENTS-LINE = C_NEW_LINE.
  APPEND WA_CONTENTS TO T_CONTENTS.

*-- You can also change or add the text here...
  CLEAR: WL_TEXTPOOL, WA_CONTENTS.
  READ TABLE TL_TEXTPOOL INTO WL_TEXTPOOL
                         WITH KEY ID 'I' KEY 'T03'
                         BINARY SEARCH.
  IF SY-SUBRC EQ 0.
    WA_CONTENTS-LINE = WL_TEXTPOOL-ENTRY.
    APPEND WA_CONTENTS TO T_CONTENTS.
  ENDIF.

*-- New line
  CLEAR WA_CONTENTS.
  WA_CONTENTS-LINE = C_NEW_LINE.
  APPEND WA_CONTENTS TO T_CONTENTS.
*-- New line
  CLEAR WA_CONTENTS.
  WA_CONTENTS-LINE = C_NEW_LINE.
  APPEND WA_CONTENTS TO T_CONTENTS.

*-- For giving spaces between texts, you can use...
  CLEAR: WL_TEXTPOOL, WA_CONTENTS.
  READ TABLE TL_TEXTPOOL INTO WL_TEXTPOOL
                         WITH KEY ID 'I' KEY 'T05'
                         BINARY SEARCH.
  IF SY-SUBRC EQ 0.
    WA_CONTENTS-LINE = WL_TEXTPOOL-ENTRY.
    APPEND WA_CONTENTS TO T_CONTENTS.
  ENDIF.

*-- New line
  CLEAR WA_CONTENTS.
  WA_CONTENTS-LINE = C_NEW_LINE.
  APPEND WA_CONTENTS TO T_CONTENTS.

*-- For Ex; Employee Numbers :
  CLEAR: WL_TEXTPOOL, WA_CONTENTS.
  READ TABLE TL_TEXTPOOL INTO WL_TEXTPOOL
                         WITH KEY ID 'I' KEY 'T06'
                         BINARY SEARCH.
  IF SY-SUBRC EQ 0.
    WA_CONTENTS-LINE = WL_TEXTPOOL-ENTRY.
*-- How to give Spaces in between texts
    CONCATENATE WA_CONTENTS-LINE C_SPACE C_EMP1 C_SPACE C_EMP2
                                 C_SPACE C_EMP3 INTO WA_CONTENTS-LINE.
    APPEND WA_CONTENTS TO T_CONTENTS.
  ENDIF.
*-- New line
  CLEAR WA_CONTENTS.
  WA_CONTENTS-LINE = C_NEW_LINE.
  APPEND WA_CONTENTS TO T_CONTENTS.
*-- New line
  CLEAR WA_CONTENTS.
  WA_CONTENTS-LINE = C_NEW_LINE.
  APPEND WA_CONTENTS TO T_CONTENTS.

*-- For more Information on HTML..
  CLEAR: WL_TEXTPOOL, WA_CONTENTS.
  READ TABLE TL_TEXTPOOL INTO WL_TEXTPOOL
                         WITH KEY ID 'I' KEY 'T07'
                         BINARY SEARCH.
  IF SY-SUBRC EQ 0.
    WA_CONTENTS-LINE = WL_TEXTPOOL-ENTRY.
    APPEND WA_CONTENTS TO T_CONTENTS.
  ENDIF.

*-- New line
  CLEAR WA_CONTENTS.
  WA_CONTENTS-LINE = C_NEW_LINE.
  APPEND WA_CONTENTS TO T_CONTENTS.
*-- New line
  CLEAR WA_CONTENTS.
  WA_CONTENTS-LINE = C_NEW_LINE.
  APPEND WA_CONTENTS TO T_CONTENTS.

**-- Hyperlink
*  CLEAR WA_CONTENTS.
*  CONCATENATE C_LINK_START C_LINK_TEXT C_LINK_END INTO WA_CONTENTS-LINE.
*  APPEND WA_CONTENTS TO T_CONTENTS.

*-- Subject of the Mail
  CONCATENATE TEXT-T01 W_MAIL_SUBJ INTO W_MAIL_SUBJ.

ENDFORM.                    " frame_mail_body
*&---------------------------------------------------------------------*
*& Form Name     : Send_mail                                           *
*&---------------------------------------------------------------------*
*& Description   : To set the recipients and send the mail             *
*&---------------------------------------------------------------------*
*& Parameters    : None                                                *
*&---------------------------------------------------------------------*
FORM SEND_MAIL.

*-- Local data declaration for sending mail
  DATA: L_SEND_REQUEST  TYPE REF TO CL_BCS,
        L_DOCUMENT      TYPE REF TO CL_DOCUMENT_BCS,
        L_SENDER        TYPE REF TO CL_SAPUSER_BCS,
        L_SUB           TYPE CHAR50,
        L_RECIPIENT     TYPE REF TO IF_RECIPIENT_BCS,
        TL_CONTENTS     TYPE STANDARD TABLE OF SOLI,
        L_DOC_LEN       TYPE SO_OBJ_LEN,
        L_CNT           TYPE SY-TABIX,
        L_RCV_EMAIL     TYPE ADR6-SMTP_ADDR,
        L_RESULT        TYPE SY-BINPT,
        L_BCS_EXCEPTION TYPE REF TO CX_BCS,
        L_SUBJ          TYPE STRING,
        WL_MAILID       LIKE LINE OF S_MAILID.

  TRY.
*-- Create persistent send request
      L_SEND_REQUEST = CL_BCS=>CREATE_PERSISTENT( ).
      TL_CONTENTS[] = T_CONTENTS[].

*-- Get the length of the Document
      DESCRIBE TABLE TL_CONTENTS LINES L_CNT.
      READ TABLE TL_CONTENTS INTO WA_CONTENTS INDEX L_CNT.
      L_DOC_LEN = ( L_CNT - ) * 255 + STRLEN( WA_CONTENTS ).
*-- Subject of the mail
      L_SUB = W_MAIL_SUBJ.

*-- Create Document
      L_DOCUMENT = CL_DOCUMENT_BCS=>CREATE_DOCUMENT(
                   I_TYPE       = C_HTM
                   I_TEXT       = TL_CONTENTS
                   I_LENGTH     = L_DOC_LEN
                   I_SUBJECT    = L_SUB
                   I_LANGUAGE   = SY-LANGU
                   I_IMPORTANCE = '1' ).
*-- Subject of the mail
      MOVE W_MAIL_SUBJ TO L_SUBJ.
      W_DOCUMENT = L_DOCUMENT.

      TRY.
*-- Set the Message Subject
          CALL METHOD L_SEND_REQUEST->SET_MESSAGE_SUBJECT
            EXPORTING
              IP_SUBJECT = L_SUBJ.
        CATCH CX_SY_DYN_CALL_ILLEGAL_METHOD.
      ENDTRY.

*-- Add document to send request
      CALL METHOD L_SEND_REQUEST->SET_DOCUMENT( L_DOCUMENT ).

*-- Do send delivery info for successful mails
      CALL METHOD L_SEND_REQUEST->SET_STATUS_ATTRIBUTES
        EXPORTING
          I_REQUESTED_STATUS = 'E'
          I_STATUS_MAIL      = 'A'.

*-- Set sender
      L_SENDER = CL_SAPUSER_BCS=>CREATE( SY-UNAME ).
      CALL METHOD L_SEND_REQUEST->SET_SENDER
        EXPORTING
          I_SENDER = L_SENDER.

*-- To frame the attachments for the mail
      PERFORM FRAME_ATTACHMENTS.
*-- Add the recipients to the Send mail
      LOOP AT S_MAILID INTO WL_MAILID.
        L_RCV_EMAIL = WL_MAILID-LOW.

        CHECK NOT L_RCV_EMAIL IS INITIAL.
        L_RECIPIENT = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS(
                                                      L_RCV_EMAIL ).
        CALL METHOD L_SEND_REQUEST->ADD_RECIPIENT
          EXPORTING
            I_RECIPIENT = L_RECIPIENT
            I_EXPRESS   = 'X'.
      ENDLOOP.

*-- Send Email
      CALL METHOD L_SEND_REQUEST->SEND(
        EXPORTING
          I_WITH_ERROR_SCREEN = 'X'
        RECEIVING
          RESULT              = L_RESULT ).

      IF L_RESULT = 'X'.
        MESSAGE S999(YMSG) WITH
        'Status Log Mail Sent Successfully'(003).
      ENDIF.

    CATCH CX_BCS INTO L_BCS_EXCEPTION.
      IF L_RESULT NE 'X'.
        MESSAGE S999(YMSG) WITH
        'Status Log Mail Not Sent'(004).
      ENDIF.
  ENDTRY.
  COMMIT WORK.                                             "Commit Work

ENDFORM.                    " send_mail
*&---------------------------------------------------------------------*
*& Form Name     : frame_attachments                                   *
*&---------------------------------------------------------------------*
*& Description   : To frame the attachments for the mail to be sent    *
*&---------------------------------------------------------------------*
*& Parameters    : None                                                *
*&---------------------------------------------------------------------*
FORM FRAME_ATTACHMENTS.
*-- Local Data declaration
  DATA: L_SUBJECT   TYPE SO_OBJ_DES,
        L_ATT_TYPE  TYPE SOODK-OBJTP.

*-- Subject of the Attachment
  L_SUBJECT  = W_FILE.
*-- Format of the Attachment
  L_ATT_TYPE = W_EXTN.

  IF T_MAILHEX[] IS NOT INITIAL.
    TRY.
*-- Add Attachment to the Document
        CALL METHOD W_DOCUMENT->ADD_ATTACHMENT
          EXPORTING
            I_ATTACHMENT_TYPE    = L_ATT_TYPE
            I_ATTACHMENT_SUBJECT = L_SUBJECT
            I_ATT_CONTENT_HEX    = T_MAILHEX.

      CATCH CX_DOCUMENT_BCS.
    ENDTRY.
  ENDIF.
ENDFORM.                    " frame_attachments

No comments:

Post a Comment