Introduction (Object Oriented Way of Sending an email with PDF as an Attachment)
This blog entry is an expansion of the one composed by me on the subject “Item Arranged approach to sending an email from ABAP side.” Object Oriented Way of Sending an email with PDF as an Attachment.
In this blog entry as well, Object Oriented Way of Sending an email with PDF as an Attachment, you will figure out how to send an email utilizing object situated way, yet with a PDF as a connection. The PDF for this situation will produced by a SMARTFORM.
Prerequisite (Object Oriented Way of Sending an email with PDF as an Attachment)
- A Smartform – It tends to be an essential smartform with a short message, we simply need it for show reason.
- Essential information on involving class CL_BCS for email sending.
- A trigger program.
Steps
Create a Smartform with any Z/Y name.
I made with the name “ZTEST_SMARTFORM_ATTACHMENT”. It simply have a short text as beneath:
Create an executable program in SE38.
I made it with the name “ZTEST_EMAIL_WITH_ATTACHMENT”.
DATA DECLARATIONS
(Please excuse for the naming convention used)
CONSTANTS:
lc_sfname TYPE tdsfname VALUE 'ZTEST_SMARTFORM_ATTACHMENT'. "Name of Smartform
"Local Object References
DATA: lo_bcs TYPE REF TO cl_bcs,
lo_doc_bcs TYPE REF TO cl_document_bcs,
lo_recep TYPE REF TO if_recipient_bcs,
lo_sapuser_bcs TYPE REF TO cl_sapuser_bcs,
lo_cx_bcx TYPE REF TO cx_bcs.
"Local Internal Tables.
DATA: lt_otfdata TYPE ssfcrescl,
lt_binary_content TYPE solix_tab,
lt_text TYPE bcsy_text,
lt_pdf_tab TYPE STANDARD TABLE OF tline,
lt_otf TYPE STANDARD TABLE OF itcoo.
"Local Structures
DATA: ls_ctrlop TYPE ssfctrlop,
ls_outopt TYPE ssfcompop.
"Local Variables
DATA: lv_bin_filesize TYPE so_obj_len,
lv_sent_to_all TYPE os_boolean,
lv_bin_xstr TYPE xstring,
lv_fname TYPE rs38l_fnam,
lv_string_text TYPE string.
Get the name of the function module of the SMARTFORM .
CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
EXPORTING
formname = lc_sfname
IMPORTING
fm_name = lv_fname
EXCEPTIONS
no_form = 1
no_function_module = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
Fill the Control Parameters, output options and call the FM of your SMARTFORM.
We will get the OTF data generated by the smartform in internal table “lt_otf”.
"Control Parameters
ls_ctrlop-getotf = 'X'.
ls_ctrlop-no_dialog = 'X'.
ls_ctrlop-preview = space.
"Output Options
ls_outopt-tdnoprev = 'X'.
ls_outopt-tddest = 'LOCL'.
ls_outopt-tdnoprint = 'X'. "No printing from print preview
CALL FUNCTION lv_fname
EXPORTING
control_parameters = ls_ctrlop
output_options = ls_outopt
IMPORTING
job_output_info = lt_otfdata
EXCEPTIONS
formatting_error = 1
internal_error = 2
send_error = 3
user_canceled = 4
OTHERS = 5.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
lt_otf[] = lt_otfdata-otfdata[].
Convert OTF Data to XSTRING “lv_bin_xstr”.
CALL FUNCTION 'CONVERT_OTF'
EXPORTING
format = 'PDF' "PDF to get pdf output
IMPORTING
bin_filesize = lv_bin_filesize
bin_file = lv_bin_xstr
TABLES
otf = lt_otf[]
lines = lt_pdf_tab[]
EXCEPTIONS
err_max_linewidth = 1
err_format = 2
err_conv_not_possible = 3
OTHERS = 4.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
Convert the XSTRING to Binary table “lt_binary_content”.
***Xstring to binary
CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
EXPORTING
buffer = lv_bin_xstr
TABLES
binary_tab = lt_binary_content.
Prepare to Send Email
Create persistent send request
TRY.
* -------- create persistent send request ------------------------
lo_bcs = cl_bcs=>create_persistent( ).
Create Email Body
"Line-1
CONCATENATE 'Dear Colleague' cl_abap_char_utilities=>newline INTO lv_string_text.
APPEND lv_string_text TO lt_text.
CLEAR lv_string_text.
"Line-2
CONCATENATE 'Please find attached a test smartform.'
cl_abap_char_utilities=>newline INTO lv_string_text.
APPEND lv_string_text TO lt_text.
CLEAR lv_string_text.
"Line-3
APPEND 'Best Regards,' TO lt_text.
"Line-4
APPEND 'Systems Administrator.' TO lt_text.
Create Email
*---------------------------------------------------------------------
*-----------------& Create Document *------------------------
*---------------------------------------------------------------------
lo_doc_bcs = cl_document_bcs=>create_document(
i_type = 'RAW'
i_text = lt_text[]
i_length = '12'
i_subject = 'Test Email' ). "Subject of the Email
Add attachment to document and Add document to send request
The interior table “lt_binary_content” contains the substance of our connection.
*---------------------------------------------------------------------
*-----------------& Add attachment to document *----------------
*---------------------------------------------------------------------
* BCS expects document content here e.g. from document upload
* binary_content = ...
CALL METHOD lo_doc_bcs->add_attachment
EXPORTING
i_attachment_type = 'PDF'
i_attachment_size = lv_bin_filesize
i_attachment_subject = 'Test Email'
i_att_content_hex = lt_binary_content.
* add document to send request
CALL METHOD lo_bcs->set_document( lo_doc_bcs ).
Set Sender
Note: this is fundamental provided that you need to set the source unique in relation to genuine client (SY-UNAME). In any case source is set consequently with genuine client.
FYI. I have remarked the code in my program.
*---------------------------------------------------------------------
*------------------------& Set Sender *-------------------------
*---------------------------------------------------------------------
* lo_sapuser_bcs = cl_sapuser_bcs=>create( sy-uname ).
* CALL METHOD lo_bcs->set_sender
* EXPORTING
* i_sender = lo_sapuser_bcs.
Add recipient (e–mail address)
You can involve various beneficiaries too.
lo_recep = cl_cam_address_bcs=>create_internet_address(
'test@test123.com' ).
"Add recipient with its respective attributes to send request
CALL METHOD lo_bcs->add_recipient
EXPORTING
i_recipient = lo_recep
i_express = 'X'.
Set Send Immediately
You can set this to promptly send your email.
CALL METHOD lo_bcs->set_send_immediately
EXPORTING
i_send_immediately = 'X'.
Send the Email
*---------------------------------------------------------------------
*-----------------& Send the email *-----------------------------
*---------------------------------------------------------------------
CALL METHOD lo_bcs->send(
EXPORTING
i_with_error_screen = 'X'
RECEIVING
result = lv_sent_to_all ).
IF lv_sent_to_all IS NOT INITIAL.
COMMIT WORK.
ENDIF.
*---------------------------------------------------------------------
*-----------------& Exception Handling *------------------------
*---------------------------------------------------------------------
CATCH cx_bcs INTO lo_cx_bcx.
"Appropriate Exception Handling
WRITE: 'Exception:', lo_cx_bcx->error_type.
ENDTRY.
Conclusion
This is one of the approach to sending an email with a PDF connection.
For any issues, enhancements, augmentations or some other worries, kindly go ahead and get in touch with us.
I look forward for your criticism and ideas.
Continue to learn!! Continue to get to the next level!!
YOU MAY LIKE THIS
Epic Evolution of ABAP Programming
Mastering the Basics of SAP ABAP: A Comprehensive Guide
How to check your custom ABAP code for SAP BTP ABAP Environment