ABAP 发送邮件的两种方式

血红的双手。 提交于 2019-12-01 12:12:15
CONSTANTS:
   GC_TAB  TYPE C VALUE CL_BCS_CONVERT=>GC_TAB,  "CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB
   GC_CRLF TYPE C VALUE CL_BCS_CONVERT=>GC_CRLF. "CL_ABAP_CHAR_UTILITIES=>CR_LF

 DATA: I_PACKING_LIST LIKE SOPCKLSTI1 OCCURS 0 WITH HEADER LINE,
         I_RECEIVERS          LIKE SOMLRECI1 OCCURS 0 WITH HEADER LINE, "receivers
         I_CONTENTS_TXT       LIKE SOLISTI1 OCCURS 0 WITH HEADER LINE, "ASCII contents of object and attachments
         I_CONTENTS_HEX       LIKE SOLIX   OCCURS 0 WITH HEADER LINE, "Binary contents of object and attachments
         I_CONTENTS_BIN       LIKE SOLISTI1   OCCURS 0 WITH HEADER LINE,
         I_OBJECT_HEADER      LIKE SOLISTI1 OCCURS 0 WITH HEADER LINE,  "attachments name
         W_DOC_DATA           LIKE SODOCCHGI1.
 DATA: C_MIMETYPE TYPE CHAR64 VALUE 'APPLICATION/MSEXCEL;charset=utf-16le'.
 DATA: V_XATTACH TYPE XSTRING.
 DATA: LV_STRING TYPE STRING.
 DATA: TAB_LINES LIKE SY-TABIX,
       W_SENT_ALL(1) TYPE C,
       W_ERROR TYPE SY-SUBRC.
 DATA: I_SPFLI LIKE STANDARD TABLE OF SPFLI WITH HEADER LINE.


***********************************************************************


START-OF-SELECTION.
   PERFORM GET_SPFLI_DATA.


***define mail main context****


  PERFORM DEFINE_MAIL_HEADER.


***dfine attachment*******************


  PERFORM DEFINE_MAIL_ATTACHMENT.


***get mail receiver*****************


  PERFORM GET_RECEIVERS.


*Send email message, although is not sent from SAP until mail send
 *program has been executed(rsconn01)


  PERFORM SEND_EMAIL_MESSAGE.


*&---------------------------------------------------------------------*
 *&      Form  GET_SPFLI_DATA
 *&---------------------------------------------------------------------*


FORM GET_SPFLI_DATA .
   SELECT * FROM SPFLI
     INTO CORRESPONDING FIELDS OF TABLE I_SPFLI.
 ENDFORM. " GET_SPFLI_DATA


*&---------------------------------------------------------------------*
 *&      Form  DEFINE_MAIL_HEADER
 *&---------------------------------------------------------------------*


FORM DEFINE_MAIL_HEADER .
   DATA: TMP_DATE LIKE SY-DATUM.
   DATA: TMP_CHAR(30).
   TMP_DATE = SY-DATUM.
   CONCATENATE 'Overdue Batch  ' SY-DATUM INTO TMP_CHAR.


********define subject and priority************


  W_DOC_DATA-OBJ_DESCR = 'Hello'.  "Email Subject.
   W_DOC_DATA-PRIORITY = 1.         "mail PRIORITY¡A 1 is highest
   W_DOC_DATA-OBJ_LANGU = SY-LANGU.
   W_DOC_DATA-OBJ_NAME = 'OFFER'.  "Name of document..
   W_DOC_DATA-SENSITIVTY = 'O'.     "Document sensitivity.


********mail main context***********************


  I_CONTENTS_TXT = 'Dear Mr and Miss:'.
   APPEND I_CONTENTS_TXT.
   I_CONTENTS_TXT = ' '.
   APPEND I_CONTENTS_TXT.
   I_CONTENTS_TXT = '     Please check attachment in time!'.
   APPEND I_CONTENTS_TXT.
   I_CONTENTS_TXT = '     This Email is sent by systme, Do not Return the Email.'.
   APPEND I_CONTENTS_TXT.
   I_CONTENTS_TXT ='     If you have any problem, please contact with ERP.'.
   APPEND I_CONTENTS_TXT.
   I_CONTENTS_TXT = ' '.
   APPEND I_CONTENTS_TXT.
   I_CONTENTS_TXT = TMP_DATE.
   APPEND I_CONTENTS_TXT.
   DESCRIBE TABLE I_CONTENTS_TXT LINES TAB_LINES.
   READ TABLE I_CONTENTS_TXT INDEX TAB_LINES.
   W_DOC_DATA-DOC_SIZE = ( TAB_LINES - 1 ) * 255 + STRLEN( I_CONTENTS_TXT ).


