邮件发送类型分为两种

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) ISl_sender    VARCHAR2(30) := '123@163.com';--发件人邮箱l_recipient VARCHAR2(300) := p_recipient_address; --收件人l_subject   VARCHAR2(2000) := '测试邮件发送'; --主题--l_body      LONG := ' ' || p_body || '<br><br><br>本邮件由系统自动发送,请不要回复本邮件。';l_mail_conn utl_smtp.connection;l_mail_host VARCHAR2(30) := 'mail.163.com'; --发送邮箱的hostl_user_name VARCHAR2(156) := '123@163.com';--同发件人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/mixedl_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);--拆分cloboffset    NUMBER := 1;lc_buffer VARCHAR2(32767);l_count   NUMBER := 20000;BEGIN--登陆认证语句 dbms_lob.append(p_body,'<br><br><br>本邮件由系统自动发送,请不要回复本邮件。');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) LOOPdbms_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);EXCEPTIONWHEN utl_smtp.transient_error OR utl_smtp.permanent_error THENfnd_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 THENfnd_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 || '<table>'; 增加报文内容。

PROCEDURE sendmessage_alert(p_errbuf  OUT VARCHAR2,p_retcode OUT VARCHAR2) IS--头数据CURSOR cur_header ISSELECT 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 tWHERE t.po_header_id = poh.po_header_idAND t.status = 'S') unique_numberFROM 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   pvsWHERE /*poh.segment1 = p_po_number --'826'AND poh.org_id = p_org_idAND */poh.authorization_status = 'APPROVED'AND poh.agent_id = pap.person_idAND SYSDATE BETWEEN nvl(pap.effective_start_date, SYSDATE - 1) ANDnvl(pap.effective_end_date, SYSDATE + 1)AND pap.current_employee_flag = 'Y'AND poh.org_id = hou.organization_idAND paa.person_id = pap.person_idAND SYSDATE BETWEEN nvl(paa.effective_start_date, SYSDATE - 1) ANDnvl(paa.effective_end_date, SYSDATE + 1)AND hoi.organization_id = paa.organization_idAND 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) - 1AND NOT EXISTS (SELECT 'X'FROM cux_po_print_list tWHERE t.po_header_id = poh.po_header_id);--行信息有数据 CURSOR cur_lines(p_header_id NUMBER) ISSELECT 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 amountFROM po_lines_all pl, mtl_categories_kfv mcWHERE pl.po_header_id = p_header_idAND pl.category_id = mc.category_id;rec_line cur_lines%ROWTYPE;--审批结果CURSOR cur_his(p_header_id NUMBER) ISSELECT to_char(action_date, 'YYYY-MM-DD') action_date,action_code_dsp,employee_name,note,fu.email_addressFROM po_action_history_v t, fnd_user fuWHERE object_id = p_header_idAND object_type_code = 'PO'AND t.employee_id = fu.employee_idORDER 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);BEGINSELECT 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 LOOPl_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 titledbms_lob.createtemporary(l_body, TRUE);l_count := 0;--dbms_lob.append(l_body,'');l_user_name := rec.email_address;dbms_lob.append(l_body,'<p class="c0"><span class="c1" align="center"><b>业务费用报销单</b></span></p>');dbms_lob.append(l_body, '<p>员工和供应商信息:</p>');dbms_lob.append(l_body,'<style>  table{border-collapse:collapse;font-size:12px;width:600px}table th{background-color:#e7f3fd}table th,table td{padding:5px;border:1px solid #000;}</style>');dbms_lob.append(l_body, '<table>');dbms_lob.append(l_body, '<tr>');dbms_lob.append(l_body, '<th align="center">员工工号</th>');dbms_lob.append(l_body,'<td align="center">' || rec.employee_number ||'</td>');dbms_lob.append(l_body, '<th align="center">供应商</th>');dbms_lob.append(l_body,'<td align="center">' || rec.vendor_name || '</td>');dbms_lob.append(l_body, '</tr>');dbms_lob.append(l_body, '<tr>');dbms_lob.append(l_body, '<th align="center">员工姓名</th>');dbms_lob.append(l_body,'<td align="center">' || rec.person_name || '</td>');dbms_lob.append(l_body, '<th align="center">银行及开户行</th>');dbms_lob.append(l_body,'<td align="center">' || rec.bank_name || '</td>');dbms_lob.append(l_body, '</tr>');dbms_lob.append(l_body, '<tr>');dbms_lob.append(l_body, '<th align="center">报销公司</th>');dbms_lob.append(l_body,'<td align="center">' || rec.ou_name || '</td>');dbms_lob.append(l_body, '<th align="center">账号</th>');dbms_lob.append(l_body,'<td align="center">' || rec.bank_number || '</td>');dbms_lob.append(l_body, '</tr>');dbms_lob.append(l_body, '<tr>');dbms_lob.append(l_body, '<th align="center">所属部门</th>');dbms_lob.append(l_body,'<td align="center">' || rec.dept_name || '</td>');dbms_lob.append(l_body, '<th align="center"> 采购订单 </th>');dbms_lob.append(l_body,'<td align="center">' || rec.po_number || '</td>');dbms_lob.append(l_body, '</tr>');dbms_lob.append(l_body, '<th align="center">备注</th>');dbms_lob.append(l_body,'<td align="left" colspan="3">' || rec.comments ||'</td>');dbms_lob.append(l_body, '</table>');-- l_count := 1;dbms_lob.append(l_body, '<p>明细信息:</p>');dbms_lob.append(l_body, '<table><tr>');dbms_lob.append(l_body, '<th align="center">费用类型</th>');dbms_lob.append(l_body, '<th align="center">币种</th>');dbms_lob.append(l_body, '<th align="center">金额(CNY)</th>');dbms_lob.append(l_body, '<th align="center">数量</th>');dbms_lob.append(l_body, '<th align="center">说明</th>');dbms_lob.append(l_body, '</tr>');--        l_user_name := 'gaoyuxin@guazi.com' ;-- line detail FOR rec_line IN cur_lines(rec.po_header_id) LOOPl_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, '<tr>');dbms_lob.append(l_body,'<td align="center">' || l_item_name || '</td>');dbms_lob.append(l_body,'<td align="center">' || rec.currency_code ||'</td>');dbms_lob.append(l_body,'<td align="center">' || l_cny_amount_chr ||'</td>');dbms_lob.append(l_body,'<td align="center">' || rec_line.quantity ||'</td>');dbms_lob.append(l_body,'<td align="center">' ||rec_line.item_description || '</td>');dbms_lob.append(l_body, '</tr>');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, '<tr>');dbms_lob.append(l_body, '<td align="center">费用合计</td>');dbms_lob.append(l_body, '<td><br/></td>');dbms_lob.append(l_body,'<td align="center">' || l_cny_sum_amount_chr ||'</td>');dbms_lob.append(l_body, '<td><br/></td>');dbms_lob.append(l_body, '<td><br/></td>');dbms_lob.append(l_body, '</tr>');--冲减金额dbms_lob.append(l_body, '<tr>');dbms_lob.append(l_body, '<td align="center">冲借款金额</td>');dbms_lob.append(l_body, '<td><br/></td>');dbms_lob.append(l_body,'<td align="center">' ||to_char(rec.cut_amount, 'FM999,999,990.00') ||'</td>');dbms_lob.append(l_body, '<td><br/></td>');dbms_lob.append(l_body, '<td><br/></td>');dbms_lob.append(l_body, '</tr>');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, '<tr>');dbms_lob.append(l_body, '<td align="center">本次支付金额</td>');dbms_lob.append(l_body, '<td><br/></td>');dbms_lob.append(l_body,'<td align="center">' || l_cny_sum_amount_chr ||'</td>');dbms_lob.append(l_body, '<td><br/></td>');dbms_lob.append(l_body, '<td><br/></td>');dbms_lob.append(l_body, '</tr>');dbms_lob.append(l_body, '</table>');-- approve history/*        l_body  := l_body || '<p><br/></p>');*/dbms_lob.append(l_body, '<p>审批历史记录</p>');-- approve headers dbms_lob.append(l_body, '<table>');dbms_lob.append(l_body, '<tr>');dbms_lob.append(l_body, '<th align="center">执行人</th>');dbms_lob.append(l_body, '<th align="center">活动</th>');dbms_lob.append(l_body, '<th align="center">日期</th>');dbms_lob.append(l_body, '<th align="center">审批意见</th>');dbms_lob.append(l_body, '</tr>');-- approve detail FOR rec_approve IN cur_his(rec.po_header_id) LOOPdbms_lob.append(l_body, '<tr>');dbms_lob.append(l_body,'<td align="center">' ||rec_approve.employee_name || '</td>');dbms_lob.append(l_body,'<td align="center">' ||rec_approve.action_code_dsp || '</td>');dbms_lob.append(l_body,'<td align="center">' || rec_approve.action_date ||'</td>');dbms_lob.append(l_body,'<td align="center">' || rec_approve.note ||'</td>');dbms_lob.append(l_body, '</tr>');IF l_flag = 0 THENl_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, '</table>');dbms_lob.append(l_body, '<table>');dbms_lob.append(l_body,'<p><b>打印人:</b>' || rec.person_name ||'      <b>  </b><b>打印日期:' ||to_char(SYSDATE, 'yyyy-MM-dd HH24:mm:ss') ||'</b></p>');dbms_lob.append(l_body,'<p><b>区域财务:                 </b><b>  </b><b>出纳:                 </b><b>  </b><b>复核:                </b><b>  </b><b>网银:                </b><b>  </b><b>批准:                </b><b>  </b></p>');dbms_lob.append(l_body, '</table>');IF l_user_name IS NOT NULL AND l_user_name <> 'SYSADMIN' ANDl_count > 0 THENsend_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 THENset_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. 邮件发送类,支持HTML格式,支持优先级设置

    www.chinacs.net  2002-5-9  中文C#技术站 邮件发送类,支持HTML格式,支持优先级设置.通过SOCKET类实现的 using System; using System.Te ...

  2. 使用Spring实现邮件发送

    2019独角兽企业重金招聘Python工程师标准>>> 这两天写个小程序需要使用邮件发送的功能,在网上搜索了一帮子文章,感觉还是使用Spring的邮件发送功能比较方便,哈哈,懒人就这 ...

  3. python邮件发送哪个好_最全总结!聊聊 Python 发送邮件的几种方式

    1. 前言 邮件,作为最正式规范的沟通方式,在日常办公过程中经常被用到 我们都知道 Python内置了对 SMTP 的支持,可以发送纯文本.富文本.HTML 等格式的邮件 本文将聊聊利用 Python ...

  4. CentOS搭建msmtp+mutt实现邮件发送

    1:搭建配置msmtp 下载msmtp包: 官方地址:http://msmtp.sourceforge.net/download.html 编译,安装(官方下载的包为tar.xz格式): #xz -d ...

  5. 利用phpmailer类邮件发送

    <?phprequire("class.phpmailer.php"); //下载的文件必须放在该文件所在目录$mail = new PHPMailer(); //建立邮件发 ...

  6. python 数据库查询结果邮件提醒_Python实现的查询mysql数据库并通过邮件发送信息功能...

    本文实例讲述了Python实现的查询mysql数据库并通过邮件发送信息功能.分享给大家供大家参考,具体如下: 这里使用Python查询mysql数据库,并通过邮件发送宕机信息. Python代码如下: ...

  7. JavaMail邮件发送不成功的那些坑人情况及分析说明

    前言   JavaMail的使用本身并不难,网上有不少案例,简单易懂,而且有详细的中文注解.但是由于JavaMail的机制设置不够完善,特别是异常出错时的参考信息太少,给初学者造成了不少麻烦,而我就是 ...

  8. 邮件发送 --- 纯Java、JavaWeb、Spring三种实现方式

    邮件发送学习笔记~ 一.邮件发送介绍 要在网络上实现邮件功能,必须要有专门的邮件服务器! 这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中! ...

  9. 使用UTL_MAIL包实现存储过程邮件发送(转)

    邮件通知预警和提示在当前系统中已经是一个比较常见的功能.各类型语言分别针对邮件提供了功能包和API接口方法,本篇介绍如何在PL/SQL代码中使用UTL_MAIL工具包发送邮件,同时还介绍配置中注意的细 ...

最新文章

  1. 【揭秘】视频直播关键技术
  2. 动态库在线更新导致coredump的问题
  3. Windows中导出电脑文件名或者文件结构的方法
  4. onclick的值传给php,php – 从onclick事件将HTML属性传递给jQuery函数
  5. 平衡查找树C语言程序,C语言数据结构之平衡二叉树(AVL树)实现方法示例
  6. 关于推荐系统中的特征工程
  7. 认知电子战 (1.2):认知理论及其在无线电领域的应用
  8. 使用爬虫自动登录QQ空间
  9. ISIS协议基础知识
  10. 计算机word加边框,Word2010怎样为段落加上边框
  11. Unity3D - 高动态范围(Hight Dynamic Range - HDR)
  12. Windows 2012 NIC teaming多网卡高可用Powershell版
  13. Onedrive创建软链接同步指定文件夹
  14. 钉钉打卡显示服务器忙,钉钉系统繁忙请稍后再试
  15. python模块之signal信号
  16. android下怎样伪装mac,Android刷成iOS?史上最强苹果伪装教程
  17. 【Codeforces 869 C The Intriguing Obsession】 组合数学 思维
  18. Water Research | 南科大夏雨组揭示Anammox菌群微米级空间异质性和保守互作
  19. EFT4 生成实体类
  20. ANSYS workbench数值分析 新手教程(1)

热门文章

  1. Windows server 2012网络负载均衡NLB
  2. 枚举类根据name获取value
  3. C Primer Plus学习 十四 使用snitch进行多重选择
  4. Linux线程JOINABLE与DETACHED的区别
  5. VIICMS(仿乐享微信)
  6. OCR 技术总结和汇总
  7. Unity Editor编辑器系列---大神教程
  8. 五年增长50倍,云栖小镇是怎么炼成的?
  9. 云栖小镇—阿里特色的云计算生态系统
  10. 工业级三维扫描仪应用:精密金属模具公差检测