cancel
Showing results for 
Search instead for 
Did you mean: 

How to send smart form to email as a body and not in attachments?

Former Member
0 Kudos

Hi

How to send smart form to email as a body and not in attachments?

Thanks in advance

Accepted Solutions (0)

Answers (2)

Answers (2)

Former Member
0 Kudos

HI

/people/pavan.bayyapu/blog/2005/08/30/sending-html-email-from-sap-crmerp

form process_webform
.
.
.
* activate XSF Output Mode
  ls_output_options-xsf        = c_charx.        " XSF Output active
  ls_output_options-xsfcmode   = c_charx.        " Get XSF params from program
  ls_output_options-xsfoutmode = c_application.  " Application
  ls_output_options-xsfformat  = c_charx.       " Formatting ON
  clear ls_output_options-xsfoutdev.
 
  ls_xsfparam_line-name  = 'GRAPHICS'.
  ls_xsfparam_line-value = 'EXTRACT'.
  append ls_xsfparam_line to ls_output_options-xsfpars.
 
  ls_xsfparam_line-name  = 'GRAPHICS-DIRECTORY'.            "#EC NOTEXT
  ls_xsfparam_line-value = c_gr_dir.
  append ls_xsfparam_line to ls_output_options-xsfpars.
 
  ls_xsfparam_line-name  = 'CONTENT-ID'.                    "#EC NOTEXT
  ls_xsfparam_line-value = 'ENABLE'.                        "#EC NOTEXT
  append ls_xsfparam_line to ls_output_options-xsfpars.
 
* silent mode ON
  ls_output_options-tdimmed = space.
  ls_output_options-tdnewid = space.
  ls_control_parameters-no_dialog = c_charx.
 
  call function 'SSF_FUNCTION_MODULE_NAME'
    exporting
      formname           = pi_form
    importing
      fm_name            = l_fm_name
    exceptions
      no_form            = 1
      no_function_module = 2
      others             = 3.
 
  if sy-subrc <> 0.
*   error handling
    message id sy-msgid type sy-msgty number sy-msgno
            with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    exit.
  endif.
 
  call function l_fm_name
    exporting
      control_parameters = ls_control_parameters
      output_options     = ls_output_options
      user_settings      = space
    importing
      job_output_info    = ls_output_data
    exceptions
      formatting_error   = 1
      internal_error     = 2
      send_error         = 3
      user_canceled      = 4
      others             = 5.
 
  if sy-subrc <> 0.
*   error handling
    message id sy-msgid type sy-msgty number sy-msgno
            with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  endif.
 
  po_html       = ls_output_data-xmloutput-trfresult.
  po_t_graphics = ls_output_data-xmloutput-xsfgr.
 
endform.                    "process_webform
 
***************************
form send_webform
.
.
.
.
  clear l_html_xstr.
  loop at pi_s_html-content into l_html_raw.
    concatenate l_html_xstr l_html_raw into l_html_xstr in byte mode.
  endloop.
 
  l_html_xstr = l_html_xstr(gs_html_data-length).
 
  call function 'SCP_TRANSLATE_CHARS'
    exporting
      inbuff       = l_html_xstr
      incode       = '4110'                                 " utf-8
      csubst       = c_charx
      substc_space = c_charx
    importing
      outbuff      = l_html_str
      outused      = l_html_len
    exceptions
      others       = 1.
 
  if sy-subrc ne 0.
    "do nothing
  endif.
 
* change encoding utf-8 to latin1
  replace all occurrences of 'utf-8' in l_html_str with 'latin1' ignoring case.
 
  replace all occurrences of 'absolute' in l_html_str with 'relative' ignoring case.
 
  replace all occurrences of 'overflow : auto'
              in l_html_str with 'overflow : hidden' ignoring case.
 
* The following code will replace the standard text shown in an html link
* such as (www.sap.com) with the text passed along with the link (contained in
* brackets [ ] ).  An example would be: "www.sap.com[Click me]" will then be
* displayed as a link on the email with "... Click me ..." as the text.  HTML links
* without brackets will be displayed normally (ie. <a href="www.sap.com)+" TARGET="test_blank">www.sap.com)+</a>
  do.
