利用Oracle 发送邮件(utl_smtp)

33 篇文章 1 订阅
7 篇文章 0 订阅

发送邮件的方法有很多,.NET前台也可以通过创建邮件类的形式,

通过微软提供的System.Net.Mail.dll 也可以简单的发送邮件。但是代码比较长,操作起来虽然很简单(很多细节忽略了)。

这里,我使用的是Oracle的UTL_SMTP包来发送邮件,在这里,代码还可以根据需要优化

(针对不同的服务可以在区分邮件的收件人,以及信息数据来源,和邮件信息体的划分,这一部分根据实际需要定制)

  --以下定义变量
  TYPE g_chr_tbl IS TABLE OF VARCHAR2(100) INDEX BY BINARY_INTEGER;

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

/*=========================================================

  Description:

      获取发件人地址,这一部分也可以针对不同邮件功能进行复用

  Input:   记录发件人的表格()

  output:  g_chr_tbl              

  FUNCTION Name:

      get_send_email_address

  Version:

      1.00      2016-05-025

  Creator:      weiyao(8000123)  测试: OK

===========================================================*/

PROCEDURE get_send_email_address(mail_to_address OUT g_chr_tbl) IS

  i NUMBER := 1;

BEGIN

  i := 1;

  FOR rec_mail IN (SELECT mv.meaning email_address, mv.*

                   FROM   mes_comm_lookup_types  mt,

                          mes_comm_lookup_values mv

                   WHERE  mt.lookup_type_id = mv.lookup_type_id

                   AND    mt.lookup_type = 'alarm__receiver')

  LOOP

    mail_to_address(i) := rec_mail.email_address;

    --获取了这些人的邮件地址

    dbms_output.put_line('地址' || i || ': ' || mail_to_address(i));

    i := i + 1;

  END LOOP;

END get_send_email_address;

  

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

/*=========================================================

  Description:

      发送邮件

  Input:  

  output:  html 格式的邮件信息,以及调试的 发送了的地址          

  FUNCTION Name:

      send_email_to_wy

  Version:

      1.00      2016-05-025

  Creator:      weiyao(8000123)  测试: OK

===========================================================*/

PROCEDURE send_email_to_wy IS

  --ORACLE发邮件

  SenderAddress VARCHAR2(150) := '****@***.com'; --发送地址    

  PassWord      VARCHAR2(150) := '******'; --服务器密码    

  --ReceiverAddress LONG := '****@**.com'; --接受地址

  EmailServer VARCHAR2(30) := '192.168.*.*'; --服务器端口

  Port        NUMBER := 25;

  mail_to_address g_chr_tbl; --发送邮件的地址,存在数据表中,多人

  conn            UTL_SMTP.CONNECTION;

  v_start   VARCHAR2(150);

  v_subject LONG;

  v_line    LONG;

  v_body    LONG;

  --crlf            VARCHAR2(2) := CHR(13) || CHR(10);

