*----------------------------------------------------------------------*
*GLOBAL DEFINITION
*----------------------------------------------------------------------*
FIELD-SYMBOLS: <ft_tb> TYPE STANDARD TABLE , "dynamic internal table
<fs_tb> TYPE any , "workspace
<dyn_field> TYPE any . "Dynamic internal table fields
*----------------------------------------------------------------------*
*SELECT SCREEN
*----------------------------------------------------------------------*
PARAMETERS: p_mailto TYPE ad_smtpadr .
PERFORM frm_send_email.
*&---------------------------------------------------------------------*
*& Form FRM_SEND_EMAIL
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_send_email.
DATA: i_objpack LIKE sopcklsti1 OCCURS 0 WITH HEADER LINE,
i_objtxt LIKE solisti1 OCCURS 0 WITH HEADER LINE,
i_objbin LIKE solisti1 OCCURS 0 WITH HEADER LINE,
i_reclist LIKE somlreci1 OCCURS 0 WITH HEADER LINE,
i_record LIKE solisti1 OCCURS 0 WITH HEADER LINE,
v_objhead TYPE soli_tab,
v_lines_txt TYPE i,
v_lines_bin TYPE i,
lv_title TYPE so_obj_des,
v_docchgi TYPE sodocchgi1,
v_lines_bin_all TYPE i,
v_filelen TYPE i.
DATA: lv_date TYPE string,
lv_data TYPE string,
lv_time TYPE string,
lv_mess TYPE string.
*****&step1.Set Mail recipient mailbox
i_reclist-receiver = p_mailto. "邮箱地址
i_reclist-express = 'X'.
i_reclist-rec_type = 'U'.
APPEND i_reclist.
*****&step2. Set Email subject
lv_title = 'Daily Report' && sy-datum. "邮件标题
v_docchgi-obj_name = 'Text'.
v_docchgi-expiry_dat = sy-datum + 10 . "expiration date
v_docchgi-sensitivty = 'F'. "Functional object
v_docchgi-doc_size = v_lines_txt * 255.
v_docchgi-obj_descr = lv_title.
*****&step3.Set Mail body
CLEAR:i_objtxt.
i_objtxt-line = 'Dear Sir/Madam,'. "邮件内容
INSERT i_objtxt INDEX 1.
INSERT INITIAL LINE INTO i_objtxt INDEX 2 .
CONCATENATE sy-datum(4) '/' sy-datum+4(2) '/' sy-datum+6(2)
INTO lv_date.
CONCATENATE 'Please find updated file for your reference.' lv_date
'in the attachment.' INTO lv_mess SEPARATED BY space.
CLEAR:i_objtxt.
i_objtxt-line = lv_mess.
INSERT i_objtxt INDEX 3.
CLEAR:lv_mess.
INSERT INITIAL LINE INTO i_objtxt INDEX 4 .
*****&step4.Set Email Signature
APPEND INITIAL LINE TO i_objtxt.
"邮件签名
lv_mess = 'This email is automatically sent by SAP, if you have any questions, please contact me in time. Thank you!'.
MOVE lv_mess TO i_objtxt-line.
APPEND i_objtxt.
CLEAR:lv_mess,i_objtxt.
DESCRIBE TABLE i_objtxt LINES v_lines_txt.
i_objpack-transf_bin = ''.
i_objpack-head_start = 1.
i_objpack-head_num = 0.
i_objpack-body_start = 1.
i_objpack-body_num = v_lines_txt.
i_objpack-doc_type = 'RAW'.
APPEND i_objpack.
*****&step5.Set Email attachment
"Convert output table data to attachment format data
PERFORM frm_get_attac.
"The output table is converted to a string
PERFORM frm_table_change USING lv_mess.
"convert string to record
PERFORM frm_str_record TABLES i_record USING lv_mess v_filelen.
" attachment name
APPEND LINES OF i_record TO i_objbin.
DESCRIBE TABLE i_record LINES v_lines_bin.
DESCRIBE TABLE i_objbin LINES v_lines_bin_all.CONCATENATE 'Daily Data-' sy-datum INTO i_objpack-obj_descr. "附件名APPEND i_objpack.
i_objpack-transf_bin = 'X'.
i_objpack-body_start = v_lines_bin_all - v_lines_bin + 1 .
i_objpack-body_num = v_lines_bin.
i_objpack-doc_type = 'XLSX'.
i_objpack-obj_name = 'text'.
i_objpack-doc_size = v_lines_bin * 255.
*****&step6.Send email
CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
EXPORTING
document_data = v_docchgi
put_in_outbox = 'X'
commit_work = 'X'
TABLES
packing_list = i_objpack
object_header = v_objhead
contents_bin = i_objbin
contents_txt = i_objtxt
receivers = i_reclist
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.
IF sy-subrc = 0.
WAIT UP TO 2 SECONDS.
SUBMIT rsconn01 WITH mode = 'INT' AND RETURN.
CLEAR :gv_message_text_output.
gv_message_text_output = text-s01.
MESSAGE s208(00) WITH gv_message_text_output.
ELSE.
CLEAR :gv_message_text_output.
gv_message_text_output = text-s02.
MESSAGE s208(00) WITH gv_message_text_output DISPLAY LIKE 'E'.
ENDIF.
ENDFORM. "FRM_SEND_EMAIL
*&---------------------------------------------------------------------*
*& Form FRM_GET_ATTAC
*&---------------------------------------------------------------------*
* text 动态获取ALV数据
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_get_attac .
DATA lt_dytable TYPE REF TO data.
DATA ls_dytable TYPE REF TO data.
DATA: lv_string TYPE string,
lv_mess TYPE string.
CLEAR lv_string.
"Dynamically generate internal tables
CALL METHOD cl_alv_table_create=>create_dynamic_table
EXPORTING
it_fieldcatalog = gt_fieldcat
IMPORTING
ep_table = lt_dytable
EXCEPTIONS
generate_subpool_dir_full = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ASSIGN lt_dytable->* TO <ft_tb> .
CREATE DATA ls_dytable LIKE LINE OF <ft_tb>.
ASSIGN ls_dytable->* TO <fs_tb> .
MOVE-CORRESPONDING gt_itab TO <ft_tb>.
ENDFORM. "FRM_GET_ATTAC
*&---------------------------------------------------------------------*
*& Form FRM_TABLE_CHANGE
*&---------------------------------------------------------------------*
* text 将数据处理为字符串格式
*----------------------------------------------------------------------*
* -->P_<FT_TB> text
* -->P_LV_MESS text
*----------------------------------------------------------------------*
FORM frm_table_change USING outstr TYPE string.
DATA: tab TYPE c VALUE cl_abap_char_utilities=>horizontal_tab,
enter(2) TYPE c VALUE cl_abap_char_utilities=>cr_lf,
n TYPE i.
DATA: BEGIN OF headtab OCCURS 0 ,
length TYPE i,
decimals TYPE i,
type_kind TYPE c,
name(30) TYPE c,
END OF headtab.
DATA descr_ref TYPE REF TO cl_abap_structdescr.
DATA:tmpbuffer TYPE xstring.
DATA len TYPE i.
FIELD-SYMBOLS: <comp_wa> TYPE abap_compdescr,
<f_field> ,
<f_intab> TYPE any.
DATA:str TYPE string,
str2 TYPE string,
text1 TYPE c.
LOOP AT gt_fieldcat INTO DATA(gs_fieldcat).
headtab-name = gs_fieldcat-coltext.
APPEND headtab.
ENDLOOP.
DESCRIBE TABLE headtab LINES n.
"Define the header structure
LOOP AT headtab INTO DATA(ls_headtab).
str = ls_headtab-name.
SEARCH str FOR '-'.
IF sy-subrc = 0 AND sy-fdpos <> 0.
SPLIT str AT '-' INTO str text1.
CONDENSE str.
CONCATENATE '-' str INTO str.
ELSE.
CONDENSE str.
ENDIF.
IF sy-tabix = 1.
CONCATENATE outstr str INTO outstr.
ELSEIF sy-tabix = n.
CONCATENATE outstr tab str enter INTO outstr.
ELSE.
CONCATENATE outstr tab str INTO outstr.
ENDIF.
ENDLOOP.
"Process row data as string
LOOP AT <ft_tb> ASSIGNING <fs_tb>.
DO n TIMES.
ASSIGN COMPONENT sy-index OF STRUCTURE <fs_tb> TO <f_field>.
str = <f_field>.
SEARCH str FOR '-'.
IF sy-subrc = 0 AND sy-fdpos <> 0.
SPLIT str AT '-' INTO str text1.
CONDENSE str.
CONCATENATE '-' str INTO str.
ELSE.
CONDENSE str.
ENDIF.
CONCATENATE str2 tab str INTO str2.
ENDDO.
SHIFT str2.
CONCATENATE outstr str2 enter INTO outstr.
CLEAR str2.
ENDLOOP.
ENDFORM. "FRM_TABLE_CHANGE
*&---------------------------------------------------------------------*
*& Form FRM_STR_RECORD
*&---------------------------------------------------------------------*
* text 将字符串处理为二进制标签
*----------------------------------------------------------------------*
* -->P_I_RECORD text
* -->P_LV_MESS text
* -->P_V_FILELEN text
*----------------------------------------------------------------------*
FORM frm_str_record TABLES record USING str len.
DATA:tmpbuffer TYPE xstring.
CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
EXPORTING
text = str
mimetype = '"APPLICATION/MSEXCEL;charset=utf-16le"'
IMPORTING
buffer = tmpbuffer
EXCEPTIONS
failed = 1
OTHERS = 2.
IF sy-subrc = 0.
CONCATENATE cl_abap_char_utilities=>byte_order_mark_little
tmpbuffer INTO tmpbuffer IN BYTE MODE.
ENDIF.
CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
EXPORTING
buffer = tmpbuffer
append_to_table = ''
IMPORTING
output_length = len
TABLES
binary_tab = record.
ENDFORM. "FRM_STR_RECORD