CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Wysyłanie maila z wieloma załącznikami

Wysyłanie maila z wieloma załącznikami

dział ogólny

Wysyłanie maila z wieloma załącznikami

Nowy postprzez Mironas » wtorek, 22 stycznia 2019, 00:21

W tej poradzie: http://programowanie.cal.pl/cyfbar/differ.html#differ11
jest opisane wysyłanie maila z jednym załącznikiem.

A jak po MAPI wysłać maila z kilkoma załącznikami?
Domyślam się, że w wierszu
KOD cpp:     UKRYJ  
MapiMessage Message = {0, Title, Note, NULL, NULL, NULL, 0, NULL, 1, &SendTo, 1, &DFile};

trzeba zmienić przedostatnią wartość (lpFiles) na liczbę załączników.
Ale jak przygotować DFile?
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 437
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 21
Otrzymał podziękowań: 62
System operacyjny: Windows 10
Kompilator: C++Builder 10.2 Tokyo
TMS Components Pack
Gadu Gadu: 0
    WindowsChrome

Re: Wysyłanie maila z wieloma załącznikami

Nowy postprzez polymorphism » wtorek, 22 stycznia 2019, 11:24

Zapewne powinna to być tablica struktur MapiFileDesc.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2179
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 203
System operacyjny: Windows 7 Pro
Windows 8.1
Linux Mint 19
Kompilator: Visual Studio 2015 Community
CodeLite (MinGW)
MSYS2 (MinGW, clang)
g++
Gadu Gadu: 0
    Windows 7Firefox

Re: Wysyłanie maila z wieloma załącznikami

Nowy postprzez lukagrom » czwartek, 24 stycznia 2019, 16:52

Ja z ciekawości chciałem taką tablicą zainicjować i wykorzystać, dlatego na szybko zmieniłem nieco funkcję, tak żeby do argumentów dodać wartości - ile plików i nazwy tych plików wpisać po kolei.
KOD cpp:     UKRYJ  
void __fastcall TForm1::SendMail(char * Adress, char * Title, char *Note,int how_Many, char **Files)
 


Jescze tablicę idzie zainicjalizować:
KOD cpp:     UKRYJ  
 MapiFileDesc *DFiles =new MapiFileDesc[how_Many];
 

Jednak z wpypełnianiem, już dużo gorzej.
KOD cpp:     UKRYJ  
for(j=0;j<how_Many;j++)
{
   DFiles[j]={0, 0, 0,Files[j],Files[j], NULL};
}
 

W kodzie błędu pokazuje mi - Expression syntax . Nadmięnie tylko, że tu nie chodzi o typ char, bo bez tablicy wskaznik tego typu jest akceptowalny.
Avatar użytkownika
lukagrom
Homos antropiczny
Homos antropiczny
 
Posty: 76
Dołączył(a): wtorek, 1 stycznia 2013, 14:54
Podziękował : 7
Otrzymał podziękowań: 4
System operacyjny: Windows Vista
Kompilator: C++ Builder 10.1 Starter
Gadu Gadu: 0
    Windows VistaChrome

Re: Wysyłanie maila z wieloma załącznikami

Nowy postprzez polymorphism » czwartek, 24 stycznia 2019, 19:19

KOD cpp:     UKRYJ  
std::vector<MapiFileDesc> file_descs(how_Many);

for(int i = 0; i < file_descs.size(); ++i)
{
        file_descs[i].ulReserved = 0;
        file_descs[i].flFlags = 0;
        file_descs[i].nPosition = 0;
        file_descs[i].lpszPathName = Files[i];
        file_descs[i].lpszFileName = NULL;
        file_descs[i].lpFileType = NULL;
}

MapiMessage Message = { 0, Title, Note, NULL, NULL, NULL, 0, NULL, 1, &SendTo, file_descs.size(), &file_descs.front() };

/* reszta stuffu */

Lub:
KOD cpp:     UKRYJ  
std::vector<MapiFileDesc> file_descs;

for(int i = 0; i < how_Many; ++i)
{
        file_descs.push_back({ 0, 0, 0, Files[i], NULL, NULL });
}

MapiMessage Message = { 0, Title, Note, NULL, NULL, NULL, 0, NULL, 1, &SendTo, file_descs.size(), &file_descs.front() };

/* reszta stuffu */
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
Mironas
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2179
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 203
System operacyjny: Windows 7 Pro
Windows 8.1
Linux Mint 19
Kompilator: Visual Studio 2015 Community
CodeLite (MinGW)
MSYS2 (MinGW, clang)
g++
Gadu Gadu: 0
    UbuntuFirefox

Re: Wysyłanie maila z wieloma załącznikami