*   Get the length for the entire HTML code for the URL and Name
    find '<a href="' in section offset l_aref_end of l_html_str match offset l_aref_start.
 
    if sy-subrc ne 0.
      exit.
    endif.
 
    find '</a>' in section offset l_aref_start of l_html_str match offset l_aref_end.
    l_aref_length = ( l_aref_end + 4 ) - l_aref_start.
 
*   Find the URL/name
    l_lnk_start = l_aref_start + 9.
    find '">' in section offset l_aref_start of l_html_str match offset l_lnk_end.
    l_lnk_length = l_lnk_end - l_lnk_start.
*   Save the URL/name
    l_link_all = l_html_str+l_lnk_start(l_lnk_length).
 
*   Find where the name starts and ends
    find '[' in l_link_all match offset l_name_start.
    if sy-subrc ne 0.
      continue.
    endif.
    find ']' in l_link_all match offset l_name_end.
    if sy-subrc ne 0.
      continue.
    endif.
 
*   Seperate out the URL
    l_link_url = l_link_all+0(l_name_start).
 
*   Seperate out the name
    l_name_start = l_name_start + 1.
    l_name_length = l_name_end - l_name_start.
    l_link_name = l_link_all+l_name_start(l_name_length).
 
*   Replace the first URL/Name occurence with just the URL
    replace first occurrence of l_link_all
            in section offset l_aref_start length l_aref_length
            of l_html_str with l_link_url.
*   Replace the second URL/Name occurence with just the Name - first
*   substitute special characters.
    replace all occurrences of '&' in l_link_all with '&'.
    replace all occurrences of '>' in l_link_all with '>'.
    replace all occurrences of '<' in l_link_all with '<'.
    replace first occurrence of l_link_all
            in section offset l_aref_start length l_aref_length
            of l_html_str with l_link_name.
 
*   Reset ending point
    l_aref_end = l_aref_end - ( l_lnk_length + 2 ).
  enddo.
 
  l_html_len = strlen( l_html_str ).
 
  l_offset = 0.
  l_length = 255.
 
  while l_offset < l_html_len.
    l_diff = l_html_len - l_offset.
    if l_diff > l_length.
      ls_soli-line = l_html_str+l_offset(l_length).
    else.
      ls_soli-line = l_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.
 
  loop at pi_t_graphics into gs_graphic.
    clear l_gr_xstr.
    loop at gs_graphic-content into l_gr_raw.
      concatenate l_gr_xstr l_gr_raw-line into l_gr_xstr in byte mode.
    endloop.
    l_gr_xstr = l_gr_xstr(gs_graphic-length).
    l_offset = 0.
    l_length = 255.
    clear lt_solix[].
    while l_offset < gs_graphic-length.
      l_diff = gs_graphic-length - l_offset.
      if l_diff > l_length.
        ls_solix-line = l_gr_xstr+l_offset(l_length).
      else.
        ls_solix-line = l_gr_xstr+l_offset(l_diff).
      endif.
      append ls_solix to lt_solix.
      add l_length to l_offset.
    endwhile.
 
    concatenate c_gr_dir gs_graphic-graphics '.bmp' into l_filename.
    concatenate c_gr_dir gs_graphic-graphics '.bmp' into l_content_id.
    l_content_type = gs_graphic-httptype.
    l_obj_len      = gs_graphic-length.
    call method lo_mime_helper->add_binary_part
      exporting
        content      = lt_solix
        filename     = l_filename
        extension    = 'BMP'
        content_type = l_content_type
        length       = l_obj_len
        content_id   = l_content_id.
  endloop.
 
  try.
      l_standard_txt = pi_smartform.
      call function 'READ_TEXT'
        exporting
          id       = 'ST'
          language = sy-langu
          name     = l_standard_txt
          object   = 'TEXT'
        tables
          lines    = lt_lines.
 
      read table lt_lines into ls_lines index 1.
      replace '&1' in ls_lines-tdline with pi_belnr.
      replace '&2' in ls_lines-tdline with pi_bukrs.
 
        move ls_lines-tdline to l_subject.
 
     lo_doc_bcs = cl_document_bcs=>create_from_multirelated(
                                    i_subject          = l_subject
                                    i_multirel_service = lo_mime_helper ).
