Skip to Content
Author's profile photo playsuji s

Simple BCS email Method (With/Without Attachment)

Sending email to persons is become quite common, and i found it is very simple to send email using CL_BCS. One more thing which is often needed is attachment in the email. I usually do in this way, like convert whatever format (either excel,pdf,doc,etc..,) into XSTRING then attach it in the mail. Then after some times, we need to format the email content, Color, table,Bigger Font, Bold…….. So i thought its better to use HTML, so we can format it as per our need. And another thing for receipients, we will often have user name but need to write logic to get email address (ie. SU01) .  These things are often used, so i write a Simple Function with these features..

Example For Importing Parameters:

I_SUBJECT = ‘Email Subject’.

APPEND ‘<b> Dear XXX </b>’ to IT_CONTENT.
APPEND ‘This is the Sample emali’ to IT_CONTENT.
APPEND ‘Thank You’ to IT_CONTENT.

LS_RECEIPIENTS-IUSRID = ‘USERNAME’.
APPEND LS_RECEIPIENTS TO IT_RECEIPIENTS.
LS_RECEIPIENTS-EMAIL = ‘abc@email.com’.
APPEND LS_RECEIPIENTS TO IT_RECEIPIENTS.

  CALL FUNCTION ‘ZSEND_EMAIL’
    EXPORTING
     i_subject              = I_SUBJECT
     it_content             = IT_CONTENT
     it_receipients         = IT_RECEIPIENTS.

If attachment needs to be added, remember to pass all the parameters for attachment.

I_ATTACH_TYPE = ‘PDF’.
I_ATTACH_SUBJECT = ‘Test Document.pdf’.
I_ATTACH_XSTRING = XSTRING.

  CALL FUNCTION ‘ZSEND_EMAIL’
    EXPORTING
     i_subject              = I_SUBJECT
     it_content             = IT_CONTENT
     it_receipients         = IT_RECEIPIENTS
     i_attach_type          = I_ATTACH_TYPE
     i_attach_subject       = I_ATTACH_SUBJECT
     i_attach_xstring       = I_ATTACH_XSTRING .

FUNCTION zsend_email.
*”———————————————————————-
*”*”Local Interface:
*”  IMPORTING
*”     REFERENCE(I_SUBJECT) TYPE  SO_OBJ_DES
*”     REFERENCE(IT_CONTENT) TYPE  SOLI_TAB
*”     REFERENCE(IT_RECEIPIENTS) TYPE  UIYT_IUSR
*”     REFERENCE(I_ATTACH_TYPE) TYPE  SO_OBJ_TP OPTIONAL
*”     REFERENCE(I_ATTACH_SUBJECT) TYPE  SO_OBJ_DES OPTIONAL
*”     REFERENCE(I_ATTACH_XSTRING) TYPE  XSTRING OPTIONAL
*”  EXPORTING
*”     REFERENCE(BAPIRETURN) TYPE  BAPIRET2_T
*”———————————————————————-
*”———————————————————————-
*   Created By  : Surajarafath
*   Created On  : 27.03.2012
*   Description : This function Sends Email to Recipeint, with / without
*                       attachment
*   Notes       : Function can also get the email id of Username Passed
*”———————————————————————-
* MODIFICATION LOG :
* Date           Modified by      Changes
*”———————————————————————-

  DATA:  lt_email_content TYPE TABLE OF soli,
         ls_email_content TYPE soli.
  DATA:  lt_receipients TYPE TABLE OF uiys_iusr,
         ls_receipients TYPE uiys_iusr.
  FIELD-SYMBOLS <fs_receipients> TYPE uiys_iusr.
  DATA:  lv_email_subject TYPE so_obj_des.
  DATA   lt_message TYPE TABLE OF soli.
  DATA   ls_return  TYPE bapiret2.
  DATA   lt_return  TYPE bapiret2_t.
  DATA   lv_text    TYPE soli-line.

  DATA   send_email TYPE REF TO cl_bcs.
  DATA   document TYPE REF TO cl_document_bcs.
  DATA   recipient TYPE REF TO if_recipient_bcs.
  DATA   sent_to_all TYPE os_boolean.
  DATA   lv_error_occured TYPE os_boolean.
  DATA   lv_email_sent TYPE char1.

  DATA lv_attach_content_solix TYPE solix_tab.
  DATA lv_attach_size        TYPE so_obj_len.