********count lines by man context*************


  CLEAR   I_PACKING_LIST-TRANSF_BIN.
   I_PACKING_LIST-TRANSF_BIN = SPACE.    "ASCII format/binary format
   I_PACKING_LIST-HEAD_START = 1.
   I_PACKING_LIST-HEAD_NUM = 0.
   I_PACKING_LIST-BODY_START = 1.
   I_PACKING_LIST-BODY_NUM = TAB_LINES.
   I_PACKING_LIST-DOC_TYPE = 'RAW'.
   APPEND I_PACKING_LIST.
 ENDFORM. " DEFINE_MAIL_HEADER


*&---------------------------------------------------------------------*
 *&      Form  DEFINE_MAIL_ATTACHMENT
 *&---------------------------------------------------------------------*


FORM DEFINE_MAIL_ATTACHMENT .
   LOOP AT I_SPFLI.
     CONCATENATE LV_STRING
             I_SPFLI-CARRID    GC_TAB
             I_SPFLI-CONNID    GC_TAB
             I_SPFLI-COUNTRYFR GC_TAB
             I_SPFLI-CITYFROM  GC_TAB
             I_SPFLI-CITYFROM  GC_TAB
             I_SPFLI-COUNTRYTO GC_TAB
             I_SPFLI-CITYTO    GC_TAB
             I_SPFLI-AIRPTO    GC_CRLF
             INTO LV_STRING.
   ENDLOOP.


* Convert string to xstring type
 * 'APPLICATION/MSEXCEL;charset=utf-16le'


  CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
     EXPORTING
       TEXT     = LV_STRING
       MIMETYPE = C_MIMETYPE
     IMPORTING
       BUFFER   = V_XATTACH
     EXCEPTIONS
       FAILED   = 1
       OTHERS   = 2.


* Add the file header for utf-16le. .


  IF SY-SUBRC = 0.
     CONCATENATE CL_ABAP_CHAR_UTILITIES=>BYTE_ORDER_MARK_LITTLE
     V_XATTACH INTO V_XATTACH IN BYTE MODE.
   ENDIF.
   CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
     EXPORTING
       BUFFER     = V_XATTACH
     TABLES
       BINARY_TAB = I_CONTENTS_HEX.



***set attachment name, count size*******************


  DESCRIBE TABLE I_SPFLI LINES TAB_LINES.
   TAB_LINES = TAB_LINES .
   I_PACKING_LIST-TRANSF_BIN = 'X'.
   I_PACKING_LIST-HEAD_START = 1.
   I_PACKING_LIST-HEAD_NUM   = 0.
   I_PACKING_LIST-BODY_START = 1.
   I_PACKING_LIST-BODY_NUM = TAB_LINES.
   I_PACKING_LIST-DOC_TYPE = 'XLS'.
   I_PACKING_LIST-OBJ_NAME   = 'ATTACHMENT'.
   I_PACKING_LIST-OBJ_DESCR  = 'spfli'.
   I_PACKING_LIST-DOC_SIZE =  TAB_LINES * 255.
   APPEND I_PACKING_LIST.
 ENDFORM. " DEFINE_MAIL_ATTACHMENT


*&---------------------------------------------------------------------*
 *&      Form  GET_RECEIVERS
 *&---------------------------------------------------------------------*


FORM GET_RECEIVERS .


* Add the recipients email address


  CLEAR I_RECEIVERS.
   REFRESH I_RECEIVERS.


*  SELECT * FROM zszmail.


  I_RECEIVERS-RECEIVER = '461356592@qq.com'."Email Address
   I_RECEIVERS-REC_TYPE = 'U'.    "Internet address
   I_RECEIVERS-NOTIF_READ = 'X'.
   I_RECEIVERS-COM_TYPE = 'INT'.
   I_RECEIVERS-NOTIF_DEL = 'X'.
   I_RECEIVERS-NOTIF_NDEL = 'X'.
   APPEND I_RECEIVERS.


*  ENDSELECT.


ENDFORM. " GET_RECEIVERS


*&---------------------------------------------------------------------*
 *&      Form SEND_EMAIL_MESSAGE
 *&---------------------------------------------------------------------*


FORM SEND_EMAIL_MESSAGE.
   DATA: W_SUBRC LIKE SY-SUBRC.


