2017-07-17 84 views
1

我配置了電子郵件設置,並且可以通過Oracle Forms 11g發送電子郵件。現在我有要求在發送的電子郵件中將PDF保存在計算機中的某處。我經歷了不同的程序,但我無法成功發送PDF文件。使用Oracle Forms 11g電子郵件外部文件

謝謝。

編輯:添加郵件代碼發送步驟

create or replace procedure send4 (p_sender IN VARCHAR2, p_recipient IN VARCHAR2, p_subject IN VARCHAR2, p_message IN VARCHAR2) 
IS 
crlf   VARCHAR2(2) := chr(13)||chr(10); 
l_mailhost VARCHAR2(255) := <IP ADDRESS>; 
v_connection    UTL_SMTP.connection; 

BEGIN 
V_CONNECTION := utl_smtp.open_connection(l_mailhost, 25); 
utl_smtp.Helo(V_CONNECTION, l_mailhost); 
utl_smtp.Mail(V_CONNECTION, p_sender); 
utl_smtp.Rcpt(V_CONNECTION, p_recipient); 
utl_smtp.Data(V_CONNECTION, 
'Date: ' || to_char(sysdate, 'Dy, DD Mon YYYY hh24:mi:ss') || crlf || 
'From: ' || p_sender || crlf || 
'Subject: '|| p_subject || crlf || 
'To: '  || p_recipient || crlf || 
'MIME-Version: 1.0'|| crlf || -- Use MIME mail standard 
'Content-Type: multipart/mixed;'|| crlf || 
' boundary="-----SECBOUND"'|| crlf || 
crlf || 
'-------SECBOUND'|| crlf || 
'Content-Type: text/plain;'|| crlf || 
'Content-Transfer_Encoding: 7bit'|| crlf || 
crlf || 
p_message|| crlf || 
crlf || 
'-------SECBOUND'|| crlf || 
'Content-Type: text/plain;'|| crlf || 
' name="file.txt"'|| crlf || 
'Content-Transfer_Encoding: 8bit'|| crlf || 
'Content-Disposition: attachment;'|| crlf || 
' filename="attachment.txt"'|| crlf || 
crlf || 
p_message|| crlf || -- Content of attachment 
crlf || 
'-------SECBOUND--'   -- End MIME mail 
); 
UTL_SMTP.quit(v_connection); 
EXCEPTION 
WHEN utl_smtp.Transient_Error OR utl_smtp.Permanent_Error then 
raise_application_error(-20000, 'Unable to send mail', TRUE); 
END; 
+0

哪臺電腦? Forms運行的中間層服務器?或者用戶的計算機,本地客戶端? – APC

+0

好的情況是,當報告生成PDF格式,然後保存(它也應該通過電子郵件發送),所以我猜它需要在服務器端完成,對嗎?報告包含圖形和一切。 – Shahzaib

+0

你應該提供更多關於你用來發送郵件的信息嗎? – nightfox79

回答

0

如果您正在使用Oracle報告11克創建你應該考慮的分配設置的PDF。您可以顯示PDF以及同一報告中的電子郵件。否則,請考慮從Oracle Form中啓動一個批處理文件,從命令行調用報告和電子郵件。

0

UTL_SMTP買不起大的附件,這裏是工作,你可以左右附加文件 創建Java源

CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "SendMail" AS 
    import java.util.*; 
    import java.io.*; 
    import javax.mail.*; 
    import javax.mail.internet.*; 
    import javax.activation.*; 
    public class SendMail { 
    // Sender, Recipient, CCRecipient, and BccRecipient are 
    // commaseparated lists of addresses. 
    // Body can span multiple CR/LF-separated lines. 
    // Attachments is a ///-separated list of file names. 
    public static int Send(String SMTPServer, 
          String Sender, 
          String Recipient, 
          String CcRecipient, 
          String BccRecipient, 
          String Subject, 
          String Body, 
          String ErrorMessage[], 
          String Attachments) { 
     // Error status 
     int ErrorStatus = 0; 

     // Create some properties and get the default Session 
     Properties props = System.getProperties(); 
     props.put("mail.akadia.com", SMTPServer); 
     Session session = Session.getDefaultInstance(props, null); 

     try { 
      // Create a message 
      MimeMessage msg = new MimeMessage(session); 

      // extracts the senders and adds them to the message 
      // Sender is a comma-separated list of e-mail addresses as per RFC822 
      { 
       InternetAddress[] TheAddresses = InternetAddress.parse(Sender); 
       msg.addFrom(TheAddresses); 
      } 

      // Extract the recipients and assign them to the message. 
      // Recipient is a comma-separated list of e-mail addresses as per RFC822. 
      { 
       InternetAddress[] TheAddresses = InternetAddress.parse(Recipient); 
       msg.addRecipients(Message.RecipientType.TO,TheAddresses); 
      } 

      // Extract the Cc-recipients and assign them to the message. 
      // CcRecipient is a comma-separated list of e-mail addresses as per RFC822. 
      if (null != CcRecipient) { 
       InternetAddress[] TheAddresses = InternetAddress.parse(CcRecipient); 
       msg.addRecipients(Message.RecipientType.CC,TheAddresses); 
      } 

      // Extract the Bcc-recipients and assign them to the message. 
      // BccRecipient is a comma-separated list of e-mail addresses as per RFC822. 
      if (null != BccRecipient) { 
       InternetAddress[] TheAddresses = InternetAddress.parse(BccRecipient); 
       msg.addRecipients(Message.RecipientType.BCC,TheAddresses); 
      } 

      // Subject field 
      msg.setSubject(Subject); 

      // Create the Multipart to be added the parts to 
      Multipart mp = new MimeMultipart(); 

      // Create and fill the first message part 
      { 
       MimeBodyPart mbp = new MimeBodyPart(); 
       mbp.setText(Body); 

       // Attach the part to the multipart 
       mp.addBodyPart(mbp); 
      } 

      // Attach the files to the message 
      if (null != Attachments) { 
       int StartIndex = 0, PosIndex = 0; 
       while (-1 != (PosIndex = Attachments.indexOf("///",StartIndex))) { 
       // Create and fill other message parts; 
       MimeBodyPart mbp = new MimeBodyPart(); 
       FileDataSource fds = 
       new FileDataSource(Attachments.substring(StartIndex,PosIndex)); 
       mbp.setDataHandler(new DataHandler(fds)); 
       mbp.setFileName(fds.getName()); 
       mp.addBodyPart(mbp); 
       PosIndex += 3; 
       StartIndex = PosIndex; 
       } 
       // Last, or only, attachment file 
       if (StartIndex < Attachments.length()) { 
       MimeBodyPart mbp = new MimeBodyPart(); 
       FileDataSource fds = new FileDataSource(Attachments.substring(StartIndex)); 
       mbp.setDataHandler(new DataHandler(fds)); 
       mbp.setFileName(fds.getName()); 
       mp.addBodyPart(mbp); 
       } 
      } 

      // Add the Multipart to the message 
      msg.setContent(mp); 

      // set the Date: header 
      msg.setSentDate(new Date()); 

      // Send the message 
      Transport.send(msg); 
     } catch (MessagingException MsgException) { 
      ErrorMessage[0] = MsgException.toString(); 
      Exception TheException = null; 
      if ((TheException = MsgException.getNextException()) != null) 
      ErrorMessage[0] = ErrorMessage[0] + "\n" + TheException.toString(); 
      ErrorStatus = 1; 
     } 
     return ErrorStatus; 
    } // End Send Class 
    } // End of public class SendMail 
/

創建包體使用上面用下面的java編譯

CREATE OR REPLACE PACKAGE SendMailJPkg AS 
    -- EOL is used to separate text line in the message body 
    EOL CONSTANT STRING(2) := CHR(13) || CHR(10); 

    TYPE ATTACHMENTS_LIST IS TABLE OF VARCHAR2(4000); 

    -- High-level interface with collections 
    FUNCTION SendMail(SMTPServerName IN STRING, 
        Sender IN STRING, 
        Recipient IN STRING, 
        CcRecipient IN STRING DEFAULT '', 
        BccRecipient IN STRING DEFAULT '', 
        Subject IN STRING DEFAULT '', 
        Body IN STRING DEFAULT '', 
        ErrorMessage OUT STRING, 
        Attachments IN ATTACHMENTS_LIST DEFAULT NULL) RETURN NUMBER; 
