Application Development Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 

Smartform as PDF attachment to mail - Error while opening PDF file

rmz01
Explorer
0 Kudos

I have created a Z program which call the smartform and send it as an PDF attachment to concerned persons. I am able to see the mail in SOST, but when I try to open the attachment it gives me error can't open file.



This is my code for converting SF to PDF

form smartform.
 data:fname type rs38l_fnam,
 wa_cparam type ssfctrlop,
 wa_output type ssfcompop.

 wa_cparam-preview = 'X'.
 wa_cparam-no_dialog = 'X'.
 wa_output-tddest = 'lp01'.
 "break-point.

 LW_CONTROL_PARAMETERS-GETOTF = 'X'.
*/.. To supress preview
 LW_CONTROL_PARAMETERS-NO_DIALOG = 'X'.
 LW_CONTROL_PARAMETERS-PREVIEW = 'X' .
 LW_CONTROL_PARAMETERS-LANGU = SY-LANGU .
 LW_OUTPUT_OPTIONS-TDNOPREV = 'X'.
 LW_OUTPUT_OPTIONS-TDNOPRINT = 'X'.
 LW_OUTPUT_OPTIONS-TDDEST = 'ZPRN'.
IF IT_EPKO-BUKRS EQ '3001'.
IF IT_EPKO-EBELN(2) EQ 43.

 call function 'SSF_FUNCTION_MODULE_NAME'
 exporting
 formname = 'ZMM_PO_FORM_CPY'
 importing
 fm_name = fm_name
 exceptions
 no_form = 1
 no_function_module = 2
 others = 3.
 if sy-subrc <> 0.
 message id sy-msgid type sy-msgty number sy-msgno

 with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
 endif.

 if sy-subrc <> 0.
* Implement suitable error handling here
 endif.
 CALL FUNCTION FM_NAME "'/1BCDWB/SF00000184'
 EXPORTING
* ARCHIVE_INDEX =
* ARCHIVE_INDEX_TAB =
* ARCHIVE_PARAMETERS =
 CONTROL_PARAMETERS = LW_CONTROL_PARAMETERS
* MAIL_APPL_OBJ =
* MAIL_RECIPIENT =
* MAIL_SENDER =
 OUTPUT_OPTIONS = LW_OUTPUT_OPTIONS
 USER_SETTINGS = 'X'
 PO_HEADER = PO_HEADER
 PO_FOOTER = PO_FOOTER
 PO_BOX_LOC = PO_BOX_LOC
 STREET = STREET
 HOUSE = HOUSE
 REMARK = REMARK
 C_CODE = C_CODE
 IMPORTING
* DOCUMENT_OUTPUT_INFO =
 JOB_OUTPUT_INFO = LW_SSFCRESCL
* JOB_OUTPUT_OPTIONS =
 TABLES
 IT_EPKO = IT_EPKO
 EXCEPTIONS
 FORMATTING_ERROR = 1
 INTERNAL_ERROR = 2
 SEND_ERROR = 3
 USER_CANCELED = 4
 OTHERS = 5
 .
 IF SY-SUBRC <> 0.
* Implement suitable error handling here
 ENDIF.

 PERFORM OTF_DATA.
FORM OTF_DATA .

 REFRESH LI_OTF[].
 LI_OTF[] = LW_SSFCRESCL-OTFDATA[].
 CLEAR : LV_BIN_FILESIZE.
 CALL FUNCTION 'CONVERT_OTF'
 EXPORTING
 FORMAT = GC_DOCTY_PDF
 IMPORTING
 BIN_FILESIZE = LV_BIN_FILESIZE
 TABLES
 OTF = LI_OTF
 LINES = LI_PDF_TAB
 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.
 DESCRIBE TABLE LI_PDF_TAB LINES LV_PDFLINES.
 REFRESH LI_CONTENT_TXT.
 LOOP AT LI_OTF INTO LW_OTF.
 CLEAR LW_CONTENT.
 CONCATENATE LW_OTF-TDPRINTCOM LW_OTF-TDPRINTPAR
 INTO LW_CONTENT.
 APPEND LW_CONTENT TO LI_CONTENT_TXT.
 ENDLOOP.
 REFRESH : LI_CONTENT_HEX,
 LI_OBJHEAD.
 CLEAR : LV_TRANSFER_BIN,
 LV_LEN.

 CALL FUNCTION 'SX_OBJECT_CONVERT_OTF_PDF'
 EXPORTING
 FORMAT_SRC = 'OTF'
 FORMAT_DST = 'PDF'
 CHANGING
 TRANSFER_BIN = LV_TRANSFER_BIN
 CONTENT_TXT = LI_CONTENT_TXT
 CONTENT_BIN = LI_CONTENT_HEX
 OBJHEAD = LI_OBJHEAD
 LEN = LV_LEN
 EXCEPTIONS
 ERR_CONV_FAILED = 1
 OTHERS = 2.
 IF SY-SUBRC <> 0.
 MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
 
 WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
 ENDIF.

