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:
- Dokumentation von Oracle zum Senden von E-Mails von PL/SQL
hat auch einige schöne Beispiele, die zeigen, wie Sie Ihre E-Mail-Nachricht mit
UTL_SMTP
richtig senden . - Siehe die Wikipedia-Seite zur SMTP-Authentifizierung für eine Transkription einer typischen SMTP-Sitzung.