Envio de e-mail via banco com anexo

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
leandro_savenhago
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 6
Registrado em: Seg, 28 Nov 2005 5:22 pm
Localização: Ribeirão Preto/SP

Bom dia Amigos!

Alguém sabe como enviar um e-mail via banco, com um arquivo em anexo?

Obrigado!
ruevers
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 324
Registrado em: Sex, 02 Jun 2006 1:48 pm
Localização: sp
Contato:

Criança, segue um exemplo...

Selecionar tudo

ALTER SESSION SET smtp_out_server = '127.0.0.1';
BEGIN
  UTL_MAIL.send(sender => 'me@address.com',
            recipients => 'you@address.com',
               subject => 'Test Mail',
               message => 'Hello World',
             mime_type => 'text; charset=us-ascii');
END;
/
Send mail with UTL_SMTP
Send mail without attachements using the UTL_SMTP package:

Selecionar tudo

DECLARE
  v_From      VARCHAR2(80) := 'oracle@mycompany.com';
  v_Recipient VARCHAR2(80) := 'test@mycompany.com';
  v_Subject   VARCHAR2(80) := 'test subject';
  v_Mail_Host VARCHAR2(30) := 'mail.mycompany.com';
  v_Mail_Conn utl_smtp.Connection;
  crlf        VARCHAR2(2)  := chr(13)||chr(10);
BEGIN
 v_Mail_Conn := utl_smtp.Open_Connection(v_Mail_Host, 25);
 utl_smtp.Helo(v_Mail_Conn, v_Mail_Host);
 utl_smtp.Mail(v_Mail_Conn, v_From);
 utl_smtp.Rcpt(v_Mail_Conn, v_Recipient);
 utl_smtp.Data(v_Mail_Conn,
   'Date: '   || to_char(sysdate, 'Dy, DD Mon YYYY hh24:mi:ss') || crlf ||
   'From: '   || v_From || crlf ||
   'Subject: '|| v_Subject || crlf ||
   'To: '     || v_Recipient || crlf ||
   crlf ||
   'some message text'|| crlf ||   -- Message body
   'more message text'|| crlf
 );
 utl_smtp.Quit(v_mail_conn);
EXCEPTION
 WHEN utl_smtp.Transient_Error OR utl_smtp.Permanent_Error then
   raise_application_error(-20000, 'Unable to send mail: '||sqlerrm);
END;
/
Send mail with UTL_SMTP - with attachments
Send mail with attachements using the UTL_SMTP package:

Selecionar tudo

DECLARE
   v_From       VARCHAR2(80) := 'oracle@mycompany.com';
   v_Recipient  VARCHAR2(80) := 'test@mycompany.com';
   v_Subject    VARCHAR2(80) := 'test subject';
   v_Mail_Host  VARCHAR2(30) := 'mail.mycompany.com';
   v_Mail_Conn  utl_smtp.Connection;
   crlf         VARCHAR2(2)  := chr(13)||chr(10);
BEGIN
  v_Mail_Conn := utl_smtp.Open_Connection(v_Mail_Host, 25);

  utl_smtp.Helo(v_Mail_Conn, v_Mail_Host);

  utl_smtp.Mail(v_Mail_Conn, v_From);

  utl_smtp.Rcpt(v_Mail_Conn, v_Recipient);

  utl_smtp.Data(v_Mail_Conn,
    'Date: '   || to_char(sysdate, 'Dy, DD Mon YYYY hh24:mi:ss') || crlf ||
    'From: '   || v_From || crlf ||
    'Subject: '|| v_Subject || crlf ||
    'To: '     || v_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 ||
    'some message text'|| crlf ||   -- Message body
    'more message text'|| crlf ||
    crlf ||

    '-------SECBOUND'|| crlf ||
    'Content-Type: text/plain;'|| crlf ||
    ' name="excel.csv"'|| crlf ||
    'Content-Transfer_Encoding: 8bit'|| crlf ||
    'Content-Disposition: attachment;'|| crlf ||
    ' filename="excel.csv"'|| crlf ||
    crlf ||
    'CSV,file,attachement'|| crlf ||   -- Content of attachment
    crlf ||

    '-------SECBOUND--'         -- End MIME mail
  );

  utl_smtp.Quit(v_mail_conn);
EXCEPTION
  WHEN utl_smtp.Transient_Error OR utl_smtp.Permanent_Error then
    raise_application_error(-20000, 'Unable to send mail: '||sqlerrm);
END;
/
Julian Campagnoli
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 82
Registrado em: Ter, 26 Fev 2008 11:33 am
Localização: MG e SP

Leandro, beleza ????

Um exemplo:

Selecionar tudo