ENDFORM.
1 ACCEPTED SOLUTION

rmz01
Explorer
0 Kudos
Thankyou all for your input.

I've solved the issue, the problem was with my OTF Convert FM and SEND MAIL FM

Data Declaration:

**  DATA FOR PRINT PREVIEW
DATA: LW_CONTROL_PARAMETERS TYPE SSFCTRLOP,
      LW_OUTPUT_OPTIONS     TYPE SSFCOMPOP.

*& for OTF CONVER FM
DATA: T_OTF         TYPE ITCOO OCCURS 0 WITH HEADER LINE,

      it_otf_data        TYPE ssfcrescl,
      it_pdfdata         TYPE TABLE OF tline,
      g_tab_lines       TYPE i,
      it_pdf             TYPE TABLE OF solisti1,
      i_pdf             TYPE STANDARD TABLE OF tline,
      w_pdf             LIKE LINE OF i_pdf,
      i_attachment      TYPE STANDARD TABLE OF solisti1,
      w_attachment      LIKE LINE OF i_attachment.

DATA: "FM_NAME          TYPE RS38L_FNAM,       "FUCNTION MODULE
  LV_BIN_FILESIZE TYPE I.

CONSTANTS: GC_DOCTY_PDF TYPE SO_OBJ_TP VALUE 'PDF',
           GC_DOCTY_RAW TYPE SO_OBJ_TP VALUE 'RAW'.


*Data declaration for mail FM
DATA: IT_PACKING_LIST  LIKE SOPCKLSTI1 OCCURS 0 WITH HEADER LINE,
      IT_PACKING_LIST3 LIKE SOPCKLSTI1 OCCURS 0 WITH HEADER LINE,
      IT_RECEIVERS     LIKE SOMLRECI1 OCCURS 0 WITH HEADER LINE,
      GD_SENT_ALL(1)   TYPE C VALUE 'X',
      GD_DOC_DATA      LIKE SODOCCHGI1,
      LT_PACKING_LIST  TYPE STANDARD TABLE OF SOPCKLSTI1 WITH HEADER LINE,
      GD_ERROR         TYPE SY-SUBRC.


*Internal table for message body
DATA:   IT_MESSAGE   TYPE STANDARD TABLE OF SOLISTI1 INITIAL SIZE 0
                  WITH HEADER LINE,
        IT_MESSAGEWA LIKE LINE OF IT_MESSAGE.

*Emiail subject
DATA : PSUBJECT(40) TYPE C .

This is what I did for the conversion of smartform to PDF.

  LW_CONTROL_PARAMETERS-GETOTF        = 'X'.
*/.. To supress preview
  LW_CONTROL_PARAMETERS-NO_DIALOG  = 'X'.
  LW_CONTROL_PARAMETERS-PREVIEW = SPACE . " before: 'X'
  LW_OUTPUT_OPTIONS-TDDEST          = 'LP01'.


IF IT_EPKO-BUKRS EQ '3001'.
IF IT_EPKO-EBELN(2) EQ 43.

       call function 'SSF_FUNCTION_MODULE_NAME'
        exporting
          formname           = 'ZMM_PO_FORM_CPY'
        importing
          fm_name            = fm_name
        exceptions
          no_form            = 1
          no_function_module = 2
          others             = 3.
      if sy-subrc <> 0.
        message id sy-msgid type sy-msgty number sy-msgno

               with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
      endif.

      if sy-subrc <> 0.
*     Implement suitable error handling here
      endif.


      CALL FUNCTION  FM_NAME "'/1BCDWB/SF00000184'
        EXPORTING
*         ARCHIVE_INDEX              =
*         ARCHIVE_INDEX_TAB          =
*         ARCHIVE_PARAMETERS         =
         CONTROL_PARAMETERS          = LW_CONTROL_PARAMETERS
*         MAIL_APPL_OBJ              =
*         MAIL_RECIPIENT             =
*         MAIL_SENDER                =
         OUTPUT_OPTIONS              = LW_OUTPUT_OPTIONS
*         USER_SETTINGS               = 'X'
          PO_HEADER                  = PO_HEADER
          PO_FOOTER                  = PO_FOOTER
          PO_BOX_LOC                 =  PO_BOX_LOC
          STREET                     =  STREET
          HOUSE                      =  HOUSE
          REMARK                     =   REMARK
          C_CODE                     =  C_CODE
       IMPORTING
