Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Geben Sie Anmeldeinformationen an UTL_MAIL.SEND, um ORA-29278 zu umgehen

Grundsätzlich müssen Sie die "untere Ebene" UTL_SMTP Paket, um die verschiedenen SMTP-Nachrichten zu senden, die vom entfernten SMTP-Server benötigt werden.

Authentifizierung

Aus dem Blog von Stefano Ghio :

 -- 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);  

Das Hauptproblem hier ist, dass Sie in der Lage sein müssen, den AUTH zu senden Nachricht mit dem "richtigen" Authentifizierungsschema für Ihren Server. Für "smtp.live.com" kann ich das nicht sagen speziell, aber abhängig von der Konfiguration des Servers können sie unterschiedliche Authentifizierungsschemata sein, wie PLAIN und LOGIN , DIGEST_MD5 , ... Üblicherweise (immer ?) sind die Parameter (username , password ) sind base64-kodiert.

Mail senden

Aber die schlechte Nachricht Da Sie jetzt eine Low-Level-Bibliothek verwenden, müssen Sie den Client-Teil des SMTP-Protokoll dich selbst. Aus derselben Quelle wie oben (von mir selbst bearbeitet, um nur das absolut notwendige Minimum zu behalten ):

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 verwenden

Und nun zu den sehr schlechten Nachrichten :Einige Server erforderten eine sichere Verbindung . Etwas wie 530 Must issue a STARTTLS command first . Leider UTL_SMTP.STARTTLS wird erst ab Oracle Database 11g Release 2 (11.2.0.2) unterstützt.

Wenn Sie das Glück haben, eine neuere Version von Oracle zu verwenden, sollten Sie so etwas schreiben, um eine sichere Verbindung mit Ihrem Server herzustellen:

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);

Um die Dokumentation von Oracle zu zitieren:

Bitte lesen Sie die entsprechende Dokumentation, um zu sehen, wie man und erstellt Brieftasche verwalten

Noch ein paar Lesungen: