Friday, November 19, 2010

SEND EMAIL IN ABAP PROGRAM (PART 2) : TABLE AND EXCEL FILE ATTACHMENT

SEND EMAIL IN ABAP PROGRAM (PART 2)
TABLE AND EXCEL FILE ATTACHMENT
         
          One modification that we can make from this is how to send internal table and compile it into excel file then send it as attachment in email.

Below is the sample code :

1.     a. Data Declaration
DATA: t_mailrecipients  LIKE somlreci1 OCCURS WITH HEADER LINE,
      t_mailtxt         
TYPE STANDARD TABLE OF soli      WITH HEADER LINE,
      t_attachment      
TYPE STANDARD TABLE OF solisti1  WITH HEADER LINE,
      t_mailsubject     
TYPE sodocchgi1,
      t_packing_list    
TYPE STANDARD TABLE OF sopcklsti1 WITH HEADER LINE,
      t_scarr 
TYPE TABLE OF scarr WITH HEADER LINE,
      d_cnt             
TYPE i,
      d_nama_xls(12) 
TYPE c.

2.     b. Input Parameter
SELECTION-SCREEN BEGIN OF BLOCK blok1 WITH FRAME TITLE text-001.
PARAMETERS: p_email 
TYPE so_recname DEFAULT 'mas.trias@gmail.com'.
PARAMETERS: p_user 
TYPE so_recname DEFAULT 'GUEST01'.
PARAMETERS: p_excel(8) 
DEFAULT 'SCARR'.
SELECTION-SCREEN END OF BLOCK blok1.

3.     c. Set Email Recipients
REFRESH t_mailrecipients.
CLEAR t_mailrecipients.
MOVE: p_user 
TO t_mailrecipients-receiver,
      
'X'      TO t_mailrecipients-express,
      
'B'      TO t_mailrecipients-rec_type.
APPEND t_mailrecipients.

CLEAR t_mailrecipients.
MOVE: p_email 
TO t_mailrecipients-receiver,
      
'U'      TO t_mailrecipients-rec_type.
APPEND t_mailrecipients.

d. Email Content
Example, we want to send data from SCARR.

* Get data.
SELECT FROM scarr INTO TABLE t_scarr.

* content email
t_mailtxt = 
'Try to make attachment in .XLS with data is below:'.
APPEND t_mailtxt. CLEAR t_mailtxt.

CONCATENATE 'CARRID' 'CARRNAME'
                      
INTO t_mailtxt-line SEPARATED BY space.
APPEND t_mailtxt.CLEAR t_mailtxt.

LOOP AT t_scarr.
  
CONCATENATE t_scarr-carrid t_scarr-carrname
                        
INTO t_mailtxt-line SEPARATED BY space.
  
APPEND t_mailtxt.CLEAR t_mailtxt.
ENDLOOP.

5.     e. Set to Excel File
Using Class : CL_ABAP_CHAR_UTILITIES

* excel data
LOOP AT t_scarr.
  
CONCATENATE t_scarr-carrid t_scarr-carrname
              
INTO t_attachment SEPARATED BY
              cl_abap_char_utilities=>horizontal_tab.

  
CONCATENATE cl_abap_char_utilities=>newline t_attachment
              
INTO t_attachment.

  
APPEND t_attachment. CLEAR t_attachment.
ENDLOOP.

t_packing_list-transf_bin  = space.
t_packing_list-head_start  = 1.
t_packing_list-head_num    = 
0.
t_packing_list-body_start  = 
1.
t_packing_list-body_num    = LINES( t_mailtxt ).
t_packing_list-doc_type    = 
'RAW'.
APPEND t_packing_list.
CLEAR t_packing_list.

CONCATENATE p_excel '.xls' INTO d_nama_xls.

t_packing_list-transf_bin  = 
'X'.
t_packing_list-head_start  = 
1.
t_packing_list-head_num    = 
1.
t_packing_list-body_start  = 
1.
t_packing_list-body_num    = LINES( t_attachment ).
t_packing_list-doc_type    = 
'XLS'" You can give RAW incase if you want just a txt file.
t_packing_list-obj_name    = d_nama_xls.
t_packing_list-obj_descr   = d_nama_xls.
t_packing_list-doc_size    = t_packing_list-body_num * 
255.
APPEND t_packing_list.
CLEAR t_packing_list.

7.     f. Set Email Subject

t_mailsubject-obj_name     = 'MAILATTACH'.
t_mailsubject-obj_langu    = sy-langu.
t_mailsubject-obj_descr    = 
'Message with excel file attached'.
t_mailsubject-sensitivty   = 
'F'.
d_cnt = LINES( t_attachment ).
t_mailsubject-doc_size     = ( d_cnt - 
) * 255 + STRLEN( t_attachment ).

8.     Call FM  SO_NEW_DOCUMENT_ATT_SEND_API1

CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
  
EXPORTING
    document_data              = t_mailsubject
    put_in_outbox              = 
