C# Email aus Programm versenden

alebec7 schrieb:
@ andr_gin:

Deine While- Schleife sieht mir sehr nach VB aus? Ich benutze aber C#. Und was ist "OutQueue"?

Ja sorry habe nicht genau geschaut. Das funktioniert in C# aber genauso.
Outqueue ist einfach der Variablennamen der Queue:

Queue OutQueue=Queue.Synchronized(new Queue());

In C# müsste die Schleife im Timer ca. so aussehen:
Code:
String Message="";
while(OutQueue.Count>0)
{
          Message += OutQueue.Dequeue();
}
RTF_Out.AppendText(Message);

kreadon schrieb:
Das kannst dir in Zukunft sparen wenn du folgenden Code zum Aktualisieren der Progressbar verwendest.
Code:
pgb1.Value = [B](pgb1.Value % pgb1.Maximum)[/B] + 1;

Und dann habe ich genau 2 Byte zu viel, weil ich z.B. ein Verzeichnis durchgelesen habe und irgendwer in der Zwischenzeit 2 Byte an eine Datei angehängt hat (Log Dateien sind da ein typischer Kandidat dafür) und ich bei 10GB und 2 Byte bin von 10GB. Dann habe ich keine volle Progressbar am Schluss, sondern eine leere. Das ist nicht unbedingt das, was ich mir vorstelle:D
Da ist Max.Min(NewValue,PRG_Main.MaxValue) schon etwas sinnvoller.
Einmal abgesehen davon gibt es dann immer noch ein Problem, wenn ich MaxValue verringern will;)
 
Code:
Noch eine Frage dazu , hat es einen besondern Grund warum du nicht das SendAsync der class SmtpClient verwendest? (Das ist der 2. Loesungsansatz.)

Also, ich habe anstatt "client.send(message);" die Varinate "client.SendAsync(message,"??");" genommen. Leider habe ich keine Ahnung, was er beim 2. Argument "object userToken" will. Da musst du mir nochmal helfen. :rolleyes:
 
andr_gin schrieb:
Und dann habe ich genau 2 Byte zu viel, weil ich z.B. ein Verzeichnis durchgelesen habe und irgendwer in der Zwischenzeit 2 Byte an eine Datei angehängt hat (Log Dateien sind da ein typischer Kandidat dafür) und ich bei 10GB und 2 Byte bin von 10GB. Dann habe ich keine volle Progressbar am Schluss, sondern eine leere. Das ist nicht unbedingt das, was ich mir vorstelle:D

Nun das beist sich aber dann mit der Aussage deines 1. Threads ;) siehe unten ;)

andr_gin schrieb:
Gerade der Status einer ProgressBar ist etwas, wo man es mit der Thread Synchronisations nicht so genau nehmen muss....
Wenn da einmal alle 100 Jahre eine Operation verloren geht und diese 1 Byte zu wenig anzeigt, dann wird das niemanden umbringen. Wenn nur ein Thread schreibt und einer liest, dann kann es bei einem Integer auch zu keinen Problemen kommen.

Ausserdem ist eine Progressbar fuer mich nur ein Hilfsmittel und keine Raketentechnik die den Status einer Operation auf Byte genau anzeigen muss. Sondern ist ein Hilfsmittel damit der User weiss das die App noch arbeitet... (Ich zaehle dann alle 1000ms hoch) ;)

andr_gin schrieb:
Da ist Max.Min(NewValue,PRG_Main.MaxValue) schon etwas sinnvoller.
Einmal abgesehen davon gibt es dann immer noch ein Problem, wenn ich MaxValue verringern will;)
Musste ich bisher noch nie. Wenn es wichtig war habe ich das anders Protokolliert. (Als nur im OProgressbar darzustellen).

@TE:
alebec7 schrieb:
Code:
 Leider habe ich keine Ahnung, was er beim 2. Argument "object userToken" will. Da musst du mir nochmal helfen. :rolleyes:[/QUOTE]
