【问题标题】:HTML emails from oracle database来自 oracle 数据库的 HTML 电子邮件
【发布时间】:2016-03-07 12:12:48
【问题描述】:

在我的项目中,要求是从数据库 (Oracle) 发送 HTML 电子邮件(通知)。我正在使用 UTL_SMTP 实用程序。但是,通知模板需要存储在数据库列之一中,并且每个通知模板都有 HTML 文本和变量。

请在 UTL_SMTP 代码下方找到:

CREATE OR REPLACE FUNCTION Email_Temp(
p_to            IN NVARCHAR2,
p_subject       IN NVARCHAR2,
p_template_id   IN Form_Templates.template_id%type)
RETURN          NVARCHAR2
AS
Ret_String      NVARCHAR2(10);
p_from          NVARCHAR2 (2000) := 'This is fixed(Database server)';
p_smtp_host     NVARCHAR2 (2000) := 'Database';
p_smtp_port     NUMBER := 25;
p_html_msg      NVARCHAR2 (4000) := NULL; 
l_mail_conn     UTL_SMTP.connection;
l_boundary      NVARCHAR2 (50) := '----=*#abc1234321cba#*=';
BEGIN

l_mail_conn := UTL_SMTP.open_connection (p_smtp_host, p_smtp_port);
UTL_SMTP.helo (l_mail_conn, p_smtp_host);
UTL_SMTP.mail (l_mail_conn, p_from);
UTL_SMTP.rcpt (l_mail_conn, p_to);
UTL_SMTP.open_data (l_mail_conn);
UTL_SMTP.write_data (l_mail_conn, 'From: ' || p_from || UTL_TCP.crlf);
UTL_SMTP.write_data (l_mail_conn, 'Sent: ' || TO_CHAR (SYSDATE,'FMDay, FMMonthDD, YYYY HH12:MI:SS PM') || UTL_TCP.crlf);
UTL_SMTP.write_data (l_mail_conn, 'To: ' || p_to || UTL_TCP.crlf);
UTL_SMTP.write_data (l_mail_conn, 'Subject: ' || p_subject || UTL_TCP.crlf);
UTL_SMTP.write_data (l_mail_conn, 'Reply-To: ' || p_from || UTL_TCP.crlf);
UTL_SMTP.write_data (l_mail_conn, 'MIME-Version: 1.0' || UTL_TCP.crlf);
UTL_SMTP.write_data (l_mail_conn
                  , 'Content-Type: multipart/alternative; boundary="' || l_boundary || '"' || UTL_TCP.crlf
                    || UTL_TCP.crlf
                   );

IF p_html_msg IS NOT NULL
THEN
select html_string into p_html_msg from Form_Templates where template_id = p_template_id;
  UTL_SMTP.write_data (l_mail_conn, '--' || l_boundary || UTL_TCP.crlf);
  UTL_SMTP.write_data (l_mail_conn, 'Content-Type: text/html; charset="iso-8859-1"' || UTL_TCP.crlf || UTL_TCP.crlf);
  UTL_SMTP.write_data (l_mail_conn, p_html_msg);
  UTL_SMTP.write_data (l_mail_conn, UTL_TCP.crlf || UTL_TCP.crlf);
END IF;

UTL_SMTP.write_data (l_mail_conn, '--' || l_boundary || '--' || UTL_TCP.crlf);
UTL_SMTP.close_data (l_mail_conn);
UTL_SMTP.quit (l_mail_conn);
Ret_String := 'Sucess';
RETURN Ret_String;
END;
/

现在,将存储在数据库列中的每个模板(带有固定文本和变量)如下示例所示:

<html>
<body>
<h4 style="color:blue;">Assignee Notification</h4><br>
Hello Assignee,
<br><br>
You have been assigned a document.
<br><br>
<font size="3" color="blue"><b>Project Name:</b></font> variable
<br>
<font size="3" color="blue"><b>Document Nickname: </b></font> variable
<br><br>
</body>
</html>

