Comment un Programme Delphi envoyer un e-Mail avec des pièces Jointes via le Client de messagerie par DÉFAUT?

Dans mon programme, je suis de la rédaction d'un e-mail à envoyer à l'aide du client de messagerie par défaut du logiciel installé sur l'ordinateur de l'utilisateur.

J'ai composé le mailto adresse, l'objet, le multilined corps, et j'ai plusieurs pièces jointes à être inclus.

J'ai presque eu ce travail à l'aide de mailto et ShellExecute comme suit:

  Message := 'mailto:[email protected]'
    + '?subject=This is the subjectBehold Error Report'
    + '&body=This is line 1' + '%0D%0A'
    + 'This is line 2' + '%0D%0A'
    + 'This is line 3'
    + '&Attach=c:\file1.txt';
  RetVal := ShellExecute(Handle, 'open', PChar(Message), nil, nil, SW_SHOWNORMAL);
  if RetVal <= 32 then
    MessageDlg('Cannot find program to send e-mail.', mtWarning, [mbOK], 0);

À l'aide de Delphi 2009 sur un ordinateur Windows Vista, ce qui permettra d'ouvrir Microsoft Mail "Créer" de la fenêtre, avec la À la, le Sujet et le Corps rempli correctement. Toutefois, le fichier ne soit pas attaché.

Comme je l'ai fait des recherches, j'ai remarqué un commentaire indiquant que cette technique ne fonctionne pas avec tous les clients de messagerie. Cependant, la plupart des commentaires, c'est assez vieux, je réalise que c'est une technique très ancienne.

Puis j'ai trouvé que Zarko Gajic a dit que "cette approche est ok, mais vous ne pouvez pas envoyer des pièces jointes dans ce sens".

J'ai vu, il y a aussi la Windows Simple Mail API (MAPI), mais Zarko dit qui ne fonctionne que si l'utilisateur final a logiciel de messagerie compatible MAPI. Il existe des techniques documentées à l'aide de MAPI avec Delphi (par exemple L'envoi d'e-mail à l'aide de mapi), mais ils ont tous l'avertissement que MAPI n'est pas toujours installé par défaut avec Windows.

D'ailleurs, je veux vraiment le message de venir d'abord par l'utilisateur dans le programme de messagerie par défaut, donc ils vont l'avoir dans le cadre de leurs dossiers de courriel et ils peuvent le modifier et de décider si et quand ils veulent l'envoyer. Je ne suis pas sûr de savoir comment MAPI fonctionne et si il va le faire.

Donc, mes besoins sont:

  1. Pour apporter de l'e-mail dans le courrier de l'utilisateur du programme.
  2. Pour permettre une ou plusieurs pièces jointes.
  3. De travailler avec (je l'espère), tous les clients de messagerie sur toutes les machines Windows à partir de XP (c'est à dire XP, Vista ou 7).

Est-il un tel animal? Ou peut-être quelqu'un sait comment récupérer les pièces jointes à travailler avec le mailto/ShellExecute technique?

Ce que font la plupart des gens?


Edit:

Il y a eu quelques réponses avec MAPI solutions et même un Indy solution.

Le problème que j'ai avec eux est qu'ils n'ont pas nécessairement utiliser le client de messagerie par défaut. Sur ma machine Vista, par exemple, j'ai installé Windows Mail par défaut de mon client. Quand je fais une MAPI envoyer, il ne fait pas apparaître de Windows Mail, mais il apporte et met en place l'e-mail dans Outlook au lieu. Je n'en veux pas.

Deux de mes utilisateurs de mon programme se plaignait:

Votre debug routine ne parvient pas à envoyer le fichier, comme il essaie de démarrer windows mail pour une raison connue de lui-même plutôt que d'utiliser le client de messagerie par défaut (dans mon cas, thunderbird)

J'ai essayé de remplir l'exception
rapport, mais a abandonné quand il a demandé pour
ce serveur, ce serveur! Puis j'ai
vraiment ennuyé car il lancé
Outlook
- Je n'ai jamais, jamais l'utiliser, ou vous voulez l'utiliser.