* Call the FM to post the message to SAPMAIL


  CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
     EXPORTING
       DOCUMENT_DATA              = W_DOC_DATA         "Attributes of new document
       PUT_IN_OUTBOX              = 'X'                 "Flag: Move document to outbox after send
       COMMIT_WORK                = 'X'                 "An explicit COMMIT WORK is to be set
     IMPORTING
       SENT_TO_ALL                = W_SENT_ALL
     TABLES
       PACKING_LIST               = I_PACKING_LIST      "Information about structure of data tables
       OBJECT_HEADER              = I_OBJECT_HEADER
       CONTENTS_HEX               = I_CONTENTS_HEX
       CONTENTS_TXT               = I_CONTENTS_TXT       "ASCII contents of object and attachments
       RECEIVERS                  = I_RECEIVERS          "Document recipients with send attributes
     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.
   W_SUBRC = SY-SUBRC.
   WAIT UP TO 2 SECONDS.
   IF W_SUBRC EQ 0.
     SUBMIT RSCONN01 WITH MODE = 'INT'
                   WITH OUTPUT = 'X'
                   AND RETURN.
   ENDIF.
 ENDFORM. " SEND_EMAIL_MESSAGE

2.00

 DATA: WA_ZBCFILE TYPE ZBCFILE.
 DATA: IT_ZBCFILE LIKE TABLE OF WA_ZBCFILE.

 DATA: BEGIN OF IT_MAILCONTENT OCCURS 0,
   PLANT LIKE ZBCFILE-PLANT,
   LOCATION LIKE ZBCFILE-LOCATION,
   END OF IT_MAILCONTENT.

 DATA: WA_MAILCONTENT LIKE IT_MAILCONTENT.

 DATA: SEND_REQUEST TYPE REF TO CL_BCS,
       DOCUMENT TYPE REF TO CL_DOCUMENT_BCS,
       FAIL TYPE REF TO CX_BCS,
       RECIPIENT TYPE REF TO IF_RECIPIENT_BCS.

 DATA: LS TYPE STRING,
        L_INDEX TYPE I,
        L_CONTENT TYPE STRING,
        MAILTO TYPE AD_SMTPADR,
        MAIN_TEXT TYPE BCSY_TEXT,
        TITLE TYPE SO_OBJ_DES,
        MAIL_SENDER_LR TYPE REF TO IF_SENDER_BCS,
        P_SENDER LIKE ADR6-SMTP_ADDR.


 SELECT * FROM ZBCFILE
   INTO CORRESPONDING FIELDS OF TABLE IT_ZBCFILE.

 LOOP AT IT_ZBCFILE INTO WA_ZBCFILE.
   WA_MAILCONTENT-PLANT = WA_ZBCFILE-PLANT.
   WA_MAILCONTENT-LOCATION = WA_ZBCFILE-LOCATION.
   APPEND WA_MAILCONTENT TO IT_MAILCONTENT.
 ENDLOOP.

 IF NOT IT_MAILCONTENT[] IS INITIAL.
   SORT IT_MAILCONTENT BY PLANT LOCATION.
   DELETE ADJACENT DUPLICATES FROM IT_MAILCONTENT COMPARING PLANT LOCATION.

   CLEAR: WA_MAILCONTENT.
   L_CONTENT = 'please maintain area mapping at TCODE¡GZPPE91¡Asome B\C FILE failed.'.
   APPEND L_CONTENT TO MAIN_TEXT.
   L_CONTENT = 'Plant  Location'.
   APPEND L_CONTENT TO MAIN_TEXT.
   LOOP AT IT_MAILCONTENT INTO WA_MAILCONTENT.
     CLEAR L_CONTENT.
     CONCATENATE WA_MAILCONTENT-PLANT WA_MAILCONTENT-LOCATION INTO L_CONTENT SEPARATED BY '  '.
     APPEND L_CONTENT TO MAIN_TEXT.
   ENDLOOP.
   TITLE = 'B\C FILE failed.'.
   CONCATENATE SY-SYSID SY-TCODE TITLE INTO TITLE SEPARATED BY ''.
   MAILTO = '461356592@qq.com'.
   P_SENDER = 'sapadmin@xxxx.com'.

   TRY.


*   step1: create request


      SEND_REQUEST = CL_BCS=>CREATE_PERSISTENT( ).



*   step2: create mail content


      DOCUMENT = CL_DOCUMENT_BCS=>CREATE_DOCUMENT(
       I_TYPE = 'RAW'
       I_TEXT = MAIN_TEXT
       I_SUBJECT = TITLE ).



*   step3: add mail content


      SEND_REQUEST->SET_DOCUMENT( DOCUMENT ).



*  step4: mail send receive address


      MAIL_SENDER_LR = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS( P_SENDER ).
       SEND_REQUEST->SET_SENDER( I_SENDER = MAIL_SENDER_LR ).
       RECIPIENT = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS( MAILTO ).



*  step5: add address to request


      SEND_REQUEST->ADD_RECIPIENT( RECIPIENT ).



*   step6: commit request


      SEND_REQUEST->SEND( I_WITH_ERROR_SCREEN = 'X' ).

      COMMIT WORK AND WAIT.
     CATCH CX_BCS INTO FAIL.
   ENDTRY.
 ENDIF.

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!