| function z_send_mail_with_attach.
*"----------------------------------------------------------------------
 *"*"Локальный интерфейс:
 *"  IMPORTING
 *"     VALUE(SAVE_IN_SAPOFFICE) TYPE  CHAR1 DEFAULT SPACE
 *"  TABLES
 *"      DOC_HEADER STRUCTURE  SOLISTI1 OPTIONAL
 *"      DOC_CONTENT STRUCTURE  SOLISTI1 OPTIONAL
 *"      RECEIVERS STRUCTURE  SOMLRECI1
 *"      ATTACHMENTS STRUCTURE  SOLISTI1 OPTIONAL
 *"  EXCEPTIONS
 *"      NO_RECEIVERS
 *"      NO_AUTHORITY
 *"----------------------------------------------------------------------
 constants: so_format(11) type c value '&SO_FORMAT='.
 data: document   like sofolenti1,
 user       like soudnamei1,
 user_data  like soudatai1,
 docdata    like sodocchgi1,
 hd_dat     like sood1,
 doc_id     like soodk,
 l_receivers   like somlreci1 occurs 0 with header line,
 l_objhead     like soli      occurs 0 with header line,
 l_doc_header  like solisti1  occurs 1 with header line,
 l_doc_content like solisti1  occurs 1 with header line.
 data: path_and_file like rlgrap-filename,
 file_format   like rlgrap-filetype,
 bin_filesize  like soxwd-doc_length,
 object_type   like soodk-objtp value 'EXT', " см.табл. TSOTD
 l_objcont     like soli occurs 0,
 l_filename    like rlgrap-filename,
 l_nodialog    like sonv-flag value 'X',
 l_cancelled   like sonv-flag,
 put_to_kpro   like sonv-flag,
 lin           type i.
 * структуры для задания и срока запуска/период/повторения ФонЗадания
 data: job        like tbtco,
 starttime  like tbtcstrt,
 status     like tbtco-status,
 released(1).
 *
 *
 authority-check object 'S_OC_SEND'
 id     'COM_MODE' field  'INT'    " INT - SMTP
 id     'NUMBER'  dummy.
 if sy-subrc ne 0.
 message e094(zr) raising no_authority.
 endif.
 * получатель (получатели)
 describe table receivers lines lin.
 if lin < 1.
 message e093(zr) raising no_receivers.
 endif.
 loop at receivers.
 l_receivers-receiver = receivers-receiver.
 l_receivers-rec_type = receivers-rec_type.
 l_receivers-express = 'X'.
 append l_receivers.
 endloop.
 * пользователь, от имени которого посылается письмо
 user-sapname = sy-uname.
 * Заголовок(тема) письма
 loop at doc_header.
 l_doc_header = doc_header.
 append l_doc_header.
 endloop.
 * Содержание письма
 loop at doc_content.
 l_doc_content = doc_content.
 append l_doc_content.
 endloop.
 * Атрибуты документа SAP_Office
 clear docdata.
 docdata-obj_name = 'Z_SEND_MAIL_WITH_ATTACH'.
 read table l_doc_header index 1.
 if sy-subrc = 0.
 docdata-obj_descr = l_doc_header-line.
 else.
 docdata-obj_descr = 'без заголовка'.
 endif.
 docdata-obj_langu  = sy-langu.
 docdata-sensitivty = 'P'.
 *
 *
 * path_and_file = 'd:\aba.xls'.
 
 * читаем данные пользователя (в основном нам нужна его SAP-папка (ID))
 call function 'SO_USER_READ_API1'
 exporting
 user                      = user
 prepare_for_folder_access = 'X'
 importing
 user_data                 = user_data
 exceptions
 user_not_exist            = 1
 parameter_error           = 2
 x_error                   = 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.
 * создаем SAP_Office-документ
 call function 'SO_DOCUMENT_INSERT_API1'
 exporting
 folder_id                  = user_data-outboxfol
 document_data              = docdata
 document_type              = 'RAW'
 importing
 document_info              = document
 tables
 object_header              = l_doc_header
 object_content             = l_doc_content
 exceptions
 folder_not_exist           = 1
 document_type_not_exist    = 2
 operation_no_authorization = 3
 parameter_error            = 4
 x_error                    = 5
 enqueue_error              = 6
 others                     = 7.
 if sy-subrc <> 0.
 message id sy-msgid type sy-msgty number sy-msgno
 with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
 endif.
 * вложения из внешних файлов
 loop at attachments into path_and_file.
 clear: hd_dat, l_objcont[].
 * загрузка объекта для аттачмента
 call function 'SO_OBJECT_UPLOAD'
 exporting
 path_and_file           = path_and_file
 no_dialog               = l_nodialog
 importing
 f_cancelled             = l_cancelled
 filelength              = bin_filesize
 act_filetype            = file_format
 act_filename            = path_and_file
 act_objtype             = object_type
 file_put_to_kpro        = put_to_kpro
 tables
 objcont                 = l_objcont
 exceptions
 invalid_type            = 1
 object_type_not_allowed = 2
 kpro_insert_error       = 3
 others                  = 4.
 
 case sy-subrc.
 when 0.
 if not l_cancelled is initial.
 exit.
 endif.
 hd_dat-objlen = bin_filesize.
 if not put_to_kpro is initial.
 hd_dat-extct = 'K'. "reference_type_kpro.
 endif.
 call function 'SO_SPLIT_FILE_AND_PATH'
 exporting
 full_name     = path_and_file
 importing
 stripped_name = l_filename.
 clear: l_objhead, l_objhead[].
 insert l_filename into l_objhead index 1.
 l_objhead-line       = so_format.
 l_objhead-line+11(3) = file_format.
 append l_objhead.
 
 hd_dat-file_ext = object_type.
 hd_dat-objnam   = text-001.
 if hd_dat-objdes is initial.
 split l_filename at '.' into hd_dat-objdes l_filename.
 endif.
 move: document-obj_type        to doc_id-objtp,
 document-object_id+3(2)  to doc_id-objyr,
 document-object_id+5(12) to doc_id-objno.
 when others.
 exit.
 endcase.
 * присоединение аттачмента к созданному документу
 call function 'SO_ATTACHMENT_INSERT'
 exporting
 object_id                  = doc_id
 attach_type                = 'EXT'
 object_hd_change           = hd_dat
 owner                      = user-sapname
 tables
 objcont                    = l_objcont
 objhead                    = l_objhead
 exceptions
 active_user_not_exist      = 35
 communication_failure      = 71
 object_type_not_exist      = 17
 operation_no_authorization = 21
 owner_not_exist            = 22
 parameter_error            = 23
 substitute_not_active      = 31
 substitute_not_defined     = 32
 system_failure             = 72
 x_error                    = 1000.
 endloop.
 * помещаем документ в исходящую очередь на отсылку
 call function 'SO_OLD_DOCUMENT_SEND_API1'
 exporting
 document_id                = document-doc_id
 put_in_outbox              = space
 tables
 receivers                  = l_receivers
 exceptions
 too_many_receiver          = 1
 document_not_sent          = 2
 document_not_exist         = 3
 operation_no_authorization = 4
 parameter_error            = 5
 x_error                    = 6
 enqueue_error              = 7
 others                     = 8.
 if sy-subrc <> 0.
 message s001(zr) with 'Error ' sy-subrc ' on send mail'.
 exit.
 endif.
 *
 job-jobname = 'Z_MAIL_SEND'.
 call function 'JOB_OPEN'
 exporting
 delanfrep =
 'X' " Delete Job After Successful Execution
 jobname          = job-jobname  " Job name
 importing
 jobcount =
 job-jobcount " ID number of background job !
 exceptions
 cant_create_job  = 01
 invalid_job_data = 02
 jobname_missing  = 03.
 if sy-subrc <> 0.
 case sy-subrc.
 when 1.message i001(38) with 'Job cannot be created, see SYSLOG'.
 when 2.message i001(38) with 'Job cont.invalid job data,см.SYSLOG'.
 when 3.message i001(38) with 'Job name not specified'.
 endcase.
 exit.
 endif.
 *
 submit rsconn01 and return
 with mode = 'INT'
 via job job-jobname number job-jobcount.
 *====== pass a background job to the background processing ===========
 starttime-startdttyp = 'D'.
 starttime-sdlstrtdt  = sy-datum.
 starttime-sdlstrttm  = sy-uzeit + 3.
 *
 call function 'JOB_CLOSE'
 exporting
 jobcount             = job-jobcount
 jobname              = job-jobname
 sdlstrtdt            = starttime-sdlstrtdt
 sdlstrttm            = starttime-sdlstrttm
 importing
 job_was_released     = released
 exceptions
 cant_start_immediate = 1
 invalid_startdate    = 2.
 if sy-subrc ne 0.
 call function 'JOB_CLOSE'
 exporting
 jobcount             = job-jobcount
 jobname              = job-jobname
 strtimmed            = 'X'
 importing
 job_was_released     = released
 exceptions
 cant_start_immediate = 1
 invalid_startdate    = 2.
 if released ne 'X'.
 call function 'BP_JOB_DELETE'
 exporting
 forcedmode = 'X'
 jobname    = job-jobname
 jobcount   = job-jobcount
 exceptions
 others     = 99.
 submit rsconn01 with mode = 'INT' and return.
 endif.
 endif.
 
 * удалить отправленный документ из SAP-Office ?
 check save_in_sapoffice = space.
 call function 'SO_DOCUMENT_DELETE_API1'
 exporting
 document_id                      = document-doc_id
 unread_delete                    = 'X'
 *     PUT_IN_TRASH                     = 'X'
 exceptions
 document_not_exist               = 1
 operation_no_authorization       = 2
 parameter_error                  = 3
 x_error                          = 4
 enqueue_error                    = 5
 others                           = 6
 .
 if sy-subrc <> 0.
 message id sy-msgid type sy-msgty number sy-msgno
 with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
 endif.
 
 
 
 
 
 endfunction.
 
 
 
						
							|   |  |