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

Oracle D2k、Oracle Forms 10g、OracleForms6iで添付ファイル付きの電子メールを送信する

    Oracle D2k、Oracle Forms 10g、OracleForms6iで添付ファイル付きの電子メールを送信します。

    メールを送信する場所から現在のスキーマにディレクトリオブジェクトEmail_Filesを作成します。

    Create or Replace directory email_files as 'c:\urdir';
    PROCEDURE Send_Email(ifrom In varchar2, ito In varchar2, icc In varchar2, ifile In varchar2, ifile2 In varchar2,
    isubject In varchar2, imsg In varchar2, isrl_no In number)
     Is
        /*utl_smtp related variables. */
        vfile varchar2(100);
        v_connection_handle  Utl_Smtp.CONNECTION;
        v_from_email_address VARCHAR2(1000) := ifrom;
        v_to_email_address   VARCHAR2(1000) := ito;
        v_smtp_host          VARCHAR2(100) := 'mail.urdomain.com'; --your mail server
        v_subject            VARCHAR2(1000) := isubject;
        l_message            VARCHAR2(2000) := imsg;
      nls_charset    varchar2(255);  
        /* this send_header procedure is written in the documentation */
        PROCEDURE send_header(pi_name In VARCHAR2, pi_header In VARCHAR2) As
        BEGIN
          Utl_Smtp.WRITE_DATA(v_connection_handle,
                              pi_name || ': ' || pi_header || Utl_Tcp.CRLF);
        END;
    
     BEGIN
           Select Value
           Into   nls_charset
           From   NLS_DATABASE_PARAMETERS
           Where  parameter = 'NLS_CHARACTERSET';
      
        /*utl_smtp related coding. */
        v_connection_handle := Utl_Smtp.OPEN_CONNECTION(v_smtp_host, 25);
        Utl_Smtp.EHLO(v_connection_handle, v_smtp_host);
        utl_smtp.command(v_connection_handle, 'auth login');
      utl_smtp.command(v_connection_handle,utl_encode.text_encode('[email protected]', nls_charset, 1));
      utl_smtp.command(v_connection_handle, utl_encode.text_encode('urpassword', nls_charset, 1));
        Utl_Smtp.Mail(v_connection_handle, v_from_email_address);
        Utl_Smtp.RCPT(v_connection_handle, v_to_email_address);
        IF icc Is Not Null Then
         Utl_Smtp.RCPT(v_connection_handle, icc);
        END IF;
        Utl_Smtp.OPEN_DATA(v_connection_handle);
        send_header('From', ifrom);
         send_header('To', ito);
        IF icc Is Not Null Then
          send_header('Cc', icc);
        END IF; 
        send_header('Subject', v_subject); 
        IF IFILE Is Null And IFILE2 Is Null Then
             Utl_Smtp.WRITE_DATA(v_connection_handle,
                               'Content-Type: text/html;' || Utl_Tcp.CRLF);
            Utl_Smtp.WRITE_DATA(v_connection_handle,
                                ' charset=US-ASCII' || Utl_Tcp.CRLF);
            Utl_Smtp.WRITE_DATA(v_connection_handle, Utl_Tcp.CRLF);
            Utl_Smtp.WRITE_DATA(v_connection_handle, l_message || Utl_Tcp.CRLF);
            Utl_Smtp.WRITE_DATA(v_connection_handle, Utl_Tcp.CRLF);
        END IF;
        
        --mime header.
        IF ifile Is Not Null Then
         For i In 1..2 LOOP
          /*preparing the lob from file for attachment. */
              /*lob operation related varriables */
          IF i = 1 Then
            vfile := ifile;
          Else
           IF ifile2 Is Null Then
             EXIT;
           Else
            vfile := ifile2;
           END IF;
          END IF;
              DECLARE
             v_src_loc  BFILE := Bfilename('EMAIL_FILES', Nvl(vfile, 'temp'));
             l_buffer   RAW(54);
             l_amount   BINARY_INTEGER := 54;
             l_pos      INTEGER := 1;
             l_blob     BLOB := Empty_Blob;
             l_blob_len INTEGER;
             v_amount   INTEGER;
             BEGIN
          Dbms_Lob.OPEN(v_src_loc, Dbms_Lob.LOB_READONLY); --read the file
          Dbms_Lob.CREATETEMPORARY(l_blob, TRUE); --create temporary lob to store the file.
          v_amount := Dbms_Lob.GETLENGTH(v_src_loc); --amount to store.
          Dbms_Lob.LOADFROMFILE(l_blob, v_src_loc, v_amount); -- loading from file into temporary lob
          l_blob_len := Dbms_Lob.getlength(l_blob);
          Utl_Smtp.WRITE_DATA(v_connection_handle,
                              'MIME-Version: 1.0' || Utl_Tcp.CRLF);
          Utl_Smtp.WRITE_DATA(v_connection_handle,
                              'Content-Type: multipart/mixed; ' || Utl_Tcp.CRLF);
          Utl_Smtp.WRITE_DATA(v_connection_handle,
                              ' boundary= "' || 'EMAIL_FILES.SECBOUND' || '"' ||
                              Utl_Tcp.CRLF);
          Utl_Smtp.WRITE_DATA(v_connection_handle, Utl_Tcp.CRLF);
          IF i = 1 Then
            -- mail body
            Utl_Smtp.WRITE_DATA(v_connection_handle,
                                '--' || 'EMAIL_FILES.SECBOUND' || Utl_Tcp.CRLF);
            Utl_Smtp.WRITE_DATA(v_connection_handle,
                                'Content-Type: text/html;' || Utl_Tcp.CRLF);
            Utl_Smtp.WRITE_DATA(v_connection_handle,
                                ' charset=US-ASCII' || Utl_Tcp.CRLF);
            Utl_Smtp.WRITE_DATA(v_connection_handle, Utl_Tcp.CRLF);
            Utl_Smtp.WRITE_DATA(v_connection_handle, l_message || Utl_Tcp.CRLF);
            Utl_Smtp.WRITE_DATA(v_connection_handle, Utl_Tcp.CRLF);
          END IF;
          -- mail attachment
          Utl_Smtp.WRITE_DATA(v_connection_handle,
                              '--' || 'EMAIL_FILES.SECBOUND' || Utl_Tcp.CRLF);
          Utl_Smtp.WRITE_DATA(v_connection_handle,
                              'Content-Type: application/octet-stream' ||
                              Utl_Tcp.CRLF);
          Utl_Smtp.WRITE_DATA(v_connection_handle,
                              'Content-Disposition: attachment; ' || Utl_Tcp.CRLF);
          Utl_Smtp.WRITE_DATA(v_connection_handle,
                             ' filename="' || vfile || '"' || --my filename
                              Utl_Tcp.CRLF);
          Utl_Smtp.WRITE_DATA(v_connection_handle,
                              'Content-Transfer-Encoding: base64' || Utl_Tcp.CRLF);
          Utl_Smtp.WRITE_DATA(v_connection_handle, Utl_Tcp.CRLF);
        /* writing the blol in chunks */
          WHILE l_pos < l_blob_len LOOP
            Dbms_Lob.Read(l_blob, l_amount, l_pos, l_buffer);
            Utl_Smtp.write_raw_data(v_connection_handle,
                                    Utl_Encode.BASE64_ENCODE(l_buffer));
            Utl_Smtp.WRITE_DATA(v_connection_handle, Utl_Tcp.CRLF);
            l_buffer := Null;
            l_pos    := l_pos + l_amount;
          END LOOP;
          Utl_Smtp.WRITE_DATA(v_connection_handle, Utl_Tcp.CRLF);
          Dbms_Lob.FREETEMPORARY(l_blob);
         Dbms_Lob.FILECLOSE(v_src_loc);
          EXCEPTION
           When Others Then
             Dbms_Lob.FREETEMPORARY(l_blob);
             Dbms_Lob.FILECLOSE(v_src_loc);
            END;
         END LOOP;
          -- close email
          Utl_Smtp.WRITE_DATA(v_connection_handle,
                              '--' || 'EMAIL_FILES.SECBOUND' || '--' || Utl_Tcp.CRLF);
          Utl_Smtp.WRITE_DATA(v_connection_handle,
                              Utl_Tcp.CRLF || '.' || Utl_Tcp.CRLF);
          END IF;
          Utl_Smtp.CLOSE_DATA(v_connection_handle);
          Utl_Smtp.QUIT(v_connection_handle);
      EXCEPTION
        When Others Then
    --    utl_smtp.quit(v_connection_handle);
         IF ifile Is Not Null Then
          Utl_Smtp.QUIT(v_connection_handle);
    
         END IF;
          RAISE;
      END;

    1. AndroidSQLiteワイルドカード

    2. PL/SQLの単体テスト

    3. Oracle SQLで指定された列を選択するのはなぜですか?

    4. MariaDB CEIL()の説明