Additional Blogs by SAP
cancel
Showing results for 
Search instead for 
Did you mean: 
Former Member
This blog explains how to make use of Netweaver technologies smartforms and SAPConnect to prepare the content and send email.
Smartforms
Smart Forms provides graphical tool to prepare the content. Thus, a user who is familiar with the tool but has only rudimentary programming knowledge can configure forms with data from an SAP system for the relevant business processes. A function module gets generated when the smartform is activated. The logic of the form is mapped entirely in the Smart Form. To print a form, you call it from within an application program, in which you retrieve the application data to be merged into the form. As data retrieval and form logic are separated, you must only adapt the Smart Form if changes to the form logic are necessary. The application program passes the data via a function module interface to the Smart Form. For more information on smartforms refer to Reference section.
SAPConnect
SAPconnect provides a standard interface for external communication, which supports sending with telecommunication services, such as FAX, text message (pager/SMS), Internet mail, and X.400, as well as sending to printers and between different SAP systems. It enables external communication components to be connected to the SAP system. In this article we only deal with email functionality of SAPConnect.
Fusing both technologies together
Smartform can be configured to send an email or fax or print when the content is retrieved via the generated function module. However the sent email will be in the form of PDF document. Email notification in html format is achieved with the following steps:
  1. Create the smartform with relevant content.
  2. Activate the smartform to generate the function module.
  3. Use the generated function module to retrieve the content in html format.
  4. Transform the content (eg: html tags) as needed.
  5. Use the SAPConnect to send the email.