Dann versuch den 1. Ansatz zu vervollstaendigen, ist wirklich nicht viel zu tun.

Dann helfe ich dir gerne bei der 2. Loesung.
Wie wollen ja das du was lernst ;)

BTW: [URL="http://msdn.microsoft.com/en-us/library/x5x13z6h.aspx"]Google [/URL]ist sehr wichtig beim proggen, das meiste ist englisch ;)
EDIT: Link added
 
Zuletzt bearbeitet:
Also ich kann mich mit dem asynchronen Senden/Empfangen auch nicht wirklich anfreunden. Das war zu Zeiten, wo es noch keine brauchbaren Thread Implementierungen (VB6) notwendig, aber heutzutage ist das eher unnötig. Da kommt nur Spaghetticode heraus und in den meisten Fällen ist das Ganze mit eine Thread viel besser gelöst.
 
andr_gin schrieb:
Also ich kann mich mit dem asynchronen Senden/Empfangen auch nicht wirklich anfreunden. Das war zu Zeiten, wo es noch keine brauchbaren Thread Implementierungen (VB6) notwendig, aber heutzutage ist das eher unnötig. Da kommt nur Spaghetticode heraus und in den meisten Fällen ist das Ganze mit eine Thread viel besser gelöst.

Ob du dich damit anfreunden kannst oder nicht steht ja gar nicht zu Diskussion.

Sinnvoll kann das Asynchrone Senden/Empfangen von Mail sehr wohl sein :stacheln: und spagetti Code kommt im Grunde nur dann rauis wenn man nicht weis was man tut ;)

Auf jeden Fall gibt es sehr wohl valide Anwendungsfaelle um Mails asynchron zu versenden.

Jetzt sollten wir uns aber wieder zurueckbesinnen und versuchen dem TE das Projekt auf die Beine zu stellen.
 
kreadon schrieb:
Nun das beist sich aber dann mit der Aussage deines 1. Threads ;) siehe unten ;)

Ich meinte damit, dass manchmal eine Race Condition in Kauf genommen wird und dann die Folgen, dass sie Progressbar um eine Operation falsch geht. Bei dir würde es bei einigen meiner Programme etwas ganz falsches an. In vielen Fällen ist MaxValue vorher nur ungefähr bekannt (z.B. bei einem Sicherungsskript die Größe der letzten Sicherung).

Ausserdem ist eine Progressbar fuer mich nur ein Hilfsmittel und keine Raketentechnik die den Status einer Operation auf Byte genau anzeigen muss. Sondern ist ein Hilfsmittel damit der User weiss das die App noch arbeitet... (Ich zaehle dann alle 1000ms hoch) ;)

Was glaubst du, warum es MinValue und MaxValue gibt. Gerade dafür, dass ich sage wie viele Schritte sind zu tun und wie viele habe ich bereits getan. Dann kann der User nicht nur sagen, ob es abgestürzt ist, sondern auch, ob es sich auszahlt, dass er sich inzwischen eine andere Arbeit sucht oder nicht.

Musste ich bisher noch nie. Wenn es wichtig war habe ich das anders Protokolliert. (Als nur im OProgressbar darzustellen).

Du kannst auch alles in % umrechnen und dann herumdividieren. Ist auch nicht wirklich viel besser...

kreadon schrieb:
Ob du dich damit anfreunden kannst oder nicht steht ja gar nicht zu Diskussion.

Sinnvoll kann das Asynchrone Senden/Empfangen von Mail sehr wohl sein :stacheln: und spagetti Code kommt im Grunde nur dann rauis wenn man nicht weis was man tut ;)

Auf jeden Fall gibt es sehr wohl valide Anwendungsfaelle um Mails asynchron zu versenden

Ich würde die Mails einfach in eine weitere synchronisierte Queue stopfen und dann in einem eigenen Thread versenden (bzw. bei höherer Last mehrere). Dann hat man es schön verteilt. Hier würde es sicher reichen einmal in der Sekunde zu pollen. Das lastet einen Kern zu ca. 0,001% aus, also auch nicht wirklich ein Problem. Dann hat man wieder eine Stelle im Code, wo man bei Bedarf alle gesendeten Emails mitloggen kann und bei höherer Systemlast die Mails auch priorisieren kann.

