Précédent   Forum des professionnels en informatique > Bases de données > Oracle > Outils > Forms
Forms Forum d'entraide sur Oracle Forms
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/05/2007, 17h02   #1
Membre Expert
 
Inscription : avril 2005
Messages : 1 672
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 1 672
Points : 1 337
Points : 1 337
Par défaut [9i & 10gR1][forms 10g] Envois de mails via UTL_SMTP

Bonjour tout le monde,

Je cherche à envoyer des e-mail via forms 10g pour des bases en 9i et 10gR1.
J'ai bien sûr effectué une recherche avancée et je pensais avoir trouvé une solution (fourni aimablement par SheikYerbouti et Helyos) :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
CREATE OR REPLACE PROCEDURE html_email(
  p_to            IN VARCHAR2,
  p_from          IN VARCHAR2,
  p_subject       IN VARCHAR2,
  p_text          IN VARCHAR2 DEFAULT NULL,
  p_html          IN VARCHAR2 DEFAULT NULL,
  p_smtp_hostname IN VARCHAR2,
  p_smtp_portnum  IN VARCHAR2) IS
    l_boundary   VARCHAR2(255) DEFAULT 'a1b2c3d4e3f2g1';
    l_connection utl_smtp.connection;
    l_body_html  CLOB := empty_clob; 
    l_offset     NUMBER;
    l_ammount    NUMBER;
    l_temp       VARCHAR2(32767) DEFAULT NULL;
    l_dest       VARCHAR2(32767);
    l_dest_tmp   VARCHAR2(32767);
  BEGIN
    l_dest       := p_to;
    l_connection := utl_smtp.open_connection(p_smtp_hostname, p_smtp_portnum);
    utl_smtp.helo(l_connection, p_smtp_hostname);
    utl_smtp.mail(l_connection, p_from);
    WHILE instr(l_dest, ',') != 0 LOOP
      l_dest_tmp := substr(l_dest, 1, instr(l_dest, ',') - 1);
      l_dest     := substr(l_dest, instr(l_dest, ',') + 1);
      utl_smtp.rcpt(l_connection, l_dest_tmp);
    END LOOP;
    utl_smtp.rcpt(l_connection, l_dest);
    l_temp := l_temp || 'MIME-Version: 1.0' || chr(13) || chr(10);
    l_temp := l_temp || 'To: ' || p_to || chr(13) || chr(10);
    l_temp := l_temp || 'From: ' || p_from || chr(13) || chr(10);
    l_temp := l_temp || 'Subject: ' || p_subject || chr(13) || chr(10);
    l_temp := l_temp || 'Reply-To: ' || p_from || chr(13) || chr(10);
    l_temp := l_temp || 'Content-Type: multipart/alternative; boundary=' ||
              chr(34) || l_boundary || chr(34) || chr(13) || chr(10);
    dbms_lob.createtemporary(l_body_html, FALSE, 10);
    dbms_lob.WRITE(l_body_html, length(l_temp), 1, l_temp);
    l_offset := dbms_lob.getlength(l_body_html) + 1;
    l_temp   := '--' || l_boundary || chr(13) || chr(10);
    l_temp   := l_temp || 'content-type: text/plain; charset=windows-1252' ||
                chr(13) || chr(10) || chr(13) || chr(10);
    dbms_lob.WRITE(l_body_html, length(l_temp), l_offset, l_temp);
    l_offset := dbms_lob.getlength(l_body_html) + 1;
    dbms_lob.WRITE(l_body_html, length(p_text), l_offset, p_text);
    l_temp   := chr(13) || chr(10) || chr(13) || chr(10) || '--' ||
                l_boundary || chr(13) || chr(10);
    l_temp   := l_temp || 'content-type: text/html; charset=windows-1252' ||
                chr(13) || chr(10) || chr(13) || chr(10);
    l_offset := dbms_lob.getlength(l_body_html) + 1;
    dbms_lob.WRITE(l_body_html, length(l_temp), l_offset, l_temp);
    l_offset := dbms_lob.getlength(l_body_html) + 1;
    dbms_lob.WRITE(l_body_html, length(p_html), l_offset, p_html);
    l_temp   := chr(13) || chr(10) || '--' || l_boundary || '--' || chr(13);
    l_offset := dbms_lob.getlength(l_body_html) + 1;
    dbms_lob.WRITE(l_body_html, length(l_temp), l_offset, l_temp);
    l_offset  := 1;
    l_ammount := 1900;
    utl_smtp.open_data(l_connection);
    WHILE l_offset < dbms_lob.getlength(l_body_html) LOOP
      utl_smtp.write_data(l_connection, dbms_lob.substr(l_body_html, l_ammount, l_offset));
      l_offset  := l_offset + l_ammount;
      l_ammount := least(1900, dbms_lob.getlength(l_body_html) - l_ammount);
    END LOOP;
    utl_smtp.close_data(l_connection);
    utl_smtp.quit(l_connection);
    dbms_lob.freetemporary(l_body_html);
  EXCEPTION
    WHEN OTHERS THEN
      ROLLBACK;
  END;