END SendMailJPkg; 
/
CREATE OR REPLACE PACKAGE BODY SendMailJPkg AS 
    PROCEDURE ParseAttachment(Attachments IN ATTACHMENTS_LIST, 
          AttachmentList OUT VARCHAR2) IS 
    AttachmentSeparator CONSTANT VARCHAR2(12) := '///'; 
    BEGIN 
     -- Boolean short-circuit is used here 
     IF Attachments IS NOT NULL AND Attachments.COUNT > 0 THEN 
     AttachmentList := Attachments(Attachments.FIRST); 
     -- Scan the collection, skip first element since it has been 
     -- already processed; 
     -- accommodate for sparse collections; 
     FOR I IN Attachments.NEXT(Attachments.FIRST) .. Attachments.LAST LOOP 
      AttachmentList := AttachmentList || AttachmentSeparator || Attachments(I); 
     END LOOP; 
     ELSE 
     AttachmentList := ''; 
     END IF; 
    END ParseAttachment; 

    -- Forward declaration 
    FUNCTION JSendMail(SMTPServerName IN STRING, 
         Sender IN STRING, 
         Recipient IN STRING, 
         CcRecipient IN STRING, 
         BccRecipient IN STRING, 
         Subject IN STRING, 
         Body IN STRING, 
         ErrorMessage OUT STRING, 
         Attachments IN STRING) RETURN NUMBER; 

    -- High-level interface with collections 
    FUNCTION SendMail(SMTPServerName IN STRING, 
        Sender IN STRING, 
        Recipient IN STRING, 
        CcRecipient IN STRING, 
        BccRecipient IN STRING, 
        Subject IN STRING, 
        Body IN STRING, 
        ErrorMessage OUT STRING, 
        Attachments IN ATTACHMENTS_LIST) RETURN NUMBER IS 
     AttachmentList VARCHAR2(4000) := ''; 
     AttachmentTypeList VARCHAR2(2000) := ''; 
    BEGIN 
     ParseAttachment(Attachments,AttachmentList); 
     RETURN JSendMail(SMTPServerName, 
         Sender, 
         Recipient, 
         CcRecipient, 
         BccRecipient, 
         Subject, 
         Body, 
         ErrorMessage, 
         AttachmentList); 
    END SendMail; 

    -- JSendMail's body is the java function SendMail.Send() 
    -- thus, no PL/SQL implementation is needed 
    FUNCTION JSendMail(SMTPServerName IN STRING, 
         Sender IN STRING, 
         Recipient IN STRING, 
         CcRecipient IN STRING, 
         BccRecipient IN STRING, 
         Subject IN STRING, 
         Body IN STRING, 
         ErrorMessage OUT STRING, 
         Attachments IN STRING) RETURN NUMBER IS 
    LANGUAGE JAVA 
    NAME 'SendMail.Send(java.lang.String, 
         java.lang.String, 
         java.lang.String, 
         java.lang.String, 
         java.lang.String, 
         java.lang.String, 
         java.lang.String, 
         java.lang.String[], 
         java.lang.String) return int'; 
END SendMailJPkg; 
/

測試代碼

var ErrorMessage VARCHAR2(4000); 
var ErrorStatus NUMBER; 

-- enable SQL*PLUS output; 
SET SERVEROUTPUT ON 
-- redirect java output into SQL*PLUS buffer; 
exec dbms_java.set_output(5000); 
BEGIN 
    :ErrorStatus := SendMailJPkg.SendMail(
       SMTPServerName => 'localhost', 
       Sender => '[email protected]', 
       Recipient => '[email protected]', 
       CcRecipient => '', 
       BccRecipient => '', 
       Subject => 'This is the subject line: Test JavaMail', 
       Body => 'This is the body: Hello, this is a test' || 
         SendMailJPkg.EOL || 'that spans 2 lines', 
       ErrorMessage => :ErrorMessage, 
       Attachments => SendMailJPkg.ATTACHMENTS_LIST(
            'C:\Users\Zahn\Work\sendmail.sql', 
            'C:\Users\Zahn\Work\ferien-2002.txt' 
           ) 
    ); 
END; 
/
print 

希望得到這個幫助!

相關問題