본문 바로가기
ABAP 문법 & 기법

[SAP ABAP] CL_BCS 메일 송신 — 4단계 객체지향 패턴 (첨부파일·SOST·SCOT)

by Song.sh 2026. 5. 19.

ABAP 에서 사용자나 거래처에게 자동으로 이메일을 보내는 요구사항은 자주 등장합니다. 결재 알림, 정기 보고서, 거래처 안내, 견적서 첨부 송신 등이 대표적입니다. 예전에는 표준 Function Module(SO_NEW_DOCUMENT_ATT_SEND_API1) 을 주로 사용했지만, 현재 SAP 표준은 객체지향 기반의 BCS(Business Communication Services) 클래스 — CL_BCS 를 권장합니다.

 

CL_BCS 패턴은 요청 생성 → 문서 작성 → 발신자/수신자 지정 → 발송 의 4단계 흐름을 객체 메소드 체이닝으로 깔끔하게 표현합니다. 본문(RAW · HTML) · 로컬 PC 첨부파일 · SAP 비즈니스 객체에 붙어있는 GOS(Generic Object Services) 첨부파일 · BCC(숨은 참조) 까지 표준 클래스 메소드로 일관되게 처리됩니다.

 

이 글은 CL_BCS 의 기본 패턴, 핵심 클래스 4개, 본문 두 가지 형식(RAW/HTM), 첨부파일 두 가지 방식(로컬 PC / SAP GOS), 발송 결과 확인 트랜잭션(SOST·SCOT), 그리고 실무에서 자주 만나는 함정까지 한 번에 정리한 메모입니다.


핵심 — CL_BCS 4개 클래스 + 4단계 흐름

이메일 송신에 필요한 표준 클래스 4개와, 메소드 호출 순서를 먼저 정리합니다.

클래스 역할
CL_BCS 송신 요청(Send Request) — 전체 흐름의 컨트롤러
CL_DOCUMENT_BCS 문서(Document) — 제목·본문·첨부파일
CL_SAPUSER_BCS 발신자(Sender) — SAP 사용자 기반
CL_CAM_ADDRESS_BCS 수신자(Recipient) — 외부 이메일 주소

첨부파일을 다룰 때는 두 가지 보조 클래스/FM 이 추가로 사용됩니다.

클래스 / FM 역할
CL_BCS_CONVERT SOLI(텍스트) ↔ SOLIX(바이너리) 변환 — 첨부파일 인코딩
CL_BINARY_RELATION SAP 비즈니스 객체에 붙은 GOS 첨부파일 링크 조회
SO_DOCUMENT_READ_API1 SAP 첨부 문서의 헤더·내용을 ABAP 으로 읽기 (FM)

전체 흐름은 4단계입니다.

1. CL_BCS=>create_persistent( )                            → 송신 요청 객체 생성
2. CL_DOCUMENT_BCS=>create_document( RAW / HTM )            → 본문 생성
   + lo_document->add_attachment( )                         → 첨부파일 (선택)
3. send_request->set_sender( ) / add_recipient( )           → 발신자·수신자 지정
4. send_request->send( ) + COMMIT WORK                      → 발송 큐에 등록

1단계 — 송신 요청과 문서 생성 (RAW · HTM)

요청 객체와 문서 객체를 만드는 가장 기본 단계입니다. 본문 형식은 텍스트(RAW) 또는 HTML(HTM) 중 선택합니다.

RAW 본문 — 단순 텍스트

" 1) 송신 요청 — 컨트롤러
DATA(send_request) = cl_bcs=>create_persistent( ).

" 2) 메일 제목
DATA: lv_title TYPE so_obj_des.
lv_title = |[알림] 일일 처리 결과 ({ sy-datum })|.

" 3) RAW 본문 — 인터널 테이블 줄 단위
DATA: lt_main_text TYPE bcsy_text.
lt_main_text = VALUE #(
  ( line = '안녕하세요' )
  ( line = '' )
  ( line = '오늘 일일 처리 결과를 보내드립니다.' )
  ( line = '' )
  ( line = '감사합니다.' )
).

