Veröffentlicht 12. März 200223 j Hi, ich such eine möglichkeit per mausklick eine neue mail mit vorbelegter empfaengeradresse über den standard client zu erzeugen. Soll folgendermassen aussehen, dass man im about dialog eines proggys auf links klickt. zum einen sowas wie mailto:irgendwer@irgendwo.com und zum anderen eine url, die dann im standard browser angezeigt wird. ist warscheinleich ne banale frage, aber ich komme nicht weiter ciao TinTin :confused:
12. März 200223 j Du kannst ein mailto:-URL genau wie jeden anderen mit ShellExecute "ausführen": ShellExecute( NULL, "open", "mailto:recipient@sld.tld", NULL, NULL, 0 );
13. März 200223 j kann ich denn auch ein subject oder body für die mail mit übergeben? das format: 'irgendwer@irgendwo.de?subject=irgendwas' scheint nicht zu funktionieren. wie kann ich die inhalte sonnst übergeben? ciao TinTin :WD
13. März 200223 j Also bei mir funktioniert das hier: ShellExecute( NULL, "open", "mailto:Klotzkopp0@compuserve.de?subject=foo&body=bar", NULL , NULL, 0 );
13. März 200223 j hi, hab dass hier probiert: void CAboutDlg::OnMail() { ShellExecute ( NULL, "open", "mailto:Klotzkopp0@compuserve.de?subject=foo&body=bar", NULL, NULL, 0 ); } und das kommt dabei raus. so sieht die outlookexpress adressleiste aus. hier klicken!! woran das wohl liegt? :confused:
13. März 200223 j Wahrscheinlich liegt es an dem verwendeten Mail-Client ob das subject und body der Kommandozeile richtig "übersetzt" werden. Evtl. reagiert Outlook anders als Netscape.
13. März 200223 j Original geschrieben von TinTin woran das wohl liegt? :confused: Kann ich Dir auch nicht sagen. Bei mir funktioniert es mit Outlook 2000 und Outlook Express 6.
13. März 200223 j liegt wohl an WIN98, unter win2k gehts, weiß der teufel warum! danke und Ciao TinTin
14. März 200223 j Das automatische Senden funktioniert, soweit ich weiß, nicht über das Ausführen eines mailto:-URL. Da würde ich dann eher MAPI empfehlen.
14. März 200223 j bei mir liegt noch irgendwo verstaubt ne methode, die über sockets e-mails versendet. damit bist du dann unabhängig von irgendwelchen clients , es muss natürlich lediglich der tcp/ip-stack installiert sein. das beispiel greift auf mfc-socket-objekte zurück und ist recht simpel.
14. März 200223 j Falls du das Beispiel mit den Sockets finden solltest, könntest du es ja mal in Forum stellen. Wäre sicherlich interessant !!!
14. März 200223 j Also schön...is zwar eine eigene zusammengeschusterte Methode, aber sie funtz *ggg* BOOL CMontagenVersandView::MailSenden(int nListenIndex) { ////////// Bearbeiter KZ ermitteln //////////////// CString sWemoNr; CString sBetreff; // Betreff sagt aus welche Wemo versandbereit ist CString SQLstr; // über SQL-Statement ermitteln, welcher Bearbeiter gewählt wurde CString MailTo; CString sEmail; // E-Mail-Adresse des Bearbeiters wird hier gespeichert CString sFrom; // Mail von.... CString sDatum; // Datum und Uhrzeit der Mail hier festhalten CString sHeader; // in diesen String kompletten Header schreiben CString sTemp; // temporärer String erzeugen, für weitere Messages an den Server CTime sTime; // String für Zeitangaben des lokalen Systems sWemoNr=m_ctrListe.GetItemText(nListenIndex,0); // WemoNr der gewählten Wemo ///////// E-Mail über die KZ ermitteln //////////// SQLstr="SELECT * FROM [dbo].[MontageDaten] WHERE WemoNr="; SQLstr+=sWemoNr; m_MontageDaten->Open(AFX_DB_USE_DEFAULT_TYPE,SQLstr); SQLstr="SELECT * FROM [dbo].[emailBearbeiter] WHERE KZ="; SQLstr+=m_MontageDaten->m_BeaKz; m_MontageDaten->Close(); sBetreff="Wemo "; // Betreffstring generieren sBetreff+=sWemoNr; sBetreff+=" ist versandbereit !"; m_EMailListe->Open(AFX_DB_USE_DEFAULT_TYPE,SQLstr); sEmail=m_EMailListe->m_EMail ; // Mail-Adresse in String schreiben m_EMailListe->Close(); // Abfrage schliessen ////////////////////////////////////////////////////////////////////////////////// ///////// MAIL GENERIEREN //////////////////// ////////////////////////////////////////////////////////////////////////////////// //////////// alle benötigten Variablen deklarieren //////////// char lokaler_PC[80]; // String für den lokalen Rechnernamen char m_ansbuf[1024]; // Fehlerpuffer für Server deklarieren CString sHello; // Aufrufstring für Mail-Server if(AfxSocketInit()==0) // Sockets initialisieren { MessageBox("Sockets konnten nicht eingerichtet werden ! Evtl. fehlender TCP/IP-Stack!"); return FALSE; // zurück } CSocket m_Server; // erforderliches Socket-Objekt einrichten if(!m_Server.Create()) // Abfragen, ob Objekt erstellt werden konnte { MessageBox("Create des Sockets fehlgeschlagen! Initialisierungsfehler der Sockets !"); // Socket erstellen return FALSE; } if(!m_Server.Connect("192.168.100.10",25)) // unser E-Mail-Server mit Port 25(SMTP) { MessageBox("Connect zu Server fehlgeschlagen! Falsche IP oder Portnummer !"); // Connection aufgerufen m_Server.Close(); return FALSE; } /////////// HALLO MODUL /////////////////////////////// gethostname( lokaler_PC, 80 ); // lokaler PC-Name in String schreiben sHello.Format("HELO %s\r\n", (LPCTSTR)lokaler_PC); m_Server.Send((LPCTSTR)sHello, sHello.GetLength() ); // Hallo senden if(m_Server.Receive(m_ansbuf,1024)==SOCKET_ERROR) // Bestätigung vom Server holen (notwendig !!) { MessageBox("Fehler beim HELO"); m_Server.Close(); return FALSE; } ////////// MAIL FROM MODUL ///////////////////////// sFrom.Format( "MAIL From: <%s>\r\n", "Lager"); // VON m_Server.Send( (LPCTSTR)sFrom, sFrom.GetLength() ); if(m_Server.Receive(m_ansbuf,1024)==SOCKET_ERROR) // { MessageBox("Fehler bei Mail From !"); m_Server.Close(); return FALSE; } ////////// RCPT TO MODUL /////////////////////////////// MailTo.Format("RCPT TO: <%s>\r\n", (LPCTSTR)sEmail ); // AN m_Server.Send( (LPCTSTR)MailTo, MailTo.GetLength() ); if( m_Server.Receive( m_ansbuf, 1024 ) == SOCKET_ERROR ) { MessageBox("Fehler bei RCPT TO !"); m_Server.Close(); return FALSE; } /////////////// DATEN MODUL ////////////////////////// sTemp = "DATA\r\n"; m_Server.Send( (LPCTSTR)sTemp, sTemp.GetLength() ); if( m_Server.Receive( m_ansbuf, 1024 ) == SOCKET_ERROR ) // Datensignal { MessageBox("Fehler bei DATA !"); m_Server.Close(); return FALSE; } //////////// KOPF MODUL ////////////////// sTime=sTime.GetCurrentTime(); // aktuelle Systemzeit ermitteln sDatum=sTime.Format( "%a, %d %b %y %H:%M:%S %Z" ); // Für Server formatieren sHeader.Format( "Date: %s\r\n"\ "From: %s\r\n"\ "To: %s\r\n"\ "Subjekt: %s\r\n"\ "MM-Mailer: <%s>\r\n\r\n", (LPCTSTR)sDatum, (LPCTSTR)sBetreff, (LPCTSTR)MailTo, (LPCTSTR)sWemoNr, "MontageManager Mail" ); m_Server.Send( (LPCTSTR)sHeader, sHeader.GetLength() ); // Kopf senden ///////////// ENDE MODUL ///////////////////////////// sTemp = "\r\n.\r\n"; m_Server.Send( (LPCTSTR)sTemp, sTemp.GetLength() ); if( m_Server.Receive( m_ansbuf, 1024 ) == SOCKET_ERROR ) // Endesignal senden { MessageBox("Error beim END"); m_Server.Close(); return FALSE; } m_Server.Close(); // Socket schliessen return TRUE; // Mail erfolgreich versand ! }
14. März 200223 j Ein schönes Beispiel für einen SMTP-Client Nur eine Anmerkung: Das Programm prüft zwar, ob der SMTP-Server eine Antwort auf HELO, MAIL FROM, RCPT TO usw. sendet, aber es scheint nicht den Inhalt der Antwort zu prüfen. Die Antwort beginnt immer mit einer Zahl, die wiedergibt, ob die Eingabe gültig war. 250 bedeutet m.W. OK, alles über 400 ist ein Fehler.
15. März 200223 j @Klotzkopp: Richtig, die Methode prüft nur, ob der nächste Schritt ausgeführt werden kann... Damals war keine Zeit mehr dies einzubauen :WD Aber jeder kann sich die SMTP-Spezifikationen durchlesen und die Fehlercodes abfangen.
20. März 200223 j gethostname() reicht im allgemeinen nicht aus. Im SMTP Hello Kommando sollte nach Hello der Name der Domäne des Absenders stehen. Um den zu bekommen muß man mit dem lokalen Rechnernamen den gethostname() liefert, die funktion gethostbyname füttern. (liefert für den namen etwa host1.domaene.com) Näheres in der winsock2 api. Wenn es trotzdem funktioniert, dann weil es den meisten SMTP MTA (mail transfer agent) egal ist was hinterm Hello steht. Das heißt es wird von ihnen nicht überprüft, ob das tatsächlich eine existierende Domäne ist.
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.