Je n'ai pas besoin de code pour MAPI ou Indy. Ils sont facilement disponibles. Mais si vous suggèrent MAPI ou Indy, ce que j'ai vraiment besoin d'une manière de trouver la valeur par défaut du client et de s'assurer qu'il est celui qui est passé à l'e-mail soit envoyé.

Aussi, j'ai besoin de savoir si MAPI est désormais universel. Il y a 5 ans, il n'était pas garanti pour fonctionner sur toutes les machines parce qu'il n'était pas installé en tant que partie du système d'exploitation. Est-ce encore le cas, ou ne MAPI maintenant venir avec Windows XP, Vista et 7 par défaut?

Mêmes questions pour Indy ou suggérer d'autres solutions. Cela peut-il fonctionner avec le client par défaut et fonctionne sur presque tous les Windows XP et plus tard les machines?

La raison pour laquelle le "mailto" la solution est tellement agréable, c'est que toutes les machines ont en charge pour le but de la manipulation de l'HTML mailto déclaration qui se trouve sur les pages web. Maintenant, si seulement je pouvais l'utiliser pour ajouter des pièces jointes ...


Probable solution trouvée: mjustin souligné une alternative qui permet d'utiliser le Système d'Exploitation de l'envoyer à la commande. Que le plus probable est le chemin à parcourir.

La mailto n'était pas limité à 256 caractères tels que le HTML mailto est, mais j'ai été dévasté à découvrir qu'il a fini par être limité à 2 048 caractères. Heureusement, quelques heures plus tard, mjustin a donné sa réponse.

Si la mise en œuvre de qui va bien, sa réponse ne l'ont fait pour moi. Si non, je vais ajouter mes commentaires ici.


Pas. Comme il s'avère, les sendto solution ne sera pas toujours ouvrir le programme de messagerie par défaut. Sur ma machine, il ouvre Outlook lors de mon mailer par défaut est Windows Mail. Trop mauvais. J'ai dû revenir à la mailto méthode, malgré les 2048 limite de caractères.

Je l'ai fait, cependant, de trouver dans l'article: Envoyer vers destinataire du message que:

À ce stade, vous pouvez le remplacer
::ShellExecute avec un bien pensé
::WinExec appel, à l'aide de la réelle
mailto ligne de commande déclaré dans le
registre cible et l'adresse e-mail actuelle
client (par exemple,
"%ProgramFiles%\Outlook
Express\msimn.exe" /mailurl:%1). Mais
ensuite, la limitation est de 32 KO. En tant que
conclusion, il n'existe aucun moyen d'envoyer
e-mails de plus de 32 KO à l'aide de la
protocole mailto.

mais j'en serais pour déterminer qui est le client de messagerie est dans chaque cas. J'attends susceptible d'entraîner des complications.

Une autre chose que j'ai trouvé est que mailto permet la mise en place de "à", "cc" et "bcc", "objet" et du "corps", mais pas de pièces jointes. Alors que sendto permet UNIQUEMENT des pièces jointes et met en place une messagerie par défaut avec un message par défaut et aucun moyen pour vous de définir les différents champs et le corps.

voir delphi.about.com/od/indy/a/email-send-indy.htm
en utilisant le client de messagerie par défaut
C'était le lien que j'ai eu dans ma question, mais je ne vois rien qui indique que Indy utilise le client de messagerie par défaut. Comment peut-on s'il doit être donné au serveur de messagerie SMTP? Veuillez expliquer.
Vous besoin de code MAPI parce que c'est le moyen d'envoyer arbitraire e-mail à l'aide de la valeur par défaut du client. Si le client par défaut ne prend pas en charge MAPI, alors vous êtes hors de la chance. Indy ne peut pas envoyer de mail à l'aide de n'importe quel autre client; Indy est l'adresse e-mail du client dans ce cas. Si MAPI n'est pas de trouver le bon programme, puis ce le problème, vous devez examiner de plus.
Vous avez vraiment creuser pour elle! Frais de poste. Je me bats avec EurekaLog à le convaincre d'envoyer la bonne e-mails (j'ai vraiment commencé à m'agacé par EurekaLog 7). J'espère que toutes ces informations vont m'aider.

OriginalL'auteur lkessler | 2009-12-26