*Initialization
  lt_email_content[] = it_content[].
  lv_email_subject = i_subject.

*Get Receipients
  IF it_receipients[] IS INITIAL.
    CLEAR ls_return.
    ls_return-type = ‘E’.
    ls_return-message = ‘No email Receipients Found’.
    APPEND ls_return TO bapireturn.
    RETURN.
  ELSE.
    lt_receipients[] = it_receipients[].
  ENDIF.
  “Get Email Id For the User Name
  LOOP AT lt_receipients ASSIGNING <fs_receipients> WHERE email IS INITIAL.
    SELECT SINGLE b~smtp_addr INTO <fs_receipients>-email
    FROM usr21 AS a
    INNER JOIN adr6  AS b
    ON  a~persnumber  = b~persnumber
    AND a~addrnumber  = b~addrnumber
    WHERE a~bname     = <fs_receipients>-iusrid
    AND   b~date_from LE sy-datum.
  ENDLOOP.

*Get the Content of the Mail
  APPEND ‘<body>’ TO lt_message.
  LOOP AT lt_email_content INTO ls_email_content.
    CONCATENATE ‘<p>’ ls_email_content-line ‘</p>’
    INTO lv_text.
    APPEND lv_text TO lt_message.
  ENDLOOP.
  APPEND ‘</body>’ TO lt_message.
  APPEND ‘<br>’ TO lt_message.

  TRY.

*Initiate
      send_email = cl_bcs=>create_persistent( ).

*Create Document
      document =  cl_document_bcs=>create_document(
          i_type        =  ‘HTM’
          i_subject     =  lv_email_subject
          i_text        =  lt_message ).

*Add Attachment
      IF  i_attach_type IS NOT INITIAL
      AND i_attach_subject IS NOT INITIAL.
      AND i_attach_xstring IS NOT INITIAL.
          lv_attach_content_solix = cl_document_bcs=>xstring_to_solix( i_attach_xstring ).
          lv_attach_size = XSTRLEN( i_attach_xstring ).
        document->add_attachment(
                i_attachment_type     = i_attach_type
                i_attachment_subject  = i_attach_subject
                i_attachment_size     = lv_attach_size
                i_att_content_hex     = lv_attach_content_solix        ) .
      ENDIF.

*Set Document to the Mail
      send_email->set_document( document ).

*Add Receipients to Mail
      LOOP AT lt_receipients INTO ls_receipients WHERE email IS NOT INITIAL.
        recipient = cl_cam_address_bcs=>create_internet_address( ls_receipients-email ).
        send_email->add_recipient( i_recipient = recipient ).
      ENDLOOP.
      IF sy-subrc NE 0.
        CLEAR ls_return.
        ls_return-type = ‘E’.
        ls_return-message = ‘No email Receipients Found’.
        APPEND ls_return TO bapireturn.
        RETURN.
      ENDIF.

*Send Email
      sent_to_all = send_email->send( i_with_error_screen = ‘X’ ).
      COMMIT WORK.
      IF sent_to_all EQ ‘X’.
        CLEAR ls_return.
        ls_return-type = ‘S’.
        ls_return-message = ‘Email has been sent successfully’.
        APPEND ls_return TO bapireturn.
      ELSE.
        CLEAR ls_return.
        ls_return-type = ‘E’.
        ls_return-message = ‘Error Occured While Sending email’.
        APPEND ls_return TO bapireturn.
        RETURN.
      ENDIF.

    CATCH cx_address_bcs.
    CATCH cx_document_bcs .
    CATCH cx_send_req_bcs.
  ENDTRY.
ENDFUNCTION.

*It is a simple function for basic email with/without one attachment file.