" 4) 문서 생성
DATA(lo_document) = cl_document_bcs=>create_document(
  i_type    = 'RAW'
  i_text    = lt_main_text
  i_subject = lv_title
).

HTM 본문 — 스타일·표 포함

HTML 형식은 본문에 표·강조·줄바꿈을 자유롭게 표현할 수 있습니다. 줄바꿈은 </br> 또는 <p> 태그를 명시해야 합니다.

lt_main_text = VALUE bcsy_text(
  ( line = |안녕하십니까.|  )
  ( line = |</br>| )
  ( line = |</br>| )
  ( line = |{ lv_subject } 관련하여 안내드립니다.| )
  ( line = |</br>| )
  ( line = |<pre>                      -아        래-</pre>| )
  ( line = |1. 제목 : { lv_subject }| )
  ( line = |</br>| )
  ( line = |2. 마감 : { lv_due_date } 까지| )
  ( line = |</br>| )
  ( line = |</br>| )
  ( line = |감사합니다.| )
).

lo_document = cl_document_bcs=>create_document(
  i_type    = 'HTM'                        " ★ HTM 타입
  i_text    = lt_main_text
  i_subject = lv_title
).
i_type 특징
RAW 일반 텍스트. 인터널 테이블 줄 단위로 자동 줄바꿈
HTM HTML. </br>·<pre>·<table> 등 태그 명시 필수

2단계 — 발신자 · 수신자 지정 (BCC 포함)

발신자는 SAP 사용자(SY-UNAME 또는 지정 사용자) 기반이고, 수신자는 외부 이메일 주소입니다. BCC(숨은 참조) 도 같은 메소드로 처리합니다.

" 1) 발신자 — 현재 로그인 사용자
DATA(lo_sender) = cl_sapuser_bcs=>create( sy-uname ).
send_request->set_sender( i_sender = lo_sender ).

" 2) 수신자 — 일반(To)
DATA: lv_mail TYPE sza5_d0700-smtp_addr.
lv_mail = 'user@example.com'.

DATA(lo_recipient) = cl_cam_address_bcs=>create_internet_address( lv_mail ).
send_request->add_recipient( i_recipient = lo_recipient ).

" 3) BCC(숨은 참조) — i_blind_copy = abap_true
lv_mail = 'manager@example.com'.
lo_recipient = cl_cam_address_bcs=>create_internet_address( lv_mail ).
send_request->add_recipient(
  EXPORTING
    i_recipient  = lo_recipient
    i_blind_copy = abap_true              " ★ 숨은 참조
).

" 4) CC(참조) — i_copy = abap_true
" (BCC 와 동일 패턴으로 i_copy 지정)

" 5) 문서를 요청에 연결
send_request->set_document( lo_document ).
옵션 의미
(기본) To — 일반 수신자
i_copy = abap_true CC — 참조 (모든 수신자에게 주소 노출)
i_blind_copy = abap_true BCC — 숨은 참조 (다른 수신자에게 주소 숨김)

거래처 다중 발송 시 다른 거래처의 메일 주소가 노출되면 안 되므로 거의 항상 BCC 로 처리합니다.


3단계 — 로컬 PC 파일 첨부 (GUI_UPLOAD)

PDF · Excel 등 로컬 PC 파일을 첨부할 때는 GUI_UPLOAD 로 SOLIX(16진) 인터널 테이블에 담은 뒤 add_attachment 로 붙입니다.

DATA: lt_mail_hex TYPE solix_tab,
      lv_filesize TYPE i.

CALL FUNCTION 'GUI_UPLOAD'
  EXPORTING
    filename   = 'C:\temp\report.pdf'
    filetype   = 'BIN'
  IMPORTING
    filelength = lv_filesize
  TABLES
    data_tab   = lt_mail_hex.

DATA: lv_attach_name TYPE sood-objdes.
lv_attach_name = |일일보고서_{ sy-datum }|.

lo_document->add_attachment(
  i_attachment_type    = 'PDF'             " PDF · XLS · DOC · TXT · ZIP 등
  i_attachment_subject = lv_attach_name     " 표시명
  i_att_content_hex    = lt_mail_hex
).

여러 파일을 첨부하려면 add_attachment 를 반복 호출합니다.


4단계 — SAP GOS 첨부파일 송신 (CL_BINARY_RELATION)

실무에서 가장 유용한 패턴. SAP 비즈니스 객체(구매오더·발주·결재문서 등) 에 사용자가 GOS 메뉴(상단 첨부 아이콘) 로 붙여둔 파일을 그대로 메일에 첨부할 수 있습니다.

흐름

1. CL_BINARY_RELATION=>READ_LINKS_OF_BINRELS    → 객체에 붙은 첨부 링크 조회
2. SO_DOCUMENT_READ_API1                         → 각 링크의 헤더·내용 읽기
3. CL_BCS_CONVERT=>SOLI_TO_SOLIX / TXT_TO_SOLIX  → 텍스트를 바이너리로 변환
4. lo_document->add_attachment( )                → 메일 문서에 첨부

코드 예시

" 1) 비즈니스 객체 키 정보 (SIBFLPORB 구조)
DATA(lv_instid) = lv_doc_no && 'XXFILE'.        " 객체 키
DATA(ls_object) = VALUE sibflporb(
  instid = lv_instid
  typeid = 'ZXXFILE'                             " 회사 BO 타입
  catid  = 'BO'
).

" 2) 첨부파일 필터 (ATTA = General attachment)
DATA(lt_option) = VALUE obl_t_relt(
  ( low    = 'ATTA'
    sign   = 'I'
    option = 'EQ' )
).

" 3) 객체에 연결된 첨부 링크 조회
CALL METHOD cl_binary_relation=>read_links_of_binrels
  EXPORTING
    is_object           = ls_object
    it_relation_options = lt_option
    ip_role             = 'GOSAPPLOBJ'
  IMPORTING
    et_links            = DATA(lt_links).

" 4) 각 첨부파일의 헤더·내용 읽고 메일에 첨부
LOOP AT lt_links INTO DATA(ls_links).
  DATA: lv_docid      TYPE sofolenti1-doc_id,
        ls_doc_data   TYPE sofolenti1,
        lt_header     TYPE TABLE OF solisti1,
        lt_cont       TYPE TABLE OF solisti1,
        lt_cont_solix TYPE TABLE OF solix.

  lv_docid = ls_links-instid_b.

  CALL FUNCTION 'SO_DOCUMENT_READ_API1'
    EXPORTING
      document_id    = lv_docid
    IMPORTING
      document_data  = ls_doc_data
    TABLES
      object_header  = lt_header
      object_content = lt_cont
      contents_hex   = lt_cont_solix.

  IF sy-subrc = 0.
    " 5) SOLI → SOLIX 변환 (포맷에 따라 분기)
    DATA: lt_binary_content TYPE solix_tab.

    IF ls_doc_data-obj_type = 'TXT'.
      cl_bcs_convert=>txt_to_solix(
        EXPORTING
          it_soli     = lt_cont
          iv_codepage = '8500'
        IMPORTING
          et_solix    = lt_binary_content
      ).
    ELSE.
      lt_binary_content = cl_bcs_convert=>soli_to_solix( it_soli = lt_cont ).
    ENDIF.

    " 6) 메일 문서에 첨부
    lo_document->add_attachment(
      i_attachment_type     = ls_doc_data-obj_type      " 형식 (PDF/XLSX/TXT...)
      i_attachment_language = ls_doc_data-obj_langu
      i_attachment_size     = ls_doc_data-doc_size
      i_attachment_subject  = ls_doc_data-obj_descr     " 표시명
      i_att_content_hex     = lt_binary_content
    ).
  ENDIF.
ENDLOOP.

