Skip to Content
Technical Articles
Author's profile photo Yasho Ratna Gupta

Email Template with Table in Email Body (SAP_Basis release 750 or above and S/4)

Introduction: In this article, I’ll demonstrate, how we can draw an HTML table in an E-mail body by using an E-mail template with all the styles we can do in Microsoft Word and a simple way to do this.

In SAP_BASIS 750 and above releases or in S/4 systems, we have an Email template feature available along with a CDS view functionality.

Please visit the blog https://blogs.sap.com/2019/10/12/e-mail-templates-in-s4-hana/  to get the initial overview of the email template.

Step 1: We can create an Email template in the object navigator by navigating to the Email template option shown as per the image below.

Step 2: Next, simply create Email content (Email Body) in MS Word, along with a table including a header and only one blank row for table data.

Step 3: Now save the document in .htm format as per below.

Step 4: Next open the e-mail template and choose the ‘Load local file’ option.

Step 5: Moving further, identify where the blank table row is in the Body HTML content.

Step 6: Copy cell attributes to have in the code. Remove the blank table row <tr>…..</tr> along with its all cells and maintain a placeholder e.g. IT_FLIGHTS in Email Body.

Step 7: Replace IT_FLIGHTS in the code as per snippet.

DATA(lv_cell_attrib) = ` width=85 valign=top style='width:77.95pt;border-top:none;border-left:`
                         && `none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;`
                         && `mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;`
                         && `mso-border-alt:solid windowtext .5pt;background:white;mso-background-themecolor:`
                         && `background1;padding:0in 5.4pt 0in 5.4pt'>`
                         && `<p class=MsoNormal align=center style='text-align:center'><span`
                         && `style='mso-bidi-font-family:Calibri'><o:p>`.

  LOOP AT lt_sflights ASSIGNING FIELD-SYMBOL(<fs_sflights>).
    lv_content = |{ lv_content }<tr>|.
    lv_content = |{ lv_content }<td{ lv_cell_attrib && <fs_sflights>-carrid }</o:p></span></p></td>|.
    lv_content = |{ lv_content }<td{ lv_cell_attrib && <fs_sflights>-connid }</o:p></span></p></td>|.
    lv_content = |{ lv_content }<td{ lv_cell_attrib && <fs_sflights>-fldate }</o:p></span></p></td>|.
    lv_content = |{ lv_content }<td{ lv_cell_attrib && <fs_sflights>-price }</o:p></span></p></td>|.
    lv_content = |{ lv_content }<td{ lv_cell_attrib && <fs_sflights>-planetype }</o:p></span></p></td>|.
    lv_content = |{ lv_content }<td{ lv_cell_attrib && <fs_sflights>-paymentsum }</o:p></span></p></td>|.
    lv_content = |{ lv_content }</tr>|.
  ENDLOOP.

REPLACE 'IT_FLIGHTS' WITH lv_content INTO lv_body_html.

 

Step 8: Next trigger an email to see the result. We can clearly see all the details are present in table format in the email body.

Code Snippet: Please refer complete code as below.

PARAMETERS : p_email TYPE ad_smtpadr.   "abc@gmail.com
CONSTANTS:
  lc_priority    TYPE bcs_docimp VALUE '1',
  lc_template_id TYPE smtg_tmpl_id VALUE 'ZTEST'.

DATA: lv_content TYPE string.

SELECT carrid,
        connid,
        fldate,
        price,
        planetype,
        paymentsum
        FROM sflight
        INTO TABLE @DATA(lt_sflights)
        UP TO 10 ROWS.
IF sy-subrc EQ 0.

  DATA(lo_email_api_ref) = cl_smtg_email_api=>get_instance( iv_template_id = lc_template_id ).
  DATA(lo_send_request_ref) = cl_bcs=>create_persistent( ).
  DATA(i_cds_key) = VALUE if_smtg_email_template=>ty_gt_data_key( ).

  " Get the RawHTML Content and Replace the palceholder with the INV Details in the email
  lo_email_api_ref->render( EXPORTING
                              iv_language = sy-langu
                              it_data_key = i_cds_key
                            IMPORTING
                              ev_subject = DATA(lv_subject)
                              ev_body_html = DATA(lv_body_html) ).

  DATA(lv_cell_attrib) = ` width=85 valign=top style='width:77.95pt;border-top:none;border-left:`
                         && `none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;`
                         && `mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;`
                         && `mso-border-alt:solid windowtext .5pt;background:white;mso-background-themecolor:`
                         && `background1;padding:0in 5.4pt 0in 5.4pt'>`
                         && `<p class=MsoNormal align=center style='text-align:center'><span`
                         && `style='mso-bidi-font-family:Calibri'><o:p>`.

  LOOP AT lt_sflights ASSIGNING FIELD-SYMBOL(<fs_sflights>).
    lv_content = |{ lv_content }<tr>|.
    lv_content = |{ lv_content }<td{ lv_cell_attrib && <fs_sflights>-carrid }</o:p></span></p></td>|.
    lv_content = |{ lv_content }<td{ lv_cell_attrib && <fs_sflights>-connid }</o:p></span></p></td>|.
    lv_content = |{ lv_content }<td{ lv_cell_attrib && <fs_sflights>-fldate }</o:p></span></p></td>|.
    lv_content = |{ lv_content }<td{ lv_cell_attrib && <fs_sflights>-price }</o:p></span></p></td>|.
    lv_content = |{ lv_content }<td{ lv_cell_attrib && <fs_sflights>-planetype }</o:p></span></p></td>|.
    lv_content = |{ lv_content }<td{ lv_cell_attrib && <fs_sflights>-paymentsum }</o:p></span></p></td>|.
    lv_content = |{ lv_content }</tr>|.
  ENDLOOP.

  REPLACE 'IT_FLIGHTS' WITH lv_content INTO lv_body_html.

  DATA(lv_body_html_soli) = cl_bcs_convert=>string_to_soli( lv_body_html ).  " Build HTML for Sending
  DATA(lo_multipart_ref) = NEW cl_gbt_multirelated_service( ).

  lo_multipart_ref->set_main_html(
      EXPORTING
        content     = lv_body_html_soli
        description = 'flightDetails' ).

*Create & Set the Email Document
  DATA(lo_doc_bcs_ref) = cl_document_bcs=>create_from_multirelated(
          EXPORTING
            i_subject          = CONV so_obj_des( lv_subject )               "Set the Email Subject
            i_importance       = lc_priority
            i_multirel_service = lo_multipart_ref ).

  lo_send_request_ref->set_document( lo_doc_bcs_ref  ).

*Populate sender name
  DATA(lo_sender_ref) = cl_sapuser_bcs=>create( sy-uname ).
  IF lo_sender_ref IS BOUND.
    lo_send_request_ref->set_sender( i_sender = lo_sender_ref ).
  ENDIF.

  DATA(lo_recipient_ref) = cl_cam_address_bcs=>create_internet_address( p_email ).
  IF lo_recipient_ref IS BOUND.
*Add recipient to send request
    lo_send_request_ref->add_recipient(
      EXPORTING
        i_recipient = lo_recipient_ref
        i_express   = abap_true ).
  ENDIF.

* Send email
  DATA(lv_sent_to_all) = lo_send_request_ref->send( ).

* If e-mail is successful then do commit work
  IF lv_sent_to_all = abap_true.
    COMMIT WORK AND WAIT.
  ENDIF.
ENDIF.

This concludes the functionality.

Thank you for reading the article. I truly hope you liked it. Please feel free to share your thoughts and suggestions.

Assigned Tags

      Be the first to leave a comment
      You must be Logged on to comment or reply to a post.