Oracle发送邮件存储过程_第1页
Oracle发送邮件存储过程_第2页
Oracle发送邮件存储过程_第3页
Oracle发送邮件存储过程_第4页
Oracle发送邮件存储过程_第5页
免费预览已结束,剩余4页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、发送邮件直接调用这个存储过程就可以了。参数的意义里面都有说明。代码如下:CREATEORREPLACEPROCEDUREPROCSENDEMAIL(P_TXTVARCHAR2,P_SUBVARCHAR2,P_SENDORVARCHAR2,P_RECEIVERVARCHAR2,P_SERVERVARCHAR2,P_PORTNUMBERDEFAULT25,P_NEED_SMTPINTDEFAULT0,P_USERVARCHAR2DEFAULTNULL,P_PASSVARCHAR2DEFAULTNULL,P_FILENAMEVARCHAR2DEFAULTNULL,P_ENCODEVARCHAR2DE

2、FAULTbit7)AUTHIDCURRENT_USERIS/*作用:用oracle发送邮件主要功能:1、支持多收件人。2、支持中文3、支持抄送人4、支持大于32K的附件5、支持多行正文6、支持多附件7、支持文本附件和二进制附件8、支持HTML格式8、支持作者:suk参数说明:p_txt:邮件正文p_sub:邮件标题p_SendorAddress:发送人邮件地址p_ReceiverAddress:接收地址,可以同时发送到多个地址上,地址之间用,或者”隔开p_EmailServer:邮件服务器地址,可以是域名或者IPp_Port:邮件服务器端口p_need_smtp:是否需要smtp认证,0表示

3、不需要,1表示需要p_user:smtp验证需要的用户名p_pass:smtp验证需要的密码p_filename:附件名称,必须包含完整的路径,如d:tempa.txt可以有多个附件,附件名称只见用逗号或者分号分隔p_encode:附件编码转换格式,其中p_encode=bit7表示文本类型附件p_encode=base64表示二进制类型附件注意:1、对于文本类型的附件,不能用base64的方式发送,否则出错2、对于多个附件只能用同一种格式发送*/L_CRLFVARCHAR2(2):=UTL_TCRLF;L_SENDORADDRESSVARCHAR2(4000);L_SPLITEVARCHAR

4、2(10):=+;CONSTANTVARCHAR2(256):=BYSUK;CONSTANTVARCHAR2(256):=-|BOUNDARY|L_CRLF;CONSTANTVARCHAR2(256):=-|BOUNDARY|-|L_CRLF;MULTIPART_MIME_TYPECONSTANTVARCHAR2(256):=multipart/mixed;boundary=|BOUNDARY|/*以下部分是发送大二进制附件时用到的变量*/BFILE;NUMBER;NUMBER;NUMBER;UTL_FILE.FILE_TYPE;BINARY_INTEGER:=672*3;/*ensuresp

5、roperformat;PLS_INTEGER:=1;/*pointerforthefile*/NUMBER;_BUFL_DATAL_MAX_LINE_WIDTHL_DIRECTORY_BASE_NAMEVARCHAR2(100):=DIR_FOR_SEND_MAIL;L_LINEVARCHAR2(1000);L_MESGVARCHAR2(32767);/*以上部分是发送大二进制附件时用到的变量*/TYPEADDRESS_LISTISTABLEOFVARCHAR2(100)INDEXBYBINARY_INTEGER;MY_ADDRESS_LISTADDRESS_LIST;TYPEACCT_LI

6、STISTABLEOFVARCHAR2(100)INDEXBYBINARY_INTEGER;MY_ACCT_LISTACCT_LIST;返回附件源文件所在目录或者名称FUNCTIONGET_FILE(P_FILEVARCHAR2,P_GETINT)RETURNVARCHAR2IS-p_get=1表示返回目录-p_get=2表示返回文件名L_FILEVARCHAR2(1000);BEGINBOUNDARYFIRST_BOUNDARYLAST_BOUNDARYL_FILL_FILE_LENL_MODULOL_PIECESL_FILE_HANDLEL_AMT2016*/L_FILEPOSL_CHUN

