将SMSARTFORMS 以PDF的方式用邮件…

有时候不需要打印smartforms,而是以pdf格式发邮件发过去,下面是部分代码

REPORT  zlm_cvrt_smart_to_pdf_mail.

"控制变量
DATA  fm_name             TYPE rs38l_fnam.
DATAcontrol_parameters  TYPE ssfctrlop,
      l_output_options    TYPE ssfcompop.

DATA job_output_info      TYPE ssfcrescl.
DATA job_output_options   TYPE ssfcresop.

*--------------------------------------------------------------------*
"转OTF
DATAgt_otf      LIKE TABLE OF itcoo    WITH HEADER LINE,
      gt_pdf_line LIKE TABLE OF tline    WITH HEADER LINE,
      gt_record   LIKE TABLE OF solisti1 WITH HEADER LINE.
DATAg_len_in TYPE i                                                "OTF 文件大小(邮件附件大小)
      g_lines_txt TYPE i                                             "邮件文本行数
      g_lines_bin TYPE i                                             "邮件附件行数
DATAg_benfile   TYPE xstring                                       "二进制格式的邮件
DATAg_object(50TYPE c                                            "邮件主题

DATA pdf_name     TYPE string                                        "附件名称

DATAgt_objpack  LIKE TABLE OF sopcklsti1   WITH HEADER LINE        "邮件内容 正文+附件
      gt_objtxt   LIKE TABLE OF solisti1     WITH HEADER LINE        "正文内容
      gt_objbin   LIKE TABLE OF solisti1     WITH HEADER LINE        "附件内容
      gt_reclist  LIKE TABLE OF somlreci1    WITH HEADER LINE        "收件人
      wa_doc_chng TYPE sodocchgi1                                    "邮件属性

*--------------------------------------------------------------------*
"选择屏幕
PARAMETERS:
            p_email TYPE so_recname OBLIGATORY DEFAULT 'LIUMENG@…….com'

*--------------------------------------------------------------------*
START-OF-SELECTION.
  CLEARjob_output_options,
         job_output_info,
         g_len_in,
         g_lines_txt,
         g_lines_bin,
         g_benfile.
  CLEAR  gt_otf[]gt_pdf_line[],gt_record[].

  "控制变量赋值
  control_parameters-getotf    'X'  "此参数必须,否则不会导出PDF而直接显示smartform
  control_parameters-no_close  ''.
  control_parameters-no_dialog 'X'  "不显示打印对话框

  "输出参数设置
  l_output_options-tddest      'ZLM_PL'. "选择打印设备,可选
  l_output_options-xsfoutdev   'ZLM_PL'"选择打印设备,可选
  l_output_options-tdprinter   'CNSAPWIN'.


CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
    EXPORTING
      formname           'ZLM_SMTFM'
    IMPORTING
      fm_name            fm_name
    EXCEPTIONS
      no_form            1
      no_function_module 2
      OTHERS             3.

  CHECKsy-subrc 0.
  CALL FUNCTION fm_name
    EXPORTING
      control_parameters control_parameters
      output_options     l_output_options      "默认打印选项设置传输
    user_settings      'X'                   "是否从用户主记录中获取信息
      i_acct_head        l_acct_head
    IMPORTING
      job_output_info    job_output_info
      job_output_options job_output_options
    TABLES
      it_acct_item       lt_acct_item
    EXCEPTIONS
      formatting_error   1
      internal_error     2
      send_error         3
      user_canceled      4
      OTHERS             5.

  CHECKsy-subrc 0.

convert smartforms to pdf
  "将SMARTFOMR转换成PDF格式
  CALL FUNCTION 'CONVERT_OTF'
    EXPORTING
      format                'PDF'
    IMPORTING
      bin_filesize          g_len_in                    "文件大小
      bin_file              g_benfile                   "16进制的文件数据
    TABLES
      otf                   job_output_info-otfdata     "由SMARTFORM生成的OTF格式的数据
      lines                 gt_pdf_line                 "生成的PDF格式的数据
    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.

  IF g_benfile IS NOT INITIAL.
    "将16进制的字符串转换成二进制数据
    CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
      EXPORTING
        buffer        g_benfile
      IMPORTING
        output_length g_len_in                        "邮件附件大小
      TABLES
        binary_tab    gt_record                     "二进制文件数据
  ENDIF.

  REFRESH:gt_reclist,gt_objtxt,gt_objbin,gt_objpack.
  CLEARwa_doc_chng.



  "将转换后的文件添加到邮件附件
  APPEND LINES OF gt_record TO gt_objbin.

  "添加邮件正文
  gt_objtxt '.
  APPEND gt_objtxt.

  gt_objtxt 本邮件由系统自动发出,请勿直接回复!'.
  APPEND gt_objtxt.

  "邮件正文行数
  DESCRIBE TABLE gt_objtxt LINES g_lines_txt.

  g_object '测试邮件!'               "邮件主题
  pdf_name '测试.pdf'                 "附件名称

**** Mail Attribute
  wa_doc_chng-obj_langu sy-langu.
  wa_doc_chng-obj_name 'Email'.
  wa_doc_chng-expiry_dat sy-datum 10.
  wa_doc_chng-obj_descr g_object  邮件主题
  wa_doc_chng-sensitivty 'F'.
  wa_doc_chng-doc_size g_lines_txt 255 g_len_in   "邮件大小
  wa_doc_chng-priority '1'.

Main Text
  CLEAR gt_objpack-transf_bin.
  gt_objpack-head_start 1.
  gt_objpack-head_num 0.
  gt_objpack-body_start 1.
  gt_objpack-body_num g_lines_txt.
  gt_objpack-doc_type 'RAW'.
  APPEND gt_objpack.

Attachment (pdf-Attachment)
  CLEAR :g_lines_bin.
  gt_objpack-transf_bin 'X'.
  gt_objpack-head_start 1.
  gt_objpack-head_num 1.
  gt_objpack-body_start 1.
  DESCRIBE TABLE gt_record LINES g_lines_bin.
  "此处附件大小应该按照SCMS_XSTRING_TO_BINARY返回值赋值,如果按照g_lines_bin*225计算,可能出现文件损坏情况
  gt_objpack-doc_size g_len_in .
  gt_objpack-body_num g_lines_bin.
  gt_objpack-doc_type 'PDF'.
  gt_objpack-obj_name 'PO'.
  gt_objpack-obj_descr pdf_name               "附件名称
  APPEND gt_objpack.

  "收件人邮箱
  gt_reclist-receiver p_email.
  gt_reclist-rec_type 'U'.
  APPEND gt_reclist.

  发送邮件
  CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
    EXPORTING
      document_data              wa_doc_chng  邮件属性
      put_in_outbox              ''
      commit_work                'X'
    TABLES
      packing_list               gt_objpack  邮件内容
      contents_bin               gt_objbin   附件内容(二进制)
      contents_txt               gt_objtxt   邮件内容(直接填入)
      receivers                  gt_reclist  收件箱地址
    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.
考虑系统时延,等待两秒
    WAIT UP TO SECONDS.
执行邮件立即发送程序
    SUBMIT rsconn01 WITH mode 'INT'
                  WITH output '' 不显示发送结果
                  AND RETURN.
    MESSAGE 'send mail successful!' TYPE 'S'.
  ELSE.
    MESSAGE 'send mail failed!' TYPE 'S'.
  ENDIF.
posted @ 2014-01-22 09:21  胡来  阅读(361)  评论(0编辑  收藏  举报