sql >> データベース >  >> RDS >> Oracle

Oracle UTL_SMTP:OracleWallet認証を使用した添付ファイル付きのメール送信の例

    OracleUTL_SMTPとOracleWallet認証の例を使用して添付ファイル付きのメールを送信します。

    以下は、OracleWalletの構成情報の例です。

    • ウォレットパス:'file:/usr1/oracle/wallets/mywallet '
    • ウォレットパスワード:YourPasword

    OracleUTL_SMTPとOracleWalletを使用して添付ファイル付きのメールを送信

    PL / SQLストアドプロシージャ:

    CREATE OR REPLACE PROCEDURE Send_EMail(i_empno IN emp.empno%type,
                                                          i_Recipient        IN VARCHAR2) IS
    
      v_Host            CONSTANT VARCHAR2(100) := 'smtp.yourhost.com';
      v_Port            CONSTANT INTEGER := 587;
      v_Wallet_Path     CONSTANT VARCHAR2(100) := 'file:/usr1/oracle/wallets/mywallet';
      v_Wallet_Password CONSTANT VARCHAR2(100) := 'YourWalletPassword';
      v_Domain          CONSTANT VARCHAR2(100) := 'smtp.yourhost.com';
      v_Username        CONSTANT VARCHAR2(100) := '[email protected]';
      v_Password        CONSTANT VARCHAR2(100) := 'YourPassword';
      v_Sender          CONSTANT VARCHAR2(100) := '[email protected]';
      v_Recipient       CONSTANT VARCHAR2(100) := i_Recipient;
      v_Subject          VARCHAR2(1000) := 'This is subject.';
      v_Body             VARCHAR2(1000) := 'This is the bodyt text.';
      l_Conn             Utl_Smtp.Connection;
      l_Reply            Utl_Smtp.Reply;
      l_Replies          Utl_Smtp.Replies;
      v_Len              NUMBER;
      v_Index            NUMBER;
      l_Boundary         VARCHAR2(50) := '----=*#foxinfotech#*=';
      v_Error_Message    VARCHAR2(1000);
      v_Filename         VARCHAR2(100);
    
    /* Fetch the PDF (BLOB) from EMP_DOCS table */
      CURSOR Cur_empPdf IS
        SELECT pdf_blob Report
          FROM emp_docs
         WHERE empno = i_empno;
    
      l_Blob        BLOB;
     
    BEGIN
    
      l_Reply := Utl_Smtp.Open_Connection(Host                          => v_Host,
                                          Port                          => v_Port,
                                          c                             => l_Conn,
                                          Wallet_Path                   => v_Wallet_Path,
                                          Wallet_Password               => v_Wallet_Password,
                                          Secure_Connection_Before_Smtp => FALSE);
    
    
      l_Replies := Utl_Smtp.Ehlo(l_Conn,
                                 v_Domain);
    
      Utl_Smtp.Starttls(l_Conn);
    
    
      l_Replies := Utl_Smtp.Ehlo(l_Conn,
                                 v_Domain);
    
      l_Reply := Utl_Smtp.Auth(l_Conn,
                               v_Username,
                               v_Password,
                               Utl_Smtp.All_Schemes);
    
      l_Reply := Utl_Smtp.Mail(l_Conn,
                               v_Sender);
    
    
      l_Reply := Utl_Smtp.Rcpt(l_Conn,
                               v_Recipient);
    
      l_Reply := Utl_Smtp.Open_Data(l_Conn);
    
    
      v_Filename := To_Char(SYSDATE,
                            'YYYYMMDDHH24MISS') || '.pdf';
    
      Utl_Smtp.Write_Data(l_Conn,
                          'From: ' || v_Sender || Utl_Tcp.Crlf);
      Utl_Smtp.Write_Data(l_Conn,
                          'To: ' || v_Recipient || Utl_Tcp.Crlf);
      Utl_Smtp.Write_Data(l_Conn,
                          'Subject: ' || v_Subject || Utl_Tcp.Crlf);
      Utl_Smtp.Write_Data(l_Conn,
                          'MIME-Version: 1.0' || Utl_Tcp.Crlf);
      Utl_Smtp.Write_Data(l_Conn,
                          'Content-Type: multipart/mixed; boundary="' ||
                          l_Boundary || '"' || Utl_Tcp.Crlf || Utl_Tcp.Crlf);
    
      IF v_Body IS NOT NULL THEN
        Utl_Smtp.Write_Data(l_Conn,
                            '--' || l_Boundary || Utl_Tcp.Crlf);
        Utl_Smtp.Write_Data(l_Conn,
                            'Content-Type: text/plain; charset="iso-8859-1"' ||
                            Utl_Tcp.Crlf || Utl_Tcp.Crlf);
      
        Utl_Smtp.Write_Data(l_Conn,
                            Utl_Tcp.Crlf || v_Body);
        Utl_Smtp.Write_Data(l_Conn,
                            Utl_Tcp.Crlf || Utl_Tcp.Crlf);
      END IF;
    
      Dbms_Lob.Createtemporary(Lob_Loc => l_Blob,
                               Cache   => TRUE,
                               Dur     => Dbms_Lob.Call);
    
      FOR c IN Cur_empPdf LOOP
      
        l_Blob := c.Report;
    
        Utl_Smtp.Write_Data(l_Conn,
                            '--' || l_Boundary || Utl_Tcp.Crlf);
        Utl_Smtp.Write_Data(l_Conn,
                            'Content-Type: ' || 'application/pdf' || '; name="' ||
                            c.Filename || '"' || Utl_Tcp.Crlf);
        Utl_Smtp.Write_Data(l_Conn,
                            'Content-Transfer-Encoding: base64' || Utl_Tcp.Crlf);
        Utl_Smtp.Write_Data(l_Conn,
                            'Content-Disposition: attachment; filename="' ||
                            v_Filename || '"' || Utl_Tcp.Crlf || Utl_Tcp.Crlf);
      
        FOR i IN 0 .. Trunc((Dbms_Lob.Getlength(l_Blob) - 1) / 12000) LOOP
          Utl_Smtp.Write_Data(l_Conn,
                              Utl_Raw.Cast_To_Varchar2(Utl_Encode.Base64_Encode(Dbms_Lob.Substr(l_Blob,
                                                                                                12000,
                                                                                                i *
                                                                                                12000 + 1))));
        END LOOP;
      
        Utl_Smtp.Write_Data(l_Conn,
                            Utl_Tcp.Crlf || Utl_Tcp.Crlf);
        Utl_Smtp.Write_Data(l_Conn,
                            '--' || l_Boundary || '--' || Utl_Tcp.Crlf);
        EXIT;
      END LOOP;
    
      l_Reply := Utl_Smtp.Close_Data(l_Conn);
    
      l_Reply := Utl_Smtp.Quit(l_Conn);
    
    EXCEPTION
      WHEN Utl_Smtp.Transient_Error OR Utl_Smtp.Permanent_Error THEN
      
        BEGIN
          Utl_Smtp.Quit(l_Conn);
        EXCEPTION
          WHEN Utl_Smtp.Transient_Error OR Utl_Smtp.Permanent_Error THEN
            NULL;
        END;
      
        Raise_Application_Error(-20000,
                                'Failed to send mail due to the following error: ' ||
                                SQLERRM);
        
      WHEN OTHERS THEN
        RAISE;
    END;
    /

    関連項目:

    • PLPDF_TOOLKIT PL / SQLパッケージを使用して、Oracleで複数のPDFファイルを1つのPDFにマージ/結合します
    • BIPublisherのレポートコンテンツをOracleApexのBLOBフィールドにロードする方法
    1. MSSQLエラー'基になるプロバイダーがOpenで失敗しました'

    2. COUNTSQL関数のパフォーマンス

    3. T-SQLを使用してSQLServerのCHECK制約の名前を変更します

    4. SQLServerで列名またはテーブル名の名前を変更する方法-SQLServer/T-SQLチュートリアルパート36