使用ebs进行邮件发送

邮件发送类型分为两种

1、发送文章内容较短,使用varchar类型即可

2、如果发送内容相对繁琐,那么就需要使用clob类型的数据

发送邮件的核心代码

注意:本次分享是按照clob类型进行的。如果想使用varchar或者long类型可将报文改成响应类型

PROCEDURE send_attach(p_recipient_address IN VARCHAR2,--收件人
                        p_body              IN OUT CLOB,--正文
                        p_count             IN NUMBER,--长度
                        p_user_name         IN VARCHAR2,--收件人
                        p_rtn_code          OUT VARCHAR2) IS
  
    l_sender    VARCHAR2(30) := '[email protected]';--发件人邮箱
    l_recipient VARCHAR2(300) := p_recipient_address; --收件人
    l_subject   VARCHAR2(2000) := '测试邮件发送'; --主题
    --l_body      LONG := ' ' || p_body || '


本邮件由系统自动发送,请不要回复本邮件。'; l_mail_conn utl_smtp.connection; l_mail_host VARCHAR2(30) := 'mail.163.com'; --发送邮箱的host l_user_name VARCHAR2(156) := '[email protected]';--同发件人 l_user_pwd VARCHAR2(156) := '1233344'; --发件人密码 l_boundary CONSTANT VARCHAR2(256) := '-----7D81B75CCC90D2974F7A1CBD'; l_first_boundary CONSTANT VARCHAR2(256) := '--' || l_boundary || utl_tcp.crlf; --发送带有附件邮件,MIME必须设为multipart/mixed l_multipart_mime_type CONSTANT VARCHAR2(256) := 'multipart/mixed; boundary="' || l_boundary || '"'; l_ehlo_result utl_smtp.replies; l_starttls_result utl_smtp.reply; l_rtn_code VARCHAR2(10); --拆分clob offset NUMBER := 1; lc_buffer VARCHAR2(32767); l_count NUMBER := 20000; BEGIN --登陆认证语句 dbms_lob.append(p_body, '


本邮件由系统自动发送,请不要回复本邮件。'); p_rtn_code := 'S'; l_mail_conn := utl_smtp.open_connection(l_mail_host, 25); utl_smtp.helo(l_mail_conn, l_mail_host); utl_smtp.helo(l_mail_conn, l_mail_host); utl_smtp.auth(c => l_mail_conn, username => l_user_name, password => l_user_pwd, schemes => 'LOGIN'); --指定发件人 utl_smtp.mail(l_mail_conn, l_sender); --发件人 utl_smtp.rcpt(l_mail_conn, l_recipient); --收件人 utl_smtp.open_data(l_mail_conn); utl_smtp.write_data(l_mail_conn, 'From:' || l_sender || utl_tcp.crlf); --显示 utl_smtp.write_data(l_mail_conn, 'To:' || l_recipient || utl_tcp.crlf); --显示 --中文编码转换 utl_smtp.write_raw_data(l_mail_conn, utl_raw.cast_to_raw(convert('Subject:' || l_subject || utl_tcp.crlf, 'ZHS16GBK'))); utl_smtp.write_raw_data(l_mail_conn, utl_raw.cast_to_raw(convert('Content-Type:' || l_multipart_mime_type || utl_tcp.crlf, 'ZHS16GBK'))); --utl_tcp.CRLF 数据流行尾符 utl_smtp.write_data(l_mail_conn, utl_tcp.crlf); --邮件正文 utl_smtp.write_data(l_mail_conn, l_first_boundary); utl_smtp.write_raw_data(l_mail_conn, utl_raw.cast_to_raw(convert('Content-Type:text/html;charset=GB2312' || utl_tcp.crlf, 'ZHS16GBK'))); utl_smtp.write_data(l_mail_conn, utl_tcp.crlf); -- 长文件拆分 WHILE offset <= dbms_lob.getlength(p_body) LOOP dbms_lob.read(p_body, l_count, offset, lc_buffer); offset := offset + l_count; utl_smtp.write_raw_data(l_mail_conn, utl_raw.cast_to_raw(convert(lc_buffer, 'ZHS16GBK'))); END LOOP; -- /*utl_smtp.write_raw_data(l_mail_conn, utl_raw.cast_to_raw(convert(l_body, 'ZHS16GBK')));*/ utl_smtp.write_data(l_mail_conn, utl_tcp.crlf); --关闭连接 utl_smtp.close_data(l_mail_conn); utl_smtp.quit(l_mail_conn); EXCEPTION WHEN utl_smtp.transient_error OR utl_smtp.permanent_error THEN fnd_file.put_line(fnd_file.log, '2 p_recipient_address=' || p_recipient_address); dbms_output.put_line(SQLERRM); fnd_file.put_line(fnd_file.log, '2 ' || SQLERRM); utl_smtp.quit(l_mail_conn); p_rtn_code := 'E'; WHEN OTHERS THEN fnd_file.put_line(fnd_file.log, '3 p_recipient_address=' || p_recipient_address); fnd_file.put_line(fnd_file.log, '3 ' || SQLERRM); dbms_output.put_line(SQLERRM); utl_smtp.quit(l_mail_conn); p_rtn_code := 'E'; END;


