[ABAP]스마트폼 E-mail 전송 관련 PDF 변환 등
출처 :
http://www.erpschool.net/yc4/bbs/board.php?bo_table=BBS_INVENT&wr_id=147
예제1)
자꾸 까먹어서 -ㅡㅡ
맨아래쪽에 메인 전송
*&---------------------------------------------------------------------*
*& Form EXECUTE_ACROBAT
*&---------------------------------------------------------------------*
* text PDF로 변환
*----------------------------------------------------------------------*
FORM EXECUTE_ACROBAT .
CLEAR : OTF_TAB, OTF_TAB[], PDF_TABLE, PDF_TABLE[],
PDF_FSIZE, PDF_LINE_TAB, PDF_LINE_TAB[],
PDF_XFILE.
** CALL FUNCTION 'SSFCOMP_PDF_PREVIEW'
** EXPORTING
** I_OTF = JOB_OUTPUT_INFO-OTFDATA[]
** EXCEPTIONS
** CONVERT_OTF_TO_PDF_ERROR = 1
** CNTL_ERROR = 2
** OTHERS = 3.
**
OTF_TAB[] = JOB_OUTPUT_INFO-OTFDATA[].
CALL FUNCTION 'CONVERT_OTF'
EXPORTING
FORMAT = 'PDF'
IMPORTING
BIN_FILESIZE = PDF_FSIZE
BIN_FILE = PDF_XFILE
TABLES
OTF = OTF_TAB
LINES = PDF_TABLE
EXCEPTIONS
ERR_MAX_LINEWIDTH = 1
ERR_FORMAT = 2
ERR_CONV_NOT_POSSIBLE = 3
ERR_BAD_OTF = 4
OTHERS = 5.
IF SY-SUBRC <> 0.
GV_ERR = 'E'.
EXIT.
ENDIF.
* PDF_LINE_TAB[] = PDF_TABLE[].
ENDFORM. " EXECUTE_ACROBAT
*&---------------------------------------------------------------------*
*& Form DISPLAY_SMARTFORM
*&---------------------------------------------------------------------*
* text 스마트 폼 조회
*----------------------------------------------------------------------*
FORM DISPLAY_SMARTFORM .
DATA : L_FORM TYPE TDSFNAME , " FORM NAME
L_FNAME TYPE RS38L_FNAM . " FUNCTION NAME
DATA : L_I01 TYPE SY-TABIX ,
L_S01 TYPE SY-TABIX ,
L_E01 TYPE SY-TABIX .
CLEAR : JOB_OUTPUT_INFO , JOB_OUTPUT_OPTIONS.
PERFORM OUTPUT_SETTTING USING OUTPUT_OPTION.
PERFORM CONTROL_SETTING USING CONTROL_PARA.
CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
EXPORTING
FORMNAME = C_FORM "스마트폼이름
IMPORTING
FM_NAME = L_FNAME " 펑션이름
EXCEPTIONS
NO_FORM = 1
NO_FUNCTION_MODULE = 2
OTHERS = 3.
IF SY-SUBRC <> 0.
GV_ERR = 'E'.
EXIT.
ENDIF.
* Smart Forms 호출.
CALL FUNCTION L_FNAME
EXPORTING
CONTROL_PARAMETERS = CONTROL_PARA
OUTPUT_OPTIONS = OUTPUT_OPTION
USER_SETTINGS = ' '
I_HEADER = IT_HEADER_SMART
IMPORTING
JOB_OUTPUT_OPTIONS = JOB_OUTPUT_OPTIONS
JOB_OUTPUT_INFO = JOB_OUTPUT_INFO
TABLES
T_ITEM = IT_ITEM_SMART
EXCEPTIONS
FORMATTING_ERROR = 1
INTERNAL_ERROR = 2
SEND_ERROR = 3
USER_CANCELED = 4
OTHERS = 5.
IF SY-SUBRC <> 0.
GV_ERR = 'E'.
EXIT.
ENDIF.
ENDFORM. " DISPLAY_SMARTFORM
FUNCTION ZMM_PO_PDF_SEND .
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" REFERENCE(I_EBELN) TYPE ZUSMM_PONO
*" EXCEPTIONS
*" INVALID_PO_NO
*" SMARTFORM_ERROR
*" PDF_ERROR
*" SEND_ERROR
*" ADDRESS_ERROR
*"----------------------------------------------------------------------
* 발주서를 pdf형식으로 변환하여 이메일에 첨부한다
* 한개 또는 복수개의 발주서를 첨부가능하다.
*-----------------------------------------------------------------------
*
DATA: LV_EBELN TYPE EBELN.
DATA: BEGIN OF LT_ATTACH OCCURS 0,
ATTSUBJECT LIKE GV_ATTSUBJECT,
DATA TYPE XSTRING,
END OF LT_ATTACH.
DATA : LS_DATA TYPE TLINE,
LV_BUFFER TYPE STRING,
LV_LINES TYPE I,
LV_SIZE TYPE SOOD-OBJLEN,
GS_SOLIX TYPE SOLIX,
G_XFILE_LENGTH TYPE I,
G_I TYPE I.
CHECK I_EBELN[] IS NOT INITIAL.
SELECT SINGLE CLNT INTO GV_CLIENT
FROM ZUSEREXIT01
WHERE BUKRS = 'NT10'.
CLEAR : GV_ERR, GT_ATTNAME, GT_ATTNAME[].
LOOP AT I_EBELN INTO LV_EBELN.
CLEAR : GV_SUBJECT, GV_ATTSUBJECT. "attach 파일명
PERFORM MAKE_GDATA USING LV_EBELN.
IF GV_ERR IS NOT INITIAL.
RAISE INVALID_PO_NO.
ENDIF.
PERFORM EDIT_DATA_SMART.
* 스마트폼 실행
PERFORM DISPLAY_SMARTFORM.
IF GV_ERR IS NOT INITIAL.
RAISE SMARTFORM_ERROR.
ENDIF.
* pdf파일로 변환
PERFORM EXECUTE_ACROBAT.
IF GV_ERR IS NOT INITIAL.
RAISE PDF_ERROR.
ENDIF.
* attach 파일 준비
CLEAR : LT_ATTACH, GT_ATTNAME.
LT_ATTACH-ATTSUBJECT = GV_ATTSUBJECT.
LT_ATTACH-DATA = PDF_XFILE.
APPEND LT_ATTACH.
GT_ATTNAME-ATTSUBJECT = GV_ATTSUBJECT.
APPEND GT_ATTNAME.
ENDLOOP.
TRY.
CLEAR SEND_REQUEST.
SEND_REQUEST = CL_BCS=>CREATE_PERSISTENT( ).
* 본문 만들기
PERFORM MAKE_MAIL_BODY.
LOOP AT LT_ATTACH.
REFRESH CONT_HEX.
CLEAR : G_XFILE_LENGTH, GS_SOLIX.
G_XFILE_LENGTH = XSTRLEN( LT_ATTACH-DATA ).
G_I = 0.
WHILE G_I < G_XFILE_LENGTH.
GS_SOLIX-LINE = LT_ATTACH-DATA+G_I.
APPEND GS_SOLIX TO CONT_HEX.
G_I = G_I + 255.
ENDWHILE.
CALL METHOD DOCUMENT2->ADD_ATTACHMENT
EXPORTING
I_ATTACHMENT_SIZE = LV_SIZE
I_ATTACHMENT_TYPE = 'PDF'
I_ATTACHMENT_SUBJECT = LT_ATTACH-ATTSUBJECT
* I_ATT_CONTENT_TEXT = CONT_TEXT.
I_ATT_CONTENT_HEX = CONT_HEX.
ENDLOOP.
CALL METHOD SEND_REQUEST->SET_DOCUMENT( DOCUMENT2 ).
CLEAR GV_ERR.
PERFORM RECEIVER_MAKE.
IF GV_ERR IS NOT INITIAL.
RAISE ADDRESS_ERROR.
ENDIF.
* ---------- send document ---------------------------------------
SEND_REQUEST->SEND_REQUEST->SET_LINK_TO_OUTBOX( 'X' ).
SEND_REQUEST->SET_SEND_IMMEDIATELY( 'X' ).
CALL METHOD SEND_REQUEST->SEND(
EXPORTING
I_WITH_ERROR_SCREEN = 'X'
RECEIVING
RESULT = SENT_TO_ALL ).
IF SENT_TO_ALL = 'X'.
ENDIF.
COMMIT WORK.
* -----------------------------------------------------------
* * exception handling
* -----------------------------------------------------------
CATCH CX_BCS INTO BCS_EXCEPTION.
RAISE SEND_ERROR.
ENDTRY.
ENDFUNCTION.
예제2)
*&---------------------------------------------------------------------*
*& Form MAIL_SEND_PER_SADOC
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM MAIL_SEND_PER_SADOC USING PS_MARK TYPE ZUSIMS0020.
* 참조 메일 주소
DATA: LT_ADDR LIKE TABLE OF ZUSMMT0011 WITH HEADER LINE.
DATA: LV_RECEIVE TYPE ADR6-SMTP_ADDR,
LV_ONE(300).
* 받는 사람
LOOP AT IT_CUST_EMAIL WHERE KUNNR = PS_MARK-KUNNR
AND ZUSE = 'X'.
CLEAR GS_RECIPIENTS. "수신
GS_RECIPIENTS-C_ADDRESS = IT_CUST_EMAIL-EMAIL.
GS_RECIPIENTS-I_EXPRESS = 'X'.
APPEND GS_RECIPIENTS TO G_RECIPIENTS.
ENDLOOP.
* --------- add recipient (e-mail address) -----------------------
SELECT * INTO TABLE LT_ADDR
FROM ZUSMMT0011
WHERE ZINACT = ' '
AND ( ZPGM = ' ' OR ZPGM = 'S' ).
SORT LT_ADDR BY ZGUBUN ZSEQ.
LOOP AT LT_ADDR. "모두 참조
CLEAR GS_RECIPIENTS.
GS_RECIPIENTS-C_ADDRESS = LT_ADDR-ZMAIL.
GS_RECIPIENTS-I_EXPRESS = 'X'.
GS_RECIPIENTS-I_COPY = 'X'.
APPEND GS_RECIPIENTS TO G_RECIPIENTS.
ENDLOOP.
* 담당영업사원
LOOP AT IT_S_MAIL. "모두 참조
CLEAR GS_RECIPIENTS.
GS_RECIPIENTS-C_ADDRESS = IT_S_MAIL-SALESMAN_MAIL.
GS_RECIPIENTS-I_EXPRESS = 'X'.
GS_RECIPIENTS-I_COPY = 'X'.
APPEND GS_RECIPIENTS TO G_RECIPIENTS.
ENDLOOP.
G_SUNAME = SY-UNAME.
CALL FUNCTION 'ZMM_SEND_DOCUMAIL'
EXPORTING
REQUESTED_STATUS = 'E'
DOCUMENTS = G_DOCUMENTS
RECIPIENTS = G_RECIPIENTS
SUNAME = G_SUNAME
SADDRESS = G_SADDRESS
IMPORTING
RETURN = G_RETURN
EXCEPTIONS
NO_SEND_MAIL = 1
OTHERS = 2.
IF SY-SUBRC = 0.
* 메일성공시 전송기록
UPDATE ZUSIMT0032 SET ESTATUS = 'X'
EDATE = SY-DATLO
WHERE KUNNR = PS_MARK-KUNNR
AND SADOC = PS_MARK-SADOC.
LOOP AT IT_LIST WHERE KUNNR = PS_MARK-KUNNR
AND SADOC = PS_MARK-SADOC.
IT_LIST-ESTATUS = 'X'.
MODIFY IT_LIST.
ENDLOOP.
ELSE.
GV_ERR = 'E'.
ENDIF.
ENDFORM. " MAIL_SEND_PER_SADOC
*&---------------------------------------------------------------------*
*& Form INIT_MAIL_VARIABLE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM INIT_MAIL_VARIABLE .
REFRESH : G_DOCUMENTS, G_RECIPIENTS.
CLEAR : G_DOCUMENTS, G_RECIPIENTS,
GS_DOCUMENTS, GS_RECIPIENTS,
G_SUNAME, G_SADDRESS,
GS_DOCUMENTS-CONTENT_TEXT[],
GS_DOCUMENTS-CONTENT_HEX[],
IT_S_MAIL, IT_S_MAIL[],
G_RETURN.
CLEAR : GV_PKNO, GV_CBNO.
ENDFORM. " INIT_MAIL_VARIABLE
FUNCTION ZMM_SEND_DOCUMAIL.
*"--------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" REFERENCE(REQUESTED_STATUS) TYPE BCS_RQST DEFAULT 'E'
*" REFERENCE(DOCUMENTS) TYPE ZHREX_DOCUMENTS
*" REFERENCE(RECIPIENTS) TYPE ZHREX_RECIPIENTS
*" REFERENCE(SUNAME) TYPE UNAME DEFAULT SY-UNAME
*" REFERENCE(SADDRESS) TYPE ADR6-SMTP_ADDR OPTIONAL
*" EXPORTING
*" REFERENCE(RETURN) TYPE BAPIRETURN-TYPE
*" EXCEPTIONS
*" NO_SEND_MAIL
*"--------------------------------------------------------------------
* 2008.07. 시스템 초기 발주서 이메일 전송처리 기능 (사용안함)
*----------------------------------------------------------------------*
* CLASS-DEFINITIONS *
*----------------------------------------------------------------------*
* Global data declarations
DATA: send_request TYPE REF TO cl_bcs ,
document TYPE REF TO cl_document_bcs ,
recipient TYPE REF TO if_recipient_bcs ,
exception_info TYPE REF TO if_os_exception_info,
bcs_exception TYPE REF TO cx_bcs ,
sender TYPE REF TO if_sender_bcs .
*----------------------------------------------------------------------*
* INTERNAL TABLES *
*----------------------------------------------------------------------*
DATA: l_mailtext TYPE soli_tab ,
l_mailhex TYPE solix_tab ,
iaddsmtp TYPE bapiadsmtp OCCURS 0 WITH HEADER LINE,
ireturn TYPE bapiret2 OCCURS 0 WITH HEADER LINE.
*----------------------------------------------------------------------*
* VARIABLES *
*----------------------------------------------------------------------*
DATA: mail_line LIKE LINE OF l_mailtext ,
mailx_line LIKE LINE OF l_mailhex ,
bapiadsmtp TYPE bapiadsmtp ,
att_line TYPE so_obj_len ,
nexen_domain(14) TYPE c VALUE '@nexen.co.kr'.
*----------------------------------------------------------------------*
* CONSTANTS *
*----------------------------------------------------------------------*
CLASS cl_cam_address_bcs DEFINITION LOAD.
CLASS cl_abap_char_utilities DEFINITION LOAD.
TRY.
* 1. Create persistent send request
send_request = cl_bcs=>create_persistent( ).
DATA: first(1) TYPE c.
CLEAR first.
DATA: documents_line LIKE LINE OF documents.
LOOP AT documents INTO documents_line.
IF first IS INITIAL.
MOVE 'X' TO first.
* 2. Build the Main Document
IF documents_line-content_hex[] IS INITIAL.
document = cl_document_bcs=>create_document(
i_type = documents_line-type
i_text = documents_line-content_text
i_subject = documents_line-subject ).
ELSE.
document = cl_document_bcs=>create_document(
i_type = documents_line-type
i_hex = documents_line-content_hex
i_subject = documents_line-subject ).
ENDIF.
ELSE.
IF documents_line-content_hex[] IS INITIAL.
* 3. Add Attachment
CALL METHOD document->add_attachment
EXPORTING
i_attachment_type = documents_line-type
i_attachment_subject = documents_line-subject
i_att_content_text = documents_line-content_text.
ELSE.
CALL METHOD document->add_attachment
EXPORTING
i_attachment_type = documents_line-type
i_attachment_subject = documents_line-subject
i_att_content_hex = documents_line-content_hex.
ENDIF.
ENDIF.
ENDLOOP.
* 4. Add document to send request
CALL METHOD send_request->set_document( document ).
* 5. Get sender object
IF saddress IS INITIAL.
sender ?= cl_sapuser_bcs=>create( suname ).
ELSE. "일반 EMAIL 주소제시할 때
DATA : i_address TYPE adr6-smtp_addr,
i_name TYPE adr6-smtp_addr.
i_address = saddress.
i_name = suname.
CALL METHOD cl_cam_address_bcs=>create_internet_address
EXPORTING
i_address_string = i_address
i_address_name = i_name
RECEIVING
result = sender.
ENDIF.
* Add sender
CALL METHOD send_request->set_sender
EXPORTING
i_sender = sender.
* 6. Create recipient
DATA: recipients_line LIKE LINE OF recipients.
LOOP AT recipients INTO recipients_line.
IF recipients_line-c_address IS INITIAL.
CLEAR iaddsmtp.
REFRESH iaddsmtp.
CLEAR bapiadsmtp.
CLEAR recipient.
* Read the E-Mail address for the user
CALL FUNCTION 'BAPI_USER_GET_DETAIL'
EXPORTING
username = recipients_line-uname
TABLES
return = ireturn
addsmtp = iaddsmtp.
LOOP AT iaddsmtp WHERE std_no = 'X'.
CLEAR bapiadsmtp.
MOVE iaddsmtp TO bapiadsmtp.
ENDLOOP.
* If no E-mail address was found, create one.
IF bapiadsmtp-e_mail = ''.
CONCATENATE recipients_line-uname nexen_domain
INTO recipients_line-c_address.
ELSE.
MOVE bapiadsmtp-e_mail TO recipients_line-c_address.
ENDIF.
ENDIF.
recipient = cl_cam_address_bcs=>create_internet_address(
recipients_line-c_address ).
* Add recipient with its respective attributes to send request
CALL METHOD send_request->add_recipient
EXPORTING
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.
* 7. Set that you don't need a Return Status E-mail
DATA: status_mail TYPE bcs_stml.
status_mail = requested_status.
CALL METHOD send_request->set_status_attributes
EXPORTING
i_requested_status = requested_status
i_status_mail = status_mail.
* 8. set send immediately flag
send_request->set_send_immediately( 'X' ).
* 9. Send document
DATA: send_to_all TYPE os_boolean,
recipients_with_error TYPE bcsy_re,
orig_recs_with_error TYPE bcsy_ercp.
CALL METHOD send_request->send(
EXPORTING
i_with_error_screen = 'X'
RECEIVING
result = send_to_all ).
IF send_to_all NE 'X'.
RAISE no_send_mail.
ELSE.
COMMIT WORK.
IF sy-subrc <> 0.
RAISE no_send_mail.
ELSE.
return = 'S'.
ENDIF.
ENDIF.
CATCH cx_bcs INTO bcs_exception.
RAISE no_send_mail.
ENDTRY.
ENDFUNCTION.
IMPORT
REQUESTED_STATUS TYPE BCS_RQST 'E' Requested Status
DOCUMENTS TYPE ZHREX_DOCUMENTS E-MAIL - DOCUMENTS
RECIPIENTS TYPE ZHREX_RECIPIENTS E-MAIL - RECIPIENTS
SUNAME TYPE UNAME SY-UNAME User Name
SADDRESS TYPE ADR6-SMTP_ADDR E-Mail Address
EXPORT
RETURN TYPE BAPIRETURN-TYPE
EXCEPTION
NO_SEND_MAIL
CALL FUNCTION 'ZMM_SEND_DOCUMAIL'
EXPORTING
REQUESTED_STATUS = 'E'
DOCUMENTS = G_DOCUMENTS
RECIPIENTS = G_RECIPIENTS
SUNAME = G_SUNAME
SADDRESS = G_SADDRESS
IMPORTING
RETURN = G_RETURN
EXCEPTIONS
NO_SEND_MAIL = 1
OTHERS = 2.
CC 는 구조체에 마킹으로 전송
이메일 전송 베이스는 SO_NEW_DOCUMENT_SEND_API1 펑션임