Отправка электронной почты на основе имени поля UTL_MAIL.send - PullRequest
0 голосов
/ 26 октября 2018

Как я могу отправить электронное письмо на основе того, что введено в текстовое поле Apex.Например, если я введу me@test.com в: p6_supervisor, я бы хотел, чтобы электронное письмо было отправлено этому человеку.

В настоящее время у меня есть предустановка UTL_MAIL.send, которая работает.

begin  
UTL_MAIL.send(sender    => 'test@test.com',
                recipients => 'test1@test.com',               
                subject    => 'Test,               
                message    => 'Please Note this is a test' );

end;

Но, конечно, это для другой цели, которая заключается в отправке электронной почты одному получателю из триггера.

Ниже приведен пример курсора

create or replace function "email"

   ( name_in IN varchar2 )
   RETURN number
IS
   supervisoremail varchar2(30);

   CURSOR c1
   IS
     select 
supervisoremail
 from 
    EMPLOYEE,supervisors
 where TO_DATE(contract_start_period,'DD-MM-YYYY') < TO_DATE (SYSDATE,'DD-MM-YYYY') - 275
 and (supervisors.supervisorname = employee.supervisorname1
     or supervisors.supervisorname = employee.supervisorname2) 

 and employee_name ='test'
; 

BEGIN

   OPEN c1;
   FETCH c1 INTO supervisoremail;



   CLOSE c1;

RETURN supervisoremail;

END;

1 Ответ

0 голосов
/ 26 октября 2018

Это будет работать, нет проблем. Простой способ -

  • создать текстовый элемент (P6_SUPERVISOR)
  • создать кнопку для отправки страницы; вам нужно, чтобы значение P6_SUPERVISOR было установлено в состояние сеанса
  • создать процесс, который вызывает UTL_MAIL; Содержимое элемента P6_SUPERVISOR используется в качестве источника для параметра RECIPIENTS. Например:

    UTL_MAIL.send (sender       => 'test@test.com',
                   recipients   => :P6_SUPERVISOR,
                   subject      => 'Test message - subject',
                   MESSAGE      => 'Test message - message body');
    

[РЕДАКТИРОВАТЬ: как отправлять письма в цикле?]

Я не уверен, что вы имели в виду, создавая функцию; он возвращает только один адрес электронной почты, который, вероятно, принадлежит имени, переданному через параметр NAME_IN (но вы использовали имя 'test' в запросе курсора).

Однако вы указали, что функция возвращает NUMBER, а переменная, в которую вы выбираете результат, является VARCHAR2. Итак, какой из них является правдой?

Если вы настаиваете на функции, не заключайте ее имя в двойные кавычки, так как вам всегда придется ссылаться на нее таким образом (двойные кавычки, правильный верхний / нижний / смешанный регистр).

Кроме того, каков тип данных столбца contract_start_period? Если это DATE, не TO_DATE. То же самое касается SYSDATE - это функция, которая в любом случае возвращает тип данных DATE, поэтому неправильно , чтобы преобразовать его в дату еще раз.

Вот пример, в котором используется курсорный цикл FOR (поскольку его легче поддерживать), и он отправляет почту на все адреса супервизорной почты, возвращаемые этим оператором SELECT.

begin
  for cur_r in (select supervisoremail
                from employee e join supervisors s on s.supervisorname = e.supervisorname1
                                                   or s.supervisorname = e.supervisorname2
                where contract_start_period < sysdate - 275
                  and e.employee_name = 'test'
               )
  loop
    utl_mail.send(sender     => 'test@test.com',
                  recipients => cur_r.supervisoremail,
                  subject    => 'Test message - subject',
                  message    => 'Test message - message body');
  end loop;
end;
...