我需要调用邮件函数的模板,但同时,模板应该包含固定的文本和带值的变量。

【问题讨论】:

    标签: html oracle email


    【解决方案1】:

    这是我编写的代码,可以满足您的需求。这不是最优雅的解决方案,并且在您需要替换多个字段的情况下不容易扩展。 它需要一个列出所有模板的电子邮件模板表和一个子区域设置表,其中包含您需要的多种语言的样板文本。这个想法的本质是设置你的模板,以便你需要替换的字符串用像'XXXXXXXX'或'YYYYYYYY'这样的文本字符串来指示。

       PROCEDURE Send_assignment_mail (to_user_in      IN NUMBER,
                                       by_user_in      IN NUMBER := NULL,
                                       case_id_in      IN NUMBER,
                                       case_type_in    IN NUMBER,
                                       mail_type_in    IN NUMBER := NULL,
                                       extra_text_in   IN VARCHAR2 := NULL)
       IS
          /******************************************************************************
          PURPOSE: sends an assignment email with link
          ******************************************************************************/
          v_user_email            VARCHAR2 (200);
          v_locale_id             NUMBER (10); --the language of the user
          v_byuser_name           VARCHAR2 (4000);
          v_subject               VARCHAR2 (200);
          v_body                  VARCHAR2 (4000);
          v_file_no               VARCHAR2 (40);
          v_weblink               VARCHAR2 (250);
          v_mail_type             NUMBER (10);
          --email type is for assignment emails in email_template table
          c_email_type   CONSTANT NUMBER (1) := 1;
          c_replace      CONSTANT VARCHAR2 (8) := 'XXXXXXXX';
       BEGIN
          --set a default template if none is provided
          IF mail_type_in IS NULL
          THEN
             v_mail_type := c_email_type;
          ELSE
             v_mail_type := mail_type_in;
          END IF;
    
          --get the language the user wishes to receive the email in
          SELECT cmu.email, cmu.locale_id
            INTO v_user_email, v_locale_id
            FROM app_user cmu
           WHERE cmu.ID = to_user_in;
    
          v_byuser_name := Get_by_user_name (by_user_in, v_locale_id);
    
    
          --get more information about the item you are notifying them about
          v_file_no := GET_FILE_NUM (case_id_in, case_type_in);
    
          SELECT emi.subject,
                    REPLACE (emi.text1, c_replace, v_file_no)
                 || UTL_TCP.CRLF
                 || UTL_TCP.CRLF
                 || REPLACE (emi.text2, c_replace, v_byuser_name)
                 || UTL_TCP.CRLF
                 || UTL_TCP.CRLF
                 || v_weblink
                 || UTL_TCP.CRLF
                 || UTL_TCP.CRLF
                 || extra_text_in
            INTO v_subject, v_body
            FROM EMAIL_TEMPLATE_LOCALE emi
           WHERE EMI.PK_ID = v_mail_type AND EMI.LOCALE_ID = v_locale_id;
    
          --call your generic mail procedure 
          MAIL_PKG.SEND (g_from,
                                  v_user_email,
                                  NULL,
                                  v_subject,
                                  v_body);
          --log that you sent the mail so if the user denies receiving it
          --you have something to show
          LOG_EMAIL (to_user_in,
                     v_mail_type,
                     v_subject,
                     case_id_in);
       END Send_assignment_mail;
    

    【讨论】:

    • 你的解决方案完全没用你不提供包MAIL_PKG的代码(或任何其他来源)。
    • @WernfriedDomscheit OP 没有询问如何发送电子邮件。他们在询问如何修改电子邮件中的模板。
    猜你喜欢
    • 2014-11-15
    • 1970-01-01
    • 2014-02-25
    • 1970-01-01
    • 2017-10-09
    • 2023-03-21
    • 2019-08-15
    • 2022-10-05
    • 1970-01-01
    相关资源
    最近更新 更多