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

REPORT  zlm_cvrt_smart_to_pdf_mail.

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

DATA job_output_info TYPE ssfcrescl.
DATA job_output_options TYPE ssfcresop.

*--------------------------------------------------------------------*
"转OTF
DATA: gt_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.​DATA: g_len_in TYPE i, "OTF 文件大小(邮件附件大小)
g_lines_txt TYPE i, "邮件文本行数
g_lines_bin TYPE i. "邮件附件行数
DATA: g_benfile TYPE xstring. "二进制格式的邮件
DATA: g_object(50) TYPE c. "邮件主题

DATA pdf_name TYPE string. "附件名称

DATA: gt_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.
CLEAR: job_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.

CHECK: sy-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.

CHECK: sy-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.
CLEAR: wa_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 2 SECONDS.
* 执行邮件立即发送程序
SUBMIT rsconn01 WITH mode = 'INT'
WITH output = '' " 不显示发送结果
AND RETURN.
MESSAGE 'send mail successful!' TYPE 'S'.
ELSE.
MESSAGE 'send mail failed!' TYPE 'S'.
ENDIF.

将SMSARTFORMS 以PDF的方式用邮件发出去_赋值



将SMSARTFORMS 以PDF的方式用邮件发出去_赋值_02