【问题标题】:Sending email based on field name UTL_MAIL.send根据字段名 UTL_MAIL.send 发送电子邮件
【发布时间】:2018-10-26 18:57:28
【问题描述】:

如何根据在顶点文本字段中输入的内容发送电子邮件。例如,如果我在 :p6_supervisor 中输入 me@test.com,我希望将电子邮件发送给那个人。

目前我有一个预设的 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;

【问题讨论】:

  • 您有什么理由使用 UTL_MAIL 而不是 APEX_MAIL,它有一些更好的功能(包括异步电子邮件和自动速率限制)?
  • 嗨@JeffreyKemp 没有特别的理由使用 utl_mail ,如果 apex_mail 更有效,我对你的知识持开放态度,因为我对 apex_mail 一无所知
  • 我已经总结了不同的选项,对于 APEX,我建议将 apex_mail 用于简单的电子邮件,因为它提供交易安全和速率限制:jeffkemponoracle.com/2016/04/email-made-easier

标签: oracle oracle11g oracle-apex oracle-apex-5.1


【解决方案1】:

它会工作,没问题。一个简单的方法是

  • 创建一个文本项 (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 参数传递的名称(但您在游标查询中使用了“测试”名称)。

但是,您指定该函数返回一个 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;

【讨论】:

  • nice ......但除此之外,我可以将其发送给电子邮件已经在表格中的主管。例如 supervisor.email (table.columnname)
  • 为什么不呢?将 P6_SUPERVISOR 项目的类型设置为“选择列表”。它的值列表查询应该从包含电子邮件地址的表中选择值。
  • 我完全理解你在说什么。但我的下一点是,假设我忘记了文本字段 (:p6_supervisor),我只想将电子邮件发送到主管表 (supervisor.email (table.columnname) ) 中的预设电子邮件。我也可以在收件人中添加它吗?
  • 到表中的所有电子邮件?也没有问题 - 这将是一个简单的光标 FOR 循环,用于选择收件人并向每个收件人发送邮件。
  • 感谢您的帮助将尝试它..但并非所有人都只是选择何时激活 where 子句,但我理解您的观点。
猜你喜欢
  • 2012-01-30
  • 1970-01-01
  • 2021-01-11
  • 2019-10-11
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多