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: 

Send Mail with PDF Attachment in ABAP

ashok_kumar24
Contributor
0 Kudos

Hi Experts,

I have a requirement where I need to convert internal table data into PDF format and send it as an E-Mail with PDF attachment to Outlook mail using ABAP.

How do I achieve this .

Can anyone send me example code for doing this.

Thanks

Kumar

4 REPLIES 4

Former Member
0 Kudos

Hi Ashok,

Check this code snippet.

https://www.sdn.sap.com/irj/sdn/wiki?path=/display/snippets/convertSpoolrequesttoPDFandsendase-mail

Regards,

Chandra Sekhar

Former Member
0 Kudos

hiii

check following code for PDF attachment and mail

** Check for any ATTACHMENTS...
 IF d_desired_type = 'RAW'.           " Set to RAW?
*    PERFORM convert_to_abaplist.       " YES - convert it
  ENDIF.                               " end...
  IF d_desired_type = 'ALI'.           " Set to ALI?
    PERFORM convert_to_alilist.        " YES - convert it
  ENDIF.                               " end...

* Check for any ATTACHMENTS...
  IF NOT t_soli[] IS INITIAL.          " attachment?
    h_real_type = d_desired_type.      " ENABLE
    h_transf_type = 'X'.               " Transfer type BINARY...


*   Write PDF/ALI formatted data to BINARY table...
    t_con_bin[] = t_soli[].

*   Add Packing List (attachment) for PDF...
    DESCRIBE TABLE t_con_bin LINES h_tab_cntr.
    READ TABLE t_con_bin INDEX h_tab_cntr.
    h_doc_data-doc_size = h_doc_data-doc_size
                        + ( ( h_tab_cntr - 1 )
                        * 255 + STRLEN( t_con_bin ) ).
    h_doc_data-obj_descr  = mail_subject.
    h_body_start = 1.
    h_body_num = h_tab_cntr.

*   Write RAW data if that's what it is (adds to TEXT)...
    IF h_real_type = 'RAW'.
      DESCRIBE TABLE t_con_text LINES h_body_start.
      h_body_start = h_body_start + 1.

      h_transf_type = space.           " Transfer type TEXT...
      LOOP AT t_con_bin.               " Zip thru TEXT stuff
        t_con_text = t_con_bin.        " set TEXT table header..
        APPEND t_con_text.             " add to what's there!
      ENDLOOP.
      CLEAR: t_con_bin.                " clear BINARY header..
      REFRESH: t_con_bin.              " reset BINARY table...
    ENDIF.

    CLEAR t_pak_list.
    IF h_transf_type = 'X'.            " Binary=PDF/ALI?
      t_pak_list-transf_bin = 'X'.
      t_pak_list-head_start = 1.
      t_pak_list-head_num   = 0.
      t_pak_list-body_start = 1.
      t_pak_list-body_num   = h_tab_cntr.
      t_pak_list-doc_type   = h_real_type.
      t_pak_list-obj_name   = 'ATTACHMENT'.
      t_pak_list-obj_descr  = 'Document'(001).
      t_pak_list-doc_size   = ( h_tab_cntr - 1 )
                            * 255 + STRLEN( t_con_bin ).
    ELSE.
      DESCRIBE TABLE t_con_text LINES h_tab_cntr.
      READ TABLE t_con_text INDEX h_tab_cntr.
      t_pak_list-transf_bin = ' '.     " Binary=RAW
      t_pak_list-head_start = 1.
      t_pak_list-head_num   = 0.
      t_pak_list-body_start = h_body_start.
      t_pak_list-body_num   = h_tab_cntr.
      t_pak_list-doc_type   = h_real_type.
      t_pak_list-obj_name   = 'ATTACHMENT'(002).
      t_pak_list-obj_descr  = 'Report'(003).
      t_pak_list-doc_size   = ( h_body_num - 1 )
                            * 255 + STRLEN( t_con_text ).
    ENDIF.
    APPEND t_pak_list.
  ENDIF.


* Send the EMAIL out with SAP function...
  CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
    EXPORTING
      document_data              = h_doc_data
      put_in_outbox              = 'X'
*      commit_work                = 'X'
    TABLES
      packing_list               = t_pak_list
      contents_bin               = t_con_bin
      contents_txt               = t_con_text
      receivers                  = t_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 syst-subrc NE 0.
*    RAISE send_failed.
    CALL FUNCTION 'NAST_PROTOCOL_UPDATE'
      EXPORTING
        msg_arbgb = '00'
        msg_nr    = '001'
        msg_ty    = 'E'
        msg_v1    = 'O/P Could not be issued '(001)
        msg_v2    = ' Due to No Mail ID'(002)
        msg_v3    = syst-msgv3
        msg_v4    = syst-msgv4
      EXCEPTIONS
        OTHERS    = 1.