* Add Attachment
*      types: begin of email_docs,
*                   type    type so_obj_tp,
*                   subject type so_obj_des,
*                   content_text type soli_tab,
*                   content_hex  type solix_tab,
*             end of email_docs.
*      types: email_docs_t type standard table of email_docs.
*
*      data: documents type        email_docs_t,
*      documents_line like line of documents.
*
*      data: soli_tab type soli_tab,
*            soli type soli.
*      soli = 'This is line one'.
*      append soli to soli_tab.
*      soli = 'And this is line two'.
*      append soli to soli_tab.
*
*      documents_line-type = 'RAW'.
*      documents_line-subject = 'Subject'.
*      documents_line-content_text = soli_tab.
*      append documents_line to documents.
*      call method lo_doc_bcs->add_attachment
*        EXPORTING
*          i_attachment_type    = documents_line-type
*          i_attachment_subject = documents_line-subject
*          i_att_content_text   = documents_line-content_text.
*
    catch cx_document_bcs.
*   error handling
      exit.
    catch cx_bcom_mime.
*   error handling
      exit.
    catch cx_gbt_mime.
*   error handling
      exit.
  endtry.
 
* create send_request
  try.
      lo_bcs = cl_bcs=>create_persistent( ).
    catch cx_send_req_bcs.
*   error handling
      exit.
  endtry.
  try.
      lo_bcs->set_document( i_document = lo_doc_bcs ).
    catch cx_send_req_bcs.
*   error handling
      exit.
  endtry.
 
* create recipient
  if pi_recipient ns '@'.
    l_username = pi_recipient.
    translate l_username to upper case.                     "#EC *
    try.
        lo_recipient = cl_sapuser_bcs=>create( l_username ).
      catch cx_address_bcs.
*     error handling
        exit.
    endtry.
  else.
    l_mail_address = pi_recipient.
    try.
        lo_recipient = cl_cam_address_bcs=>create_internet_address( i_address_string = l_mail_address ).
 
      catch cx_address_bcs.
*     error handling
        exit.
    endtry.
  endif.
 
  try.
      lo_bcs->add_recipient( i_recipient = lo_recipient ).
    catch cx_send_req_bcs.
*   error handling
      exit.
  endtry.
 
* send
  try.
*     RECEIPTS ONLY FOR ERRORS
      call method lo_bcs->send_request->set_requested_status
        exporting
          i_requested_status = 'N'.                         "#EC NOTEXT
 
      lo_bcs->send( ).
      commit work.
    catch cx_send_req_bcs.
*   error handling
      exit.
  endtry.
 
endform.                    "send_webform

]

Former Member
0 Kudos

Hi NAresh thanks a lot for your code but when i tried to execute the code

i get a message 'Please maintain an output device in user master data'

how could this be resolved?

Former Member
0 Kudos

please see this code ... for sending the Email as PDF attach file,

&----


*& Report ZSPOOLTOPDF *

*& *

&----


*& Converts spool request into PDF document and emails it to *

*& recipicant. *

*& *

*& Execution *

*& -


*

*& This program must be run as a background job in-order for the write *

*& commands to create a Spool request rather than be displayed on *

*& screen *

&----


REPORT zspooltopdf.

PARAMETER: p_email1 LIKE somlreci1-receiver

DEFAULT 'abap@sapdev.co.uk',

p_sender LIKE somlreci1-receiver

DEFAULT 'abap@sapdev.co.uk',

p_delspl AS CHECKBOX.

*DATA DECLARATION

DATA: gd_recsize TYPE i.

  • Spool IDs

TYPES: BEGIN OF t_tbtcp.