Nowy postprzez lukagrom » czwartek, 24 stycznia 2019, 20:15

Czyli reasumując (dzięki pomocy polymorphis) nowy kształt funkcji:
KOD cpp:     UKRYJ  
void __fastcall TForm1::SendMail(char * Adress, char * Title, char *Note,int how_Many, char **Files)
{
  int i;
  HANDLE hMAPILib = LoadLibrary("MAPI32.DLL");
  LPMAPILOGON MapiLogon = (LPMAPILOGON)GetProcAddress(hMAPILib, "MAPILogon");
  LPMAPISENDMAIL lpMapiSendMail = (LPMAPISENDMAIL)GetProcAddress(hMAPILib, "MAPISendMail");
  LPMAPILOGOFF MapiLogoff = (LPMAPILOGOFF)GetProcAddress(hMAPILib, "MAPILogoff");
  LHANDLE mapiSession;
 (*MapiLogon)(0, NULL, NULL, 0, 0, &mapiSession);
  MapiRecipDesc SendTo = {0, MAPI_TO, NULL, Adress, 0, NULL};

  std::vector<MapiFileDesc> file_descs(how_Many);

for( i = 0; i < file_descs.size(); ++i)
{
        file_descs[i].ulReserved = 0;
        file_descs[i].flFlags = 0;
        file_descs[i].nPosition = 0;
        file_descs[i].lpszPathName = Files[i];
        file_descs[i].lpszFileName = NULL;
        file_descs[i].lpFileType = NULL;
}
MapiMessage Message = { 0, Title, Note, NULL, NULL, NULL, 0, NULL, 1, &SendTo, file_descs.size(), &file_descs.front() };
(*lpMapiSendMail)(0, 0, &Message, 0, 0);                                   // wysyłanie e-mail'a.
(*MapiLogoff)(mapiSession, 0, 0, 0);
 FreeLibrary(hMAPILib);


}
 

Moja próba wysłania plików z katalogu na swój email:
KOD cpp:     UKRYJ  
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 
 char *files[3]={"m_test_Mapi.cpp","p_test_Mapi.res","p_test_Mapi.exe"};
 SendMail("moja_poczta@poczta.pl","Testowanie MAPI","Ala ma kota, a kot ma Ale",3,files);
}
 

I pojawilo się ostrzeżenie od Outlooka, że program próbuje wysłać maila, co niby jest nietypowe, jednakże dając Zezwalaj wszystko przebiegło OK. Tyle, że mail z jakichś przyczyn w ogóle nie dotarł.
Wysyłałem, także bezpośrendio z aplikacji .exe przy wyłączonym środowisko, ponownie lipa.

Za ten post autor lukagrom otrzymał podziękowanie od:
Mironas
Avatar użytkownika
lukagrom
Homos antropiczny
Homos antropiczny
 
Posty: 76
Dołączył(a): wtorek, 1 stycznia 2013, 14:54
Podziękował : 7
Otrzymał podziękowań: 4
System operacyjny: Windows Vista
Kompilator: C++ Builder 10.1 Starter
Gadu Gadu: 0
    Windows VistaChrome

Re: Wysyłanie maila z wieloma załącznikami

Nowy postprzez polymorphism » czwartek, 24 stycznia 2019, 21:41

Sprawdź, co zwraca MapiSendMail, może dowiesz się, w czym jest problem.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2179
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 203
System operacyjny: Windows 7 Pro
Windows 8.1
Linux Mint 19
Kompilator: Visual Studio 2015 Community
CodeLite (MinGW)
MSYS2 (MinGW, clang)
g++
Gadu Gadu: 0
    UbuntuFirefox

Re: Wysyłanie maila z wieloma załącznikami

Nowy postprzez Mironas » piątek, 25 stycznia 2019, 10:59

lukagrom napisał(a):I pojawilo się ostrzeżenie od Outlooka, że program próbuje wysłać maila, co niby jest nietypowe, jednakże dając Zezwalaj wszystko przebiegło OK. Tyle, że mail z jakichś przyczyn w ogóle nie dotarł.
Wysyłałem, także bezpośrendio z aplikacji .exe przy wyłączonym środowisko, ponownie lipa.


Podaj pełne ścieżki do plików/załączników - u mnie zadziałało.