핵심 포인트:

  • SOLI vs SOLIX — SAP 내부 첨부 데이터는 보통 SOLI(텍스트 라인) 로 저장되지만 add_attachment 는 SOLIX(16진) 를 요구합니다. CL_BCS_CONVERT 가 두 포맷 사이를 변환합니다.
  • TXT 파일은 별도 처리 — 코드페이지(8500 등) 를 명시해야 한글이 안 깨집니다.
  • ip_role = 'GOSAPPLOBJ' — 일반 GOS 첨부파일에는 항상 이 role 사용.
  • lt_option 의 'ATTA' — Attachment 만 필터링. 다른 GOS 객체(노트·링크 등) 와 분리.

 


5단계 — 발송 + COMMIT WORK + 운영 트랜잭션

마지막에 send 호출 후 COMMIT WORK 가 반드시 필요 — 빠뜨리면 큐에 들어가지 않아 실제 발송이 안 됩니다.

DATA(lo_send_all) = send_request->send( i_with_error_screen = abap_true ).

IF lo_send_all IS INITIAL.
  ROLLBACK WORK.
  MESSAGE |메일 발송 실패| TYPE 'S' DISPLAY LIKE 'E'.
ELSE.
  COMMIT WORK.
  MESSAGE |메일 발송 완료| TYPE 'S'.
ENDIF.

운영 트랜잭션

T-Code 용도
SOST 개별 메일 송신 상태 모니터링 — 발송 큐·재발송·오류 메시지 확인
SCOT SMTP 노드·도메인 설정 (베이시스 영역)
SBWP 개인 SAP 인박스 (Business Workplace) — 사내 SAP 사용자 메일 수신함
SU01 사용자 마스터 — 발신자 이메일 주소 등록 (Address 탭)

발송 직후 메일이 안 도착했다면 먼저 SOST 에서 상태를 확인합니다. 큐에 "Waiting" 으로 멈춰 있다면 SCOT 의 Send Job 이 비활성화돼 있을 가능성이 큽니다.


흔히 빠뜨리는 함정

COMMIT WORK 누락 → 메일이 큐에 안 들어감

가장 흔한 실수. send( ) 메소드를 호출해도 COMMIT WORK 가 없으면 SAP 가 발송 큐에 등록하지 않습니다. 호출 직후 반드시 COMMIT WORK(또는 COMMIT WORK AND WAIT).

SMTP 노드 미설정

SCOT 의 Send Job 이 활성화되어 있지 않으면 메일이 큐에 쌓인 채 안 나갑니다. 신규 시스템 오픈 시 베이시스가 SMTP 노드와 정기 Send Job 을 설정해 두었는지 사전 확인이 필수입니다.

SAP 사용자 이메일 미등록

발신자(SY-UNAME) 의 SAP 사용자 마스터(SU01) 에 이메일 주소가 비어있으면 발신자 정보가 깨진 채 발송됩니다. SU01 → Address 탭에 E-Mail 항목 등록 필요.

GOS 첨부에서 SOLI → SOLIX 변환 누락

SO_DOCUMENT_READ_API1 이 반환하는 object_content(SOLI) 를 그대로 add_attachment 에 넣으면 첨부파일이 깨집니다. 반드시 cl_bcs_convert=>soli_to_solix( ) 변환을 거칩니다. TXT 는 txt_to_solix 로 코드페이지 명시.

첨부파일 한글 파일명 깨짐

i_attachment_subject 에 한글이 들어가면 깨질 수 있습니다. 시스템 코드페이지에 따라 다르므로 한글 파일명이 중요하면 영문/숫자 위주로 명명하거나 별도 코드페이지 처리.

첨부파일이 본문으로 들어가는 케이스

create_documenti_type = 'PDF' 로 만들면 PDF 가 본문 형태로 인식되는 경우가 있습니다. 본문은 RAW 또는 HTM 로 만들고, PDF 는 add_attachment 로 추가합니다.

HTML 본문에 줄바꿈 누락

i_type = 'HTM' 사용 시 인터널 테이블 줄별로 </br> 또는 <p> 태그를 명시적으로 추가해야 줄바꿈이 표시됩니다. RAW 와 다름.