INCLUDE STRUCTURE tbtcp.

TYPES: END OF t_tbtcp.

DATA: it_tbtcp TYPE STANDARD TABLE OF t_tbtcp INITIAL SIZE 0,

wa_tbtcp TYPE t_tbtcp.

  • Job Runtime Parameters

DATA: gd_eventid LIKE tbtcm-eventid,

gd_eventparm LIKE tbtcm-eventparm,

gd_external_program_active LIKE tbtcm-xpgactive,

gd_jobcount LIKE tbtcm-jobcount,

gd_jobname LIKE tbtcm-jobname,

gd_stepcount LIKE tbtcm-stepcount,

gd_error TYPE sy-subrc,

gd_reciever TYPE sy-subrc.

DATA: w_recsize TYPE i.

DATA: gd_subject LIKE sodocchgi1-obj_descr,

it_mess_bod LIKE solisti1 OCCURS 0 WITH HEADER LINE,

it_mess_att LIKE solisti1 OCCURS 0 WITH HEADER LINE,

gd_sender_type LIKE soextreci1-adr_typ,

gd_attachment_desc TYPE so_obj_nam,

gd_attachment_name TYPE so_obj_des.

  • Spool to PDF conversions

DATA: gd_spool_nr LIKE tsp01-rqident,

gd_destination LIKE rlgrap-filename,

gd_bytecount LIKE tst01-dsize,

gd_buffer TYPE string.

  • Binary store for PDF

DATA: BEGIN OF it_pdf_output OCCURS 0.

INCLUDE STRUCTURE tline.

DATA: END OF it_pdf_output.

CONSTANTS: c_dev LIKE sy-sysid VALUE 'DEV',

c_no(1) TYPE c VALUE ' ',

c_device(4) TYPE c VALUE 'LOCL'.

************************************************************************

*START-OF-SELECTION.

START-OF-SELECTION.

  • Write statement to represent report output. Spool request is created

  • if write statement is executed in background. This could also be an

  • ALV grid which would be converted to PDF without any extra effort

WRITE 'Hello World'.

new-page.

commit work.

new-page print off.

IF sy-batch EQ 'X'.

PERFORM get_job_details.

PERFORM obtain_spool_id.

************************************

      • Alternative way could be to submit another program and store spool

      • id into memory, will be stored in sy-spono.

*submit ZSPOOLTOPDF2

  • to sap-spool

  • spool parameters %_print

  • archive parameters %_print

  • without spool dynpro

  • and return.

************************************

  • Get spool id from program called above

  • IMPORT w_spool_nr FROM MEMORY ID 'SPOOLTOPDF'.

PERFORM convert_spool_to_pdf.

PERFORM process_email.

if p_delspl EQ 'X'.

PERFORM delete_spool.

endif.

IF sy-sysid = c_dev.

wait up to 5 seconds.

SUBMIT rsconn01 WITH mode = 'INT'

WITH output = 'X'

AND RETURN.

ENDIF.

ELSE.

SKIP.

WRITE:/ 'Program must be executed in background in-order for spool',

'request to be created.'.

ENDIF.

----


  • FORM obtain_spool_id *

----


FORM obtain_spool_id.

CHECK NOT ( gd_jobname IS INITIAL ).

CHECK NOT ( gd_jobcount IS INITIAL ).

SELECT * FROM tbtcp

INTO TABLE it_tbtcp

WHERE jobname = gd_jobname

AND jobcount = gd_jobcount

AND stepcount = gd_stepcount

AND listident <> '0000000000'

ORDER BY jobname

jobcount

stepcount.

READ TABLE it_tbtcp INTO wa_tbtcp INDEX 1.

IF sy-subrc = 0.

message s004(zdd) with gd_spool_nr.

gd_spool_nr = wa_tbtcp-listident.

MESSAGE s004(zdd) WITH gd_spool_nr.

ELSE.

MESSAGE s005(zdd).

ENDIF.

ENDFORM.

----


  • FORM get_job_details *

----


FORM get_job_details.

  • Get current job details

