2017-07-17 12 views
1

電子メール設定が構成されており、Oracle Forms 11g経由で電子メールを送信できます。今私は送信された電子メール内の私のコンピュータのどこかに保存されたPDFを添付する必要があります。私は別の手順を経たが、PDFファイルを正常に送信できなかった。Oracle Forms 11gを使用した外部ファイルの電子メール

ありがとうございます。

EDIT:Oracleを使用している場合はPROCEDURE

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

を送信したメールのコードを追加するには、あなたが配信設定になっているはずですPDFを作成するための11グラムを報告します。同じレポートからPDFと電子メールを表示することができます。それ以外の場合は、コマンドラインからレポートと電子メールを呼び出すOracleフォームからバッチ・ファイルを起動することを検討してください。

0

UTL_SMTPは、ここでは、大きな添付ファイルを余裕がない仕事は、あなたの周りにある

下記の使用
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; 
/

テストをコンパイルしたJava上で使用するためにパッケージ本体を作成し、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 
/

を作成 ファイルを添付することができますコード

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 

このヘルプが必要です。

関連する問題