*         DOCUMENT_OUTPUT_INFO       =
         JOB_OUTPUT_INFO             = IT_OTF_DATA
*         JOB_OUTPUT_OPTIONS         =
        TABLES
          IT_EPKO                    = IT_EPKO
       EXCEPTIONS
         FORMATTING_ERROR           = 1
         INTERNAL_ERROR             = 2
         SEND_ERROR                 = 3
         USER_CANCELED              = 4
         OTHERS                     = 5
                .
      IF SY-SUBRC <> 0.
* Implement suitable error handling here
      ENDIF.

      PERFORM OTF_DATA.
      PERFORM SEND_MAIL.


FORM OTF_DATA .

  CLEAR T_OTF.
  REFRESH T_OTF.

*  LI_OTF[] = LW_SSFCRESCL-OTFDATA[].
  T_OTF[] = IT_OTF_DATA-OTFDATA[].

  CLEAR : LV_BIN_FILESIZE.
  CALL FUNCTION 'CONVERT_OTF'
    EXPORTING
      FORMAT                = GC_DOCTY_PDF
*      MAX_LINEWIDTH         = 132
    IMPORTING
      BIN_FILESIZE          = LV_BIN_FILESIZE
    TABLES
      OTF                   = T_OTF
      LINES                 = it_pdfdata[]
    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.


CALL FUNCTION 'SX_TABLE_LINE_WIDTH_CHANGE'
 EXPORTING
*   LINE_WIDTH_SRC                    =
   LINE_WIDTH_DST                    = '255'
*   TRANSFER_BIN                      = ' '
  TABLES
    CONTENT_IN                        = it_pdfdata[]
    CONTENT_OUT                       = it_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.
ENDFORM.

And this is what I did for sending mail

FORM SEND_MAIL .

* Fill the document data.
*  GD_DOC_DATA-DOC_SIZE = 1.

* Populate the subject/generic message attributes
  GD_DOC_DATA-OBJ_NAME  = 'SAPRPT'.
  GD_DOC_DATA-OBJ_DESCR = PSUBJECT.
*  GD_DOC_DATA-SENSITIVTY = 'F'.

* Describe the body of the message
  CLEAR IT_PACKING_LIST.
  REFRESH IT_PACKING_LIST.
  DESCRIBE TABLE IT_MESSAGE LINES G_TAB_LINES.
  IT_PACKING_LIST-TRANSF_BIN = SPACE.
  IT_PACKING_LIST-HEAD_START = 1.
  IT_PACKING_LIST-HEAD_NUM = 0.
  IT_PACKING_LIST-BODY_START = 1.
*  DESCRIBE TABLE IT_MESSAGE LINES IT_PACKING_LIST-BODY_NUM.
  IT_PACKING_LIST-BODY_NUM = g_tab_lines.
  IT_PACKING_LIST-DOC_TYPE = 'RAW'.
  APPEND IT_PACKING_LIST.


*  CLEAR IT_PACKING_LIST2.
*  REFRESH IT_PACKING_LIST2.
*  IT_PACKING_LIST2-TRANSF_BIN = SPACE.
*  IT_PACKING_LIST2-HEAD_START = 1.
*  IT_PACKING_LIST2-HEAD_NUM = 1.
*  IT_PACKING_LIST2-BODY_START = 1.
*  IT_PACKING_LIST2-BODY_NUM   = 1.
*  DESCRIBE TABLE LI_CONTENT_TXT LINES IT_PACKING_LIST2-BODY_NUM.
*  IT_PACKING_LIST2-DOC_TYPE = 'PDF'.
*  APPEND IT_PACKING_LIST2.


  CLEAR LT_PACKING_LIST.
  REFRESH LT_PACKING_LIST.

  LT_PACKING_LIST-TRANSF_BIN  = 'X'.
  LT_PACKING_LIST-HEAD_START  = 1.
  LT_PACKING_LIST-HEAD_NUM    = 1.
  LT_PACKING_LIST-BODY_START  = 1.
*  LT_PACKING_LIST-BODY_NUM    = LV_PDFLINES.
  DESCRIBE TABLE it_pdf LINES LT_PACKING_LIST-BODY_NUM.
  LT_PACKING_LIST-DOC_TYPE    = GC_DOCTY_PDF. " You can give RAW incase if you want just a txt file.
  LT_PACKING_LIST-OBJ_NAME    = 'PO_ATTACHMENT'.
  LT_PACKING_LIST-OBJ_DESCR   = 'PO Attachment'.
  LT_PACKING_LIST-DOC_SIZE    = LT_PACKING_LIST-BODY_NUM * 255.
  APPEND LT_PACKING_LIST.