CALL FUNCTION 'GET_JOB_RUNTIME_INFO'

IMPORTING

eventid = gd_eventid

eventparm = gd_eventparm

external_program_active = gd_external_program_active

jobcount = gd_jobcount

jobname = gd_jobname

stepcount = gd_stepcount

EXCEPTIONS

no_runtime_info = 1

OTHERS = 2.

ENDFORM.

----


  • FORM convert_spool_to_pdf *

----


FORM convert_spool_to_pdf.

CALL FUNCTION 'CONVERT_ABAPSPOOLJOB_2_PDF'

EXPORTING

src_spoolid = gd_spool_nr

no_dialog = c_no

dst_device = c_device

IMPORTING

pdf_bytecount = gd_bytecount

TABLES

pdf = it_pdf_output

EXCEPTIONS

err_no_abap_spooljob = 1

err_no_spooljob = 2

err_no_permission = 3

err_conv_not_possible = 4

err_bad_destdevice = 5

user_cancelled = 6

err_spoolerror = 7

err_temseerror = 8

err_btcjob_open_failed = 9

err_btcjob_submit_failed = 10

err_btcjob_close_failed = 11

OTHERS = 12.

CHECK sy-subrc = 0.

  • Transfer the 132-long strings to 255-long strings

LOOP AT it_pdf_output.

TRANSLATE it_pdf_output USING ' ~'.

CONCATENATE gd_buffer it_pdf_output INTO gd_buffer.

ENDLOOP.

TRANSLATE gd_buffer USING '~ '.

DO.

it_mess_att = gd_buffer.

APPEND it_mess_att.

SHIFT gd_buffer LEFT BY 255 PLACES.

IF gd_buffer IS INITIAL.

EXIT.

ENDIF.

ENDDO.

ENDFORM.

----


  • FORM process_email *

----


FORM process_email.

DESCRIBE TABLE it_mess_att LINES gd_recsize.

CHECK gd_recsize > 0.

PERFORM send_email USING p_email1.

  • perform send_email using p_email2.

ENDFORM.

----


  • FORM send_email *

----


  • --> p_email *

----


FORM send_email USING p_email.

CHECK NOT ( p_email IS INITIAL ).

REFRESH it_mess_bod.

  • Default subject matter

gd_subject = 'Subject'.

gd_attachment_desc = 'Attachname'.

  • CONCATENATE 'attach_name' ' ' INTO gd_attachment_name.

it_mess_bod = 'Message Body text, line 1'.

APPEND it_mess_bod.

it_mess_bod = 'Message Body text, line 2...'.

APPEND it_mess_bod.

  • If no sender specified - default blank

IF p_sender EQ space.

gd_sender_type = space.

ELSE.

gd_sender_type = 'INT'.

ENDIF.

  • Send file by email as .xls speadsheet

PERFORM send_file_as_email_attachment

tables it_mess_bod

it_mess_att

using p_email

'Example .xls documnet attachment'

'PDF'

gd_attachment_name

gd_attachment_desc

p_sender

gd_sender_type

changing gd_error

gd_reciever.

ENDFORM.

----


  • FORM delete_spool *

----


FORM delete_spool.

DATA: ld_spool_nr TYPE tsp01_sp0r-rqid_char.

ld_spool_nr = gd_spool_nr.

CHECK p_delspl <> c_no.

CALL FUNCTION 'RSPO_R_RDELETE_SPOOLREQ'

EXPORTING

spoolid = ld_spool_nr.

ENDFORM.

&----


*& Form SEND_FILE_AS_EMAIL_ATTACHMENT

&----


  • Send email

----


FORM send_file_as_email_attachment tables it_message

it_attach

using p_email

p_mtitle

p_format

p_filename

p_attdescription

p_sender_address

p_sender_addres_type

changing p_error

p_reciever.

DATA: ld_error TYPE sy-subrc,

ld_reciever TYPE sy-subrc,

ld_mtitle LIKE sodocchgi1-obj_descr,

ld_email LIKE somlreci1-receiver,