Tutaj trochę przerobiona funkcja - działająca pod C++Builder 10.2 Tokyo
KOD cpp:     UKRYJ  
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  char* files[3];
  files[0] = "C:\\Wydruki\\F0118.pdf";
  files[1] = "C:\\Wydruki\\F0119.pdf";
  files[2] = "C:\\Wydruki\\F0218.pdf";

  SendMail("mojadres@gmail.com", "Testowanie MAPI", "Ala ma kota, a kot ma Ale", 3, files);
}
//---------------------------------------------------------------------------
// Wysyłanie maila z listą załączników
void TForm1::SendMail(char* Adress, char* Title, char* Note, int how_Many, char** Files)
{
  //HANDLE hMAPILib = LoadLibrary(L"MAPI32.DLL");
  HMODULE hMAPILib = LoadLibrary(L"MAPI32.DLL");

  LPMAPILOGON MapiLogon = (LPMAPILOGON)GetProcAddress(hMAPILib, "MAPILogon");
  LPMAPISENDMAIL lpMapiSendMail = (LPMAPISENDMAIL)GetProcAddress(hMAPILib, "MAPISendMail");
  LPMAPILOGOFF MapiLogoff = (LPMAPILOGOFF)GetProcAddress(hMAPILib, "MAPILogoff");

  LHANDLE mapiSession;
  (*MapiLogon)(0, NULL, NULL, 0, 0, &mapiSession);
  MapiRecipDesc SendTo = {0, MAPI_TO, NULL, Adress, 0, NULL};

  std::vector<MapiFileDesc> file_descs(how_Many);
  for (int i=0 ; i<how_Many ; ++i)
  {
    file_descs[i].ulReserved = 0;
    file_descs[i].flFlags = 0;
    file_descs[i].nPosition = 0;
    file_descs[i].lpszPathName = Files[i];
    file_descs[i].lpszFileName = NULL;
    file_descs[i].lpFileType = NULL;
  }

  MapiMessage Message = {0, Title, Note, NULL, NULL, NULL, 0, NULL, 1, &SendTo, file_descs.size(), &file_descs.front()};
  (*lpMapiSendMail)(0, 0, &Message, 0, 0);          // Wysyłanie maila
  (*MapiLogoff)(mapiSession, 0, 0, 0);

  FreeLibrary(hMAPILib);
}
//---------------------------------------------------------------------------
 


Teraz działa poprawnie.
Wszystkim dziękuję za pomoc i zaangażowanie.

[EDIT]
Przy okazji (może to być dla kogoś istotne) - Jeśli chcemy aby mail nie wysyłał się od razu, tylko najpierw otwierał się w programie pocztowym, to lpMapiSendMail należy wywołać z parametrem MAPI_DIALOG:
KOD cpp:     UKRYJ  
  //(*lpMapiSendMail)(0, 0, &Message, 0, 0);            // Wyślij od razu
  (*lpMapiSendMail)(0, 0, &Message, MAPI_DIALOG, 0);  // Otwórz maila przed wysłaniem
 
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 437
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 21
Otrzymał podziękowań: 62
System operacyjny: Windows 10
Kompilator: C++Builder 10.2 Tokyo
TMS Components Pack
Gadu Gadu: 0
    WindowsChrome

Re: Wysyłanie maila z wieloma załącznikami

Nowy postprzez lukagrom » piątek, 25 stycznia 2019, 17:07

Czy u użytkownika Mironas, też pojawia się komunikat ostrzegawczy o próbie wysłania maila? Bo, jeżeli jest to np do ominięcia, to nawet nie było by to trudne, stworzenie aplikacji, która przeglądała by cały dysk i wyszukiwała każdy nowy plik z interesującym nasz rozszerzeniem, a po zliczeniu tych plików, wysyłała (bez ostrzegania usera z wykorzystaniem Mapi) jako załączniki pliki czy kopie pod wskazany przez nasz email. Ciekawym, czy gdyby to się udało zrealizować,podrzucić na jakiś komp, to jakby zareagował antywirus, bądz zapora Windowsa?
Avatar użytkownika
lukagrom
Homos antropiczny
Homos antropiczny
 
Posty: 76
Dołączył(a): wtorek, 1 stycznia 2013, 14:54
Podziękował : 7
Otrzymał podziękowań: 4
System operacyjny: Windows Vista
Kompilator: C++ Builder 10.1 Starter
Gadu Gadu: 0
    Windows VistaChrome

Re: Wysyłanie maila z wieloma załącznikami

Nowy postprzez Mironas » piątek, 25 stycznia 2019, 18:37

lukagrom napisał(a):Czy u użytkownika Mironas, też pojawia się komunikat ostrzegawczy o próbie wysłania maila? [...]

Tak.
Używam Mozilla Thunderbird.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 437
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 21
Otrzymał podziękowań: 62
System operacyjny: Windows 10
Kompilator: C++Builder 10.2 Tokyo
TMS Components Pack
Gadu Gadu: 0
    WindowsChrome


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 5 gości

cron