*& for filling document data and get size of attachment
  GD_DOC_DATA-OBJ_LANGU = SY-LANGU.
  read table it_pdf into w_pdf index G_TAB_LINES.
  GD_DOC_DATA-DOC_SIZE = ( G_TAB_LINES - 1 ) * 255 + STRLEN( W_ATTACHMENT ).


  DATA : LV_INDEXA TYPE SY-TABIX.
* Add the recipients email address
  CLEAR IT_RECEIVERS.
  REFRESH IT_RECEIVERS.

*    CLEAR WA_RCV.
*    LOOP AT IT_RCV INTO WA_RCV.

    CLEAR LV_INDEXA.
    LV_INDEXA = SY-TABIX.

    IT_RECEIVERS-RECEIVER = WA_RCV-SMTP_ADDR.
    IT_RECEIVERS-REC_TYPE = 'U'.
    IT_RECEIVERS-COM_TYPE = 'INT'.
    IT_RECEIVERS-NOTIF_DEL = 'X'.
    IT_RECEIVERS-NOTIF_NDEL = 'X'.
    APPEND IT_RECEIVERS.
*  ENDLOOP.


  CLEAR IT_PACKING_LIST3.
  REFRESH IT_PACKING_LIST3.

  APPEND IT_PACKING_LIST TO IT_PACKING_LIST3.
*  APPEND IT_PACKING_LIST2 TO IT_PACKING_LIST3.
  APPEND LT_PACKING_LIST TO IT_PACKING_LIST3.

*--------------------------------------------------------------
* Send Email and attach to Complaint
*--------------------------------------------------------------
* Sending the document

  CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
    EXPORTING
      DOCUMENT_DATA              = GD_DOC_DATA
      PUT_IN_OUTBOX              = 'X'
      COMMIT_WORK                = 'X'
    IMPORTING
      SENT_TO_ALL                = GD_SENT_ALL
*     NEW_OBJECT_ID              =
    TABLES
      PACKING_LIST               = IT_PACKING_LIST3
*      OBJECT_HEADER              = LI_OBJHEAD
      CONTENTS_BIN               = IT_PDF
      CONTENTS_TXT               = IT_MESSAGE
*     CONTENTS_HEX                = LI_CONTENT_HEX
*     OBJECT_PARA                =
*     OBJECT_PARB                =
      RECEIVERS                  = IT_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.
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.
  IF SY-SUBRC = 0.
    COMMIT WORK AND WAIT.
    MESSAGE 'Email Sent Successfully' TYPE 'S'.

*  ELSE.
*    WAIT UP TO 2 SECONDS.
*    SUBMIT rsconn01 WITH mode = 'INT' WITH output = 'X' AND RETURN.
  ENDIF.

* Store function module return code
  GD_ERROR = SY-SUBRC.


ENDFORM.

6 REPLIES 6

Sandra_Rossi
Active Contributor

Here, it's just the part to generate the PDF in memory, but the error can also occur when creating the email.

First, test the PDF generation by downloading the PDF to your laptop (GUI_DOWNLOAD) and display it.

If it works, then the culprit is the way you attach the PDF to the email.

rmz01
Explorer

Thanks for the reply sandra.rossi .
I got your point, i'll testing the PDF by downloading first.

rmz01
Explorer
0 Kudos

sandra.rossi

This is what i'm doing to convert

FORM OTF_DATA .

  REFRESH LI_OTF[].

  CLEAR T_OTF.
  REFRESH T_OTF.

*  LI_OTF[] = LW_SSFCRESCL-OTFDATA[].
  T_OTF[] = LW_SSFCRESCL-OTFDATA[].

  CLEAR : LV_BIN_FILESIZE.
  CALL FUNCTION 'CONVERT_OTF'
    EXPORTING
      FORMAT                = GC_DOCTY_PDF
      MAX_LINEWIDTH         = 132
    IMPORTING
      BIN_FILESIZE          = LV_BIN_FILESIZE
    TABLES
      OTF                   = T_OTF
      LINES                 = T_PDF_TAB
    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.

  DESCRIBE TABLE T_PDF_TAB LINES LV_PDFLINES.
  REFRESH LI_CONTENT_TXT.
  LOOP AT T_OTF  INTO  LW_OTF.
    CLEAR LW_CONTENT.
    CONCATENATE LW_OTF-TDPRINTCOM LW_OTF-TDPRINTPAR
           INTO LW_CONTENT.
    APPEND LW_CONTENT TO LI_CONTENT_TXT.
  ENDLOOP.
  REFRESH : LI_CONTENT_HEX,
               LI_OBJHEAD.
  CLEAR : LV_TRANSFER_BIN,
            LV_LEN.

  CALL FUNCTION 'SX_OBJECT_CONVERT_OTF_PDF'
    EXPORTING
      FORMAT_SRC      = 'OTF'
      FORMAT_DST      = 'PDF'
    CHANGING
      TRANSFER_BIN    = LV_TRANSFER_BIN
      CONTENT_TXT     = LI_CONTENT_TXT
      CONTENT_BIN     = LI_CONTENT_HEX
      OBJHEAD         = LI_OBJHEAD
      LEN             = LV_LEN
    EXCEPTIONS
      ERR_CONV_FAILED = 1
      OTHERS          = 2.
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.
ENDFROM.


