Ich möchte einfach ein Programm schreiben, in dem ich u.a. eine Mail verschicken kann.
Dabei ist es mir egal ob der Standard Mail client aufgerufen wird oder eine andere Lösung funktioniert.
Es sollte halt einigermaßen einfach umsetzbar sein.
Durch die geänderten Sicherheitsbestimmungen bei Google scheint es mit GMail in Verbindung mit SMTP auf C# nicht mit einem überschaubaren Aufwand möglich zu sein ein mail zu senden.
Ich weiß was VBA ist und habe das ganze Programm in VB realisiert und kann so eine Arbeit die normalerweise 30min dauert locker in 5 min erledigen.
Also das krieg ich nicht auf die Reihe. Hab noch keine Beschreibung gefunden wie ich den Token bekomme und in meiner App verifiziere und nutze.
Und wenn es so einfach wäre in 2021 ein gmail in einer app zu verschicken, hätte man sicher ein komplettes aktuelles Tutorial gefunden.
Ich hatte ja gefragt wie ich ein mail verschicken kann, am besten mit dem standrd mail client. Leider mit Attachment.
Stattdessen hatte ich das versucht:
System.Diagnostics.Process.Start("mailto:hush4@web.de?subject=test&body=teesttext");
Klappt, aber leider nicht mit attachment.
oder So habe ich es in VB gemacht:
In VB habe ich ein anderes Beispiel, das funktioniert:
'StörungsMenge
'** Vorgaben definieren
Set OutlookApp = CreateObject("Outlook.Application")
Set strEmail = OutlookApp.CreateItem(0)
'** PDF erzeugen
'ActiveWorkbook.
ActiveWorkbook.Sheets(1).ExportAsFixedFormat Type:=xlTypePDF, fileName:= _
PathFile, Quality:=xlQualityStandard _
, IncludeDocProperties:=False, IgnorePrintAreas:=False, OpenAfterPublish _
:=False
'** E-Mail versenden
strPDF = PathFile
With strEmail
.To = "GetGruppe" '"name@domain.tld"
.Subject = fileName + " als Anlage" 'Betreffzeile
.body = TextBlock
.Attachments.Add PathFile
.Display
'.Send 'Damit wir die E-Mail sofort versendet
End With
Ja, wieder eine Wissenschaft für sich.
Das Problem ist wohl die Authentifizierung unter gmail.
using (var client = new SmtpClient())
{
//client.Connect("smtp.gmail.com", 465, SecureSocketOptions.SslOnConnect);
client.Connect("smtp.gmail.com", 587, SecureSocketOptions.StartTlsWhenAvailable);
client.Authenticate("xxx", "ccc");
client.Send(message);
Klappt auch nicht: Application specific password required
Bei Google steht:
Postausgangsserver (SMTP)
smtp.gmail.com
SSL erforderlich: Ja
TLS erforderlich: Ja (falls verfügbar)
Authentifizierung erforderlich: Ja
Port für TLS/STARTTLS: 587
Wenn Sie Gmail über ein Konto in Ihrem Unternehmen oder Ihrer Bildungseinrichtung nutzen, fragen Sie Ihren Administrator nach der korrekten SMTP-Konfiguration.
Ich habe beide Varianten versucht, aber es haut nicht hin. Auch in meinem Gmail account habe ich imap aktiviert.
danke. So wie es aussieht muss ich Nuget für jede solution extra installieren?
Wie auch immer. Folgendes habe ich gemacht:
using MailKit;
using MimeKit;
using MailKit.Net.Smtp;
using MailKit.Security;
private void button1_Click(object sender, EventArgs e)
{
var message = new MimeMessage();
message.From.Add(new MailboxAddress("Joey", "xxx@gmail.com"));
message.To.Add(new MailboxAddress("Alice", "xxx@yahoo.com"));
message.Subject = "How you doin?";
message.Body = new TextPart("plain")
{
Text = @"Hey Alice,
What are you up to this weekend? Monica is throwing one of her parties on
Saturday and I was hoping you could make it.
Will you be my +1?
-- Joey
"
};
using (var client = new SmtpClient())
{
client.Connect("smtp.gmail.com", 465, SecureSocketOptions.SslOnConnect);
client.Authenticate("xxx", "xxx");
client.Send(message);
client.Disconnect(true);
}
Das compliliert, aber beim SEnden habe ich ein Problem mit Username Password
Ich dachte das diese Funktion mit ein paar Zeilen Code umsetzbar wäre, aber weit gefehlt. Ich meine es ist ja schon schwer gmail in Outlook zu konfigurrieren aber mit SMTP in C# kriege ich es nicht hin. Hier mein Versuch mit SMTP
try
{
MailMessage mail = new MailMessage();
SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com");
mail.From = new MailAddress("myUserName@gmail.com");
mail.To.Add("myDestination@yahoo.com");
mail.Subject = "Test Mail";
mail.Body = "This is for testing SMTP mail from GMAIL";
SmtpServer.Port = 465;// 587;
SmtpServer.EnableSsl = true;
SmtpServer.Credentials = new System.Net.NetworkCredential("myUserName", "myPasword");
SmtpServer.EnableSsl = true;
SmtpServer.Send(mail);
MessageBox.Show("mail Send");
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
Irgendwas scheint hier mit den notwendigen Security features für gmail noch zu fehlen. Diese sind: Gmail SMTP server address: smtp.gmail.com
Gmail SMTP username: Your Gmail address (for example, example@gmail.com)
Gmail SMTP password: Your Gmail password
Gmail SMTP port (TLS): 587
Gmail SMTP port (SSL): 465
Gmail SMTP TLS/SSL required: Yes
Dann habe ich von dem MimeKit gelesen. Ok nuget nie probiert aber irgendwie installiert. Using using MailKit; using MimeKit; genutzt und dann
private void button2_Click(object sender, EventArgs e)
{//https://www.mimekit.net/docs/html/Creating-Messages.htm
var message = new MimeMessage();
message.From.Add(new MailboxAddress("Herm", "jodahush@gmail.com"));
message.To.Add(new MailboxAddress("mann", "jodahush@yahoo.com"));
message.Subject = "How you doin?";
message.Body = new TextPart("plain")
{
Text = @"Hey Alice,
What are you up to this weekend? Monica is throwing one of her parties on
Saturday and I was hoping you could make it.
Will you be my +1?
-- Joey
"
};
}
da tut sich garnix, es fehlt ja auch irgend ein Befehl zum senden wie z.B. message.send(); aber das gibt es nicht.
Kann man nicht einfach den Standard mail client über c# ansprechen und diesem ein vorausgefülltes mail aus den Rippen leiern? Am liebsten die Windows Mail App. Wie auch immer, mal eben schnell ne mail schicken is wohl eher nicht möglich. Gibt es kein Rezept für Einsteiger?
Kaum zu Glauben, ich habe es hinbekommen.
Vielen Dank für deine Unterstützung.
Hier meine Lösung
So fülle ich den Chart:
//DS is the total Dirsize
for (int i = 0; i < DirNames.Count; i++)
{
try
{
// if (DirSz[i]>0)
{//MaxV
int PerSz = 0;
if (DirSz[i] > 0)
{
long PercSize = (DirSz[i] * 100 / (MaxV));
PerSz = Convert.ToInt32(PercSize);
}
//index name prozentwert
AddLVItem(i, DirNames[i], PerSz, DirSz[i] / 1024 / 1024);
//FillChart
//Loop through DirNames and DirSizes
MySeries.Points.Add(DirSz[i]);
MySeries.Points[i].LegendText = DirNames[i];
}
}
catch (Exception e)
{
MessageBox.Show(e.ToString()); //throw;
}
}
Und so zeige ich die Pie Legendentext an wenn ich auf das Chart klicke.
private void chart1_MouseClick(object sender, MouseEventArgs e)
{
int clkdGraphPoint;
string clkdGraphSeries = null;
System.Windows.Forms.DataVisualization.Charting.HitTestResult result = chart1.HitTest(e.X, e.Y);
try
{
clkdGraphPoint = result.PointIndex;
if (clkdGraphPoint >= 0)
{
clkdGraphSeries = result.Series.Points[clkdGraphPoint].LegendText;
StatusLabel1.Text = (clkdGraphSeries);
textBox1.Text = Path.GetFullPath(LastRoot + @"\" + clkdGraphSeries);
}
else
{
StatusLabel1.Text = ("nix da!");
}
}
catch (Exception)
{
StatusLabel1.Text = ("No valid area on chart");
//throw;
}
}
Danke.
Der Name ist blöd, hab ich bei vielen CopyPaste Aktionen irgendwo hergenommen. Da kommt jetzt was anderes hin.
Also so:
name der serie
Series MySeries = this.chart1.Series.Add(textBox1.Text);
MySeries.ChartType= SeriesChartType.Pie;
in der Schleife
//FillChart
//Loop through DirNames and DirSizes
MySeries.Points.Add(DirSz_);
MySeries.Name = DirNames_;
**
Ergebnis schon besser, allerdings zeigt die Legende nur points an**
Entsprechend klappt auch der MausClick nicht mehr richtig.
Scheint das mit dem name nicht richtig zu sein: MySeries.Name = DirNames_;
Danke schön.
Tja, die Northwind database hätte ich auch gerne genutzt/das Bsp. nachgebaut. Scheint aber auch nicht zu gehen. Man kann jetzt nur die Access DB nutzen, oder?
Gut, zur Frage: Wie kann ich das BarChart als Pie darstellen.
Als Balken Chart klappt das ganze, auch soweit, dass ich interaktiv auf die Balken klicken kann und das Label sehe. Allerdings scheitere ich beim Pie (unabhängig davon sehe ich die Darstellung des Pie mittlerweile eher kritisch, weil die Anzahl der Items oft zu hoch ist. Trotzdem würde ich es gerne verstehen.).
Series series = this.chart1.Series.Add(DirNames[i]);
chart1.Series[i].ChartType = SeriesChartType.Pie;
series.Points.Add(DirSz[i]);
Bei diesem Beispiel führt die zweite Zeile dazu dass ich nur ein Collection Element sehe (also einen Vollkreis, kein PieChart). Es sollten aber mehrere sein. Wie gesagt, als Balkenchart klappt das ganze (ohne Zeile 2)
Die Series_ verstehe ich nicht. Series Serie ist eine neue Serie, zu der ich Elemente hinzufüge. Ich kann die series aber nicht als Pie definieren, sondern nur die addierten series** Elemente.
Nach meiner Denke würde man mit chart1.Series auch den Typ bestimmen können. Ist aber nicht möglich. Man kann nur die Collection hinzufügen.
Der Collection (Series_) kann man einen Typ verpassen - was für mich unlogisch erscheint, da ich am Ende ein Chart erzeugen könnte bei dem jede Collection ein eigener Typ ist, wobei das zu einem Laufzeit Fehler führt.
Ich habe mich mit dem Chart rumgeschlagen und dachte ich hätte die Lösung. (Zumindest für den Chart, nicht für den Wait Cursor)
Tatsächlich klappte sie in einem Projekt mit Balkenchart.
siehe hier:
private void chart1_MouseDoubleClick(object sender, MouseEventArgs e)
{
int clkdGraphPoint;
string clkdGraphSeries = null;
System.Windows.Forms.DataVisualization.Charting.HitTestResult result = chart1.HitTest(e.X, e.Y);
try
{
clkdGraphPoint = result.PointIndex;
if (clkdGraphPoint > 0)
{
clkdGraphSeries = result.Series.Name;
StatusLabel1.Text = (clkdGraphSeries);
}
else
{
StatusLabel1.Text = ("nix da!");
}
}
catch (Exception)
{
StatusLabel1.Text=( "No valid area on chart");
//throw;
}
}
nun habe ich hier aber ein Pie Chart und das ganze funzt nicht mehr
Vielleicht liegt es dran, wie ich das Chart gefüllt habe - selbst wenn ich ein Pie wähle wird es wieder ein BarChart
public void BarExample()
{
this.chart1.Series.Clear();
// Data arrays
string[] seriesArray = { "Cat", "Dog", "Bird", "Monkey" };
int[] pointsArray = { 2, 1, 7, 5 };
// Set palette
this.chart1.Palette = ChartColorPalette.EarthTones;
// Set title
this.chart1.Titles.Add("Animals");
// Add series.
for (int i = 0; i < seriesArray.Length; i++)
{
Series series = this.chart1.Series.Add(seriesArray[i]);
series.Points.Add(pointsArray[i]);
}
}
private void Form1_Load(object sender, EventArgs e)
{
BarExample();
}
Möglicherweise muss ich die Chartelemente anders in das Chart reinschreiben. Ich habe es so gemacht:
chart1.Series["DirSizes"].Points.AddXY(DirNames[i], DirSz[i]);
}