BEGIN

  get_send_email_address(mail_to_address); --获取发送多个地址

  IF mail_to_address.count > 0

  THEN

    conn := utl_smtp.open_connection(EmailServer, Port);

    utl_smtp.ehlo(conn, 'tcl.com');

    --utl_smtp.helo(conn, EmailServer); --和上面一句效果相同

    UTL_SMTP.COMMAND(conn, 'AUTH LOGIN');

    UTL_SMTP.COMMAND(conn,

                     UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_ENCODE(UTL_RAW.CAST_TO_RAW(SenderAddress))));

    UTL_SMTP.COMMAND(conn,

                     UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_ENCODE(UTL_RAW.CAST_TO_RAW(PassWord))));

    utl_smtp.mail(conn, '<' || SenderAddress || '>'); --发件人

    --utl_smtp.rcpt(conn, '<' || ReceiverAddress || '>'); --单个收件人

    FOR i IN 1 .. mail_to_address.count

    LOOP

      utl_smtp.rcpt(conn, '<' || mail_to_address(i) || '>'); --多个收件人

    END LOOP;

    --写内容

    utl_smtp.open_data(conn);

    utl_smtp.write_data(conn, 'From: itpub@tcl.com' || utl_tcp.crlf); --发件人

    --utl_smtp.write_data(conn, 'To:' || ReceiverAddress || utl_tcp.crlf);

    FOR i IN 1 .. mail_to_address.count

    LOOP

      utl_smtp.write_data(conn,

                          'To:' || mail_to_address(i) || utl_tcp.CRLF); --多个收件人

    END LOOP;

    ---

    ---以下是发送邮件内容部分,可以单独分离出不同形式,已复用

    --

    v_subject := 'Subject:' || '预警信息邮件' || utl_tcp.crlf;

    utl_smtp.write_raw_data(conn, utl_raw.cast_to_raw(v_subject));

    --body部分<HTML形式写>

    utl_smtp.write_data(conn,

                        'Content-Type: text/html; charset=GB2312' ||

                        utl_tcp.crlf);

    v_start := '<html><body>';

    v_body  := v_start || '您们好,现在时间是: ' ||

               to_char(SYSDATE, 'yyyy/MM/DD hh24:mi:ss') || '<br>' ||

               '该邮件为预警测试邮件,请不用回复!' || '<br>' || '<table>';

    v_line  := '<tr><td><table cellpadding="2" cellspacing="0" border="1"  align="left">

    <tr>

    <th>第一列</th>

    <th>第二列</th>

    <th>第三列</th>

    <th>第四列</th>';

    /*      FOR rec_email_data IN email_data LOOP      --循环写入表内容

      v_line := v_line || '<tr><td>' || rec_email_data.job || '</td><td>' ||

                rec_email_data.schema_user || '</td><td>' ||

                rec_email_data.what || '</td><td>' ||rec_email_data.failures || '</td></tr>';

     

    END LOOP;*/

    v_body := v_body || v_line || '</table></td></tr>';

    v_body := v_body || '</table></body></html>';

    dbms_output.put_line(v_body); --给自己看,可以复制到记事本中网页打开查看

    utl_smtp.write_data(conn, utl_tcp.crlf); -- body 后面加上 utl_tcp.crlf

   

    utl_smtp.write_raw_data(conn,

                            utl_raw.cast_to_raw(convert(v_body,

                                                        'ZHS16GBK')));

    utl_smtp.close_data(conn);

    utl_smtp.quit(conn);

  END IF;

EXCEPTION

  WHEN OTHERS THEN

    utl_smtp.quit(conn);

    RAISE;

END send_email_to_wy;

测试结果:

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好,关于您提到的使用 UTL_SMTP 发邮件,给自己发邮件有正文内容,给别人发邮件没有正文内容的问题,我猜测是您在发送邮件时没有添加邮件正文内容,或者您添加的邮件正文内容格式不正确导致的。 在使用 UTL_SMTP 发送邮件时,需要调用 UTL_SMTP.WRITE_DATA 函数将邮件正文内容写入到邮件中。正文内容的格式需要按照邮件的格式要求进行指定,通常是使用 HTML 格式或纯文本格式。 以下是一个使用 UTL_SMTP 发送 HTML 格式邮件的示例代码: ``` DECLARE l_mail_conn UTL_SMTP.connection; l_mail_host VARCHAR2(255) := 'smtp.example.com'; l_mail_port PLS_INTEGER := 25; l_mail_user VARCHAR2(255) := 'user@example.com'; l_mail_pass VARCHAR2(255) := 'password'; l_mail_to VARCHAR2(255) := 'recipient@example.com'; l_mail_subject VARCHAR2(255) := 'Test Email'; l_mail_body VARCHAR2(32767) := '<html><body><h1>This is a test email!</h1></body></html>'; BEGIN l_mail_conn := utl_smtp.open_connection(l_mail_host, l_mail_port); utl_smtp.helo(l_mail_conn, l_mail_host); utl_smtp.mail(l_mail_conn, l_mail_user); utl_smtp.rcpt(l_mail_conn, l_mail_to); utl_smtp.data(l_mail_conn, 'Subject:' || l_mail_subject || utl_tcp.crlf); utl_smtp.data(l_mail_conn, 'From: ' || l_mail_user || utl_tcp.crlf); utl_smtp.data(l_mail_conn, 'To: ' || l_mail_to || utl_tcp.crlf); utl_smtp.data(l_mail_conn, 'Content-Type: text/html; charset=UTF-8' || utl_tcp.crlf); utl_smtp.data(l_mail_conn, utl_tcp.crlf); utl_smtp.write_data(l_mail_conn, l_mail_body); utl_smtp.quit(l_mail_conn); END; ``` 请注意,这只是一个示例代码,并且需要根据您的实际情况进行调整。希望能对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值