* Check General incompletion status of the header
    IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    ELSE.
      WRITE : 'SENT'.
    ENDIF.

  ELSE.
*    commit work.
  ENDIF.


ENDFORM.                               " SEND_MAIL_FAX

*&---------------------------------------------------------------------*
*&      Form  convert_otf_2_pdf
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM convert_otf_2_pdf .

  DATA: "t_line            LIKE tline OCCURS 0 WITH HEADER LINE,
        t_objcont         LIKE soli  OCCURS 0 WITH HEADER LINE,
        d_doc_size(12)    TYPE c,
        d_fle1(2)         TYPE p,
        d_fle2(2)         TYPE p,
        d_off1            TYPE p,
        d_hltlines        TYPE i,
        d_hfeld(500)      TYPE c,
        w_indx            LIKE sy-tabix.

  CLEAR: t_line, t_objcont, d_off1.
  REFRESH: t_line, t_objcont.

* Check/set DEFAULT Desired-type attachment...
  IF d_desired_type IS INITIAL.        " Entered Desired type?
    d_desired_type = 'PDF'.            " NO  - default to PDF
  ENDIF.                               "

  CALL FUNCTION 'CONVERT_OTF'
    EXPORTING
      format                = d_desired_type
    IMPORTING
      bin_filesize          = d_doc_size
    TABLES
      otf                   = t_itcoo
      lines                 = t_line
    EXCEPTIONS
      err_max_linewidth     = 1
      err_format            = 2
      err_conv_not_possible = 3
      OTHERS                = 4.

  IF sy-subrc > 0.
    RAISE otf_convert_failed.
  ENDIF.


ENDFORM.                               " convert_otf_2_pdf
*&---------------------------------------------------------------------*
*&      Form  convert_otf_2_pdf_sx
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM convert_otf_2_pdf_sx .
  DATA:
    t_otf          LIKE solisti1 OCCURS 0 WITH HEADER LINE,"ENABLE
    t_pdf          LIKE tline    OCCURS 0 WITH HEADER LINE,"ENABLE
    doc_size(12)   TYPE n,
    len_out        TYPE i,
    x_real         LIKE  soodk-objtp,
    x_idx_b        LIKE sy-tabix,
    x_idx_e        LIKE sy-tabix.

  IF d_desired_type = 'PDF'.
    d_desired_type = 'OTF'.
  ENDIF.

  CALL FUNCTION 'RSPO_RETURN_SPOOLJOB'
    EXPORTING
      rqident              = d_spool_id
      desired_type         = d_desired_type
    IMPORTING
      real_type            = x_real
    TABLES
      buffer               = t_otf
      buffer_pdf           = t_pdf
    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.
    IF sy-subrc = 1.
      RAISE invalid_spool_id.
    ELSE.
      RAISE otf_convert_failed.
    ENDIF.
  ENDIF.

* Check Desired-Type vs. Real-Type (if any)...
  IF d_desired_type IS INITIAL.
    IF x_real = 'OTF'.
      d_desired_type = 'PDF'.
    ELSE.
      d_desired_type = x_real.
    ENDIF.
  ELSE.
    IF ( d_desired_type = 'PDF' OR
         d_desired_type = 'OTF' ) AND
       ( x_real = 'OTF' OR
         x_real = 'PDF' ).
      d_desired_type = 'PDF'.
    ELSE.
      IF d_desired_type <> x_real.
        RAISE type_no_match.
      ENDIF.
    ENDIF.
    IF ( d_desired_type = 'ALI' OR
         d_desired_type = 'RAW' ) AND
         x_real = 'OTF'.
      RAISE type_no_match.
    ENDIF.
  ENDIF.

* Check if ABAP-LIST and not SapScript...
  IF d_desired_type = 'ALI' OR
     d_desired_type = 'RAW'.
    t_soli[] = t_otf[].
    EXIT.
  ENDIF.

* Load OTF data gotten from spool...
  LOOP AT t_otf.
    t_itcoo = t_otf.
    APPEND t_itcoo.

*   if Vendor P/O (SapScript = Z_MEDRUCK) then
*      trap INDEX for "Terms & Conditions" on BACK...
    IF t_itcoo-tdprintcom =  'IN' AND
       t_itcoo-tdprintpar =  '01EZ_MEDRUCK       BACK'.
      x_idx_b = sy-tabix.
    ENDIF.
    IF t_itcoo-tdprintcom =  'IN' AND
       t_itcoo-tdprintpar =  '01EZ_MEDRUCK       NEXT'.
      x_idx_e = ( sy-tabix - 1 ).
    ENDIF.

  ENDLOOP.