And this is my email part

FORM GET_MESSAGE .

CLEAR WA_RCV.
LOOP AT IT_RCV INTO WA_RCV.
  CLEAR IT_MESSAGEWA.
  CONCATENATE 'PO Released' PO_MAIL-EBELN INTO PSUBJECT SEPARATED BY SPACE.

  CLEAR IT_MESSAGE.
  REFRESH IT_MESSAGE.

  CONCATENATE 'Dear ' WA_RCV-NAME1 ',' INTO IT_MESSAGEWA SEPARATED BY SPACE.
  APPEND IT_MESSAGEWA TO IT_MESSAGE.

  CLEAR IT_MESSAGEWA.
  CONCATENATE 'PO Number : ' PO_MAIL-EBELN INTO IT_MESSAGEWA SEPARATED BY SPACE.
  APPEND IT_MESSAGEWA TO IT_MESSAGE.

  CONCATENATE 'has been released' 'by' IT_DESIG-DSIGNTION INTO IT_MESSAGEWA SEPARATED BY SPACE.
  APPEND IT_MESSAGEWA TO IT_MESSAGE.

  APPEND 'Regards,' TO IT_MESSAGE.
  APPEND 'SAP.' TO IT_MESSAGE.

  PERFORM SEND_MAIL.


ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form SEND_MAIL
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM SEND_MAIL .

* Fill the document data.
  GD_DOC_DATA-DOC_SIZE = 1.

* Populate the subject/generic message attributes
  GD_DOC_DATA-OBJ_LANGU = SY-LANGU.
  GD_DOC_DATA-OBJ_NAME  = 'SAPRPT'.
  GD_DOC_DATA-OBJ_DESCR = PSUBJECT.
  GD_DOC_DATA-SENSITIVTY = 'F'.

* Describe the body of the message
  CLEAR IT_PACKING_LIST.
  REFRESH IT_PACKING_LIST.
  IT_PACKING_LIST-TRANSF_BIN = SPACE.
  IT_PACKING_LIST-HEAD_START = 1.
  IT_PACKING_LIST-HEAD_NUM = 0.
  IT_PACKING_LIST-BODY_START = 1.
  DESCRIBE TABLE IT_MESSAGE LINES IT_PACKING_LIST-BODY_NUM.
  IT_PACKING_LIST-DOC_TYPE = 'RAW'.
  APPEND IT_PACKING_LIST.


  CLEAR IT_PACKING_LIST2.
  REFRESH IT_PACKING_LIST2.
  IT_PACKING_LIST2-TRANSF_BIN = SPACE.
  IT_PACKING_LIST2-HEAD_START = 1.
  IT_PACKING_LIST2-HEAD_NUM = 1.
  IT_PACKING_LIST2-BODY_START = 1.
  IT_PACKING_LIST2-BODY_NUM   = 1.
  DESCRIBE TABLE LI_CONTENT_TXT LINES IT_PACKING_LIST2-BODY_NUM.
  IT_PACKING_LIST2-DOC_TYPE = 'PDF'.
  APPEND IT_PACKING_LIST2.


  LT_PACKING_LIST-TRANSF_BIN  = 'X'.
  LT_PACKING_LIST-HEAD_START  = 1.
  LT_PACKING_LIST-HEAD_NUM    = 1.
  LT_PACKING_LIST-BODY_START  = 1.
  LT_PACKING_LIST-BODY_NUM    = LV_PDFLINES.
  LT_PACKING_LIST-DOC_TYPE    = GC_DOCTY_PDF. " You can give RAW incase if you want just a txt file.
  LT_PACKING_LIST-OBJ_NAME    = 'PO.PDF'.
  LT_PACKING_LIST-OBJ_DESCR   = 'PO.PDF'.
  LT_PACKING_LIST-DOC_SIZE    = LT_PACKING_LIST-BODY_NUM * 255.
  APPEND LT_PACKING_LIST. CLEAR LT_PACKING_LIST.

  DATA : LV_INDEXA TYPE SY-TABIX.