BCC 누락으로 거래처 이메일 노출

여러 거래처에게 같은 메일을 보낼 때 To 또는 CC 로 추가하면 모든 거래처가 다른 거래처의 이메일을 볼 수 있습니다. 거의 항상 i_blind_copy = abap_true 로 BCC 처리합니다.

외부 이메일 주소 형식 검증 누락

수신자 주소에 공백이나 잘못된 문자가 섞이면 CX_ADDRESS_BCS 예외가 발생합니다. 송신 전에 정규식 또는 CONTAINS_ONLY 로 사전 검증.

대량 발송 시 send_request 재사용

LOOP 안에서 N건을 보낸다면 매번 cl_bcs=>create_persistent( ) 로 새 인스턴스를 만드는 것이 안전합니다. 같은 객체에 수신자만 추가해서 N번 send 호출하면 이전 메일의 수신자가 누적될 수 있습니다.

TRY/CATCH 누락

CL_BCS 메소드들은 다양한 예외(CX_DOCUMENT_BCS · CX_BCS · CX_SEND_REQ_BCS · CX_ADDRESS_BCS) 를 발생시킵니다. 운영용 코드에서는 TRY ... CATCH cx_bcs INTO DATA(lx) 로 감싸 로그를 남깁니다.


전체 코드 — 복사용 통합본

기본 송신 + HTML 본문 + 로컬 PDF 첨부 + GOS 첨부 + BCC + 예외 처리까지 모두 포함한 표준 패턴입니다. SE38 에 그대로 붙여 실행 가능합니다.

REPORT z_cl_bcs_full_demo.

PARAMETERS:
  p_to     TYPE sza5_d0700-smtp_addr DEFAULT 'user@example.com',
  p_bcc    TYPE sza5_d0700-smtp_addr DEFAULT 'manager@example.com',
  p_html   AS CHECKBOX,                  " HTML 본문 사용
  p_local  AS CHECKBOX,                  " 로컬 PC 파일 첨부
  p_lfile  TYPE string LOWER CASE DEFAULT 'C:\temp\report.pdf',
  p_gos    AS CHECKBOX,                  " GOS 첨부 사용
  p_objid  TYPE string LOWER CASE DEFAULT 'TEST_OBJ_001'.