Assigned Tags

      1 Comment
      You must be Logged on to comment or reply to a post.
      Author's profile photo Elodie capel
      Elodie capel

      Hello,

      i try your method to send an itab as attachment but to open it with Excel.

      I pass a XLS type in the attachment parameter but when i open the attachment i see this :

       

      My code if someone can look and see what i do wrong.

       

               CREATE OBJECT GET_XLS.
      LV_XSTRING GET_XLS->RUNIT_OUT_REC LT_SEND  ).

      EXCEL_AS_SOLIX_STACK CL_BCS_CONVERT=>XSTRING_TO_SOLIXIV_XSTRING LV_XSTRING  ).

      DOCUMENT CL_DOCUMENT_BCS=>CREATE_DOCUMENT(
      I_TYPE 'RAW'
      I_SUBJECT MAIL_TITLE ).

      DOCUMENT->ADD_ATTACHMENT(
      I_ATTACHMENT_TYPE 'XLS'
      I_ATTACHMENT_SUBJECT MAIL_ATTACHMENT_SUBJECT
      I_ATT_CONTENT_HEX EXCEL_AS_SOLIX_STACK ).

      SEND_REQUEST->SET_DOCUMENTDOCUMENT ).

      * Envoie de l'email
      CALL METHOD SEND_REQUEST->SEND(
      RECEIVING
      RESULT SENT_TO_ALL ).

       

      With :   DATAGET_XLS            TYPE REF TO ZCL_ITAB_TO_EXCEL.

      and :

        method RUN.
      DATA LO_DATA_REF TYPE REF TO DATA.
      GET REFERENCE OF IT_OUT_REC INTO LO_DATA_REF.
      RV_XSTRING NEW ZCL_ITAB_TO_EXCEL)->ITAB_TO_XSTRINGLO_DATA_REF ).
      endmethod.

       

        METHOD ITAB_TO_XSTRING.

      FIELD-SYMBOLS<FS_DATA> TYPE ANY TABLE.
      DATAANY_BCS_EXCEPTION  TYPE REF TO CX_ROOT.
      DATADIAGNOSTIC         TYPE STRING.

      CLEAR RV_XSTRING.
      ASSIGN IR_DATA_REF->TO <FS_DATA>.

      TRY.
      CL_SALV_TABLE=>FACTORY(
      IMPORTING R_SALV_TABLE DATA(LO_TABLE)
      CHANGING  T_TABLE      <FS_DATA> ).

      DATA(LT_FCAT=
      CL_SALV_CONTROLLER_METADATA=>GET_LVC_FIELDCATALOG(
      R_COLUMNS      LO_TABLE->GET_COLUMNS)
      R_AGGREGATIONS LO_TABLE->GET_AGGREGATIONS).

      DATA(LO_RESULT=
      CL_SALV_EX_UTIL=>FACTORY_RESULT_DATA_TABLE(
      R_DATA         IR_DATA_REF
      T_FIELDCATALOG LT_FCAT ).

      CL_SALV_BS_TT_UTIL=>IF_SALV_BS_TT_UTIL~TRANSFORM(
      EXPORTING
      XML_TYPE      IF_SALV_BS_XML=>C_TYPE_XLSX
      XML_VERSION   CL_SALV_BS_A_XML_BASE=>GET_VERSION)
      R_RESULT_DATA LO_RESULT
      XML_FLAVOUR   IF_SALV_BS_C_TT=>C_TT_XML_FLAVOUR_EXPORT
      GUI_TYPE      IF_SALV_BS_XML=>C_GUI_TYPE_GUI
      IMPORTING
      XML           RV_XSTRING ).
      CATCH CX_ROOT INTO ANY_BCS_EXCEPTION.
      DIAGNOSTIC ANY_BCS_EXCEPTION->IF_MESSAGE~GET_TEXT).
      CLEAR RV_XSTRING.
      ENDTRY.

      ENDMETHOD.

       

      Thks if someone can see the problem and help. I still look at many blog and exemple but it don't help me to solve.