CREATE OR REPLACE PROCEDURE send_email AS
   BEGIN  
     UTL_MAIL.SEND(sender => 'xxx@oracle.com', recipients => 'xxx@oracle.com', cc => 'xxx@oracle.com', bcc => 'xxx@oracle.com', subject => 'Testmail', message => 'Hello');
  
   EXCEPTION
   WHEN OTHERS THEN
    --  dbms_output.put_line('Fehler');
     raise_application_error(-20001,'The following error has occured: ' || sqlerrm);   
   END;
De uma pesquisada na package UTL-MAIL, acho que tera mais informações sobre o que você procura.

Abraço
______________
Julian
leandro_savenhago
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 6
Registrado em: Seg, 28 Nov 2005 5:22 pm
Localização: Ribeirão Preto/SP

Agradeço amigos pela dia, mas já utilizo utl_smtp para enviar só texto e com certeza é coisa de criança...
Mas o que estou fazendo é envio de "arquivo em anexo" no e-mail e consegui um bom exemplo em JSP (Java Stored Procedure)...

Selecionar tudo

1 – Carregando e lendo a API JavaMail 

Primeiramente, deve-se realizar o download a partir do site http://java.sun.com/products/javamail/index.html. Lá, encontram-se a API JAVAMAIL versão 1.3.2 e o JavaBeansTM Activation Framework extension ou JAF que é utilizado em conjunto com a API JAVAMAIL. Extraia o conteúdo dos arquivos *.ZIP para dentro da pasta C:\Temp, por exemplo, na qual você irá utilizar somente dois arquivos, o mail.jar e o activation.jar. No prompt do DOS digite : 

loadjava -u sys/manager@o9i -o -r -v -f -noverify -synonym -g public mail.jar loadjava -u sys/manager@o9i -o -r -v -f -noverify -synonym -g public activation.jar 

Onde :

-u sys/manager : Id e senha para sua conta SYS 
-o : Para utilização do driver oci8 
-r : Verificação e validação das classes JAVA 
-v : Lista passo a passo do processo de carregamento das classes JAVA 
-f : Recria o processo caso ocorra algum erro 
-noverify : Verifica os bytecodes do processo -synonym : Cria sinônimos públicos -g public : Previlégios GRANT para as classes JAVA 

Dentro do SQL PLUS digite : 

Usuário SCOTT/TIGER

call sys.dbms_java.loadjava('-v -r -grant PUBLIC -synonym activation.jar') call sys.dbms_java.loadjava('-v -r -grant PUBLIC -synonym mail.jar') 

Usuário SYS/MANAGER

exec dbms_java.grant_permission('SCOTT','java.util.PropertyPermission','*','read,write'); exec dbms_java.grant_permission('SCOTT','java.net.SocketPermission','*','connect, resolve');
exec dbms_java.grant_permission('SCOTT','java.io.FilePermission','C:\*','read,write');

2 – Criando a JSP (Java Stored Procedure)
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 comma-separated
     // 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();
        //Inserção do endereço SMTP
        props.put("smtp.são.terra.com.br", 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
/
3 – Criando o cabeçalho da Package PL/SQL
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;
/

3.2 – Criando o corpo da Package PL/SQL

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 NUMBERIS
      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;
/

4 – Checando o funcionamento do E-mail (SQL PLUS)
var ErrorMessage VARCHAR2(4000);
var ErrorStatus NUMBER;
-- Aciona a saída no SQL*PLUS
SET SERVEROUTPUT ON
-- Redireciona a saída java dentro do buffer SQL*PLUS
exec dbms_java.set_output(5000);
BEGIN
   :ErrorStatus := SendMailJPkg.SendMail(
                SMTPServerName => 'localhost',
                Sender    => 'leandro@terra.com.br',
                Recipient => 'leandroeschiavi@terra.com.br',
                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:\ppc0010r.pdf'                                                               ,'C:\teste.txt'
                                                           )
                                        );
END;
/print
ruevers
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 324
Registrado em: Sex, 02 Jun 2006 1:48 pm
Localização: sp
Contato:

Sempre chamo todo mundo de criança...é mania, não tive a intenção de dizer o que pensou....
no exemplo que mandei, também tem lá embaixo como mandar arquivo.
leandro_savenhago
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 6
Registrado em: Seg, 28 Nov 2005 5:22 pm
Localização: Ribeirão Preto/SP

Amigo,


Teste o bloco que você passou, com arquivos TXT ele funciona bem, mas com PDF não fica legal...


Obrigado
leandro_savenhago
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 6
Registrado em: Seg, 28 Nov 2005 5:22 pm
Localização: Ribeirão Preto/SP

No caso Anderson, estou primeiro salvando os arquivos no diretório de banco criado...