'X'
    commit_work                = 
'X'
  
TABLES
    packing_list               = t_packing_list
    contents_bin               = t_attachment
    contents_txt               = t_mailtxt
    receivers                  = t_mailrecipients
  
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 EQ 0.
  
COMMIT WORK.
  
SUBMIT rsconn01 WITH mode 'INT' AND RETURN.
  
MESSAGE i003(aq) WITH 'Message Sent Succesfully'.
ELSE.
  
MESSAGE i003(aq) WITH 'Message Not Sent'.
ENDIF.

                                                      EXECUTE REPORT



Send Email in ABAP Report






SEND EMAIL IN ABAP PROGRAM


Sometimes, there is a user need to send email from SAP to internal SAP or to eksternal SMTP. Below sample code in ABAP to make report that is able to send email from SAP

a.     Data Declaration
SAP Structures: sodocchgi1, solisti1, somlreci1
 DATA :
      document_data
LIKE sodocchgi1,
      objpack 
LIKE sopcklsti1 OCCURS WITH HEADER LINE,
      objhead 
LIKE solisti1 OCCURS WITH HEADER LINE,
      objtxt 
LIKE solisti1 OCCURS WITH HEADER LINE,
      receivers 
LIKE somlreci1 OCCURS WITH HEADER LINE,
 tab_lines TYPE i.

b.     Input Parameters
SELECTION-SCREEN BEGIN OF BLOCK blok1 WITH FRAME TITLE text-001.
PARAMETERS p_email TYPE SO_RECNAME DEFAULT 'mas.trias@gmail.com'.
PARAMETERS p_login TYPE SO_RECNAME DEFAULT 'GUEST01'.
PARAMETERS p_judul TYPE SO_OBJ_DES DEFAULT 'Email dari SAP'.
PARAMETERS p_text TYPE SO_TEXT255 DEFAULT 'Ini hanya test Email dari SAP'.
SELECTION-SCREEN END OF BLOCK blok1.

c.      Sample codes in Start of Selection.

-         Set Email body.
START-OF-SELECTION.
CLEAR objtxt[].
objtxt-line = p_text.
APPEND objtxt.

-         Set Email Title 
CLEAR document_data.
       DESCRIBE TABLE objtxt LINES tab_lines.
      
READ TABLE objtxt INDEX tab_lines.
       document_data-doc_size = ( tab_lines - 
) * 255 + STRLEN( objtxt ).
       WRITE p_judul TO document_data-obj_descr.

-         Creation of the entry for the compressed document DESCRIBE TABLE objtxt LINES tab_lines.
  CLEAR objpack-transf_bin.
  objpack-head_start = 
1.
  objpack-head_num = 
0.
  objpack-body_start = 
1.
  objpack-body_num = tab_lines.
  objpack-doc_type = 
'RAW'.
  
APPEND objpack.

 -         Set Internal SAP Email
  receivers-receiver = p_login."SAP Login User
  receivers-rec_type = 
'B'"local addres user
  receivers-express = 
'X'.
  
APPEND receivers.

-         Set Eksternal Email
  receivers-receiver = p_email. "Email Address
  receivers-rec_type = 
'U'"Intenet Address
  
APPEND receivers.

-         Call Function Module SO_NEW_DOCUMENT_ATT_SEND_API1
  CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
    
EXPORTING
      document_data                    = document_data
      put_in_outbox                    = 
'X'
      commit_work                      = 
'X'
* IMPORTING
*   SENT_TO_ALL                      = SENT_TO_ALL
*   NEW_OBJECT_ID                    = NEW_OBJECT_ID
    
TABLES
      packing_list                   = objpack
     object_header                 = objhead
*   CONTENTS_BIN                     = CONTENTS_BIN
     contents_txt                    = objtxt
*   CONTENTS_HEX                     = CONTENTS_HEX
*   OBJECT_PARA                      = OBJECT_PARA
*   OBJECT_PARB                      = OBJECT_PARB
      receivers                        = 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
            .
-         Show Message as an FM exceptions.
  CASE sy-subrc.
    
WHEN 0.
      
MESSAGE i398(00) WITH 'Success'.
    
WHEN 1.
      
MESSAGE e398(00) WITH 'Too many receivers'.
    
WHEN 2.
      
MESSAGE e398(00) WITH 'Document not send'.
    
WHEN 3.
      
MESSAGE e398(00) WITH 'Document type not exist'.
    
WHEN 4.
      
MESSAGE e398(00) WITH 'Operation no autorization'.
    
WHEN 5.
      
MESSAGE e398(00) WITH 'Parameter Erros'.
    
WHEN 6.
      
MESSAGE e398(00) WITH 'X Eror'.
    
WHEN 7.
      
MESSAGE e398(00) WITH 'Enque Error'.
    
WHEN OTHERS.
      
MESSAGE e398(00) WITH 'Others'.
ENDCASE.


                                   EXECUTE REPORT