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.
|
|