7、KSRAW(2100);RAW(2100);NUMBER:=54;IFINSTR(P_FILE,)0THEN-windowsIFP_GET=1THENL_FILE:=SUBSTR(P_FILE,1,INSTR(P_FILE,-1)-1);ELSIFP_GET=2THENL_FILE:=SUBSTR(P_FILE,-(LENGTH(P_FILE)-INSTR(P_FILE,-1);ENDIF;ELSIFINSTR(P_FILE,/)0THEN-linux/unixIFP_GET=1THENL_FILE:=SUBSTR(P_FILE,1,INSTR(P_FILE,/,-1)-1);ELSIFP_G

8、ET=2THENL_FILE:=SUBSTR(P_FILE,-(LENGTH(P_FILE)-INSTR(P_FILE,/,-1);ENDIF;ENDIF;RETURNL_FILE;END;删除directoryPROCEDUREDROP_DIRECTORY(P_DIRECTORY_NAMEVARCHAR2)ISBEGINEXECUTEIMMEDIAEdropdirectory|P_DIRECTORY_NAME;EXCEPTIONWHENOTHERSTHENNULL;END;创建directoryPROCEDURECREATE_DIRECTORY(P_DIRECTORY_NAMEVARCHAR

9、2,P_DIRVARCHAR2)ISBEGINEXECUTEIMMEDIAEcreatedirectory|P_DIRECTORY_NAME|as|P_DIR|;EXECUTEIMMEDIAEgrantread,writeondirectory|P_DIRECTORY_NAME|topublic;EXCEPTIONWHENOTHERSTHENRAISE;END;分割邮件地址或者附件地址PROCEDUREP_SPLITE_STR(P_STRVARCHAR2,P_SPLITE_FLAGINTDEFAULT1)ISL_ADDRVARCHAR2(254):=;L_LENINT;L_STRVARCHAR

10、2(4000);JINT:=0;-表示邮件地址或者附件的个数BEGIN/*处理接收邮件地址列表,包括去空格、将;转换为,等*/L_STR:=TRIM(RTRIM(REPLACE(REPLACE(P_STR,;,),),);L_LEN:=LENGTH(L_STR);FORIIN1.L_LENLOOPIFSUBSTR(L_STR,I,1),THENL_ADDR:=L_ADDR|SUBSTR(L_STR,I,1);ELSEJ:=J+1;IFP_SPLITE_FLAG=1THEN-示处理邮件地址- -前后需要加上,否则很多邮箱将不能发送邮件L_ADDR:=;- -调用邮件发送过程MY_ADDRESS_

11、LIST(J):=L_ADDR;ELSIFP_SPLITE_FLAG=2THEN!示处理附件名称MY_ACCT_LIST(J):=L_ADDR;ENDIF;L_ADDR:=;ENDIF;IFI=L_LENTHENJ:=J+1;IFP_SPLITE_FLAG=1THEN- -调用邮件发送过程L_ADDR:=;MY_ADDRESS_LIST(J):=L_ADDR;ELSIFP_SPLITE_FLAG=2THENMY_ACCT_LIST(J):=L_ADDR;ENDIF;ENDIF;ENDLOOP;END;写邮件头和邮件内容PROCEDUREWRITE_DATA(P_CONNINOUTNOCOPYU

12、TL_SMTPONNECTION,P_NAMEINVARCHAR2,P_VALUEINVARCHAR2,P_SPLITEVARCHAR2DEFAULT:,P_CRLFVARCHAR2DEFAULTL_CRLF)ISBEGIN/*utl_raw.cast_to_raw对解决中文乱码问题很重要*/UTL_SMTPWRITE_RAW_DATA(P_CONN,UTL_RAW.CAST_TO_RAW(CONVERT(P_NAME|P_SPLITE|P_VALUE|P_CRLF,ZHS16GBK);END;写MIME邮件尾部PROCEDUREEND_BOUNDARY(CONNINOUTNOCOPYUTL_

13、SMTRNECTION,LASTINBOOLEANDEFAULTFALSE)ISBEGINUTL_SMTPWRITE_DATA(CONN,UTL_TCCRLF);IF(LAST)THENUTL_SMTPWRITE_DATA(CONN,LAST_BOUNDARY);ENDIF;END;发送附件INOUTNOCOPYUTL_SMTPONNECTIONINVARCHAR2DEFAULTtext/plain,INBOOLEANDEFAULTTRUE,INVARCHAR2DEFAULTt.txt,TRANSFER_ENCINVARCHAR2DEFAULT7bit,DT_NAMEINVARCHAR2DEF

14、AULT0)ISL_FILENAMEVARCHAR2(1000);BEGIN-写附件头UTL_SMTPWRITE_DATA(CONN,FIRST_BOUNDARY);- -设置附件格式WRITE_DATA(CONN,Content-Type,MIME_TYPE);- -如果文件名称非空,表示有附件DROP_DIRECTORY(DT_NAME);一创建directoryCREATE_DIRECTORY(DT_NAME,GET_FILE(FILENAME,1);- -得到附件文件名称L_FILENAME:=GET_FILE(FILENAME,2);IF(INLINE)THENWRITE_DATA(

15、CONN,Content-Disposition,inline;filename=|L_FILENAME|);ELSEWRITE_DAA(CONN,Content-Disposition,attachment;filename=|L_FILENAME|);ENDIF;- -设置附件的转换格式IF(TRANSFER_ENCISNOTNULL)THENWRITE_DATA(CONN,Content-Transfer-Encoding,TRANSFER_ENC);PROCEDUREATTACHMENT(CONNMIME_TYPEINLINEFILENAMEENDIF;UTL_SMTPWRITE_DA

16、TA(CONN,UTL_TCCRLF);-begin贴附件内容IFTRANSFER_ENC=bit7THEN-如果是文本类型的附件BEGINL_FILE_HANDLE:=UTL_FILE.FOPEN(DT_NAME,L_FILENAME,r打开文件-把附件分成多份,这本可以发送超过32K的附件LOOPUTL_FILE.GET_LINE(L_FILE_HANDLE,L_LINE);L_MESG:=L_LINE|L_CRLF;WRITE_DATA(CONN,L_MESG,);ENDLOOP;UTL_FILE.FCLOSE(L_FILE_HANDLE);END_BOUNDARY(CONN);EXCE

17、PTIONWHENOTHERSTHENUTL_FILE.FCLOSE(L_FILE_HANDLE);END_BOUNDARY(CONN);NULL;END;-结束文本类型附件的处理ELSIFTRANSFER_ENC=base64THEN-如果是二进制类型的附件BEGIN-把附件分成多份,这本可以发送超过32K的附件L_FILEPOS:=1;-重置offset,在发送多个附件时,必须重置L_FIL:=BFILENAME(DT_NAME,L_FILENAME);L_FILE_LEN:=DBMS_LOB.GETLENGTH(L_FIL);L_MODULO:=MOD(L_FILE_LEN,L_AMT)

18、;L_PIECES:=TRUNC(L_FILE_LEN/L_AMT);IF(L_MODULO0)THENL_PIECES:=L_PIECES+1;ENDIF;DBMS_LOB.FILEOPEN(L_FIL,DBMS_LOB.FILE_READO)NLDBMS_LOB.READ(L_FIL,L_AMT_FILEPOS,L_BUF);L_DATA:=NULL;FORIIN1.L_PIECESLOOPL_FILEPOS:=I*L_AMT+1;L_FILE_LEN:=L_FILE_LEN-L_AMT;L_DATA:=UTL_RAW.CONCAT(L_DATA,L_BUF);L_CHUNKS:=TRUN

19、C(UTL_RAW.LENGTH(L_DATA)/L_MAX_LINE_WIDTH);IF(IL_PIECES)THENL_CHUNKS:=L_CHUNKS-1;ENDIF;UTL_SMTPWRITE_RAW_DATA(CONN,UTL_ENCODE.BASE64_ENCODE(L_DATA);L_DATA:=NULL;IF(L_FILE_LEN0)THENL_AMT:=L_FILE_LEN;ENDIF;DBMS_LOB.READ(L_FIL,L_AMT_FILEPOS,L_BUF);ENDLOOP;DBMS_LOB.FILECLOSE(L_FIL);END_BOUNDARY(CONN);EX

20、CEPTIONWHENOTHERSTHENDBMS_LOB.FILECLOSE(L_FIL);END_BOUNDARY(CONN);RAISE;END;-结束处理二进制附件ENDIF;-结束处理附件内容DROP_DIRECTORY(DT_NAME);END;-结束过程ATTACHMENT真正发送邮件的过程PROCEDUREP_EMAIL(P_SENDORADDRESS2/ARCHAR2,-t送地址P_RECEIVERADDRESS2VARCHAR2)受地址ISL_CONNUTL_SMTEONNECTION;-义连接BEGIN/*初始化邮件服务器信息,连接邮件服务器*/L_CONN:=UTL_S

21、MT.OPEN_CONNECTION(P_SERVER,P_PORT);UTL_SMTPHELO(L_CONN,P_SERVER);/*smtp服务器登录校验*/IFP_NEED_SMTP=1THENUTL_SMTPCOMMAND(L_CONN,AUTHLOGIN,);UTL_SMTPCOMMAND(L_CONN,UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_ENCODE(UTL_RAW.CAST_TO_RAW(P_USER);UTL_SMTP.COMMAND(L_CONN,UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE

22、64_ENCODE(UTL_RAW.CAST_TO_RAW(P_PASS);ENDIF;/*设置发送地址和接收地址*/UTL_SMTPMAIL(L_CONN,P_SENDORADDRESS2);UTL_SMTPRCPT(L_CONN,P_RECEIVERADDRESS2);/*设置邮件头*/UTL_SMTPOPEN_DATA(L_CONN);WRITE_DATA(L_CONN,Date,TO_CHAR(SYSDATE,yyyy-mm-ddhh24:mi:ss);/*设置发送人*/WRITE_DATA(L_CONN,From,P_SENDOR);/*设置接收人*/WRITE_DATA(L_CON

23、N,To,P_RECEIVER);/*设置邮件主题*/WRITE_DATA(L_CONN,Subject,P_SUB);WRITE_DATA(L_CONN,Content-Type,MULTIPART_MIME_TYPE);UTL_SMTFWRITE_DATA(L_CONN,UTL_TCCRLF);UTL_SMTf?WRITE_DATA(L_CONN,FIRST_BOUNDARY);WRITE_DATA(L_CONN,Content-Type,text/plain;charset=gb2312);-单独空一行,否则,正文内容不显示UTL_SMTFWRITE_DATA(L_CONN,UTL_TCCRLF);/*设置邮件

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论