Convert any structure to Internal table format, Field text and values
data: stru_descr type ref to cl_abap_structdescr.
data: dummy.
data: data_structure type abap_abstypename.
data: lt_components type abap_compdescr_tab.
data: ls_email_data type zemail_data.
data: ls_fieldvalue(60000) type c. " Nvbug 1909188
field-symbols: <value> type any,
<component> type abap_compdescr.
stru_descr ?= cl_abap_typedescr=>describe_by_data( i_str_data ).
data_structure = stru_descr->absolute_name.
split data_structure at '=' into dummy data_structure.
append lines of stru_descr->components to lt_components.
loop at lt_components assigning <component> WHERE type_kind ne 'h' .
assign component <component>-name of structure i_str_data to <value>.
ls_email_data-fieldname = <component>-name.
write <value> to ls_fieldvalue.
condense ls_fieldvalue.
ls_email_data-structure = data_structure .
ls_email_data-fieldvalue = ls_fieldvalue.
append ls_email_data to et_mail_data.
endloop.
Conver Body to HTML template
SELECT SINGLE * FROM zemail_temp
INTO ls_zemail_temp
WHERE templ = i_templ
AND langu = i_langu.
IF sy-subrc <> 0.
SELECT SINGLE * FROM zemail_temp
INTO ls_zemail_temp
WHERE templ = i_templ
AND langu = ' ' .
CHECK sy-subrc EQ 0.
ENDIF.
xdocument = ls_zemail_temp-temp_data.
encoding = ls_zemail_temp-encoding.
TRY.
btf = cl_btf=>get_reference( ).
btf_document = btf->create_document( sy-langu ).
btf_document->set_content( text = xdocument encoding = encoding ).
lv_crm_doc = zcl_email_btf_document=>get_reference( ).
lv_crm_doc->set_document( btf_document ).
lv_crm_doc->collect_fields_tidy( IMPORTING ev_error = lv_error_string er_field_adm = lo_admin ).
lo_admin = lv_crm_doc->collect_fields( ).
lt_fields = lo_admin->get_all_fields( ).
lv_crm_doc->collect_links_tidy( IMPORTING er_link_adm = lv_link_adm ev_error = lv_error_string ).
lt_links = lv_link_adm->get_all_links( cl_btf_link=>co_element_a ).
lt_img = lv_link_adm->get_all_links( cl_btf_link=>co_element_img ).
IF NOT lt_img IS INITIAL.
APPEND LINES OF lt_img TO lt_links.
ENDIF.
CATCH cx_btf_runtime_error INTO l_exception.
CATCH cx_btf_parameter_error INTO lp_exception.
ENDTRY.
LOOP AT lt_fields INTO ls_field.
CLEAR: lv_name.
lv_name = ls_field-field->get_name( ).
LOOP AT mail_data INTO ls_mail_data WHERE structure = ls_zemail_temp-structure AND
fieldname = lv_name.
ls_field-field->set_value( ls_mail_data-fieldvalue ).
TRY.
ls_field-field->set_replace( t_yes ).
lv_replace_flag = 'X'.
CATCH cx_btf_parameter_error .
ENDTRY.
ENDLOOP.
ENDLOOP.
IF lv_replace_flag = 'X'.
TRY.
lv_crm_doc->replace_fields_tidy( EXPORTING ir_field_adm = lo_admin
IMPORTING ev_error = lv_error_string ).
CATCH cx_btf_runtime_error.
CATCH cx_btf_parameter_error.
ENDTRY.
ENDIF.
LOOP AT lt_links INTO ls_link.
lv_name = ls_link-link->get_link_in( ).
IF lv_name(6) = 'about:'.
LOOP AT mail_data INTO ls_mail_data WHERE structure = ls_zemail_temp-structure AND
fieldname = lv_name+6.
CHECK ls_mail_data-aboutlink IS NOT INITIAL.
ls_link-link->set_link_out( ls_mail_data-aboutlink ).
ls_link-link->set_link_changemode( cl_btf_link=>co_changemode_replace ).
lv_link_flag = 'X'.
ENDLOOP.
ELSEIF lv_name(5) = 'data:'.
READ TABLE mail_data INTO ls_mail_data WITH KEY structure = ls_zemail_temp-structure
fieldname = lv_name+5.
IF sy-subrc = 0.
DATA(lv_img) = |data:image/bmp;base64,{ ls_mail_data-fieldvalue }|.
ls_link-link->set_link_out( lv_img ).
ls_link-link->set_link_changemode( cl_btf_link=>co_changemode_replace ).
lv_link_flag = 'X'.
ENDIF.
ELSE.
ls_link-link->set_link_out( lv_string ).
ENDIF.
ENDLOOP.
IF lv_link_flag = 'X'.
TRY.
lv_crm_doc->replace_links_tidy( EXPORTING ir_link_adm = lv_link_adm
IMPORTING ev_error = lv_error_string ).
CATCH cx_btf_runtime_error .
ENDTRY.
ENDIF.
btf_document->get_content( IMPORTING text = xdocument encoding = encoding ).
xdocument_length = xstrlen( xdocument ).
CALL FUNCTION 'CRM_IC_XML_XSTRING2STRING'
EXPORTING
inxstring = xdocument
IMPORTING
outstring = cdocument.
REPLACE ALL OCCURRENCES OF '<br>' IN cdocument WITH '<br>'.
Send Email with HTML body
DATA : btf TYPE REF TO if_btf.
DATA : btf_document TYPE REF TO if_btf_document.
DATA : lv_crm_doc TYPE REF TO zcl_email_btf_document.
DATA : l_exception TYPE REF TO cx_btf_runtime_error.
DATA : ls_zemail_temp TYPE zemail_temp.
DATA : xdocument TYPE xstring.
DATA : encoding TYPE string.
DATA : lp_exception TYPE REF TO cx_btf_parameter_error.
DATA : lo_admin TYPE REF TO zcl_email_btf_field_adm.
DATA : lv_error_string TYPE string.
DATA : lt_fields TYPE zcrmt_im_btf_field_table.
DATA : ls_field TYPE zcrmt_im_btf_field.
DATA : lv_name TYPE string.
DATA : lv_replace_flag TYPE flag.
DATA : lv_link_flag TYPE flag.
DATA : lv_link_adm TYPE REF TO zcl_email_btf_link_adm.
DATA : lt_links TYPE zcrmt_im_btf_link_table.
DATA : lt_img TYPE zcrmt_im_btf_link_table.
DATA : ls_link TYPE zcrmt_im_btf_link.
DATA : codepage TYPE cpcodepage.
DATA : cdocument TYPE string.
DATA : cdocument_row(1000) TYPE c.
DATA : cdocument_table LIKE TABLE OF cdocument_row.
DATA : cdocument_length TYPE i.
DATA : cdocument_offset TYPE i.
DATA : xdocument_length TYPE i.
DATA : ls_recepients TYPE zmail_recepients.
DATA : ls_mail_data TYPE zemail_data.
DATA : ls_attachments TYPE zemail_attachment.
DATA : l_attachment_type TYPE so_obj_tp.
DATA : l_attachment_typ1 TYPE text255.
DATA : l_attach_type_len TYPE i.
DATA : l_attachment_subject TYPE so_obj_des.
DATA : l_attachment_size TYPE so_obj_len.
DATA : l_att_content_hex TYPE solix_tab.
DATA : lv_length TYPE i.
DATA : l_dummy TYPE c.
DATA : lt_email_address TYPE bcsy_smtpa.
DATA : lv_type TYPE so_obj_tp VALUE 'HTM'.
DATA : lt_mail_text TYPE bcsy_text.
DATA : lt_header TYPE bcsy_text.
DATA : l_send_request TYPE REF TO cl_bcs.
DATA : l_document TYPE REF TO cl_document_bcs.
DATA : l_sender TYPE REF TO if_sender_bcs.
DATA : l_recipient TYPE REF TO if_recipient_bcs.
DATA : l_exception_info TYPE REF TO if_os_exception_info.
DATA : l_bcs_exception TYPE REF TO cx_bcs.
DATA : lv_num_rows TYPE i.
DATA : lv_text_length TYPE so_obj_len.
DATA : lv_sender_address TYPE ad_smtpadr.
DATA : l_uname TYPE sy-uname.
DATA : lv_reciever_address TYPE ad_smtpadr.
DATA : lv_subject TYPE so_obj_des.
DATA : lv_text_line TYPE soli,
l_attachment_header TYPE soli_tab.
SELECT SINGLE * FROM zemail_temp INTO ls_zemail_temp WHERE templ = i_templ AND langu = i_langu.
IF sy-subrc <> 0.
SELECT SINGLE * FROM zemail_temp INTO ls_zemail_temp WHERE templ = i_templ AND langu = ' ' .
ENDIF.
CHECK sy-subrc EQ 0.
xdocument = ls_zemail_temp-temp_data.
encoding = ls_zemail_temp-encoding.
TRY.
btf = cl_btf=>get_reference( ).
btf_document = btf->create_document( sy-langu ).
btf_document->set_content( text = xdocument encoding = encoding ).
lv_crm_doc = zcl_email_btf_document=>get_reference( ).
lv_crm_doc->set_document( btf_document ).
lv_crm_doc->collect_fields_tidy( IMPORTING ev_error = lv_error_string er_field_adm = lo_admin ).
lo_admin = lv_crm_doc->collect_fields( ).
lt_fields = lo_admin->get_all_fields( ).
lv_crm_doc->collect_links_tidy( IMPORTING er_link_adm = lv_link_adm ev_error = lv_error_string ).
lt_links = lv_link_adm->get_all_links( cl_btf_link=>co_element_a ).
lt_img = lv_link_adm->get_all_links( cl_btf_link=>co_element_img ).
IF NOT lt_img IS INITIAL.
APPEND LINES OF lt_img TO lt_links.
ENDIF.
CATCH cx_btf_runtime_error INTO l_exception.
CATCH cx_btf_parameter_error INTO lp_exception.
ENDTRY.
LOOP AT lt_fields INTO ls_field.
CLEAR: lv_name.
lv_name = ls_field-field->get_name( ).
LOOP AT mail_data INTO ls_mail_data WHERE structure = ls_zemail_temp-structure AND
fieldname = lv_name.
ls_field-field->set_value( ls_mail_data-fieldvalue ).
TRY.
ls_field-field->set_replace( t_yes ).
lv_replace_flag = 'X'.
CATCH cx_btf_parameter_error .
ENDTRY.
ENDLOOP.
ENDLOOP.
IF lv_replace_flag = 'X'.
TRY.
lv_crm_doc->replace_fields_tidy( EXPORTING ir_field_adm = lo_admin
IMPORTING ev_error = lv_error_string ).
CATCH cx_btf_runtime_error.
CATCH cx_btf_parameter_error.
ENDTRY.
ENDIF.
LOOP AT lt_links INTO ls_link.
lv_name = ls_link-link->get_link_in( ).
CHECK lv_name(6) = 'about:'.
LOOP AT mail_data INTO ls_mail_data WHERE structure = ls_zemail_temp-structure AND
fieldname = lv_name+6.
CHECK ls_mail_data-aboutlink IS NOT INITIAL.
ls_link-link->set_link_out( ls_mail_data-aboutlink ).
ls_link-link->set_link_changemode( cl_btf_link=>co_changemode_replace ).
lv_link_flag = 'X'.
ENDLOOP.
ENDLOOP.
IF lv_link_flag = 'X'.
TRY.
lv_crm_doc->replace_links_tidy( EXPORTING ir_link_adm = lv_link_adm
IMPORTING ev_error = lv_error_string ).
CATCH cx_btf_runtime_error .
ENDTRY.
ENDIF.
btf_document->get_content( IMPORTING text = xdocument encoding = encoding ).
xdocument_length = xstrlen( xdocument ).
CALL FUNCTION 'CRM_IC_XML_XSTRING2STRING'
EXPORTING
inxstring = xdocument
IMPORTING
outstring = cdocument.
REPLACE ALL OCCURRENCES OF '<' IN cdocument WITH '<'.
REPLACE ALL OCCURRENCES OF '>' IN cdocument WITH '>'.
CALL FUNCTION 'SCMS_STRING_TO_FTEXT'
EXPORTING
text = cdocument
TABLES
ftext_tab = lt_mail_text.
TRY.
* Create persistent send request
l_send_request = cl_bcs=>create_persistent( ).
* Create document
DESCRIBE TABLE lt_mail_text LINES lv_num_rows.
lv_num_rows = lv_num_rows * 255.
MOVE lv_num_rows TO lv_text_length.
lv_subject = mail_subject.
l_document = cl_document_bcs=>create_document(
i_type = lv_type
i_text = lt_mail_text
i_length = lv_text_length
i_subject = lv_subject
i_importance = '1' ). "#EC *
* Add attachment for the mail
LOOP AT mail_attachments INTO ls_attachments.
CLEAR : l_attachment_type,
l_attachment_subject,
l_attachment_size,
l_att_content_hex,
l_attachment_header,
lv_length.
SPLIT ls_attachments-file_name AT '.' INTO l_dummy l_attachment_typ1.
l_attachment_type = l_attachment_typ1.
l_attach_type_len = strlen( l_attachment_typ1 ).
IF l_attach_type_len GT 3.
CONCATENATE '<(>&< )>SO_FILENAME=' ls_attachments-file_name INTO lv_text_line.
APPEND lv_text_line TO l_attachment_header.
ENDIF.
TRANSLATE l_attachment_type TO UPPER CASE.
l_attachment_subject = ls_attachments-file_name.
CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
EXPORTING
buffer = ls_attachments-filedata
IMPORTING
output_length = lv_length
TABLES
binary_tab = l_att_content_hex.
l_attachment_size = lv_length.
TRY.
CALL METHOD l_document->add_attachment
EXPORTING
i_attachment_type = l_attachment_type
i_attachment_subject = l_attachment_subject
i_attachment_size = l_attachment_size
i_att_content_hex = l_att_content_hex.
CATCH cx_document_bcs .
ENDTRY.
ENDLOOP.
* Add document to send request
CALL METHOD l_send_request->set_document( l_document ).
* Get sender object
IF i_sender IS INITIAL.
lv_sender_address = sy-uname.
ELSEIF NOT i_sender-uname IS INITIAL.
lv_sender_address = i_sender-uname.
ELSEIF NOT i_sender-email IS INITIAL.
lv_sender_address = i_sender-email.
ENDIF.
IF lv_sender_address CA '@'.
TRANSLATE lv_sender_address TO UPPER CASE.
l_sender = cl_cam_address_bcs=>create_internet_address( lv_sender_address ).
ELSE.
l_uname = lv_sender_address .
l_sender = cl_sapuser_bcs=>create( l_uname ).
ENDIF.
* Add sender
CALL METHOD l_send_request->set_sender
EXPORTING
i_sender = l_sender.
* Create recipient
LOOP AT to_mail_recipients INTO ls_recepients .
IF ls_recepients-email IS NOT INITIAL.
TRANSLATE ls_recepients-email TO UPPER CASE.
lv_reciever_address = ls_recepients-email.
l_recipient = cl_cam_address_bcs=>create_internet_address( lv_reciever_address ).
ELSE.
l_uname = ls_recepients-uname.
l_recipient = cl_sapuser_bcs=>create( l_uname ).
ENDIF.
* Add recipient with its respective attributes to send request
CALL METHOD l_send_request->add_recipient
EXPORTING
i_recipient = l_recipient
i_express = ' '
i_copy = ' '
i_blind_copy = ' '.
ENDLOOP.
LOOP AT cc_mail_recipients INTO ls_recepients .
IF ls_recepients-email IS NOT INITIAL.
TRANSLATE ls_recepients-email TO UPPER CASE.
lv_reciever_address = ls_recepients-email.
l_recipient = cl_cam_address_bcs=>create_internet_address( lv_reciever_address ).
ELSE.
l_uname = ls_recepients-uname.
l_recipient = cl_sapuser_bcs=>create( l_uname ).
ENDIF.
* Add recipient with its respective attributes to send request
CALL METHOD l_send_request->add_recipient
EXPORTING
i_recipient = l_recipient
i_express = ' '
i_copy = 'X'
i_blind_copy = ' '.
ENDLOOP.
LOOP AT bcc_mail_recipients INTO ls_recepients .
IF ls_recepients-email IS NOT INITIAL.
TRANSLATE ls_recepients-email TO UPPER CASE.
lv_reciever_address = ls_recepients-email.
l_recipient = cl_cam_address_bcs=>create_internet_address( lv_reciever_address ).
ELSE.
l_uname = ls_recepients-uname.
l_recipient = cl_sapuser_bcs=>create( l_uname ).
ENDIF.
* Add recipient with its respective attributes to send request
CALL METHOD l_send_request->add_recipient
EXPORTING
i_recipient = l_recipient
i_express = ' '
i_copy = ' '
i_blind_copy = 'X'.
ENDLOOP.
l_send_request->set_message_subject( mail_subject ).
* Send document
CALL METHOD l_send_request->send( ).
IF i_send = 'X'.
COMMIT WORK .
ENDIF.
CATCH cx_bcs INTO l_bcs_exception.
EXIT.
ENDTRY.