Sapforum.Biz
Инструменты => ABAP - Инструментальные средства => SE37 - Построитель функций => Тема начата: Uukrul от Декабрь 05, 2007, 02:25:58 pm
-
В общем-то вполне полезный функционал который позволяет отправлять сообщения пользователям как по системе так и на внешние e-mail адреса, ну если конечно ваши администраторы настроили соответствующий функционал системы и отправка разрешена на выбранные домены.
В общем виде шаблон вызова ФМ представлен в следующем виде:
CALL FUNCTION 'SO_NEW_DOCUMENT_SEND_API1'
EXPORTING
document_data =
* DOCUMENT_TYPE = 'RAW'
* PUT_IN_OUTBOX = ' '
* IMPORTING
* SENT_TO_ALL =
* NEW_OBJECT_ID =
tables
* OBJECT_HEADER =
* OBJECT_CONTENT =
* CONTENTS_HEX =
* OBJECT_PARA =
* OBJECT_PARB =
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.
Ну и расшифруем некоторые параметры ФМ-ки:
DOCUMENT_DATA - содержит заголовок отправляемого документа, полей в нем много и большая часть из них актуальная для хранения документа в sapoffice. Из того что обязательно/желательно заполнить в данной стркутуре:
OBJ_NAME - Имя документа,
OBJ_DESCR - Краткое описание, собственно фактически это аналог темы e-mail сообщений
OBJ_LANGU - Код языка, ну сюда обычно толкаем значение из SY-LANGU, если не требуется что либо другое
SENSITIVTY - Степень конфиденциальности документа пока возможны следующие значения:
P Личный объект
F Функциональный объект
O Конфиденциальный объект
C Конфиденциальный объект фирмы
EXPIRY_DAT - Дата истчения срока действия сообщения. Полезно использовать совместно с параметром PUT_IN_OUTBOX.
NO_CHANGE - Если поставить в Х, то документ невозможно будет изменить. Само собой актуально для SapOffice
PUT_IN_OUTBOX - Иногда полезная функция, позволяте оставить отправленное сообщение в папке исходящие. Полезно для разбора полетов было сформировано сообщение или нет, ну если это какая-то вертушка работает.
DOCUMENT_TYPE - Тип документа который отправляется. Фактически это тип данных который передается в таблице OBJECT_CONTENT. Констант там определено дочертиков, опять же разницу в использовании определяйте сами, я лично пользовался всего парочкой из предложенного ниже списка (в примерах будет показано), а так вот оно:
fol like sood-objtp value 'FOL', " Folder
dli like sood-objtp value 'DLI', " Distributionlist
usr like sood-objtp value 'USR', " User
sys like sood-objtp value 'SYS', " System
raw like sood-objtp value 'RAW', " RAW-Text
int like sood-objtp value 'INT', " RAW-Text mit byte count
bin like sood-objtp value 'BIN', " Binary Objects
doc like sood-objtp value 'DOC', " Word - documents
xls like sood-objtp value 'XLS', " Exel - documents
img like sood-objtp value 'IMG', " Image-link
otf like sood-objtp value 'OTF', " SAPscript Ausgabeformat
rtf like sood-objtp value 'RTF', " RTF Editor (no TOM)
txt like sood-objtp value 'TXT', " Text Format (notepad -no TOM)
htm like sood-objtp value 'HTM', " HTML Format (no TOM)
scr like sood-objtp value 'SCR', " SAPscript-Texte
adr like sood-objtp value 'ADR', " Adressen
org like sood-objtp value 'ORG', " organisation unit
obj like sood-objtp value 'OBJ', " sap object
ofo like sood-objtp value 'OFO', " object folder'RAW'
url like sood-objtp value 'URL', " Internet/Intranet-Link
dat like sood-objtp value 'DAT', " Date (Termin)
qry like sood-objtp value 'QRY', " Suchabfragen SAPfind
shl like sood-objtp value 'SHL', " Shelltexte SAPfind
gry like sood-objtp value 'GRY', " SAP Prôsentationsgraphik
fax like sood-objtp value 'FAX', " Telefax
ext like sood-objtp value 'EXT', " PC documents
arc like sood-objtp value 'ARC', " ArchiveLink
ali like sood-objtp value 'ALI', " ABAP lists
idc like sood-objtp value 'IDC', " idocs for edi as referenz
r3i like sood-objtp value 'R3I', " idocs for edi as referenz
wfl like sood-objtp value 'WFL', " WorkFlow
gra like sood-objtp value 'GRA'. " SAP Prôsentationsgraphik
OBJECT_CONTENT - Собственно сам текст сообщения хранится в данной таблице, вообще там все по простому просто таблица строк в 255 символов длинной.
RECEIVERS - Список получателей, тут структура посложнее хотя не все нам из нее нужно:
RECEIVER - Имя получателя. Сюда можно записать как имя пользователя в система SAP так и внешний e-mail адрес.
REC_TYPE - Собственно поле определяющее что же мы записали в RECEIVER. По умолчнию предполагается что там записан пользователь из системы SAP, но вообще список довольно большой, пользовал или B - пользователь SAP или же U - что соответствует e-mail адресу Кстати из списка значений ясно что можно организовать рассылку списку адресатов из SAPoffice.
P Личный список адресатов
C Общий список адресатов
O Пользователь SAPoffice
B SAP-пользователь
U Адрес в Интернете
X X.400-адрес
R SAP-пользователь в другой SAP-системе
A Внешний адрес
F Номер факса
D X.500-адрес
L Номер телекса
H Организационная единица/Штатная должность
J SAP-объект
G Организационный объект/Ид.
EXPRESS - Полезная галочка, если нужно то по SAPoffice документ придет с отметкой экспресс, т.е. вывалится сообщение пользователю.
Ну а остальные поля уже по вкусу разбирайте от требований ситуации. В принципе для простой отправки текста данных уже хватает с головой. Так что можно перейти к практическому примеру. Например программа отработала и вывалила список сообщений обычными WRITE и к примеру вам надо этот сформированный отчет в некотором случае отправить пользователю по системе SAP.
DATA: real_type LIKE soodk-objtp,
document_data LIKE sodocchgi1,
so_ali LIKE soli OCCURS 100 WITH HEADER LINE,
rec_tab LIKE somlreci1 OCCURS 1 WITH HEADER LINE.
* Сначала получит данные спула, куда шел вывод.
CALL FUNCTION 'RSPO_RETURN_SPOOLJOB'
EXPORTING
rqident = SY-SPONO
first_line = '1'
desired_type = 'ALI'
IMPORTING
real_type = real_type
TABLES
buffer = so_ali
EXCEPTIONS
no_such_job = 1
job_contains_no_data = 2
selection_empty = 3
no_permission = 4
can_not_access = 5
read_error = 6
type_no_match = 7
OTHERS = 8.
IF sy-subrc = 0.
document_data-obj_langu = sy-langu.
document_data-obj_name = 'Liste'(sls).
document_data-obj_descr = sy-title.
document_data-sensitivty = 'O'.
MOVE: 'UUKRUL_SAP' TO rec_tab-receiver,
'X' TO rec_tab-express.
APPEND rec_tab.
CALL FUNCTION 'SO_NEW_DOCUMENT_SEND_API1'
EXPORTING
document_data = document_data
document_type = real_type
put_in_outbox = 'X'
TABLES
object_content = so_ali
receivers = rec_tab
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.
ENDIF.
Для отправки на e-mail меняем тип получателя на 'U' задаем адрес и тип документа 'RAW', затем после отправки собственно всей почты требуется вызвать коммуникационную программу которая собственно говоря и сделает физическую отправку почты. Обычно админы данную программу планируют в фоне с периодичностью от часа до... сколько им там нужно, но никто ж нам не запрещает это дело подтолкнуть. Для этого требуется вызвать следующий код:
SUBMIT rsconn01 WITH mode = 'INT'
WITH output = 'X'
TO SAP-SPOOL DESTINATION 'LOCL' IMMEDIATELY ' '
KEEP IN SPOOL 'X' DATASET EXPIRATION 14
WITHOUT SPOOL DYNPRO AND RETURN.
Вызывать только при отправке на адреса e-mail, для внутренних пользователей SAPoffice, это делать не нужно.
-
дошло что он rfc :)
неясно только что значит тип получателя "R" - если вызываешь как RFC, то пользователь-то уже локальный?
-
неясно только что значит тип получателя "R" - если вызываешь как RFC, то пользователь-то уже локальный?
R - SAP-пользователь в другой SAP-системе... т.е. локальный для системы получателя.
-
R - SAP-пользователь в другой SAP-системе... т.е. локальный для системы получателя.
ну так модуль уже запускается в системе-получателе как rfc
фактически ему передаются только адресат и пакет, а исполняется уже всё там
те передать локальному (для destination) юзеру
если указать 'B' то что-то разве изменится?...
впрочем может логику какую завязали на этом...
-
а также форматированный вывод
ошеннно красиво получается ;D
http://help-abap.blogspot.com/2008/09/sapconnect-email-with-formatting.html (http://help-abap.blogspot.com/2008/09/sapconnect-email-with-formatting.html)
*&---------------------------------------------------------------------*
*& Report ZTEST_SEND_MAIL_HTML
*&---------------------------------------------------------------------*
*& This report will show how to send the Formatted Emails using
*& SAPConnect
*&---------------------------------------------------------------------*
REPORT ztest_np_send_mail.
DATA:
t_objbin TYPE STANDARD TABLE OF solisti1, " Attachment data
t_objtxt TYPE STANDARD TABLE OF solisti1, " Message body
t_objpack TYPE STANDARD TABLE OF sopcklsti1, " Packing list
t_reclist TYPE STANDARD TABLE OF somlreci1, " Receipient list
t_objhead TYPE STANDARD TABLE OF solisti1. " Header
DATA: wa_docdata TYPE sodocchgi1, " Document data
wa_objtxt TYPE solisti1, " Message body
wa_objbin TYPE solisti1, " Attachment data
wa_objpack TYPE sopcklsti1, " Packing list
wa_reclist TYPE somlreci1. " Receipient list
DATA: w_tab_lines TYPE i. " Table lines
* Selection Screen
PARAMETERS: p_email TYPE char120 obligatory
VISIBLE LENGTH 40
LOWER CASE.
* Start-of-selection
START-OF-SELECTION.
* Creating message
PERFORM create_message.
* Sending Message
PERFORM send_message.
*&---------------------------------------------------------------------*
*& Form create_message
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM create_message .
**1 Title, Description & Body
PERFORM create_title_desc_body.
**2 Receivers
PERFORM fill_receivers.
ENDFORM. " create_message
*&---------------------------------------------------------------------*
*& Form CREATE_TITLE_DESC_BODY
*&---------------------------------------------------------------------*
* Title, Description and body
*----------------------------------------------------------------------*
FORM create_title_desc_body.
*...Title
wa_docdata-obj_name = 'Email notification'.
*...Description
wa_docdata-obj_descr = 'Email body in HTML'.
*...Message Body in HMTL
wa_objtxt-line = '<html> <body style="background-color:#FFE4C4;">'.
APPEND wa_objtxt TO t_objtxt.
wa_objtxt-line = '<p> List of Test materials </p>'.
APPEND wa_objtxt TO t_objtxt.
* table display
wa_objtxt-line = '<table style="MARGIN: 10px" bordercolor="#90EE90" '.
APPEND wa_objtxt TO t_objtxt.
wa_objtxt-line = ' cellspacing="0" cellpadding="3" width="400"'.
APPEND wa_objtxt TO t_objtxt.
wa_objtxt-line = ' border="1"><tbody><tr>'.
APPEND wa_objtxt TO t_objtxt.
* table header
wa_objtxt-line = '<th bgcolor="#90EE90">Material</th>'.
APPEND wa_objtxt TO t_objtxt.
wa_objtxt-line = '<th bgcolor="#90EE90">Description</th></tr>'.
APPEND wa_objtxt TO t_objtxt.
* table Contents
DO 5 TIMES.
wa_objtxt-line = '<tr style="background-color:#eeeeee;"><td>TEST</td>'.
APPEND wa_objtxt TO t_objtxt.
CONCATENATE '<td>' sy-abcde '</td> </tr>' INTO wa_objtxt-line.
APPEND wa_objtxt TO t_objtxt.
ENDDO.
* table close
wa_objtxt-line = '</tbody> </table>'.
APPEND wa_objtxt TO t_objtxt.
* Hyperlink
wa_objtxt-line = '<br> <br>'.
APPEND wa_objtxt TO t_objtxt.
wa_objtxt-line = '<p><a href="http://help-abap.blogspot.com">'.
APPEND wa_objtxt TO t_objtxt.
wa_objtxt-line = 'Click here to check the latest post</a></p>'.
APPEND wa_objtxt TO t_objtxt.
* Signature with background color
wa_objtxt-line = '<br><br>'.
APPEND wa_objtxt TO t_objtxt.
wa_objtxt-line = '<p> Regards,</p>'.
APPEND wa_objtxt TO t_objtxt.
wa_objtxt-line = '<p style="background-color:#1E90FF;"><b>Naimesh Patel</b></p>'.
APPEND wa_objtxt TO t_objtxt.
* HTML close
wa_objtxt-line = '</body> </html> '.
APPEND wa_objtxt TO t_objtxt.
* Document data
DESCRIBE TABLE t_objtxt LINES w_tab_lines.
READ TABLE t_objtxt INTO wa_objtxt INDEX w_tab_lines.
wa_docdata-doc_size =
( w_tab_lines - 1 ) * 255 + STRLEN( wa_objtxt ).
* Packing data
CLEAR wa_objpack-transf_bin.
wa_objpack-head_start = 1.
wa_objpack-head_num = 0.
wa_objpack-body_start = 1.
wa_objpack-body_num = w_tab_lines.
* we will pass the HTML, since we have created the message
* body in the HTML
wa_objpack-doc_type = 'HTML'.
APPEND wa_objpack TO t_objpack.
ENDFORM. " CREATE_TITLE_DESC_BODY
*&---------------------------------------------------------------------*
*& Form fill_receivers
*&---------------------------------------------------------------------*
* Filling up the Receivers
*----------------------------------------------------------------------*
FORM fill_receivers .
wa_reclist-receiver = p_email.
wa_reclist-rec_type = 'U'.
APPEND wa_reclist TO t_reclist.
CLEAR wa_reclist.
ENDFORM. " fill_receivers
*&---------------------------------------------------------------------*
*& Form send_message
*&---------------------------------------------------------------------*
* Sending Mail
*----------------------------------------------------------------------*
FORM send_message .
* Send Message to external Internet ID
CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
EXPORTING
document_data = wa_docdata
put_in_outbox = 'X'
commit_work = 'X' "used from rel.6.10
TABLES
packing_list = t_objpack
object_header = t_objhead
contents_txt = t_objtxt
receivers = t_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 NE 0.
WRITE: 'Sending Failed'.
ELSE.
WRITE: 'Sending Successful'.
ENDIF.
ENDFORM. " send_message
PS: Uukrul, подправил код на предмет заключения в скобки code /code
-
А подскажите пожалуйста, как прикрепить к вложениям отправляемого письма файл XLS! Допустим файл сформировался - куда-нибудь сложился на комп и потом его сразу отправить?
-
А подскажите пожалуйста, как прикрепить к вложениям отправляемого письма файл XLS! Допустим файл сформировался - куда-нибудь сложился на комп и потом его сразу отправить?
Ну тут есть вариант описания отправки сообщения с вложением, посмотри пример: http://sapnet.ru/viewtopic.php?p=6490
-
Спасибо за пример! А этот пример отправляет на любую почту письма, в том числе и на внешнюю?
-
Спасибо за пример! А этот пример отправляет на любую почту письма, в том числе и на внешнюю?
Тип получателя наверное надо указать правильно. Ну и разрешения дложня быть на отправку почты на внешние адреса.
-
А этот фм из примера вообще ничего не делает... коммит в конце раскоментил...
Не подскажешь как самое простое с помощью SO_NEW_DOCUMENT_SEND_API1 прилепить к вложениям XLS?
Так почему ты решил что ничего не делается? При отправке почты из SAP она не уходит сразу на указанный адрес. Сообщение попадет в очередь и в зависимости от настройки администраторами, физическая отправка происходит периодическим заданием или в ручном режиме запустить транзакцию SCOT и там выбрать режим "Запустить процесс отправки". Или вы это делали?
-
Подскажите пожалуйста.
Пытаюсь Смартформу конвертнуть в ПДФ, приатачить к письму и отправить.
но при выполнении функции "SO_NEW_DOCUMENT_SEND_API1" получаю EXCEPTIONS x_error = 6
В чем может быть проблема?
Подставлял и U и R...
не могу понять в чем ошибка... :(
itab_reclist-rec_type = 'R'. "U Internet address
DATA: ls_output_data TYPE ssfcrescl.
...
PERFORM send_emailnew TABLES ls_output_data-otfdata.
...
FORM send_emailnew TABLES p_otf.
* Definitions for emailing
DATA: itab_otf TYPE TABLE OF itcoo WITH HEADER LINE,
itab_lines TYPE TABLE OF tline WITH HEADER LINE,
itab_receivers TYPE TABLE OF somlreci1 WITH HEADER LINE,
itab_objpack TYPE TABLE OF sopcklsti1 WITH HEADER LINE,
itab_objtxt TYPE TABLE OF solisti1 WITH HEADER LINE,
itab_pdf TYPE TABLE OF solisti1 WITH HEADER LINE,
itab_reclist TYPE TABLE OF somlreci1 WITH HEADER LINE,
* l_return TYPE ssfcrescl,
l_doc_chng TYPE sodocchgi1,
l_bin_size LIKE sood-objlen,
l_lines TYPE i.
* Convert Smart Form output into PDF binary format
itab_otf[] = p_otf[].
* CALL FUNCTION 'CONVERT_OTF'
CALL FUNCTION 'CONVERT_OTF_2_PDF'
* EXPORTING
* format = 'PDF'
* max_linewidth = 132
IMPORTING
bin_filesize = l_bin_size
TABLES
otf = itab_otf
doctab_archive = gt_docs
lines = itab_lines
EXCEPTIONS
err_max_linewidth = 1
err_format = 2
err_conv_not_possible = 3
err_bad_otf = 4
OTHERS = 5.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
REFRESH itab_pdf[].
CALL FUNCTION 'SX_TABLE_LINE_WIDTH_CHANGE'
EXPORTING
line_width_dst = '255'
TABLES
content_in = itab_lines
content_out = itab_pdf
EXCEPTIONS
err_line_width_src_too_long = 1
err_line_width_dst_too_long = 2
err_conv_failed = 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.
CLEAR: l_doc_chng, itab_reclist, itab_objtxt, itab_objpack.
REFRESH: itab_reclist, itab_objtxt, itab_objpack.
l_doc_chng-obj_name = sy-repid.
l_doc_chng-obj_descr = 'Test'.
l_doc_chng-sensitivty = 'O'.
* Email body text
itab_objtxt-line = 'Test'.
APPEND itab_objtxt.
* Packing for body text.
DESCRIBE TABLE itab_objtxt LINES l_lines.
l_doc_chng-doc_size = ( l_lines - 1 ) * 255 + strlen( itab_objtxt ).
CLEAR itab_objpack-transf_bin.
itab_objpack-head_start = 1.
itab_objpack-head_num = 0.
itab_objpack-body_start = 1.
itab_objpack-body_num = l_lines.
itab_objpack-doc_type = 'RAW'.
itab_objpack-doc_size = l_lines * 255.
APPEND itab_objpack.
* Packing for PDF.
DESCRIBE TABLE itab_pdf LINES l_lines.
itab_objpack-transf_bin = 'X'.
itab_objpack-head_start = 1.
itab_objpack-head_num = 1.
itab_objpack-body_start = 1.
itab_objpack-body_num = l_lines.
itab_objpack-doc_type = 'PDF'.
itab_objpack-obj_name = 'Invoice'.
CONCATENATE itab_objpack-obj_name '.pdf' INTO itab_objpack-obj_descr.
itab_objpack-doc_size = l_lines * 255.
APPEND itab_objpack.
* Email recipient list
itab_reclist-rec_type = 'R'. "U Internet address
itab_reclist-receiver = '****@***.com'.
APPEND itab_reclist.
* Sending mail.
CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
* CALL FUNCTION 'SO_DOCUMENT_SEND_API1'
EXPORTING
document_data = l_doc_chng
put_in_outbox = 'X'
commit_work = 'X'
TABLES
packing_list = itab_objpack
contents_bin = itab_pdf
contents_txt = itab_objtxt
receivers = itab_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.
ENDFORM.
-
Значит так, R - это имя сап пользователя, а ты отправляешь на интернет почту, так что точно надо U ставить. Еще нужно узнать разрешена ли отправка сообщений за пределы системы, стандартно в системе отправка почты на E-mail закрыта.
-
Значит так, R - это имя сап пользователя, а ты отправляешь на интернет почту, так что точно надо U ставить. Еще нужно узнать разрешена ли отправка сообщений за пределы системы, стандартно в системе отправка почты на E-mail закрыта.
Можете подсказать куда копать дабы открыть (что бы им подсказать) . а то они не знают и получается что неверно работает прога - то есть я крайний...
-
Можете подсказать куда копать дабы открыть (что бы им подсказать) . а то они не знают и получается что неверно работает прога - то есть я крайний...
Как сказали знакомые базисники, типа читать тут: http://wiki.sdn.sap.com/wiki/display/ABAP/Send+Message+to+External+email+id+and+SAP+User+id+via+ABAP
или тут:
http://mysapinkpot.blogspot.com/2007/11/configuration-sending-mails-from-sap.html#!/2007/11/configuration-sending-mails-from-sap.html
-
Спасибо.
Как оказалось. доступ все же есть.
Ошибка возникает если добавить такой блок:
То есть пытаюсь приатачить ПДФ документ.
* Packing for PDF.
DESCRIBE TABLE itab_pdf LINES l_lines.
itab_objpack-transf_bin = 'X'.
itab_objpack-head_start = 1.
itab_objpack-head_num = 1.
itab_objpack-body_start = 1.
itab_objpack-body_num = l_lines.
itab_objpack-doc_type = 'PDF'.
itab_objpack-obj_name = 'DocName'.
CONCATENATE itab_objpack-obj_name '.pdf' INTO itab_objpack-obj_descr.
itab_objpack-doc_size = l_lines * 255.
APPEND itab_objpack.
может кто-то такое делал, как описывать этот блок?
по поводу itab_objpack-doc_type = 'PDF'.
Перешел через домен "SO_OBJ_TP" поля doc_type в таблицу TSOTD (Допустимые типы объектов)
и там кода 'PDF' нет, может из-за этого? если да то как его туда добавить?
Закоментил строку "doc_type = 'PDF'." получил сообщение с вложением "Name_PDF.pdf.txt"
Прописал типа "doc_type = 'RAW'". получил сообщение с вложением "Name_PDF.pdf.txt"
правда как текст там иероглифы, а если убрать .txt и оставить "Name_PDF.pdf" то пишет, что ошибка в чтении...
%(
-
Перешел через домен "SO_OBJ_TP" поля doc_type в таблицу TSOTD (Допустимые типы объектов)
и там кода 'PDF' нет, может из-за этого? если да то как его туда добавить?
А остальные типа BIN или EXT тоже не подходят?
-
Нет (
может
-
Нет
Почитай еще тут: http://sapland.ru/articles/stats/2010/1/Poluchenie_kirillicheskih_PDF-dokumentov_v_sistemah_SAP.html
и тут типа пример программы вроде как есть:
http://sap.ittoolbox.com/groups/technical-functional/sap-dev/so_new_document_att_send_api1-to-send-a-pdf-attachment-101555
-
что-то не получается, вроде бы даже готовые с сайта примеры подставлял все равно... :(
-
Сделал настройки как по ссылке(рис smtp.jpg):
И также сделал второй вариант отправки email с вложением PDF через клас "cl_bcs"
И тоже самое - оба, если прописываю type = 'PDF' ДАМП,
если type = 'RAW' получаем тело письма(1) и само вложение в ПДФ(2) (рис outlook.jpg)
Тело письма нормально читаемое,
а вот само вложение иероглифы (рис nopdf.jpg)
-
попробовал зайти на почту САП (тр SBWP) и там создать себе письмо и риатачить какой-то документ
в результате получил ошбку "Ошибка БД при <INSERT INTO KPRO> <>"
На продуктиве все ОК с этим, так может оно как-то связано?
-
попробовал зайти на почту САП (тр SBWP) и там создать себе письмо и риатачить какой-то документ
в результате получил ошбку "Ошибка БД при <INSERT INTO KPRO> <>"
А еще одна система типа теста, где можно проверить под руками нет? Вполне может быть, что проблема с этим.
-
А еще одна система типа теста, где можно проверить под руками нет? Вполне может быть, что проблема с этим.
Спасибо.
Да, так и сделал.
Ошибка была(и есть пока что) в CRM, я перенес все наработки в ERP - и тут все отработало без ошибки.
Таки проблема базиса.
Если нужно могу тут выложить 1 готовый пример (есть 3 варианта реализации :) ).
-
Если нужно могу тут выложить 1 готовый пример (есть 3 варианта реализации :) ).
Не только можно, но и нужно.. причем можно все три.. мало ли кому пригодится...
-
Не только можно, но и нужно.. причем можно все три.. мало ли кому пригодится...
позже (может уже в следующем году) выложу, нужно их подготовить - а то нет времени...
А пока такой вопрос, а как сделать, что бы письмо отправлялось от другого имени (которое будет постоянное)
к примеру [email protected], не меняя sy-uname?
-
"Ошибка БД при <INSERT INTO KPRO> <>"
Данный ФМ лезит в РФЦ...
эта ошибка была из-за неверной настройки HTTP_SERV в этом манданте..
Если хотите узнать под какой настройкой у вас лезит, поставьте остановку в ФМе "SCMS_HTTP_CREATE_TABLE"
и посмотрите на переменную "CREP_ID"
А дальше Таблицы в связке: SDOKSTCA-STOR_REP - > CREP_HTTP-CREP_ID
ну и Настройка тут(рис. so_new_document_send_api1.png)
-
позже (может уже в следующем году) выложу, нужно их подготовить - а то нет времени...
А пока такой вопрос, а как сделать, что бы письмо отправлялось от другого имени (которое будет постоянное)
к примеру [email protected], не меняя sy-uname?
lv_sender = '[email protected]'.
CALL FUNCTION 'SO_DOCUMENT_SEND_API1'
EXPORTING
document_data = wa_docdata
put_in_outbox = 'X'
sender_address = lv_sender " space "
sender_address_type = 'INT' "space
commit_work = 'X'
TABLES
packing_list = lt_objpack
object_header = lt_objhead
contents_txt = lt_objtxt
receivers = lt_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.
-
lv_sender = '[email protected]'.
CALL FUNCTION 'SO_DOCUMENT_SEND_API1'
...
sender_address = lv_sender " space "
...
спасибо.
-
Еще такой вопрос:
можно как-то перенаправить письмо, чтобы оно шло по другому SMTP хосту?
-
Ну или через RFC?
Кста, тут хорошая статья как настроить RFC http://scn.sap.com/thread/477925
-
Наткнулся на один прикол касательно вложения документа. Для меня это было ново..
Если у пользователя нет этой настройки (см. рис) то к письму не будет приатачен документ.
В тр su01
-
Если у пользователя нет этой настройки (см. рис) то к письму не будет приатачен документ.
Т.е. не задано устройство вывода по умолчанию? Или не задан немедленный вывод? Так как эти параметры доступны пользователю для изменений.
-
Т.е. не задано устройство вывода по умолчанию? Или не задан немедленный вывод? Так как эти параметры доступны пользователю для изменений.
Да, хорошо подметили - если не задано устройство вывода по умолчанию то не будет приатачен документ.
Подмечу - если отправка происходит в фоне то и фонового пользователя это тоже касается.
-
Итак, как обещал.
Начну с cl_bcs
У меня была задача СМАРТФОРМ отправлять почтой.
Выбрал данный метод потому что, много плюсов, один из них это тема письма больше 50символов, и немедленная отправка без дерганья тр SCOT :)
DATA:
l_function_module_name TYPE rs38l_fnam.
* parameters for generated function module
DATA:
ls_output_options TYPE ssfcompop,
ls_control_parameters TYPE ssfctrlop.
" тут получаем имя смартфомы
CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
EXPORTING
formname = 'SMARTFORM_NAME'
IMPORTING
fm_name = l_function_module_name
EXCEPTIONS
no_form = 1
no_function_module = 2
others = 3.
ls_control_parameters-no_dialog = 'X'.
ls_control_parameters-getotf = 'X'.
CALL FUNCTION l_function_module_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.
.
DATA:
itab_message_body TYPE TABLE OF solisti1 WITH HEADER LINE,
l_bin_size LIKE sood-objlen,
lv_xstring TYPE xstring,
itab_lines TYPE TABLE OF tline,
itab_otf TYPE TABLE OF itcoo.
itab_otf[] = ls_output_data-otfdata[]
CALL FUNCTION 'CONVERT_OTF'
EXPORTING
format = 'PDF'
max_linewidth = 132
IMPORTING
bin_filesize = l_bin_size "#EC NEEDED
bin_file = lv_xstring
TABLES
otf = itab_otf
lines = itab_lines
EXCEPTIONS
err_max_linewidth = 1
err_format = 2
err_conv_not_possible = 3
OTHERS = 4.
CALL FUNCTION 'ZSEND_EMAIL'
EXPORTING
lines_xstring = lv_xstring
sender_email_from = gl_email_from " email FROM
recipient_email_to = gl_email_adress " email TO
title_email = lv_title_email
IMPORTING
result = lv_senemail_res
TABLES
contents_text = itab_message_body. " текст тела письма
FUNCTION ZSEND_EMAIL.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*" IMPORTING
*" REFERENCE(LINES_XSTRING) TYPE XSTRING
*" REFERENCE(SENDER_EMAIL_FROM) TYPE ADR6-SMTP_ADDR
*" REFERENCE(RECIPIENT_EMAIL_TO) TYPE ADR6-SMTP_ADDR
*" REFERENCE(TITLE_EMAIL) TYPE STRING OPTIONAL
*" REFERENCE(TYPE_ATACH_DOC) TYPE SO_OBJ_TP DEFAULT 'PDF'
*" REFERENCE(NAME_ATACH_DOC) TYPE SO_OBJ_DES DEFAULT 'SomeName'
*" EXPORTING
*" REFERENCE(RESULT) TYPE I
*" TABLES
*" CONTENTS_BIN STRUCTURE SOLISTI1 OPTIONAL
*" CONTENTS_TEXT STRUCTURE SOLISTI1 OPTIONAL
*"----------------------------------------------------------------------
DATA:
zes_keg_email_documents_row TYPE zes_keg_email_documents_row OCCURS 0 WITH HEADER LINE,
zes_keg_email_recipients_row TYPE zes_keg_email_recipients_row OCCURS 0 WITH HEADER LINE.
zes_keg_email_documents_row-type = type_atach_doc.
zes_keg_email_documents_row-subject = name_atach_doc.
zes_keg_email_documents_row-content_text[] = contents_text[].
APPEND zes_keg_email_documents_row.
zes_keg_email_recipients_row-c_address = recipient_email_to.
zes_keg_email_recipients_row-i_express = 'X'.
APPEND zes_keg_email_recipients_row.
CALL FUNCTION 'ZEMAIL_WITH_CL_BCS'
EXPORTING
sender_address_from = sender_email_from
title_email = title_email
lines_xstring = lines_xstring
documents = zes_keg_email_documents_row[]
recipients = zes_keg_email_recipients_row[]
IMPORTING
result = result.
ENDFUNCTION.
FUNCTION ZEMAIL_WITH_CL_BCS.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*" IMPORTING
*" REFERENCE(SENDER_ADDRESS_FROM) TYPE ADR6-SMTP_ADDR
*" REFERENCE(TITLE_EMAIL) TYPE STRING OPTIONAL
*" REFERENCE(LINES_XSTRING) TYPE XSTRING OPTIONAL
*" REFERENCE(DOCUMENTS) TYPE ZES_KEG_EMAIL_DOCUMENTS OPTIONAL
*" REFERENCE(RECIPIENTS) TYPE ZES_KEG_EMAIL_RECIPIENTS OPTIONAL
*" REFERENCE(CONTENT_TYPE) TYPE SO_OBJ_TP DEFAULT 'HTM'
*" EXPORTING
*" REFERENCE(RESULT) TYPE I
*" RAISING
*" CX_BCS
*"----------------------------------------------------------------------
*----------------------------------------------------------------------*
* CLASS-DEFINITIONS *
*----------------------------------------------------------------------*
DATA: send_request TYPE REF TO cl_bcs.
DATA: document TYPE REF TO cl_document_bcs.
* DATA: sender TYPE REF TO cl_sapuser_bcs.
DATA: sender TYPE REF TO cl_cam_address_bcs.
DATA: recipient TYPE REF TO if_recipient_bcs.
DATA: exception_info TYPE REF TO if_os_exception_info,
bcs_exception TYPE REF TO cx_bcs.
*----------------------------------------------------------------------*
* INTERNAL TABLES *
*----------------------------------------------------------------------*
DATA: l_mailtext TYPE soli_tab.
DATA: l_mailhex TYPE solix_tab.
* DATA: iaddsmtp TYPE bapiadsmtp OCCURS 0 WITH HEADER LINE.
DATA: ireturn TYPE bapiret2 OCCURS 0 WITH HEADER LINE.
*----------------------------------------------------------------------*
* VARIABLES *
*----------------------------------------------------------------------*
DATA: mail_line LIKE LINE OF l_mailtext.
DATA: mailx_line LIKE LINE OF l_mailhex.
DATA: la_doc_line LIKE LINE OF documents.
DATA: recipients_line LIKE LINE OF recipients.
* DATA: bapiadsmtp TYPE bapiadsmtp.
DATA: lv_mail_from TYPE adr6-smtp_addr.
DATA: first(1) TYPE c.
DATA: la_contents TYPE soli.
DATA: conlengths TYPE so_obj_len.
DATA: lv_pdf_content TYPE solix_tab.
*----------------------------------------------------------------------*
* CONSTANTS *
*----------------------------------------------------------------------*
CLASS cl_cam_address_bcs DEFINITION LOAD.
CLASS cl_abap_char_utilities DEFINITION LOAD.
lv_mail_from = sender_address_from.
TRY.
* Create persistent send request
send_request = cl_bcs=>create_persistent( ).
CLEAR first.
lv_pdf_content = cl_document_bcs=>xstring_to_solix( lines_xstring ).
LOOP AT documents INTO la_doc_line.
* Build the Main Document
IF la_doc_line-content_hex[] IS INITIAL.
DESCRIBE TABLE la_doc_line-content_text[] LINES conlengths.
READ TABLE la_doc_line-content_text[] INTO la_contents INDEX conlengths.
conlengths = ( conlengths - 1 ) * 255 + STRLEN( la_contents ).
document = cl_document_bcs=>create_document(
i_type = content_type
i_text = la_doc_line-content_text[]
i_length = conlengths
i_subject = la_doc_line-subject ).
IF NOT lv_pdf_content IS INITIAL.
document->add_attachment(
i_attachment_type = la_doc_line-type " add PDF attachment
i_attachment_subject = la_doc_line-subject
i_att_content_hex = lv_pdf_content ).
ENDIF.
ELSE.
* Add Attachment
document->add_attachment(
i_attachment_type = la_doc_line-type
i_attachment_subject = la_doc_line-subject
i_att_content_hex = la_doc_line-content_hex ).
ENDIF.
ENDLOOP.
* Add document to send request
send_request->set_document( document ).
* Get sender object
* sender = cl_sapuser_bcs=>create( sy-uname ).
sender = cl_cam_address_bcs=>create_internet_address( lv_mail_from ).
* Add sender
send_request->set_sender( sender ).
* Create recipient TO
LOOP AT recipients INTO recipients_line.
IF recipients_line-c_address IS INITIAL.
recipients_line-c_address = '[email protected]'.
ENDIF.
recipient = cl_cam_address_bcs=>create_internet_address( recipients_line-c_address ).
* Add recipient with its respective attributes to send request
send_request->add_recipient(
i_recipient = recipient
i_express = recipients_line-i_express
i_copy = recipients_line-i_copy
i_blind_copy = recipients_line-i_blind_copy
i_no_forward = recipients_line-i_no_foward ).
ENDLOOP.
* subject line more than 50 chars
send_request->set_message_subject( title_email ).
* set send immediately flag
send_request->set_send_immediately( 'X' ).
* Send document
send_request->send( ).
COMMIT WORK AND WAIT.
CATCH cx_bcs INTO bcs_exception.
RESULT = 10.
* RAISE EXCEPTION bcs_exception.
ENDTRY.
ENDFUNCTION.
"*---------------- ВТОРОЙ СПОСОБ ----------------------*"
"*---------------- SO_DOCUMENT_SEND_API1 ---------*"
itab_otf[] = ls_output_data-otfdata[].
CALL FUNCTION 'CONVERT_OTF_2_PDF'
IMPORTING
bin_filesize = bin_filesize
TABLES
OTF = itab_otf
DOCTAB_ARCHIVE = itab_docs
LINES = itab_lines
.
CALL FUNCTION 'SX_TABLE_LINE_WIDTH_CHANGE'
EXPORTING
line_width_dst = '255'
TABLES
content_in = itab_lines
content_out = itab_pdf
EXCEPTIONS
err_line_width_src_too_long = 1
err_line_width_dst_too_long = 2
err_conv_failed = 3
OTHERS = 4.
FUNCTION ZEMAIL_WITH_API.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*" IMPORTING
*" REFERENCE(SENDER_MAIL_FROM) TYPE SOMLRECI1-RECEIVER
*" REFERENCE(RECIPIENT_MAIL_TO) TYPE SOMLRECI1-RECEIVER
*" REFERENCE(NAME_EMAIL50) TYPE SO_OBJ_DES
*" REFERENCE(TYPE_BODY_TEXT) TYPE SO_OBJ_TP DEFAULT 'HTM'
*" REFERENCE(TYPE_ATACH_DOC) TYPE SO_OBJ_TP DEFAULT 'PDF'
*" REFERENCE(NAME_ATACH_DOC) TYPE SO_OBJ_DES DEFAULT 'SomeName'
*" EXPORTING
*" REFERENCE(RESULT) TYPE I
*" TABLES
*" CONTENTS_BIN STRUCTURE SOLISTI1 OPTIONAL " сам атач
*" MESSAGE_BODY STRUCTURE SOLISTI1 OPTIONAL " тело
*"----------------------------------------------------------------------
DATA:
v_lines_bin TYPE i VALUE 0,
v_lines_rec TYPE i,
v_lines_txt TYPE i,
la_doc_data TYPE sodocchgi1,
lt_receivers LIKE somlreci1 OCCURS 0 WITH HEADER LINE,
lt_packlist LIKE sopcklsti1 OCCURS 0 WITH HEADER LINE,
la_document_data TYPE sodocchgi1.
*-- Assign the Email id and User id to Whom you want to Send -------------&
REFRESH lt_receivers.
lt_receivers-receiver = recipient_mail_to. "&---- Assign Email id
lt_receivers-rec_type = 'U'. "&---- Send to External Email id
lt_receivers-com_type = 'INT'.
lt_receivers-notif_del = 'X'.
lt_receivers-notif_ndel = 'X'.
APPEND lt_receivers.
*& - END of Assign the Email id and User id to Whom you want to Send --&
"&--- Read the Number of lines in the Internal Table
DESCRIBE TABLE lt_receivers LINES v_lines_rec.
IF v_lines_rec IS NOT INITIAL.
DESCRIBE TABLE message_body LINES v_lines_txt.
READ TABLE message_body INDEX v_lines_txt.
la_doc_data-obj_name = 'SMARTFORM'.
la_doc_data-expiry_dat = sy-datum + 10.
la_doc_data-obj_descr = name_email50.
la_doc_data-sensitivty = 'F'.
la_doc_data-doc_size = v_lines_txt * 255.
* la_doc_data-doc_size = ( v_lines_bin - 1 ) * 255 + STRLEN( contents_bin ).
la_doc_data-obj_langu = sy-langu.
* Describe the body of the message
REFRESH lt_packlist.
lt_packlist-transf_bin = space.
lt_packlist-head_start = 1.
lt_packlist-head_num = 0.
lt_packlist-body_start = 1.
lt_packlist-body_num = v_lines_txt.
lt_packlist-doc_type = type_body_text."'RAW'.
APPEND lt_packlist.
* Packing for PDF.
IF NOT contents_bin IS INITIAL.
DESCRIBE TABLE contents_bin LINES v_lines_bin.
ENDIF.
lt_packlist-transf_bin = 'X'.
lt_packlist-head_start = 1.
lt_packlist-head_num = 1.
lt_packlist-body_start = 1.
lt_packlist-body_num = v_lines_bin.
lt_packlist-doc_type = type_atach_doc. "'PDF'.
lt_packlist-obj_name = 'smart'.
lt_packlist-obj_descr = name_atach_doc.
lt_packlist-doc_size = v_lines_bin * 255.
APPEND lt_packlist.
CALL FUNCTION 'SO_DOCUMENT_SEND_API1'
EXPORTING
document_data = la_doc_data
sender_address = sender_mail_from
sender_address_type = 'INT'
put_in_outbox = 'X'
commit_work = 'X'
TABLES
packing_list = lt_packlist
contents_bin = contents_bin
contents_txt = message_body
receivers = lt_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 .
result = sy-subrc.
ENDIF. "&---- END of Check the Sender Email id or SAP User id is got or not.
ENDFUNCTION.
-
Пример отправки SmartForms в виде PDF-атачмента: http://sapforum.biz/index.php/topic,2717.msg13884.html#msg13884
-
Всем доброго времени суток!
Коллеги, мы отправили письмо с транзакцией. Но пользователю не понравилось что надо
открывать письмо и далее идти в меню и нажимать Документ->Выполнить (Ctrl+F6).
Пользователь хочет по двойному клику по письму что бы запускалась транзакция.
На сколько я знаю, это можно сделать если через Work-Flow.
Из примера описания данного фм-ника видно что можно передать параметр объекта
wfl like sood-objtp value 'WFL', " WorkFlow
.
Вопрос как создать объект WorkFlow программно и добавить в таблицу object_content?
Или можно как то заставить открываться транзакцию по двойному клику?