Send Email Using PLSQL

后端 未结 2 1050
猫巷女王i
猫巷女王i 2021-01-15 14:39

I want to Send Email via gmail or yahoo host using PL_SQL, i searched in google and find SMT.Mail package but it did\'t work for me, Please any one can guide me how will i

2条回答
  •  失恋的感觉
    2021-01-15 15:00

    My experience has been that the utl_mail package is much easier to use. Here is a silly example:

    BEGIN
       UTL_MAIL.send (sender     => 'bighearted@somewhere.com'
                    , recipients => 'receiver@footballreceiver.com'
                    , subject    => 'Goofy Messages'
                    , MESSAGE    => 'Please don''t send any more goofy messages'
                    , mime_type  => 'text/html; charset=us-ascii');
     END;
    

    You must set the system parameter smtp_out_server to the name of your email server.

    With Oracle 11G R2 and beyond, you must set up the proper access control list (ACL) for this to work. This is the code that I use to do so.

    DECLARE
       -- ACL name to be used for email access reuse the same value for all 
       -- future calls
       l_acl         VARCHAR2 (30) := 'utl_smtp.xml';
       -- Oracle user to be given permission to send email
       l_principal   VARCHAR2 (30) := 'CEAADMIN';
       -- Name of email server
       g_mailhost    VARCHAR2 (60) := 'mail.yourserver.com';
       l_cnt         INTEGER;
    
       PROCEDURE validate_smtp_server
       AS
          l_value       v$parameter.VALUE%TYPE;
          l_parameter   v$parameter.name%TYPE := 'smtp_out_server';
       BEGIN
    
          SELECT VALUE
            INTO l_value
            FROM v$parameter
           WHERE name = l_parameter;
    
          IF l_value IS NULL
          THEN
             raise_application_error (
                -20001
              ,    'Oracle parameter '
                || l_parameter
                || ' has not been set'
                || UTL_TCP.crlf
                || 'it s/b mail.yourserver.com'
             );
          END IF;
    
          DBMS_OUTPUT.put_line ('parameter ' || l_parameter || ' value is ' ||     l_value);
    
       END validate_smtp_server;
    
       PROCEDURE create_if_needed (p_acl IN VARCHAR2)
       AS
          l_cnt   INTEGER;
       BEGIN
    
          SELECT COUNT (*) c
            INTO l_cnt
            FROM dba_network_acls a
           WHERE SUBSTR (acl, INSTR (acl, '/', -1) + 1) = p_acl;
    
          IF l_cnt = 0
          THEN
             DBMS_OUTPUT.put_line ('creating acl ' || p_acl);
             DBMS_NETWORK_ACL_ADMIN.create_acl (
                acl         => p_acl
              , description => 'Allow use of utl_smtp'
              , principal   => l_principal
              , is_grant    => TRUE
              , privilege   => 'connect'
             );
    
             DBMS_NETWORK_ACL_ADMIN.assign_acl (acl => p_acl, HOST => g_mailhost);
             COMMIT;
          ELSE
             DBMS_OUTPUT.put_line (p_acl || ' acl already exists');
          END IF;
    
       END create_if_needed;
    
       PROCEDURE add_if_needed (
          p_principal   IN VARCHAR2
        , p_acl         IN VARCHAR2
       )
       AS
          l_cnt   INTEGER;
       BEGIN
    
          SELECT COUNT (*) c
            INTO l_cnt
            FROM dba_network_acl_privileges
           WHERE SUBSTR (acl, INSTR (acl, '/', -1) + 1) = p_acl
             AND principal = p_principal;
    
          IF l_cnt = 0
          THEN
             DBMS_NETWORK_ACL_ADMIN.add_privilege (
                acl       => 'utl_smtp.xml'
              , principal => p_principal
              , is_grant  => TRUE
              , privilege => 'connect'
             );
             COMMIT;
             DBMS_OUTPUT.put_line ('access to ' || p_acl || ' added for ' ||     p_principal);
          ELSE
             DBMS_OUTPUT.put_line (p_principal || ' already has access to ' || p_acl);
          END IF;
    
       END add_if_needed;
    BEGIN
    
       EXECUTE IMMEDIATE 'grant execute on utl_mail to ' || l_principal;
    
       create_if_needed (p_acl => l_acl);
       add_if_needed (p_principal => l_principal, p_acl => l_acl);
       DBMS_OUTPUT.put_line ('Verification SQL:');
       DBMS_OUTPUT.put_line ('    SELECT * FROM dba_network_acls;');
       DBMS_OUTPUT.put_line ('    SELECT * FROM dba_network_acl_privileges;');
       COMMIT;
       validate_smtp_server;
    END;
    

提交回复
热议问题