/
J'invoque ce code de la manière suivante :
Code :
exec html_email(p_to => 'xxx@orange.fr', p_from => 'xxx@orange.fr', p_subject => 'SUJET', p_text => 'MAIL VERSION TEXTE avec smtp.orange.fr', p_html => 'MAIL VERSION HTML', p_smtp_hostname => 'smtp.orange.fr', p_smtp_portnum => '25');
où les adresses représentées par p_to et p_from sont valides (je les ai modifiées dans ce post pour des raisons de confidentialité).

Résultat :
Citation:
10g SOC10> CREATE OR REPLACE PROCEDURE html_email(
...
70 /

Procédure créée.

10g SOC10> exec html_email(p_to => 'xxx@orange.fr', p_from => 'xxx@orange.fr', p_subject => 'SUJET',
p_text => 'MAIL VERSION TEXTE avec smtp.orange.fr', p_html => 'MAIL VERSION HTML', p_smtp_hostname
=> 'smtp.orange.fr', p_smtp_portnum => '25');

Procédure PL/SQL terminée avec succès.
MAIS : je ne reçois aucun mail

J'ai modifié l'adresse du serveur SMTP en : smtp.orange.fr, smtp.yahoo.fr, smtp.free.fr
J'ai aussi testé avec d'autres adresses mails mais rien n'y fait : pas d'erreur ni de mail reçu.

Pourquoi ?
Merci de votre aide.
__________________
Modérateur des forums Oracle et Langage SQL
Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum
Magnus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2007, 17h26   #2
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 533
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 533
Points : 6 469
Points : 6 469
Peut-être un proxy intermédiare qui bloquerait l'envoi ?
__________________
Rédacteur Oracle (Oracle ACE)
Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
Je ne réponds pas aux questions techniques par MP
Blogs: Forms-PL/SQL-J2EE - Forms Java Beans
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2007, 17h31   #3
Membre Expert
 
Inscription : avril 2005
Messages : 1 672
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 1 672
Points : 1 337
Points : 1 337
En fait, comme toi Sheik, je penche pour un problème externe à Oracle.
En effet, j'arrive bien à configurer Outlook pour utiliser le serveur SMTP de notre FAI mais quand je fais un telnet sur un serveur SMTP quelconque, impossible d'envoyer un mail en respectant le protocole.

J'obtiens :
Citation:
553 <xxx@yyy.fr>: Sender address rejected: not logged in
et pourtant l'adresse mail que je mets est valide.

J'imagine donc que c'est un souci indépendant d'Oracle ?
__________________
Modérateur des forums Oracle et Langage SQL
Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum
Magnus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/05/2007, 12h11   #4
Membre Expert
 
Inscription : avril 2005
Messages : 1 672
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 1 672
Points : 1 337
Points : 1 337
Nouvelle semaine donc nouveaux résultats : j'ai effectué un envoi de mail par le protocole SMTP en utilisant un bon vieux telnet.
A ma grande surprise, ça n'avait pas fonctionné la semaine dernière, j'obtenais systématiquement un message 550 lorsque j'essayais de renseigner le "RCPT TO".
L'important est que ça fonctionne aujourd'hui sans souci.
Apparemment, cela venait d'un problème technique de mon FAI.

Toujours est-il, j'ai essayé de bout de code et j'ai effectivement reçu un mail :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
CREATE OR REPLACE PROCEDURE send_test_message IS
    mailhost    VARCHAR2(64) := 'smtp.orange.fr';
    sender      VARCHAR2(64) := '<X@Y.Z>'; -- les chevrons sont obligatoires !!!!
    recipient   VARCHAR2(64) := '<A@B.C>'; -- les chevrons sont obligatoires !!!!
    mail_conn  utl_smtp.connection;
BEGIN
    mail_conn := utl_smtp.open_connection(mailhost, 25);
    utl_smtp.helo(mail_conn, mailhost);
    utl_smtp.mail(mail_conn, sender);
    utl_smtp.rcpt(mail_conn, recipient);
    utl_smtp.open_data(mail_conn);
    utl_smtp.write_data(mail_conn, 'bla bla' || chr(13));
    utl_smtp.close_data(mail_conn);
    utl_smtp.quit(mail_conn);
    EXCEPTION
        WHEN OTHERS THEN
           NULL;
           -- dbms_output.put_line('Une erreur est survenue...');
END;
/
Merci
__________________
Modérateur des forums Oracle et Langage SQL
Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum
Magnus est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h31.


 
 
 
 
Partenaires

Hébergement Web