Creation of smartform
Create or modify a smartform using the transaction smartforms. You can have html content like links for images as shown below.
Activate the form to generate the function module.
Code to fetch the smartform content in html format
Following code will get the smartform generated function module. Using the generated function module, it fetches the content in HTML format. From address can be SAP user id or an internal email address. Email address maintained SU01 transaction of the SAP user will appear in the from part of the email.
*&--------------------------------------------------------------------* *& Form SEND_SMARTFORM_HTML_EMAIL *&--------------------------------------------------------------------* * RETREIVES CONTENT FROM SMARTFORM AND SENDS EMAIL TO THE RECEIVERS *---------------------------------------------------------------------* * -->ET_RETURN ERROR OR INFORMATIONAL MESSAGES * -->RECEIVERS EMAIL RECEPIENTS * -->FORM_NAME FORM NAME * -->MAIL_SUBJECT EMAIL SUBJECT *---------------------------------------------------------------------* FORM SEND_SMARTFORM_HTML_EMAIL TABLES ET_RETURN TYPE BAPIRET2_TAB RECEIVERS STRUCTURE SOMLRECI1 "receivers USING IV_SMARTFORM TYPE TDSFNAME SEND_PARTNER TYPE BU_PARTNER "from address MAIL_SUBJECT TYPE SO_OBJ_DES. DATA: CONTROL_PARAMETERS TYPE SSFCTRLOP, OUTPUT_OPTIONS TYPE SSFCOMPOP, DOCUMENT_OUTPUT_INFO TYPE SSFCRESPD, JOB_OUTPUT_INFO TYPE SSFCRESCL, JOB_OUTPUT_OPTIONS TYPE SSFCRESOP, XSFPARAM_LINE TYPE SSFXSFP, P_HTML TYPE TRFRESULT, P_GRAPHICS TYPE TSF_XSF_GR, FORM_NAME TYPE RS38L_FNAM. " generated function module name DATA: WA_RETURN TYPE BAPIRET2. CONSTANTS: C_GR_DIR TYPE TDTEXT VALUE 'MYGRAPHICS/'. "#EC NOTEXT *SET SMARTFORM OUTPUT OPTIONS OUTPUT_OPTIONS-XSFCMODE = 'X'. "#EC NOTEXT OUTPUT_OPTIONS-XSF = 'X'. "#EC NOTEXT OUTPUT_OPTIONS-XSFOUTMODE = 'A'. "#EC NOTEXT OUTPUT_OPTIONS-XSFFORMAT = 'X'. "#EC NOTEXT CLEAR OUTPUT_OPTIONS-XSFOUTDEV. XSFPARAM_LINE-NAME = 'GRAPHICS'. "#EC NOTEXT XSFPARAM_LINE-VALUE = 'EXTRACT'. "#EC NOTEXT APPEND XSFPARAM_LINE TO OUTPUT_OPTIONS-XSFPARS. XSFPARAM_LINE-NAME = 'GRAPHICS-DIRECTORY'. "#EC NOTEXT XSFPARAM_LINE-VALUE = C_GR_DIR. APPEND XSFPARAM_LINE TO OUTPUT_OPTIONS-XSFPARS. XSFPARAM_LINE-NAME = 'CONTENT-ID'. "#EC NOTEXT XSFPARAM_LINE-VALUE = 'ENABLE'. "#EC NOTEXT APPEND XSFPARAM_LINE TO OUTPUT_OPTIONS-XSFPARS. * SILENT MODE ON OUTPUT_OPTIONS-TDIMMED = SPACE. OUTPUT_OPTIONS-TDNEWID = SPACE. CONTROL_PARAMETERS-NO_DIALOG = 'X'. "#EC NOTEXT * Get the generated function name of the smartform CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME' "#EC NOTEXT EXPORTING FORMNAME = IV_SMARTFORM IMPORTING FM_NAME = FORM_NAME EXCEPTIONS NO_FORM = 1 NO_FUNCTION_MODULE = 2 OTHERS = 3. IF SY-SUBRC <> 0. * Error receiving the generated function module CLEAR WA_RETURN. MESSAGE E005 WITH IV_SMARTFORM INTO WA_RETURN-MESSAGE. WA_RETURN-TYPE = 'E'. "#EC NOTEXT INSERT WA_RETURN INTO TABLE ET_RETURN. EXIT. ENDIF. * Get the smartform content CALL FUNCTION FORM_NAME EXPORTING CONTROL_PARAMETERS = CONTROL_PARAMETERS OUTPUT_OPTIONS = OUTPUT_OPTIONS *pass other application specific parameters (eg order number, items ). IMPORTING DOCUMENT_OUTPUT_INFO = DOCUMENT_OUTPUT_INFO JOB_OUTPUT_INFO = JOB_OUTPUT_INFO JOB_OUTPUT_OPTIONS = JOB_OUTPUT_OPTIONS EXCEPTIONS FORMATTING_ERROR =1 INTERNAL_ERROR =2 SEND_ERROR =3 USER_CANCELED = 4. IF SY-SUBRC <> 0. * FAILED TO GET CONTENT FROM SMARTFORM CLEAR WA_RETURN. MESSAGE E012 WITH FORM_NAME SY-SUBRC INTO WA_RETURN-MESSAGE. INSERT WA_RETURN INTO TABLE ET_RETURN. EXIT. ENDIF. P_HTML = JOB_OUTPUT_INFO-XMLOUTPUT-TRFRESULT. P_GRAPHICS[] = JOB_OUTPUT_INFO-XMLOUTPUT-XSFGR[]. * send the extracted content all the recipients PERFORM SEND_HTML_EMAIL TABLES ET_RETURN RECEIVERS USING P_HTML P_GRAPHICS[] SEND_PARTNER MAIL_SUBJECT. ENDFORM. "SEND_SMARTFORM_HTML_EMAIL