Mas parece que ele que cria o arquivo em anexo, e não busca no diretório...

Obrigado
frvitor
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Qua, 26 Nov 2008 10:01 am
Localização: Bragança Paulista - SP
Vitor.

Leandro, estava com esse mesmo problema e encontrei uma Java Stored Procedure que resolveu meu problema. Como o arquivo está gerado no disco do SO, eu fiz um procedimento para carregar esse arquivo para um BLOB e depois chamei esse java, estou te mandando esses dois códigos.

Selecionar tudo

-- CÓDIGO JAVA QUE ENVIA O EMAIL COM ANEXO.

create or replace and compile java source named mail as
import java.io.*;
import java.sql.*;
import java.util.Properties;
import java.util.Date;
import javax.activation.*;
import javax.mail.*;
import javax.mail.internet.*;
import oracle.jdbc.driver.*;
import oracle.sql.*;

public class mail {
    static String dftMime = "application/octet-stream";
    static String dftName = "filename.dat";

    public static oracle.sql.NUMBER send(String from,
                                         String to,
                                         String cc,
                                         String bcc,
                                         String subject,
                                         String body,
                                         String SMTPHost,
                                         oracle.sql.BLOB attachmentData,
                                         String attachmentType,
                                         String attachmentFileName) {
        int rc = 0;
        try {
            Properties props = System.getProperties();
            props.put("mail.smtp.host", SMTPHost);
            Message msg = new MimeMessage(Session.getDefaultInstance(props, null));
            msg.setFrom(new InternetAddress(from));

            if (to != null && to.length() > 0)
                msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to, false));

            if (cc != null && cc.length() > 0)
                msg.setRecipients(Message.RecipientType.CC, InternetAddress.parse(cc, false));

            if (bcc != null && bcc.length() > 0)
                msg.setRecipients(Message.RecipientType.BCC, InternetAddress.parse(bcc, false));

            if ( subject != null && subject.length() > 0 )
                msg.setSubject(subject);
            else
                msg.setSubject("(no subject)");

            msg.setSentDate(new Date());

            if (attachmentData != null) {
                MimeBodyPart mbp1 = new MimeBodyPart();
                mbp1.setText((body != null ? body : ""));
                mbp1.setDisposition(Part.INLINE);
                MimeBodyPart mbp2 = new MimeBodyPart();
                String type = (attachmentType != null ? attachmentType : dftMime);
                String fileName = (attachmentFileName != null ? attachmentFileName : dftName);
                mbp2.setDisposition(Part.ATTACHMENT);
                mbp2.setFileName(fileName);
                mbp2.setDataHandler(new DataHandler(new BLOBDataSource(attachmentData, type)));
                MimeMultipart mp = new MimeMultipart();
                mp.addBodyPart(mbp1);
                mp.addBodyPart(mbp2);
                msg.setContent(mp);
            } else {
                msg.setText((body != null ? body : ""));
            }
            Transport.send(msg);
            rc = 1;
        } catch (Exception e) {
            e.printStackTrace();
            rc = 0;
        } finally {
            return new oracle.sql.NUMBER(rc);
        }
    }
    
    static class BLOBDataSource implements DataSource {
        private BLOB   data;
        private String type;

        BLOBDataSource(BLOB data, String type) {
            this.type = type;
            this.data = data;
        }

        public InputStream getInputStream() throws IOException {
            try {
                if(data == null)
                    throw new IOException("No data.");

                return data.getBinaryStream();
            } catch(SQLException e) {
                throw new IOException("Cannot get binary input stream from BLOB.");
            }
        }

        public OutputStream getOutputStream() throws IOException {
            throw new IOException("Cannot do this.");
        }

        public String getContentType() {
            return type;
        }

        public String getName() {
            return "BLOBDataSource";
        }
    }
}

-- FUNÇÃO QUE CHAMA O CÓDIGO JAVA.

create or replace function send (p_from                  in varchar2,
                                 p_to                    in varchar2,
                                 p_cc                    in varchar2,
                                 p_bcc                   in varchar2,
                                 p_subject               in varchar2,
                                 p_body                  in varchar2,
                                 p_smtp_host             in varchar2,
                                 p_attachment_data       in blob,
                                 p_attachment_type       in varchar2,
                                 p_attachment_file_name  in varchar2) return number is
    language java name 'mail.send( java.lang.String,
                                 java.lang.String,
                                 java.lang.String,
                                 java.lang.String,
                                 java.lang.String,
                                 java.lang.String,
                                 java.lang.String,
                                 oracle.sql.BLOB,
                                 java.lang.String,
                                 java.lang.String
                               ) return oracle.sql.NUMBER';