@alebec: Ist das Tool so eine Art Fehlerberichtserstattung für diverse User, die alle eine andere EDV Umgebung haben. In diesem Fall wirst du das mit dem automatischen Versenden nicht richtig hinbekommen. Hier wird es nur gehen, wenn du das Standardemailprogramm öffnest und Empfänger und Betreff einfügst oder das ganze nicht per Email machst sondern eine TCP Verbindung zu einem Server von dir erstellst, der die Berichte entgegennimmt.
 
andr_gin schrieb:
@alebec: Ist das Tool so eine Art Fehlerberichtserstattung für diverse User, die alle eine andere EDV Umgebung haben. In diesem Fall wirst du das mit dem automatischen Versenden nicht richtig hinbekommen. Hier wird es nur gehen, wenn du das Standardemailprogramm öffnest und Empfänger und Betreff einfügst oder das ganze nicht per Email machst sondern eine TCP Verbindung zu einem Server von dir erstellst, der die Berichte entgegennimmt.

Dieses Mail- Programm soll später (wenn es fertig ist^^) in ein größeres Programm eingebunden werden. Der Sinn dabei ist, dass die Benutzer eine Fehlermeldung oder was auch immer an den Hausinternen Mailserver schicken können. Es werden also keine Nachrichten nach außen versendet.

@kreadon: Könntes du mir einen Tipp geben, an welcher Stelle des Programms ich "invoke" anwenden soll. Ich habe gestern noch 1h probiert und probiert aber kein Erfolg gehabt. :(
 
alebec7 schrieb:
@kreadon: Könntes du mir einen Tipp geben, an welcher Stelle des Programms ich "invoke" anwenden soll. Ich habe gestern noch 1h probiert und probiert aber kein Erfolg gehabt. :(

Hab ich doch schon :) aber hier gerne nochmal.
Die erklaerung ist im post.
kreadon schrieb:
Nun, die Exception kommt bei Zeile 91,
Code:
message.Subject = cb_subject.Text; //cb_subject.Text;         //Combobox
 
Ich komme einfach nicht weiter:
wenn ich bei Zeile 91 des Programms mit invoke arbeiten soll, dann muss ich doch nach "message.Subject = cb_subject.Invoke();" die Delegate Methode reinschreiben? Aber die kann ich nicht verwenden.
 
Ok tipp,
rufe anstelle der zeile eine ueberladene Methode (die du noch implementieren musst) des Generic delegate auf.

Die Methoden Rumpf sieht bei mir so aus :
void SetMessageSubject(MailMessage message, ComboBox cbo)
{
// Hier kommt deine implementierung rein
}
 
So, ich habs endlich geschafft!^^

Nach langem probieren geht jetzt das Versenden von E- Mails mit Betreff und Inhalt. Das mit der Progressbar habe ich Übergangsweise mit der For- Schleife realisiert.

Ich habe es aber ein wenig anders realisiert als hier beschrieben wurde:

string subj = ""; // lokale Variable für das Subject in der Mail
string bodi = ""; // lokale Variable für den Inhalt (Body) der Mail

private void button2_Click(object sender, EventArgs e)
{
subj = cb_subject.Text;
bodi = rtb_body.Text;

// Backgroundworker- Prozess wird gestartet
bgw1.RunWorkerAsync();

}

Und schon war das Problem mit dem Threadübergreifendem Prozess verschwunden.
 
Gratuliere, ja viele Wege fueren nach Rom ;)

Hier nochmal dein Code in dem die Loesung mit dem Invoke realisiert ist. (Deinem 1. Plan)

Lg

Kreadon

EDIT: Deutschen Satz gebildet ;)
 

Anhänge

Zuletzt bearbeitet:
Zurück
Oben