* Add the recipients email address
  CLEAR IT_RECEIVERS.
  REFRESH IT_RECEIVERS.

    CLEAR LV_INDEXA.
    LV_INDEXA = SY-TABIX.

    IT_RECEIVERS-RECEIVER = WA_RCV-SMTP_ADDR.
    IT_RECEIVERS-REC_TYPE = 'U'.
    IT_RECEIVERS-COM_TYPE = 'INT'.
    IT_RECEIVERS-NOTIF_DEL = 'X'.
    IT_RECEIVERS-NOTIF_NDEL = 'X'.
    APPEND IT_RECEIVERS.

  APPEND IT_PACKING_LIST TO IT_PACKING_LIST3.
  APPEND IT_PACKING_LIST2 TO IT_PACKING_LIST3.


*--------------------------------------------------------------
* Send Email and attach to Complaint
*--------------------------------------------------------------
* Sending the document

  CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
    EXPORTING
      DOCUMENT_DATA              = GD_DOC_DATA
      PUT_IN_OUTBOX              = 'X'
      COMMIT_WORK                = 'X'
    IMPORTING
      SENT_TO_ALL                = GD_SENT_ALL
*     NEW_OBJECT_ID              =
    TABLES
      PACKING_LIST               = IT_PACKING_LIST3
      OBJECT_HEADER              = LI_OBJHEAD
*      CONTENTS_BIN               = LI_CONTENT_HEX
      CONTENTS_TXT               = IT_MESSAGE
*     CONTENTS_HEX               =
*     OBJECT_PARA                =
*     OBJECT_PARB                =
      RECEIVERS                  = IT_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.
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.
  IF SY-SUBRC = 0.
    COMMIT WORK AND WAIT.
    MESSAGE 'Email Sent Successfully' TYPE 'S'.
  ENDIF.

* Store function module return code
  GD_ERROR = SY-SUBRC.


ENDFORM.

Sandra_Rossi
Active Contributor

Okay. Waiting for your feedback to know what is to be investigated.

Yasin
Active Participant

Hi Rameez

Am not sure if you can open the attachment from the SOST, but you can easily check the inbox where you sent the email to see if attachment received ...

Thanks

rmz01
Explorer
0 Kudos
Thankyou all for your input.

I've solved the issue, the problem was with my OTF Convert FM and SEND MAIL FM

Data Declaration:

**  DATA FOR PRINT PREVIEW
DATA: LW_CONTROL_PARAMETERS TYPE SSFCTRLOP,
      LW_OUTPUT_OPTIONS     TYPE SSFCOMPOP.

*& for OTF CONVER FM
DATA: T_OTF         TYPE ITCOO OCCURS 0 WITH HEADER LINE,

      it_otf_data        TYPE ssfcrescl,
      it_pdfdata         TYPE TABLE OF tline,
      g_tab_lines       TYPE i,
      it_pdf             TYPE TABLE OF solisti1,
      i_pdf             TYPE STANDARD TABLE OF tline,
      w_pdf             LIKE LINE OF i_pdf,
      i_attachment      TYPE STANDARD TABLE OF solisti1,
      w_attachment      LIKE LINE OF i_attachment.

DATA: "FM_NAME          TYPE RS38L_FNAM,       "FUCNTION MODULE
  LV_BIN_FILESIZE TYPE I.

CONSTANTS: GC_DOCTY_PDF TYPE SO_OBJ_TP VALUE 'PDF',
           GC_DOCTY_RAW TYPE SO_OBJ_TP VALUE 'RAW'.


*Data declaration for mail FM
DATA: IT_PACKING_LIST  LIKE SOPCKLSTI1 OCCURS 0 WITH HEADER LINE,
      IT_PACKING_LIST3 LIKE SOPCKLSTI1 OCCURS 0 WITH HEADER LINE,
      IT_RECEIVERS     LIKE SOMLRECI1 OCCURS 0 WITH HEADER LINE,
      GD_SENT_ALL(1)   TYPE C VALUE 'X',
      GD_DOC_DATA      LIKE SODOCCHGI1,
      LT_PACKING_LIST  TYPE STANDARD TABLE OF SOPCKLSTI1 WITH HEADER LINE,
      GD_ERROR         TYPE SY-SUBRC.


*Internal table for message body
DATA:   IT_MESSAGE   TYPE STANDARD TABLE OF SOLISTI1 INITIAL SIZE 0
                  WITH HEADER LINE,
        IT_MESSAGEWA LIKE LINE OF IT_MESSAGE.

*Emiail subject
DATA : PSUBJECT(40) TYPE C .