-- FUNÇÃO QUE CARREGA O ARQUIVO DO DISCO PARA UM BLOB E 
-- CHAMA A PROCEDURE JAVA.

  FUNCTION FU_ENVIAR_EMAIL(P_TO      IN VARCHAR2,
                           P_ASSUNTO IN VARCHAR2,
                           P_TEXTO   IN VARCHAR2,
                           P_PEDIDO  IN NUMBER,
                           P_MSG    OUT VARCHAR2,
                           P_CC      IN VARCHAR2,
                           P_BCC     IN VARCHAR2) RETURN BOOLEAN IS
      V_BFILE    BFILE := NULL;
      V_BLOB     BLOB;
      SRC_OFFSET NUMBER := 1;
      DST_OFFSET NUMBER := 1;
      RET_CODE   NUMBER;
      V_RET      VARCHAR2(2000);
      V_URL      VARCHAR2(2000) := NULL;
      V_DIR      VARCHAR2(1000);
      --
  BEGIN
      -- Carrega o arquivo gerado pela URL em uma variável do tipo BLOB.
      V_BFILE := BFILENAME('LOCATION_ARQUIVO_UNIX', P_PEDIDO || '.pdf');
      DBMS_LOB.FILEOPEN(V_BFILE, DBMS_LOB.FILE_READONLY);
      DBMS_LOB.CREATETEMPORARY(V_BLOB, TRUE);
      DBMS_LOB.LOADBLOBFROMFILE(V_BLOB, V_BFILE, DBMS_LOB.LOBMAXSIZE, DST_OFFSET, SRC_OFFSET);
      DBMS_LOB.FILECLOSE(V_BFILE);
      --
      -- Chama a função responsável por enviar o e-mail.
      RET_CODE := SEND(P_FROM                 => 'teste@teste.com.br',
                       P_TO                   => P_TO,
                       P_CC                   => P_CC,
                       P_BCC                  => P_BCC,
                       P_SUBJECT              => P_ASSUNTO,
                       P_BODY                 => P_TEXTO || CHR(13) || CHR(13),
                       P_SMTP_HOST            => smtp_host,
                       P_ATTACHMENT_DATA      => V_BLOB,
                       P_ATTACHMENT_TYPE      => 'text/plain', --'application/winzip',
                       P_ATTACHMENT_FILE_NAME => 'pedido_' || V_COD_PEDIDO || '.pdf');
      --
      -- Valida o retorno da função.
      IF RET_CODE = 1 THEN
          RETURN TRUE;
      ELSE
          P_MSG := 'Erro desconhecido ao enviar e-mail.';
          RETURN FALSE;
      END IF;
      --
  EXCEPTION
      WHEN OTHERS THEN
          P_MSG := 'Erro ao enviar e-mail. Erro: ' || SQLERRM;
          RETURN FALSE;
  END;
Para mim funcionou perfeitamento, qualquer coisa, estamos ai.
e_muniz
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 19
Registrado em: Qua, 01 Jul 2009 10:35 am
Localização: Belo Horizonte / MG

Anderson, no seu código (abaixo) você, menciona o arquivo "excel.csv", fiz o teste e seu procedimento funcionou, entretanto o anexo foi gerado apenas com as seguintes informações "CSV,file,attachement", com esse procedimento eu realmente consigo anexar um arquivo no disco do SO ?

Se sim, como devo proceder para idêntificar a localização do arquivo, tentei colocar o path absoluto = "C:\excel.csv" e não deu certo..
At. Ernandes Muniz

Selecionar tudo

'-------SECBOUND'|| crlf || 
    'Content-Type: text/plain;'|| crlf || 
    ' name="excel.csv"'|| crlf || 
    'Content-Transfer_Encoding: 8bit'|| crlf || 
    'Content-Disposition: attachment;'|| crlf || 
    ' filename="excel.csv"'|| crlf || 
    crlf || 
    'CSV,file,attachement'|| crlf ||   -- Content of attachment 
    crlf
marlonpasquali
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 248
Registrado em: Sex, 06 Fev 2009 3:02 pm
Localização: ERECHIM - RS

Galera,
como faço para chamar a funçao FU_ENVIAR_EMAIL

podem me dar um exemplo da chamada com os parametros. Tentei fazer aqui mas da erro dizendo "expressao é do tipo incorreto"

obrigado,
Marlon
marlonpasquali
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 248
Registrado em: Sex, 06 Fev 2009 3:02 pm
Localização: ERECHIM - RS

Mais uma pergunta por favor.

O que é que vai nesta variavel

Selecionar tudo

   P_SMTP_HOST            => smtp_host, 
pois quando vou criar a function diz que variavel não definida
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 16 visitantes