W jaki sposób program Delphi może wysłać wiadomość e-mail z załącznikami za pośrednictwem domyślnego klienta poczty e-mail?

W moim programie tworzę wiadomość e-mail do wysłania za pomocą domyślnego oprogramowania klienta poczty e-mail zainstalowanego na komputerze użytkownika.

Skomponowałem adres mailto, temat, ciało wielowierszowe i mam kilka załączników do uwzględnienia.

Prawie udało mi się to zrobić za pomocą mailto i ShellExecute w następujący sposób:

  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);

Używając Delphi 2009 na komputerze z systemem Windows Vista, otworzy się okno Microsoft Mail „Utwórz pocztę”, wypełnione prawidłowo Do, Temat i treść. Plik nie jest jednak dołączany.

Jak to zbadałem, zauważyłem pewne komentarze stwierdzające, że ta technika nie działa ze wszystkimi klientami poczty. Jednak większość komentarzy jest dość stara, ponieważ zdaję sobie sprawę, że jest to bardzo stara technika.

Wtedy to znalazłemZarko Gajic powiedział że „to podejście jest w porządku, ale nie można wysyłać załączników w ten sposób”.

Widziałem tam także Windows Simple Mail API (MAPI), ale Zarko mówi, że działa tylko wtedy, gdy użytkownik końcowy ma oprogramowanie pocztowe zgodne z MAPI. Istnieją dobrze udokumentowane techniki używania MAPI z Delphi (np.Wysyłanie wiadomości e-mail za pomocą mapi), ale wszyscy mają zastrzeżenie, że MAPI nie zawsze jest instalowany z Windows.

Poza tym, naprawdę chcę, żeby wiadomość pojawiła się jako pierwsza w domyślnym programie pocztowym użytkownika, więc będą mieli ją jako część swoich e-maili i będą mogli ją edytować i zdecydować, czy i kiedy chcą ją wysłać. Nie jestem pewien, jak działa MAPI i czy to zrobi.

Więc moje wymagania to:

Aby wysłać wiadomość e-mail do programu pocztowego użytkownika.

Aby zezwolić na jeden lub więcej załączników.

Aby współpracować (miejmy nadzieję) ze wszystkimi klientami poczty e-mail na dowolnym komputerze z systemem Windows od XP up (np. XP, Vista lub 7).

Czy istnieje takie zwierzę? A może ktoś wie, jak uzyskać załączniki do pracy z techniką mailto / ShellExecute?

Co robi większość ludzi?

Edytować:

Było kilka odpowiedzi z rozwiązaniami MAPI, a nawet rozwiązaniem Indy.

Mam problem z tym, że niekoniecznie używają domyślnego klienta poczty. Na przykład na moim komputerze z systemem Vista skonfigurowałem program Poczta systemu Windows jako domyślnego klienta. Gdy wysyłam MAPI, nie uruchamia się Poczta systemu Windows, ale zamiast tego wywołuje i konfiguruje pocztę w programie Outlook. Nie chcę tego.

Dwóch moich użytkowników mojego programu skarżyło się:

Twoja procedura debugowania nie wysyła pliku, ponieważ próbuje uruchomić pocztę systemu Windows z jakiegoś powodu znanego dla siebie, zamiast używać domyślnego klienta poczty (w moim przypadku thunderbird)

Próbowałem wypełnić raport wyjątku, ale zrezygnowałem, gdy poprosił o ten serwer, ten serwer! Wtedy naprawdę się zdenerwowałem, ponieważ uruchomił program Outlook - nigdy go nie używam ani nie chcę z niego korzystać.

Nie potrzebuję kodu dla MAPI lub Indy. Są łatwo dostępne. Ale jeśli zasugerujesz MAPI lub Indy, to naprawdę potrzebuję sposobu na znalezienie domyślnego klienta i upewnienie się, że to ten, któremu przekazano e-mail, który ma zostać wysłany.

Muszę też wiedzieć, czy MAPI jest teraz uniwersalny. 5 lat temu nie było gwarancji, że będzie działać na wszystkich komputerach, ponieważ nie został zainstalowany jako część systemu operacyjnego. Czy to nadal prawda, czy też MAPI domyślnie ma teraz Windows XP, Vista i 7?

Te same pytania dotyczą Indy lub innych sugerowanych rozwiązań. Czy może działać z domyślnym klientem i czy będzie działać na prawie wszystkich komputerach z systemem Windows XP i nowszych?

Powodem, dla którego rozwiązanie „mailto” jest tak miłe, jest to, że wszystkie komputery muszą go obsługiwać w celu obsługi oświadczenia HTML mailto znajdującego się na stronach internetowych. Gdybym tylko mógł użyć go do dodania załączników ...

Prawdopodobne rozwiązanie: mjustin wskazał alternatywę, która korzysta z polecenia sendto systemu operacyjnego. To najprawdopodobniej sposób.

Mailto nie było ograniczone do 256 znaków, tak jak HTML mailto, ale byłem zdruzgotany, gdy okazało się, że ogranicza się do 2048 znaków. Na szczęście kilka godzin później mjustin dał odpowiedź.

Jeśli wdrożenie tego pójdzie dobrze, jego odpowiedź zrobi to dla mnie. Jeśli nie, dodam tutaj moje komentarze.

Nie. Jak się okazuje, rozwiązanie sendto nie zawsze otwiera domyślny program pocztowy. Na moim komputerze otwiera Outlook, gdy moją domyślną pocztą jest Poczta systemu Windows. Szkoda. Musiałem wrócić do metody mailto, pomimo limitu 2048 znaków.

Znalazłem jednak w artykule:Wyślij do odbiorcy poczty że:

W tym momencie możesz zamienić :: ShellExecute na dobrze pomyślane wywołanie :: WinExec, używając rzeczywistej linii komend mailto zadeklarowanej w rejestrze i kierując na bieżącego klienta poczty e-mail (na przykład „% ProgramFiles% \ t .exe "/ mailurl:% 1). Ale wtedy ograniczenie wynosi 32 KB. Podsumowując, nie ma możliwości wysyłania wiadomości e-mail większych niż 32 KB przy użyciu protokołu mailto.

ale wtedy musiałbym ustalić, kto jest klientem poczty w każdym przypadku. Spodziewam się, że doprowadzi to do dalszych komplikacji.

Kolejną rzeczą, którą odkryłem, jest to, że mailto pozwala na ustawienie „do”, „cc”, „bcc”, „temat” i „ciało”, ale bez załączników. Natomiast sendto TYLKO zezwala na załączniki, a następnie ustawia domyślną wiadomość e-mail z domyślną wiadomością i nie ma możliwości ustawienia różnych pól i treści.

questionAnswers(5)

yourAnswerToTheQuestion