以上是邮件发送的核心内容。但是报文的拼接也是其中的关键部分。

报文拼接关键

定义变量 body 如果是clob类型的那么使用dbms_lob.append 增加报文内容。如果使用long类型或者varchar2使用l_body      := l_body || '

'; 增加报文内容。

PROCEDURE sendmessage_alert(p_errbuf  OUT VARCHAR2,
                              p_retcode OUT VARCHAR2) IS
  
    --头数据
    CURSOR cur_header IS
      SELECT poh.segment1 po_number,
             pap.full_name person_name,
             pap.employee_number,
             poh.po_header_id,
             poh.org_id,
             poh.agent_id,
             hou.name ou_name,
             hoi.name dept_name,
             pv.vendor_name,
             pv.attribute1 || pv.attribute2 bank_name,
             pv.attribute6 bank_number,
             nvl(poh.currency_code, 'CNY') currency_code,
             nvl(poh.rate, 1) rate,
             pap.email_address,
             -1 * to_number(poh.attribute2) cut_amount, --冲减金额
             '             ' null_char,
             poh.attribute1 is_pre,
           /* REPLACE(poh.comments,
               substr(poh.comments,
                      instr(poh.comments, '['),
                      instr(poh.comments, ']')),
               '') comments,*/
             poh.comments,
             (SELECT MAX(t.unique_number)
                FROM cux_po_header_interface t
               WHERE t.po_header_id = poh.po_header_id
                 AND t.status = 'S') unique_number
        FROM po_headers_all        poh,
             per_all_people_f      pap,
             hr_operating_units    hou,
             per_all_assignments_f paa,
             hr_organization_units hoi,
             po_vendors            pv,
             po_vendor_sites_all   pvs
       WHERE /*poh.segment1 = p_po_number --'826'
                                                                                                                                                                                                                                                               AND poh.org_id = p_org_id
                                                                                                                                                                                                                                                               AND */
       poh.authorization_status = 'APPROVED'
       AND poh.agent_id = pap.person_id
       AND SYSDATE BETWEEN nvl(pap.effective_start_date, SYSDATE - 1) AND
       nvl(pap.effective_end_date, SYSDATE + 1)
       AND pap.current_employee_flag = 'Y'
       AND poh.org_id = hou.organization_id
       AND paa.person_id = pap.person_id
       AND SYSDATE BETWEEN nvl(paa.effective_start_date, SYSDATE - 1) AND
       nvl(paa.effective_end_date, SYSDATE + 1)
       AND hoi.organization_id = paa.organization_id
       AND poh.vendor_id = pv.vendor_id(+)
       AND poh.vendor_id = pvs.vendor_id(+)
       AND poh.org_id = pvs.org_id(+)
       AND poh.vendor_site_id = pvs.vendor_site_id(+)
       AND poh.last_update_date >= trunc(SYSDATE) - 1
       AND NOT EXISTS (SELECT 'X'
          FROM cux_po_print_list t
         WHERE t.po_header_id = poh.po_header_id);
  
    --行信息有数据 
    CURSOR cur_lines(p_header_id NUMBER) IS
      SELECT pl.item_description,
             pl.category_id,
             mc.concatenated_segments,
             cux_common_utl.get_flex_value_desc('xxx',
                                                mc.segment1) segment_desc1,
             cux_common_utl.get_flex_value_desc('xxx',
                                                mc.segment2) segmnet_desc2,
             pl.quantity,
             pl.unit_price,
             pl.quantity * pl.unit_price amount
        FROM po_lines_all pl, mtl_categories_kfv mc
       WHERE pl.po_header_id = p_header_id
         AND pl.category_id = mc.category_id;
    rec_line cur_lines%ROWTYPE;
  
    --审批结果
    CURSOR cur_his(p_header_id NUMBER) IS
      SELECT to_char(action_date, 'YYYY-MM-DD') action_date,
             action_code_dsp,
             employee_name,
             note,
             fu.email_address
        FROM po_action_history_v t, fnd_user fu
       WHERE object_id = p_header_id
         AND object_type_code = 'PO'
         AND t.employee_id = fu.employee_id
       ORDER BY sequence_num DESC;
  
    l_sum_amount         NUMBER := 0; --合计数量
    l_cny_sum_amount     NUMBER := 0; --合计重量
    l_cny_sum_amount_chr VARCHAR2(120);
    receipt_num          VARCHAR2(50);
    l_line_count         NUMBER; --获取行数量
    l_header_type        VARCHAR2(50); --获取状态
    l_loop_count         NUMBER; --得到头循环次数
    i                    NUMBER := 1;
    j                    NUMBER := 1;
    l_item_name          VARCHAR2(360);
    l_cny_amount         NUMBER;
    l_cny_amount_chr     VARCHAR2(120);
  
    --l_body          VARCHAR2(32767);
    l_body          CLOB;
    l_count         NUMBER DEFAULT 0;
    l_user_name     VARCHAR2(200);
    l_isprod_status NUMBER DEFAULT 0;
    l_rtn_code      VARCHAR2(10);
    l_code          VARCHAR2(10);
    l_is_pre        VARCHAR2(120);
    l_unique_number VARCHAR2(120);
    l_approve_name  VARCHAR2(120);
    l_approve_email VARCHAR2(120);
    l_flag          NUMBER;
    l_return_status VARCHAR2(120);
    l_error_message VARCHAR2(3000);
  
  BEGIN
  
    SELECT cux_utl_pkg.get_isprod_status INTO l_isprod_status FROM dual;
    -----
    l_isprod_status := 1;
    ----
  
    cux_html_utl_pkg.output_log(l_isprod_status);
  
    FOR rec IN cur_header LOOP
      l_sum_amount     := 0;
      l_cny_sum_amount := 0;
      l_unique_number  := NULL;
      l_is_pre         := NULL;
      l_approve_email  := NULL;
      l_approve_name   := NULL;
      l_flag           := 0;
      l_code           := 'S';
      l_unique_number  := rec.unique_number;
      l_is_pre         := rec.is_pre;
      log_msg('订单号:' || rec.po_header_id);
      IF l_isprod_status = 1 THEN
      
        -- report title
      
        dbms_lob.createtemporary(l_body, TRUE);
        l_count := 0;
        --dbms_lob.append(l_body,'');
        l_user_name := rec.email_address;
        dbms_lob.append(l_body,
                        '

业务费用报销单

'); dbms_lob.append(l_body, '

员工和供应商信息:

'); dbms_lob.append(l_body, ' '); dbms_lob.append(l_body, '
'); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, '
员工工号' || rec.employee_number || '供应商' || rec.vendor_name || '
员工姓名' || rec.person_name || '银行及开户行' || rec.bank_name || '
报销公司' || rec.ou_name || '账号' || rec.bank_number || '
所属部门' || rec.dept_name || ' 采购订单 ' || rec.po_number || '
备注' || rec.comments || '
'); -- l_count := 1; dbms_lob.append(l_body, '

明细信息:

'); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); -- l_user_name := '[email protected]' ; -- line detail FOR rec_line IN cur_lines(rec.po_header_id) LOOP l_item_name := rec_line.segment_desc1 || '.' || rec_line.segmnet_desc2; l_cny_amount := rec_line.amount * rec.rate; l_cny_amount_chr := to_char(l_cny_amount, 'FM999,999,990.00'); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); l_sum_amount := l_sum_amount + rec_line.amount; l_cny_sum_amount := l_cny_sum_amount + l_cny_amount; l_cny_sum_amount_chr := to_char(l_cny_sum_amount, 'FM999,999,990.00'); END LOOP; -- line total dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); --冲减金额 dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); l_cny_sum_amount := l_cny_sum_amount + nvl(rec.cut_amount, 0); l_cny_sum_amount_chr := to_char(l_cny_sum_amount, 'FM999,999,990.00'); -- line total dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, '
费用类型币种金额(CNY)数量说明
' || l_item_name || '' || rec.currency_code || '' || l_cny_amount_chr || '' || rec_line.quantity || '' || rec_line.item_description || '
费用合计
' || l_cny_sum_amount_chr || '

冲借款金额
' || to_char(rec.cut_amount, 'FM999,999,990.00') || '

本次支付金额
' || l_cny_sum_amount_chr || '

'); -- approve history /* l_body := l_body || '


');*/ dbms_lob.append(l_body, '

审批历史记录

'); -- approve headers dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); -- approve detail FOR rec_approve IN cur_his(rec.po_header_id) LOOP dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, ''); IF l_flag = 0 THEN l_approve_email := rec_approve.email_address; l_approve_name := rec_approve.employee_name; END IF; l_flag := l_flag + 1; END LOOP; dbms_lob.append(l_body, '
执行人活动日期审批意见
' || rec_approve.employee_name || '' || rec_approve.action_code_dsp || '' || rec_approve.action_date || '' || rec_approve.note || '
'); dbms_lob.append(l_body, ''); dbms_lob.append(l_body, '

打印人:' || rec.person_name || '        打印日期:' || to_char(SYSDATE, 'yyyy-MM-dd HH24:mm:ss') || '

'); dbms_lob.append(l_body, '

区域财务:                   出纳:                   复核:                  网银:                  批准:                 

'); dbms_lob.append(l_body, '
'); IF l_user_name IS NOT NULL AND l_user_name <> 'SYSADMIN' AND l_count > 0 THEN send_attach(l_user_name, l_body, l_count, l_user_name, l_rtn_code); l_code := l_rtn_code; cux_html_utl_pkg.output_log(l_user_name); END IF; --如果是新车采购,进行回传操作 IF l_unique_number IS NOT NULL THEN set_po_sys_status(p_uniquer_number => l_unique_number, p_is_pre => l_is_pre, p_approve_name => l_approve_name, p_approve_email => l_approve_email, x_return_status => l_return_status, x_error_message => l_error_message); END IF; -- 插入数据 IF l_code = 'S' THEN -- 已经发邮件的数据插入 表 INSERT INTO cux_po_print_list t (po_number, po_header_id, last_name, employee_number, email_address) VALUES (rec.po_number, rec.po_header_id, rec.person_name, rec.employee_number, rec.email_address); COMMIT; END IF; END IF; dbms_lob.freetemporary(l_body); --释放 END LOOP; END;

效果展示:

使用ebs进行邮件发送_第1张图片

你可能感兴趣的:(Oracle,Ebs技术开发-邮件发送)