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

クレデンシャルをUTL_MAIL.SENDに付与して、ORA-29278をバイパスします

    基本的に、「下位レベル」UTL_SMTP 離れたSMTPサーバーに必要なさまざまなSMTPメッセージを送信するためのパッケージ。

    認証

    StefanoGhioのブログ から :

     -- prepare base64 encoded username and password
     l_encoded_username := UTL_RAW.cast_to_varchar2(UTL_ENCODE.base64_encode(UTL_RAW.cast_to_raw(username)));  
     l_encoded_password := UTL_RAW.cast_to_varchar2(UTL_ENCODE.base64_encode(UTL_RAW.cast_to_raw(password)));
    
     -- Open connection and send EHLO and AUTH messages  
     l_conn := UTL_SMTP.open_connection(smtpHost, smtpPort);  
     UTL_SMTP.ehlo(l_conn, smtpHost);--DO NOT USE HELO  
     UTL_SMTP.command(l_conn, 'AUTH', 'LOGIN');  
     UTL_SMTP.command(l_conn, l_encoded_username);  
     UTL_SMTP.command(l_conn, l_encoded_password);  
    

    ここでの主な問題は、AUTHを送信できる必要があるということです。 サーバーの「正しい」認証スキームを使用したメッセージ。 "smtp.live.com"については言えません 具体的には、サーバーの構成によっては、PLAINなどの異なる認証スキームである可能性があります。 およびLOGINDIGEST_MD5 、...通常(常に?)パラメータ(usernamepassword )はbase64でエンコードされています。

    メールの送信

    しかし、悪いニュース つまり、現在低レベルのライブラリを使用しているため、SMTPプロトコル あなた自身。上記と同じソースから(絶対に必要なものだけを保持するように自分で編集 ):

    UTL_SMTP.mail(l_conn, mailFrom);
    UTL_SMTP.rcpt(l_conn, rcptTo);
    [...]
    
    --start multi line message
    UTL_SMTP.open_data(l_conn);
    
    --prepare mail header
    UTL_SMTP.write_data(l_conn, 'To: ' || rcptTo || crlf);
    UTL_SMTP.write_data(l_conn, 'From: ' || mailFrom || crlf);
    UTL_SMTP.write_data(l_conn, 'Subject: ' || messageSubject || crlf);
    
    --include the message body
    UTL_SMTP.write_data(l_conn, messageBody || crlf || crlf);
    
    --send the email and close connection
    UTL_SMTP.close_data(l_conn);
    UTL_SMTP.quit(l_conn); 
    

    SSL/TLSの使用

    そして今、非常に悪いニュース :一部のサーバーには安全な接続が必要でした 。 530 Must issue a STARTTLS command first 。残念ながら、 UTL_SMTP.STARTTLS> Oracle Database 11gリリース2(11.2.0.2)以降でのみサポートされます。

    幸運にも最新バージョンのOracleを使用できる場合は、サーバーとの安全な接続を開くために、次のようなものを作成する必要があります。

    l_conn := UTL_SMTP.open_connection(l_conn, smtpHost,
        wallet_path => 'file:/oracle/wallets/smtp_wallet',
        wallet_password => 'password',
        secure_connection_before_smtp => FALSE);
    UTL_SMTP.starttls(l_conn);
    

    Oracleのドキュメントを引用するには:

    作成方法と作成方法については、対応するドキュメントを参照してください。ウォレットの管理

    その他の測定値:



    1. TNSPINGはOKですが、sqlplusはORA-12154を提供しますか?

    2. PL / SQL-where-clauseのオプション条件-動的SQLなし?

    3. コメントはストアドプロシージャのパフォーマンスを妨げる可能性がありますか?

    4. MysqlDBからJFreechartTimeSeriesCollectionにデータを入力しますか?