This is what I did for the conversion of smartform to PDF.

  LW_CONTROL_PARAMETERS-GETOTF        = 'X'.
*/.. To supress preview
  LW_CONTROL_PARAMETERS-NO_DIALOG  = 'X'.
  LW_CONTROL_PARAMETERS-PREVIEW = SPACE . " before: 'X'
  LW_OUTPUT_OPTIONS-TDDEST          = 'LP01'.


IF IT_EPKO-BUKRS EQ '3001'.
IF IT_EPKO-EBELN(2) EQ 43.

       call function 'SSF_FUNCTION_MODULE_NAME'
        exporting
          formname           = 'ZMM_PO_FORM_CPY'
        importing
          fm_name            = fm_name
        exceptions
          no_form            = 1
          no_function_module = 2
          others             = 3.
      if sy-subrc <> 0.
        message id sy-msgid type sy-msgty number sy-msgno

               with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
      endif.

      if sy-subrc <> 0.
*     Implement suitable error handling here
      endif.


      CALL FUNCTION  FM_NAME "'/1BCDWB/SF00000184'
        EXPORTING
*         ARCHIVE_INDEX              =
*         ARCHIVE_INDEX_TAB          =
*         ARCHIVE_PARAMETERS         =
         CONTROL_PARAMETERS          = LW_CONTROL_PARAMETERS
*         MAIL_APPL_OBJ              =
*         MAIL_RECIPIENT             =
*         MAIL_SENDER                =
         OUTPUT_OPTIONS              = LW_OUTPUT_OPTIONS
*         USER_SETTINGS               = 'X'
          PO_HEADER                  = PO_HEADER
          PO_FOOTER                  = PO_FOOTER
          PO_BOX_LOC                 =  PO_BOX_LOC
          STREET                     =  STREET
          HOUSE                      =  HOUSE
          REMARK                     =   REMARK
          C_CODE                     =  C_CODE
       IMPORTING
*         DOCUMENT_OUTPUT_INFO       =
         JOB_OUTPUT_INFO             = IT_OTF_DATA
*         JOB_OUTPUT_OPTIONS         =
        TABLES
          IT_EPKO                    = IT_EPKO
       EXCEPTIONS
         FORMATTING_ERROR           = 1
         INTERNAL_ERROR             = 2
         SEND_ERROR                 = 3
         USER_CANCELED              = 4
         OTHERS                     = 5
                .
      IF SY-SUBRC <> 0.
* Implement suitable error handling here
      ENDIF.

      PERFORM OTF_DATA.
      PERFORM SEND_MAIL.


FORM OTF_DATA .

  CLEAR T_OTF.
  REFRESH T_OTF.

*  LI_OTF[] = LW_SSFCRESCL-OTFDATA[].
  T_OTF[] = IT_OTF_DATA-OTFDATA[].

  CLEAR : LV_BIN_FILESIZE.
  CALL FUNCTION 'CONVERT_OTF'
    EXPORTING
      FORMAT                = GC_DOCTY_PDF
*      MAX_LINEWIDTH         = 132
    IMPORTING
      BIN_FILESIZE          = LV_BIN_FILESIZE
    TABLES
      OTF                   = T_OTF
      LINES                 = it_pdfdata[]
    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.


CALL FUNCTION 'SX_TABLE_LINE_WIDTH_CHANGE'
 EXPORTING
*   LINE_WIDTH_SRC                    =
   LINE_WIDTH_DST                    = '255'
*   TRANSFER_BIN                      = ' '
  TABLES
    CONTENT_IN                        = it_pdfdata[]
    CONTENT_OUT                       = it_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.
ENDFORM.

And this is what I did for sending mail

FORM SEND_MAIL .

* Fill the document data.
*  GD_DOC_DATA-DOC_SIZE = 1.

* Populate the subject/generic message attributes
  GD_DOC_DATA-OBJ_NAME  = 'SAPRPT'.
  GD_DOC_DATA-OBJ_DESCR = PSUBJECT.
*  GD_DOC_DATA-SENSITIVTY = 'F'.

* Describe the body of the message
  CLEAR IT_PACKING_LIST.
  REFRESH IT_PACKING_LIST.
  DESCRIBE TABLE IT_MESSAGE LINES G_TAB_LINES.
  IT_PACKING_LIST-TRANSF_BIN = SPACE.
  IT_PACKING_LIST-HEAD_START = 1.
  IT_PACKING_LIST-HEAD_NUM = 0.
  IT_PACKING_LIST-BODY_START = 1.
*  DESCRIBE TABLE IT_MESSAGE LINES IT_PACKING_LIST-BODY_NUM.
  IT_PACKING_LIST-BODY_NUM = g_tab_lines.
  IT_PACKING_LIST-DOC_TYPE = 'RAW'.
  APPEND IT_PACKING_LIST.