Code to send the email
Following code will transform the html content into displayable format and send email to all the recipients. Note: This form also handles the images (static) defined in the smartform, as well as the images defined with html IMG tag (eg: URL link to image on the network).
*&--------------------------------------------------------------------* *& Form SEND_HTML_EMAIL *&--------------------------------------------------------------------* * Send the email provided the content and other details *---------------------------------------------------------------------* * -->P_RETURN Error messages * -->P_RECEIVERS emailr recipients * -->P_HTML html text * -->P_GRAPHICS html graphics if any * -->P_SUBJECT subject of the email *---------------------------------------------------------------------* FORM SEND_HTML_EMAIL TABLES P_RETURN TYPE BAPIRET2_TAB P_RECEIVERS STRUCTURE SOMLRECI1 USING P_HTML TYPE TRFRESULT P_GRAPHICS TYPE TSF_XSF_GR SEND_PARTNER TYPE BU_PARTNER P_SUBJECT TYPE SO_OBJ_DES. DATA: L_GRAPHIC TYPE SSF_XSF_GR. CONSTANTS: C_GR_DIR TYPE TDTEXT VALUE 'MYGRAPHICS/'. "#EC NOTEXT DATA: HTML_DATA TYPE TRFRESULT, GRAPHICS TYPE TSF_XSF_GR, LV_SENT_TO_ALL TYPE BOOLEAN, LV_SEND_ADDRESS TYPE ADR6-SMTP_ADDR, LI_SENDER TYPE REF TO IF_SENDER_BCS, RECEIVER TYPE SOMLRECI1. DATA: LO_BCS TYPE REF TO CL_BCS, LO_DOC_BCS TYPE REF TO CL_DOCUMENT_BCS, LO_MIME_HELPER TYPE REF TO CL_GBT_MULTIRELATED_SERVICE, LO_RECIPIENT TYPE REF TO IF_RECIPIENT_BCS. DATA: L_FILENAME TYPE STRING, LT_SOLI TYPE SOLI_TAB, LT_SOLIX TYPE SOLIX_TAB, LS_SOLI TYPE SOLI, LS_SOLIX TYPE SOLIX. DATA: L_HTML_RAW LIKE LINE OF HTML_DATA-CONTENT, HTML_XSTR TYPE XSTRING, HTML_STR TYPE STRING, HTML_LEN TYPEI, L_OFFSET TYPE I, L_LENGTH TYPE I, L_DIFF TYPE I, L_CONTENT_ID TYPE STRING, L_CONTENT_TYPE TYPE W3CONTTYPE, L_OBJ_LEN TYPE SO_OBJ_LEN, GR_XSTR TYPE XSTRING, L_GR_RAW TYPE BAPICONTEN, L_USERNAME TYPE UNAME, L_MAIL_ADDRESS TYPE AD_SMTPADR, WA_RETURN TYPE BAPIRET2. DATA: LV_SEND_REQ_BCS TYPE REF TO CX_SEND_REQ_BCS, LV_ADDRESS_BCS TYPE REF TO CX_ADDRESS_BCS, LV_GBT_MIME TYPE REF TO CX_GBT_MIME, LV_BCOM_MIME TYPE REF TO CX_BCOM_MIME, LV_DOCUMENT_BCS TYPE REF TO CX_DOCUMENT_BCS. CLEAR HTML_XSTR. LOOP AT P_HTML-CONTENT INTO L_HTML_RAW. CONCATENATE HTML_XSTR L_HTML_RAW INTO HTML_XSTR IN BYTE MODE. ENDLOOP. HTML_XSTR = HTML_XSTR(P_HTML-LENGTH). CALL FUNCTION 'SCP_TRANSLATE_CHARS' "#EC NOTEXT EXPORTING INBUFF = HTML_XSTR INCODE = '4110' " UTF-8 "#EC NOTEXT * OUTCODE = '0000' " ACTUAL CODEPAGE CSUBST = 'X' "#EC NOTEXT SUBSTC_SPACE = 'X' "#EC NOTEXT IMPORTING OUTBUFF = HTML_STR OUTUSED = HTML_LEN EXCEPTIONS OTHERS = 1. * CHANGE ENCODING UTF-8 TO LATIN1 REPLACE ALL OCCURRENCES OF 'UTF-8' IN HTML_STR WITH 'iso-8859-1' IGNORING CASE. "#EC NOTEXT *HACK THE HTML CODE GENERATED BY SARTFORM TO MAKE THE *EXTERNAL IMAGES APPEAR AS  TAG IN HTML REPLACE ALL OCCURRENCES OF '' IN HTML_STR WITH '/>' IGNORING CASE. "#EC NOTEXT REPLACE ALL OCCURRENCES OF '' IN HTML_STR WITH '' IGNORING CASE. "#EC NOTEXT REPLACE ALL OCCURRENCES OF '<' IN HTML_STR WITH '<' IGNORING CASE. "#EC NOTEXT REPLACE ALL OCCURRENCES OF '>' IN HTML_STR WITH '>' IGNORING CASE. "#EC NOTEXT HTML_LEN = STRLEN( HTML_STR ). L_OFFSET = 0. L_LENGTH = 255. WHILE L_OFFSET < HTML_LEN. L_DIFF = HTML_LEN - L_OFFSET. IF L_DIFF > L_LENGTH. LS_SOLI-LINE = HTML_STR+L_OFFSET(L_LENGTH). ELSE. LS_SOLI-LINE = HTML_STR+L_OFFSET(L_DIFF). ENDIF. APPEND LS_SOLI TO LT_SOLI. ADD L_LENGTH TO L_OFFSET. ENDWHILE. CREATE OBJECT LO_MIME_HELPER. CALL METHOD LO_MIME_HELPER->SET_MAIN_HTML EXPORTING CONTENT = LT_SOLI FILENAME = 'SAPWEBFORM.HTM' "#EC NOTEXT DESCRIPTION = 'SAP WEB FORM'. "#EC NOTEXT LOOP AT P_GRAPHICS INTO L_GRAPHIC. CLEAR GR_XSTR. LOOP AT L_GRAPHIC-CONTENT INTO L_GR_RAW. CONCATENATE GR_XSTR L_GR_RAW-LINE INTO GR_XSTR IN BYTE MODE. ENDLOOP. GR_XSTR = GR_XSTR(L_GRAPHIC-LENGTH). L_OFFSET = 0. L_LENGTH = 255. CLEAR LT_SOLIX[]. WHILE L_OFFSET < L_GRAPHIC-LENGTH. L_DIFF = L_GRAPHIC-LENGTH - L_OFFSET. IF L_DIFF > L_LENGTH. LS_SOLIX-LINE = GR_XSTR+L_OFFSET(L_LENGTH). ELSE. LS_SOLIX-LINE = GR_XSTR+L_OFFSET(L_DIFF). ENDIF. APPEND LS_SOLIX TO LT_SOLIX. ADD L_LENGTH TO L_OFFSET. ENDWHILE. CONCATENATE C_GR_DIR L_GRAPHIC-GRAPHICS '.BMP' INTO L_FILENAME. "#EC NOTEXT CONCATENATE C_GR_DIR L_GRAPHIC-GRAPHICS '.BMP' INTO L_CONTENT_ID. "#EC NOTEXT L_CONTENT_TYPE = L_GRAPHIC-HTTPTYPE. L_OBJ_LEN = L_GRAPHIC-LENGTH. *Add images to the email CALL METHOD LO_MIME_HELPER->ADD_BINARY_PART EXPORTING CONTENT = LT_SOLIX FILENAME = L_FILENAME EXTENSION = 'BMP' "#EC NOTEXT DESCRIPTION = 'GRAPHIC IN BMP FORMAT' "#EC NOTEXT CONTENT_TYPE = L_CONTENT_TYPE LENGTH = L_OBJ_LEN CONTENT_ID = L_CONTENT_ID. ENDLOOP. TRY. LO_DOC_BCS = CL_DOCUMENT_BCS=>CREATE_FROM_MULTIRELATED( I_SUBJECT = P_SUBJECT I_MULTIREL_SERVICE = LO_MIME_HELPER ). CATCH CX_DOCUMENT_BCS INTO LV_DOCUMENT_BCS. * ERROR HANDLING CLEAR WA_RETURN. WA_RETURN-TYPE = 'E'. "#EC NOTEXT MOVE LV_DOCUMENT_BCS->GET_LONGTEXT( ) TO WA_RETURN-MESSAGE. INSERT WA_RETURN INTO TABLE P_RETURN. EXIT. CATCH CX_BCOM_MIME INTO LV_BCOM_MIME. CLEAR WA_RETURN. WA_RETURN-TYPE = 'E'. "#EC NOTEXT MOVE LV_BCOM_MIME->GET_LONGTEXT( ) TO WA_RETURN-MESSAGE. INSERT WA_RETURN INTO TABLE P_RETURN. EXIT. CATCH CX_GBT_MIME INTO LV_GBT_MIME. CLEAR WA_RETURN. WA_RETURN-TYPE = 'E'. "#EC NOTEXT MOVE LV_GBT_MIME->GET_LONGTEXT( ) TO WA_RETURN-MESSAGE. INSERT WA_RETURN INTO TABLE P_RETURN. EXIT. ENDTRY. * REUSE THE CONTENT PREPARED FOR ALL RECEIVERS LOOP AT P_RECEIVERS INTO RECEIVER. L_MAIL_ADDRESS = RECEIVER-RECEIVER. * CREATE SEND_REQUEST TRY. LO_BCS = CL_BCS=>CREATE_PERSISTENT( ). LO_BCS->SET_DOCUMENT( I_DOCUMENT = LO_DOC_BCS ). CATCH CX_SEND_REQ_BCS INTO LV_SEND_REQ_BCS. CLEAR WA_RETURN. WA_RETURN-TYPE = 'E'. "#EC NOTEXT MOVE LV_SEND_REQ_BCS->GET_LONGTEXT( ) TO WA_RETURN-MESSAGE. INSERT WA_RETURN INTO TABLE P_RETURN. EXIT. ENDTRY. * CREATE SENDER CLASS CL_CAM_ADDRESS_BCS DEFINITION LOAD. TRY. IF L_USERNAME NS '@'. "#EC NOTEXT L_USERNAME = SEND_PARTNER . TRANSLATE L_USERNAME TO UPPER CASE. "#EC TRANSLANG LI_SENDER ?= CL_SAPUSER_BCS=>CREATE( L_USERNAME ). ELSE. DATA: L_FROM_MAIL_ADDRESS TYPE AD_SMTPADR. L_FROM_MAIL_ADDRESS = L_USERNAME. LI_SENDER ?= CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS( I_ADDRESS_STRING = L_FROM_MAIL_ADDRESS ). ENDIF. CALL METHOD LO_BCS->SET_SENDER EXPORTING I_SENDER = LI_SENDER. CATCH CX_ADDRESS_BCS INTO LV_ADDRESS_BCS. * ERROR HANDLING CLEAR WA_RETURN. WA_RETURN-TYPE = 'E'. "#EC NOTEXT MOVE LV_ADDRESS_BCS->GET_LONGTEXT( ) TO WA_RETURN-MESSAGE. INSERT WA_RETURN INTO TABLE P_RETURN. EXIT. CATCH CX_SEND_REQ_BCS INTO LV_SEND_REQ_BCS. * FAILED TO ADD A SENDER CLEAR WA_RETURN. WA_RETURN-TYPE = 'E'. "#EC NOTEXT MOVE LV_SEND_REQ_BCS->GET_LONGTEXT( ) TO WA_RETURN-MESSAGE. INSERT WA_RETURN INTO TABLE P_RETURN. EXIT. EXIT. ENDTRY. * CREATE RECIPIENT TRY. LO_RECIPIENT = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS( I_ADDRESS_STRING = L_MAIL_ADDRESS ). CATCH CX_ADDRESS_BCS INTO LV_ADDRESS_BCS. * ERROR HANDLING CONTINUE. ENDTRY. TRY. LO_BCS->ADD_RECIPIENT( I_RECIPIENT = LO_RECIPIENT ). CATCH CX_SEND_REQ_BCS INTO LV_SEND_REQ_BCS. * FAILED TO ADD A RECIPIENT CONTINUE. ENDTRY. * SEND TRY. * RECEIPTS ONLY FOR ERRORS CALL METHOD LO_BCS->SEND_REQUEST->SET_REQUESTED_STATUS EXPORTING I_REQUESTED_STATUS = 'N'. "#EC NOTEXT LV_SENT_TO_ALL = LO_BCS->SEND( ). CATCH CX_SEND_REQ_BCS INTO LV_SEND_REQ_BCS. CLEAR WA_RETURN. WA_RETURN-TYPE = 'E'. "#EC NOTEXT MOVE LV_SEND_REQ_BCS->GET_LONGTEXT( ) TO WA_RETURN-MESSAGE. INSERT WA_RETURN INTO TABLE P_RETURN. * ERROR HANDLING EXIT. ENDTRY. ENDLOOP. " END LOOP AT P_RECEIVERS COMMIT WORK. * set the success information CLEAR WA_RETURN. MESSAGE i013 INTO WA_RETURN-MESSAGE. "Email sent successfully INSERT WA_RETURN INTO TABLE P_RETURN. ENDFORM. "SEND_HTML_EMAIL

Adjust the look and feel of the email content
Make proper use of the smartstyles (transaction smartstyles) in the smartform to improve the look and feel of the email. Here is how a sample email looks. You can also use static images in the smartform. These images will come as multipart format. You can also make use of URL links in the smartforms to provide the link from email to the webapplication like webshop.
Sample email

Important transactions
  • Smartforms - create/edit smartforms and smart styles
  • Scot - Outgoing email management (Sending email, verify status etc)
  • sost - overview of sent emails
55 Comments