* Drop from table if INDEX'S are set (see above)...
  IF ( x_idx_b > 0 AND
     ( x_idx_e > x_idx_b ) ) .
    DELETE t_itcoo FROM x_idx_b
                 TO x_idx_e.
  ENDIF.

  PERFORM convert_otf_2_pdf.

ENDFORM.                               " convert_otf_2_pdf_sx



*&---------------------------------------------------------------------*
*&      Form  CONVERSION_OF_SIZE                                       *
*&---------------------------------------------------------------------*
* *"Converting the file to get a 255 char single line internal table   *
* The PDF file that is generated out of the above function module     *
* cannot be transported as it needs to be of 255 chars. Hence         *
* converting the file to get a 255 char single line,internal table.   *
*----------------------------------------------------------------------*

FORM conversion_of_size .
"Declaring Local Constants............................................
  CONSTANTS:
     cnv_hexconst_zero TYPE x VALUE '00'.

*"--------------------------------------------------------------------*
* Internal table to hold 255 Char's Single Line.                      *
*"--------------------------------------------------------------------*
  DATA:
    lv_big_lines(268) TYPE c
                      OCCURS 0 WITH HEADER LINE.




*"Local Work Variables.................................................
  DATA:
    lfl_flag          TYPE c,
    lv_left_t(268)    TYPE c,
    lv_left_i         TYPE i,
    tv_left_i         TYPE i,
    lv_curr_i         TYPE i.

  FIELD-SYMBOLS: <f>.

* Get the lines into a table of 268 char as the first step to put it in
* the pdf file of 255 chars
  CLEAR lfl_flag.

  LOOP AT t_line.

    IF lfl_flag EQ ' '.
      CLEAR lv_big_lines.
      ASSIGN lv_big_lines(134) TO <f>.
      <f> = t_line.
      lfl_flag = 'X'.
    ELSE.
      lv_big_lines+134 = t_line.
      APPEND lv_big_lines.
      CLEAR: lfl_flag.
    ENDIF.                             " If lfl_flag = ''..

  ENDLOOP.                             " Loop at t_pdf

  IF lfl_flag EQ 'X'.
    APPEND lv_big_lines.
  ENDIF.                               " If lflf_flag eq 'X'..

* Next fill it into a 255 char table
  CLEAR: lv_left_t, lv_left_i, tv_left_i.
  lv_curr_i = 255.

  LOOP AT lv_big_lines.
    IF lv_left_i NE 0.

      IF lv_curr_i NE 0.
        wa_objcont(lv_left_i)           = lv_left_t(lv_left_i).
        wa_objcont+lv_left_i(lv_curr_i) = lv_big_lines(lv_curr_i).
      ELSE.
        wa_objcont = lv_left_t(lv_left_i).
      ENDIF.                           " IF lv_curr_i NE 0

    ELSE.

      wa_objcont = lv_big_lines(lv_curr_i).

    ENDIF.                             " IF lv_left_i NE 0

    APPEND wa_objcont TO t_objcont.
    tv_left_i = 268 - lv_curr_i.

    IF tv_left_i > 255.
      wa_objcont = lv_big_lines+lv_curr_i(255).
      APPEND wa_objcont TO t_objcont.
      lv_left_i = tv_left_i - 255.
      tv_left_i = 255 + lv_curr_i.
      lv_curr_i = 255 - lv_left_i.
      lv_left_t = lv_big_lines+tv_left_i.
    ELSE.
      lv_left_t = lv_big_lines+lv_curr_i.
      lv_left_i = 268 - lv_curr_i.
      lv_curr_i = 255 - lv_left_i.
    ENDIF.                             " IF tv_left_i > 255

  ENDLOOP.                             " LOOP AT lv_big_lines.

  CLEAR wa_objcont .

  ASSIGN wa_objcont(lv_left_i) TO <f>.

  <f> = lv_left_t(lv_left_i).

  APPEND wa_objcont TO t_objcont.

    h_transf_type = 'X'.                 " Transfer type BINARY...
  IF NOT t_objcont[] IS INITIAL.
    t_soli[]     = t_objcont[].        " SapScript doc to Objects...
  ENDIF.

regards

twinkal

bpawanchand
Active Contributor
0 Kudos

HI

https://www.sdn.sap.com/irj/sdn/wiki?path=/display/snippets/abap-Sendthespooldatatoanemail+address.

Regards

pavan

Former Member
0 Kudos

Hi,

Please chk the following

Regards,

Manish