*  CLEAR IT_PACKING_LIST2.
*  REFRESH IT_PACKING_LIST2.
*  IT_PACKING_LIST2-TRANSF_BIN = SPACE.
*  IT_PACKING_LIST2-HEAD_START = 1.
*  IT_PACKING_LIST2-HEAD_NUM = 1.
*  IT_PACKING_LIST2-BODY_START = 1.
*  IT_PACKING_LIST2-BODY_NUM   = 1.
*  DESCRIBE TABLE LI_CONTENT_TXT LINES IT_PACKING_LIST2-BODY_NUM.
*  IT_PACKING_LIST2-DOC_TYPE = 'PDF'.
*  APPEND IT_PACKING_LIST2.


  CLEAR LT_PACKING_LIST.
  REFRESH LT_PACKING_LIST.

  LT_PACKING_LIST-TRANSF_BIN  = 'X'.
  LT_PACKING_LIST-HEAD_START  = 1.
  LT_PACKING_LIST-HEAD_NUM    = 1.
  LT_PACKING_LIST-BODY_START  = 1.
*  LT_PACKING_LIST-BODY_NUM    = LV_PDFLINES.
  DESCRIBE TABLE it_pdf LINES LT_PACKING_LIST-BODY_NUM.
  LT_PACKING_LIST-DOC_TYPE    = GC_DOCTY_PDF. " You can give RAW incase if you want just a txt file.
  LT_PACKING_LIST-OBJ_NAME    = 'PO_ATTACHMENT'.
  LT_PACKING_LIST-OBJ_DESCR   = 'PO Attachment'.
  LT_PACKING_LIST-DOC_SIZE    = LT_PACKING_LIST-BODY_NUM * 255.
  APPEND LT_PACKING_LIST.


*& for filling document data and get size of attachment
  GD_DOC_DATA-OBJ_LANGU = SY-LANGU.
  read table it_pdf into w_pdf index G_TAB_LINES.
  GD_DOC_DATA-DOC_SIZE = ( G_TAB_LINES - 1 ) * 255 + STRLEN( W_ATTACHMENT ).


  DATA : LV_INDEXA TYPE SY-TABIX.
* Add the recipients email address
  CLEAR IT_RECEIVERS.
  REFRESH IT_RECEIVERS.

*    CLEAR WA_RCV.
*    LOOP AT IT_RCV INTO WA_RCV.

    CLEAR LV_INDEXA.
    LV_INDEXA = SY-TABIX.

    IT_RECEIVERS-RECEIVER = WA_RCV-SMTP_ADDR.
    IT_RECEIVERS-REC_TYPE = 'U'.
    IT_RECEIVERS-COM_TYPE = 'INT'.
    IT_RECEIVERS-NOTIF_DEL = 'X'.
    IT_RECEIVERS-NOTIF_NDEL = 'X'.
    APPEND IT_RECEIVERS.
*  ENDLOOP.


  CLEAR IT_PACKING_LIST3.
  REFRESH IT_PACKING_LIST3.

  APPEND IT_PACKING_LIST TO IT_PACKING_LIST3.
*  APPEND IT_PACKING_LIST2 TO IT_PACKING_LIST3.
  APPEND LT_PACKING_LIST TO IT_PACKING_LIST3.

*--------------------------------------------------------------
* Send Email and attach to Complaint
*--------------------------------------------------------------
* Sending the document

  CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
    EXPORTING
      DOCUMENT_DATA              = GD_DOC_DATA
      PUT_IN_OUTBOX              = 'X'
      COMMIT_WORK                = 'X'
    IMPORTING
      SENT_TO_ALL                = GD_SENT_ALL
*     NEW_OBJECT_ID              =
    TABLES
      PACKING_LIST               = IT_PACKING_LIST3
*      OBJECT_HEADER              = LI_OBJHEAD
      CONTENTS_BIN               = IT_PDF
      CONTENTS_TXT               = IT_MESSAGE
*     CONTENTS_HEX                = LI_CONTENT_HEX
*     OBJECT_PARA                =
*     OBJECT_PARB                =
      RECEIVERS                  = IT_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.
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.
  IF SY-SUBRC = 0.
    COMMIT WORK AND WAIT.
    MESSAGE 'Email Sent Successfully' TYPE 'S'.

*  ELSE.
*    WAIT UP TO 2 SECONDS.
*    SUBMIT rsconn01 WITH mode = 'INT' WITH output = 'X' AND RETURN.
  ENDIF.

* Store function module return code
  GD_ERROR = SY-SUBRC.


ENDFORM.