Envoyer un email avec attachement de fichier

0/5 (5 avis)

Vue 10 004 fois - Téléchargée 1 236 fois

Description

Ce prog permet d'envoyer un email et d'attacher des fichiers si on veux........
Utilisation de thread pour l'emission(mieux que le compo antifrezze d'indy)...ceci est un bon exemple pour les newbies (tout le monde l'a été un jour!!!)

Sinon j'ai un petit pb lorsque je j'utilise l evt OnWorkBegin de SMTP la constante
AWorkCountMax reste toujours nul!!!!!!!! Par conséquent je ne peux pas utiliser une barre de progression........Si quelqu'un a une idée je suis ouvert a tous....
PS:Pour utiliser mon prog il vous faut les composants DcScript
ces composants permettent d'avoir une application du style de winamp..

Source / Exemple :


unit EmailSender1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DSBtExit, DSControls, DSPanel, DSMagnetic, DSMarquee, DSButton,
  DSBtMenu, IdMessage, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdMessageClient, IdSMTP, StdCtrls, DSPanelTools, ShellApi,
  ExtCtrls, DSPanelTitle, DSImgBarre, DSProgress, DSScope;

type
  TSend1 = class(TThread)
  private

  protected
    procedure Execute();override;
  public
    constructor Create();
  end;

  TForm1 = class(TForm)
    DSPanel1: TDSPanel;
    DSBtExit1: TDSBtExit;
    DSMarquee1: TDSMarquee;
    DSBtMenu1: TDSBtMenu;
    DSButton1: TDSButton;
    DSPanelTools1: TDSPanelTools;
    Label1: TLabel;
    IdSMTP1: TIdSMTP;
    IdMessage1: TIdMessage;
    DSPanelTools2: TDSPanelTools;
    Edit1: TEdit;
    DSPanelTitle1: TDSPanelTitle;
    DSPanelTools3: TDSPanelTools;
    Memo1: TMemo;
    DSPanelTools4: TDSPanelTools;
    ListBox1: TListBox;
    DSIndicator1: TDSIndicator;
    procedure DSBtExit1Click(Sender: TObject);
    procedure DSBtMenu1Click(Sender: TObject);
    procedure DSButton1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure IdSMTP1Work(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCount: Integer);
  private
    { Déclarations privées }
  public
    procedure WMDropFiles(var msg : TMessage); message WM_DROPFILES;
    { Déclarations publiques }
  end;

var
  Form1: TForm1;

implementation
Uses WinInet;
{$R *.dfm}

constructor TSend1.Create;
begin
 //ca je c pas a koi ca sert, mais ca sert
 FreeOnTerminate := True;
 inherited Create(false);
 //changer la priorité de la boucle
 Priority := tpHigher;
end;

function Detection_Connexion :boolean;
 var
  dwFlags : DWORD;
 begin
  dwFlags :=INTERNET_CONNECTION_MODEM + INTERNET_CONNECTION_LAN
           + INTERNET_CONNECTION_PROXY ;
  RESULT := InternetGetConnectedState(@dwFlags,0);
 end;

procedure TForm1.IdSMTP1Work(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCount: Integer);
begin
 DSIndicator1.Position := Round(AWorkCount);
end;

procedure TSend1.Execute;  //code à executer par le thread
begin
 inherited;
 if Detection_Connexion = true then
  begin
   Form1.Label1.Caption:= 'Connexion...';
   Form1.IdSMTP1.Connect; //Connexion
   try
    Form1.Label1.Caption:= 'Emission...';
    Form1.IdSMTP1.Send(Form1.IdMessage1); //Envoi du message
   finally
    Form1.IdSMTP1.Disconnect; //Déconnexion
    Form1.Label1.Caption:= 'Email envoyé...';
   end;
   Form1.ListBox1.Items.Clear;
   Form1.Memo1.Clear;
   Terminate;
  end
 else
  begin
   Form1.Label1.Caption:= 'Pas connecté à internet';
   Terminate;
  end; 
end;

procedure TForm1.WMDropFiles(var msg : TMessage);
var
  hand: THandle;
  nbFich, i : integer;
  buf:array[0..254] of Char;
begin
  hand:=msg.wParam;
  nbFich:= DragQueryFile(hand, 4294967295, buf, 254);
  for i:= 0 to nbFich - 1 do
    begin
      DragQueryFile(hand, i, buf, 254);
      Form1.ListBox1.Items.Add(buf);
    end;
  DragFinish(hand);
end;

procedure TForm1.DSBtExit1Click(Sender: TObject);
begin
 Close;
end;

procedure TForm1.DSBtMenu1Click(Sender: TObject);
begin
 Application.Minimize;
end;

procedure TForm1.DSButton1Click(Sender: TObject);
var
 I: Integer;
begin
 //Prepare le corps de l email
 IdMessage1.Clear; //Efface l'entête et le corps du message
 IdMessage1.From.Text:='EmailSender@hotmail.com'; //Adresse email de l'expediteur
 IdMessage1.ReplyTo.EMailAddresses:='EmailSender@hotmail.com'; //Adresse email où le destinataire pourra répondre
 IdMessage1.Recipients.EMailAddresses:=Edit1.Text; //Adresse email du destinataire
 IdMessage1.Date:=Date; //Date de l'envoi du message
 IdMessage1.Subject:='File(s) from EmailSender v2.00'; //Sujet du message
 IdMessage1.Priority:=mpNormal; //Priorité du message
 IdMessage1.Body.Assign(Memo1.Lines); //Corps du message
 //Attache les fichiers
 I:=0;
 ListBox1.Items.Add('Fin');
 Application.ProcessMessages;
 while not(ListBox1.Items[I] = 'Fin') do
  begin
   if fileexists(ListBox1.Items[I]) then
    TIdAttachment.Create(idmessage1.MessageParts,ListBox1.Items[I]);
    I:=I+1;
   end;
 //Connexion au serveur smtp
 IdSMTP1.AuthenticationType:=atLogin; //Type d'authentification
 IdSMTP1.Host:='smtp.laposte.net'; //Hôte (ou par exemple pour Free : smtp.free.fr)
 IdSMTP1.Port:=25; //Port (par exemple pour Free : 25)
 IdSMTP1.UserName:='***i.***'; //Nom d'utilisateur
 IdSMTP1.Password:='****'; //Mot de passe
 TSend1.Create;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.Height:=205;
Form1.Width:=285;
DSPanel1.Left:=0;
DSPanel1.Top:=0;
DSPanel1.Width:=285;
DSPanel1.Height:=205;
DragAcceptFiles(Handle, true);
DSIndicator1.Position := 0;
end;

end.

Conclusion :


Pour ajouter un fichier il suffit de le faire glisser et de le déposer dessus......
Si vous avez des améliorations a me soumettre pas de problème..
("C'est par les autres que l'on peut progresser" Blueangel)

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

cs_aldorado
Messages postés
7
Date d'inscription
dimanche 5 décembre 2004
Statut
Membre
Dernière intervention
30 octobre 2005
-
pour revennir a la progressbar, c'est donc un bug des compo indy puisque j'ai tout essayé et rien ne fonctionne
y a t'il une version des compo. indy ou maintenant ce bug la est corrigé ??
quelle est la solution ?
bref, merci ;)
+
hurrycane
Messages postés
123
Date d'inscription
samedi 4 janvier 2003
Statut
Membre
Dernière intervention
19 juin 2009
1 -
c'est stupide d'utiliser des composant personnalisés dans une source qui est censée etre partagée et publique
Hnimsgern
Messages postés
49
Date d'inscription
mercredi 18 décembre 2002
Statut
Membre
Dernière intervention
4 mars 2005
-
Bonjour, Dans un programme que j'ai développé avec le composant SMTP la procedure Send est bloquante même si j'utilise l'antifreeze ou un threat. D'autre part le ProgressBar ne fonctionne pas pour la même raison. Ce bloquage est visible si fichier attaché est de grande taille est transmis. Est-ce un problème que pour le SMTP ? Je n'ai pas pu essayé ton programme parcequ'il manque les composants visuels. HN.
ericdevil89
Messages postés
3
Date d'inscription
mercredi 13 août 2003
Statut
Membre
Dernière intervention
26 novembre 2003
-
Oui je suis d'accord mais pour utiliser la barre de progression il te faut le nombre Max de "travail" a effectué ie AWorkCountMax........
Ds onWorkBegin il te suffit ds ce cas a mettre
Progressbar1.Position:=Round(AWorkCount/AWorkCountMax);
Et voila mais ds mon cas la cste AWorkCountMax est null!!!!!!!!!!!!!
cs_stailer
Messages postés
511
Date d'inscription
jeudi 28 mars 2002
Statut
Membre
Dernière intervention
13 mai 2009
1 -
Normalement les barres de progression se font sur le OnWork et non OnWorkBegin... Du moins ca marche comme ca avec les composants FTP d'Indy.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.