Отправка электронной почты из oracle apex UTL_SMTP с учетными данными сервера smtp

Есть ли способ отправить электронную почту, используя метод UTL_SMTP, предоставив учетные данные SMTP-сервера, который не является localhost.

т.е. служба SMTP работает где-то еще, но не защищена https, я хочу использовать пакет utl_smtp, но я не вижу ни одного параметра функции, который принимает идентификатор или пароль сервера smtp в нем

1 ответ

Если вы хотите использовать UTL_SMTP, вы предоставляете хост SMTP при вызове utl_smtp.open_connection,

Пример кода (взят из документации Oracle);

DECLARE
  c UTL_SMTP.CONNECTION;

  PROCEDURE send_header(name IN VARCHAR2, header IN VARCHAR2) AS
  BEGIN
    UTL_SMTP.WRITE_DATA(c, name || ': ' || header || UTL_TCP.CRLF);
  END;

BEGIN
  c := UTL_SMTP.OPEN_CONNECTION('smtp-server.acme.com');
  UTL_SMTP.HELO(c, 'foo.com');
  UTL_SMTP.MAIL(c, 'sender@foo.com');
  UTL_SMTP.RCPT(c, 'recipient@foo.com');
  UTL_SMTP.OPEN_DATA(c);
  send_header('From',    '"Sender" <sender@foo.com>');
  send_header('To',      '"Recipient" <recipient@foo.com>');
  send_header('Subject', 'Hello');
  UTL_SMTP.WRITE_DATA(c, UTL_TCP.CRLF || 'Hello, world!');
  UTL_SMTP.CLOSE_DATA(c);
  UTL_SMTP.QUIT(c);
EXCEPTION
  WHEN utl_smtp.transient_error OR utl_smtp.permanent_error THEN
    BEGIN
      UTL_SMTP.QUIT(c);
    EXCEPTION
      WHEN UTL_SMTP.TRANSIENT_ERROR OR UTL_SMTP.PERMANENT_ERROR THEN
        NULL; -- When the SMTP server is down or unavailable, we don't have
              -- a connection to the server. The QUIT call raises an
              -- exception that we can ignore.
    END;
    raise_application_error(-20000,
      'Failed to send mail due to the following error: ' || sqlerrm);
END;

Если ваш SMTP-сервер принимает аутентификацию PLAIN, LOGIN или CRAM-MD5, вам нужно позвонить utl_smtp.auth а также, например:

DECLARE
  c utl_smtp.connection;
BEGIN
  c := utl_smtp.open_connection(
      host => 'smtp.example.com',
      port => 25,
      wallet_path => 'file:/oracle/wallets/smtp_wallet',
      wallet_password => 'password',
      secure_connection_before_smtp => FALSE);
  UTL_SMTP.STARTTLS(c);
  UTL_SMTP.AUTH(
      c => c,
      username => 'scott',
      password => 'password'
      schemes  => utl_smtp.all_schemes);
END;

Тем не менее, если вы используете APEX, вы можете рассмотреть возможность использования APEX_MAIL. Вы настраиваете хост в настройках экземпляра APEX.

Документация:

Другие вопросы по тегам