START-OF-SELECTION.

  TRY.
      " ★ 1) 송신 요청 생성
      DATA(send_request) = cl_bcs=>create_persistent( ).

      " ★ 2) 본문 작성 (RAW or HTM)
      DATA: lv_title TYPE so_obj_des.
      lv_title = |[알림] CL_BCS 통합 발송 테스트 ({ sy-datum })|.

      DATA lt_text TYPE bcsy_text.
      DATA lv_type TYPE so_obj_tp.

      IF p_html = abap_true.
        lv_type = 'HTM'.
        lt_text = VALUE bcsy_text(
          ( line = |안녕하세요.| )
          ( line = |</br>| )
          ( line = |</br>| )
          ( line = |<pre>                      -아        래-</pre>| )
          ( line = |1. 일자 : { sy-datum }| )
          ( line = |</br>| )
          ( line = |2. 본문 : 첨부파일을 확인해 주세요.| )
          ( line = |</br>| )
          ( line = |</br>| )
          ( line = |감사합니다.| )
        ).
      ELSE.
        lv_type = 'RAW'.
        lt_text = VALUE bcsy_text(
          ( line = '안녕하세요.' )
          ( line = '' )
          ( line = '첨부파일을 확인해 주세요.' )
          ( line = '' )
          ( line = '감사합니다.' )
        ).
      ENDIF.

      DATA(lo_document) = cl_document_bcs=>create_document(
        i_type    = lv_type
        i_text    = lt_text
        i_subject = lv_title
      ).

      " ★ 3) 로컬 PC 파일 첨부 (옵션)
      IF p_local = abap_true.
        DATA: lt_hex      TYPE solix_tab,
              lv_filesize TYPE i.

        CALL FUNCTION 'GUI_UPLOAD'
          EXPORTING
            filename   = CONV string( p_lfile )
            filetype   = 'BIN'
          IMPORTING
            filelength = lv_filesize
          TABLES
            data_tab   = lt_hex.

        IF sy-subrc = 0 AND lv_filesize > 0.
          lo_document->add_attachment(
            i_attachment_type    = 'PDF'
            i_attachment_subject = |Report_{ sy-datum }|
            i_att_content_hex    = lt_hex
          ).
        ENDIF.
      ENDIF.

      " ★ 4) SAP GOS 첨부 (옵션)
      IF p_gos = abap_true.
        DATA(ls_object) = VALUE sibflporb(
          instid = p_objid
          typeid = 'ZXXFILE'                  " 회사 BO 타입
          catid  = 'BO'
        ).
        DATA(lt_option) = VALUE obl_t_relt(
          ( low = 'ATTA' sign = 'I' option = 'EQ' )
        ).

        CALL METHOD cl_binary_relation=>read_links_of_binrels
          EXPORTING
            is_object           = ls_object
            it_relation_options = lt_option
            ip_role             = 'GOSAPPLOBJ'
          IMPORTING
            et_links            = DATA(lt_links).

        LOOP AT lt_links INTO DATA(ls_link).
          DATA: lv_docid       TYPE sofolenti1-doc_id,
                ls_doc_data    TYPE sofolenti1,
                lt_obj_header  TYPE TABLE OF solisti1,
                lt_obj_content TYPE TABLE OF solisti1,
                lt_obj_hex     TYPE TABLE OF solix,
                lt_bin_content TYPE solix_tab.

          lv_docid = ls_link-instid_b.

          CALL FUNCTION 'SO_DOCUMENT_READ_API1'
            EXPORTING
              document_id    = lv_docid
            IMPORTING
              document_data  = ls_doc_data
            TABLES
              object_header  = lt_obj_header
              object_content = lt_obj_content
              contents_hex   = lt_obj_hex.

          IF sy-subrc = 0.
            IF ls_doc_data-obj_type = 'TXT'.
              cl_bcs_convert=>txt_to_solix(
                EXPORTING
                  it_soli     = lt_obj_content
                  iv_codepage = '8500'
                IMPORTING
                  et_solix    = lt_bin_content
              ).
            ELSE.
              lt_bin_content = cl_bcs_convert=>soli_to_solix(
                it_soli = lt_obj_content
              ).
            ENDIF.

            lo_document->add_attachment(
              i_attachment_type     = ls_doc_data-obj_type
              i_attachment_language = ls_doc_data-obj_langu
              i_attachment_size     = ls_doc_data-doc_size
              i_attachment_subject  = ls_doc_data-obj_descr
              i_att_content_hex     = lt_bin_content
            ).
          ENDIF.

          CLEAR: lt_obj_header, lt_obj_content, lt_obj_hex, lt_bin_content.
        ENDLOOP.
      ENDIF.

      " ★ 5) 문서 연결 + 발신자
      send_request->set_document( lo_document ).

      DATA(lo_sender) = cl_sapuser_bcs=>create( sy-uname ).
      send_request->set_sender( i_sender = lo_sender ).

      " ★ 6) 수신자 (To) + BCC
      DATA(lo_recipient) = cl_cam_address_bcs=>create_internet_address( p_to ).
      send_request->add_recipient( i_recipient = lo_recipient ).

      IF p_bcc IS NOT INITIAL.
        DATA(lo_bcc) = cl_cam_address_bcs=>create_internet_address( p_bcc ).
        send_request->add_recipient(
          EXPORTING
            i_recipient  = lo_bcc
            i_blind_copy = abap_true
        ).
      ENDIF.

      " ★ 7) 발송 + COMMIT
      DATA(lo_send_all) = send_request->send( i_with_error_screen = abap_true ).

      IF lo_send_all IS INITIAL.
        ROLLBACK WORK.
        MESSAGE |메일 발송 실패. SOST 에서 큐 상태 확인| TYPE 'S' DISPLAY LIKE 'E'.
      ELSE.
        COMMIT WORK.
        MESSAGE |메일 발송 완료. SOST 에서 처리 상태 확인 가능| TYPE 'S'.
      ENDIF.

    CATCH cx_document_bcs INTO DATA(lx_doc).
      MESSAGE |문서 생성 실패: { lx_doc->get_text( ) }| TYPE 'E'.
    CATCH cx_send_req_bcs INTO DATA(lx_send).
      MESSAGE |송신 요청 실패: { lx_send->get_text( ) }| TYPE 'E'.
    CATCH cx_address_bcs INTO DATA(lx_addr).
      MESSAGE |수신자 주소 오류: { lx_addr->get_text( ) }| TYPE 'E'.
    CATCH cx_bcs INTO DATA(lx_bcs).
      MESSAGE |BCS 오류: { lx_bcs->get_text( ) }| TYPE 'E'.
  ENDTRY.

요약

단계 메소드 역할
1 cl_bcs=>create_persistent( ) 송신 요청 객체 생성
2 cl_document_bcs=>create_document( RAW / HTM ) 본문 작성 — RAW(텍스트) · HTM(HTML)
3a GUI_UPLOAD + add_attachment( ) 로컬 PC 파일 첨부
3b CL_BINARY_RELATION + CL_BCS_CONVERT SAP GOS 첨부파일 송신
4 set_sender( ) · add_recipient( i_blind_copy = abap_true ) 발신자 · 수신자 (To · CC · BCC) 지정
5 send( ) + COMMIT WORK 발송 큐 등록 (COMMIT 필수!)
6 운영 T-Code SOST(큐 상태) · SCOT(SMTP 설정) · SBWP(인박스) · SU01(사용자 메일)

CL_BCS 패턴은 ABAP 에서 표준 SAP 가 권장하는 객체지향 기반 메일 송신 방식입니다. 4개 클래스의 4단계 흐름(요청 → 문서 → 발신/수신 → 발송) 만 익히면 RAW/HTML 본문, 로컬 파일 첨부, SAP GOS 첨부, BCC 등 어떤 변형도 같은 패턴으로 처리할 수 있습니다. GOS 첨부 시 CL_BINARY_RELATION 으로 링크 조회 → SO_DOCUMENT_READ_API1 로 데이터 읽기 → CL_BCS_CONVERT 로 SOLIX 변환 → add_attachment 의 4단계 보조 흐름만 추가하면 됩니다. send( )COMMIT WORK 호출과 SOST 큐 모니터링 두 가지만 빠뜨리지 않으면 안정적으로 운영됩니다.


Disclaimer — 이 포스트는 실무 정리 노트를 바탕으로 AI 보조로 정리되었습니다.

CL_BCS · CL_DOCUMENT_BCS · CL_SAPUSER_BCS · CL_CAM_ADDRESS_BCS · CL_BCS_CONVERT · CL_BINARY_RELATION 클래스와 SO_DOCUMENT_READ_API1 함수, SOST · SCOT · SBWP · SU01 트랜잭션은 SAP NetWeaver 표준 기능으로 시스템 버전 의존 없이 동작합니다. 메일 발송이 실제로 외부로 나가려면 베이시스가 SCOT 의 SMTP 노드와 정기 Send Job 을 활성화해 두어야 하므로, 신규 시스템 또는 첫 메일 발송 코드 작성 시 인프라 설정을 사전에 확인하시기 바랍니다. GOS 첨부의 BO Type(TYPEID) 은 회사별 커스텀 객체에 따라 달라지며,

본 글의 예시 ZXXFILE 은 일반화된 표기이므로 실 시스템의 BO Type 으로 교체하여 사용하시기 바랍니다. COMMIT WORK 호출은 SAP 가 메일을 발송 큐에 등록하는 트리거이므로 반드시 send( ) 호출 후 명시적으로 호출해야 하며, 한글 첨부파일명은 시스템 코드페이지에 따라 깨질 수 있어 영문/숫자 위주의 파일명 사용을 권장합니다.