TinTin Geschrieben 12. März 2002 Geschrieben 12. März 2002 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: Zitieren
Klotzkopp Geschrieben 12. März 2002 Geschrieben 12. März 2002 Du kannst ein mailto:-URL genau wie jeden anderen mit ShellExecute "ausführen": ShellExecute( NULL, "open", "mailto:recipient@sld.tld", NULL, NULL, 0 ); Zitieren
TinTin Geschrieben 12. März 2002 Autor Geschrieben 12. März 2002 merci, hat mir sehr geholfen. TinTin Zitieren
TinTin Geschrieben 13. März 2002 Autor Geschrieben 13. März 2002 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 Zitieren
Klotzkopp Geschrieben 13. März 2002 Geschrieben 13. März 2002 Also bei mir funktioniert das hier: ShellExecute( NULL, "open", "mailto:Klotzkopp0@compuserve.de?subject=foo&body=bar", NULL , NULL, 0 ); Zitieren
TinTin Geschrieben 13. März 2002 Autor Geschrieben 13. März 2002 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: Zitieren
mst Geschrieben 13. März 2002 Geschrieben 13. März 2002 Wahrscheinlich liegt es an dem verwendeten Mail-Client ob das subject und body der Kommandozeile richtig "übersetzt" werden. Evtl. reagiert Outlook anders als Netscape. Zitieren
Klotzkopp Geschrieben 13. März 2002 Geschrieben 13. März 2002 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. Zitieren
TinTin Geschrieben 13. März 2002 Autor Geschrieben 13. März 2002 liegt wohl an WIN98, unter win2k gehts, weiß der teufel warum! danke und Ciao TinTin Zitieren
Comroader Geschrieben 13. März 2002 Geschrieben 13. März 2002 Ist es eigentlich auch möglich die E-Mail mit ShellExecute gleich zu senden ???? Zitieren
Crush Geschrieben 13. März 2002 Geschrieben 13. März 2002 Geht das nicht auch mit System() irgendwie? Zitieren
Klotzkopp Geschrieben 14. März 2002 Geschrieben 14. März 2002 Das automatische Senden funktioniert, soweit ich weiß, nicht über das Ausführen eines mailto:-URL. Da würde ich dann eher MAPI empfehlen. Zitieren
gugelhupf Geschrieben 14. März 2002 Geschrieben 14. März 2002 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. Zitieren
Comroader Geschrieben 14. März 2002 Geschrieben 14. März 2002 Falls du das Beispiel mit den Sockets finden solltest, könntest du es ja mal in Forum stellen. Wäre sicherlich interessant !!! Zitieren
gugelhupf Geschrieben 14. März 2002 Geschrieben 14. März 2002 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 ! } Zitieren
Klotzkopp Geschrieben 14. März 2002 Geschrieben 14. März 2002 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. Zitieren
gugelhupf Geschrieben 15. März 2002 Geschrieben 15. März 2002 @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. Zitieren
maxim_42 Geschrieben 20. März 2002 Geschrieben 20. März 2002 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. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.