ld_format TYPE so_obj_tp ,

ld_attdescription TYPE so_obj_nam ,

ld_attfilename TYPE so_obj_des ,

ld_sender_address LIKE soextreci1-receiver,

ld_sender_address_type LIKE soextreci1-adr_typ,

ld_receiver LIKE sy-subrc.

data: t_packing_list like sopcklsti1 occurs 0 with header line,

t_contents like solisti1 occurs 0 with header line,

t_receivers like somlreci1 occurs 0 with header line,

t_attachment like solisti1 occurs 0 with header line,

t_object_header like solisti1 occurs 0 with header line,

w_cnt type i,

w_sent_all(1) type c,

w_doc_data like sodocchgi1.

ld_email = p_email.

ld_mtitle = p_mtitle.

ld_format = p_format.

ld_attdescription = p_attdescription.

ld_attfilename = p_filename.

ld_sender_address = p_sender_address.

ld_sender_address_type = p_sender_addres_type.

  • Fill the document data.

w_doc_data-doc_size = 1.

  • Populate the subject/generic message attributes

w_doc_data-obj_langu = sy-langu.

w_doc_data-obj_name = 'SAPRPT'.

w_doc_data-obj_descr = ld_mtitle .

w_doc_data-sensitivty = 'F'.

  • Fill the document data and get size of attachment

CLEAR w_doc_data.

READ TABLE it_attach INDEX w_cnt.

w_doc_data-doc_size =

( w_cnt - 1 ) * 255 + STRLEN( it_attach ).

w_doc_data-obj_langu = sy-langu.

w_doc_data-obj_name = 'SAPRPT'.

w_doc_data-obj_descr = ld_mtitle.

w_doc_data-sensitivty = 'F'.

CLEAR t_attachment.

REFRESH t_attachment.

t_attachment[] = it_attach[].

  • Describe the body of the message

CLEAR t_packing_list.

REFRESH t_packing_list.

t_packing_list-transf_bin = space.

t_packing_list-head_start = 1.

t_packing_list-head_num = 0.

t_packing_list-body_start = 1.

DESCRIBE TABLE it_message LINES t_packing_list-body_num.

t_packing_list-doc_type = 'RAW'.

APPEND t_packing_list.

  • Create attachment notification

t_packing_list-transf_bin = 'X'.

t_packing_list-head_start = 1.

t_packing_list-head_num = 1.

t_packing_list-body_start = 1.

DESCRIBE TABLE t_attachment LINES t_packing_list-body_num.

t_packing_list-doc_type = ld_format.

t_packing_list-obj_descr = ld_attdescription.

t_packing_list-obj_name = ld_attfilename.

t_packing_list-doc_size = t_packing_list-body_num * 255.

APPEND t_packing_list.

  • Add the recipients email address

CLEAR t_receivers.

REFRESH t_receivers.

t_receivers-receiver = ld_email.

t_receivers-rec_type = 'U'.

t_receivers-com_type = 'INT'.

t_receivers-notif_del = 'X'.

t_receivers-notif_ndel = 'X'.

APPEND t_receivers.

CALL FUNCTION 'SO_DOCUMENT_SEND_API1'

EXPORTING

document_data = w_doc_data

put_in_outbox = 'X'

sender_address = ld_sender_address

sender_address_type = ld_sender_address_type

commit_work = 'X'

IMPORTING

sent_to_all = w_sent_all

TABLES

packing_list = t_packing_list

contents_bin = t_attachment

contents_txt = it_message

receivers = t_receivers

EXCEPTIONS

too_many_receivers = 1

document_not_sent = 2

document_type_not_exist = 3

operation_no_authorization = 4

parameter_error = 5

x_error = 6

enqueue_error = 7

OTHERS = 8.

  • Populate zerror return code

ld_error = sy-subrc.

  • Populate zreceiver return code

LOOP AT t_receivers.

ld_receiver = t_receivers-retrn_code.

ENDLOOP.

ENDFORM

Message was edited by:

Karthikeyan Pandurangan