Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Outlook Timing / Objektprobleme
ChrisProg
myCSharp.de - Member

Avatar #avatar-3533.jpg


Dabei seit:
Beiträge: 170
Herkunft: Cloppenburg

Themenstarter:

Outlook Timing / Objektprobleme

beantworten | zitieren | melden

Hallo zusammen,

ich erstelle per Microsoft.Office.Interop.Outlook E-Mails (soweit ja kein Problem...)


public void send()
{
try
{
    if (System.Diagnostics.Process.GetProcessesByName("OUTLOOK").Count() > 0)
    {
        try
        {
            lo_OutApp = Marshal.GetActiveObject("Outlook.Application") as Outlook.Application;
        }
        catch (COMException ex) { Fehlermeldung.ErrorMessage(ex); }
    }
    else
    {
        try
        {
            lo_OutApp = new Microsoft.Office.Interop.Outlook.Application();
        }
        catch (COMException ex)  {  Fehlermeldung.ErrorMessage(ex); }
    }
    if (lo_OutApp != null)
    {
          lo_NSpace = lo_OutApp.GetNamespace("MAPI");
         (usw)...
    }
}
catch (Exception ex) {Fehlermeldung.ErrorMessage(ex); }
}

beim Massenversand habe ich nun feststellen müssen , das der Aufruf


lo_OutApp = new Microsoft.Office.Interop.Outlook.Application();
recht lange dauert (gefühlt fast zwei Sekunden) ...

Also habe ich folgendes versucht, um das etwas zu beschleunigen ...


public class sendmail
{
        #region Outlook
        Microsoft.Office.Interop.Outlook.Application lo_OutApp = null;
        Microsoft.Office.Interop.Outlook.NameSpace lo_NSpace = null;
        Microsoft.Office.Interop.Outlook.MAPIFolder lo_Folder = null;


        public Boolean Outlook_starten()
        {
            Boolean x_retwert = true;
            if (System.Diagnostics.Process.GetProcessesByName("OUTLOOK").Count() > 0)
            {
                try
                {
                    lo_OutApp = Marshal.GetActiveObject("Outlook.Application") as Outlook.Application;
                }
                catch (COMException ex) { x_retwert = false; }
            }
            else
            {
                try
                {
                    lo_OutApp = new Microsoft.Office.Interop.Outlook.Application();
                }
                catch (COMException ex) { x_retwert = false; }
            }
            return x_retwert;
        }

         public void send()
        {
            if (lo_OutApp != null)
           {
                lo_NSpace = lo_OutApp.GetNamespace("MAPI");
                (usw)...
            }
        }
}
public void xyz()
{
    sendmail x_sendmail = new sendmail();
     if (x_sendmail.Outlook_starten())
     {
          foreach()
         {
               ...
               x_sendmail.send();
               ...
          }
     }
}

Das funktioniert bei der ersten E-Mail einwandfrei, bei der zweiten knallt es dann beim Aufruf von


lo_NSpace = lo_OutApp.GetNamespace("MAPI");

mit folgender Fehlermeldung:
Fehler
********** Fehlermeldung vom : 03.06.2021 10:22:20 **************************************************
Meldung: Der RPC-Server ist nicht verfügbar. (Ausnahme von HRESULT: 0x800706BA)
bei Microsoft.Office.Interop.Outlook.ApplicationClass.GetNamespace(String Type)
****************************************************************************************************

Google zählt verschieden Dinge auf, die aber irgendwie nichts mit Outlook zu tun haben...

geht so etwas nicht, oder was übersehe ich ?

Ich weiß, das ich das vermutlich auch mit EWS lösen könnte, aber da der Kunde wünscht, das (zu Kontollzwecken) die Mails nicht sofort raus gehen, muss die Möglichkeit des Offline-Betriebes möglich sein - u. da weiß ich nicht, ob das mit EWS möglich ist (wenn ich das richtig verstanden habe, dann übergeht EWS ja Outlook, richtig?)...


MfG Christian
private Nachricht | Beiträge des Benutzers
dannoe
myCSharp.de - Member



Dabei seit:
Beiträge: 173

beantworten | zitieren | melden

Zum eigentlichen Problem kann ich leider nichts beitragen.
Zitat von ChrisProg
...
Ich weiß, das ich das vermutlich auch mit EWS lösen könnte, aber da der Kunde wünscht, das (zu Kontollzwecken) die Mails nicht sofort raus gehen, muss die Möglichkeit des Offline-Betriebes möglich sein - u. da weiß ich nicht, ob das mit EWS möglich ist (wenn ich das richtig verstanden habe, dann übergeht EWS ja Outlook, richtig?)...
...

Das sollte gehen. Die E-Mails werden dann halt nur in einem Ordner abgelegt und müssen manuell versendet werden.

CreateItem
Und dann mit MessageDisposition = "SaveOnly" in einen Ordner speichern.
private Nachricht | Beiträge des Benutzers
glandorf
myCSharp.de - Member

Avatar #avatar-4144.jpg


Dabei seit:
Beiträge: 66
Herkunft: Chemnitz

beantworten | zitieren | melden

Hallo,

der Fehler kommt von der Microsoft COM-Schnittstelle. Du kannst dir dazu mal NetOffice anschauen, das kapselt den ganzen Office-COM-Kram.
Wenn möglich verzichte auf die COM-Schnittstellen bei der Massenverarbeitung.

PS: Du gibst die ganzen COM-Objekte nicht frei, dass ist aber dringend erforderlich.


Marshal.ReleaseComObject(..)


glandorf
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15817
Herkunft: BW

beantworten | zitieren | melden

Man würde das über sehr viele Mittel lösen, aber niemals mit (nicht so wirklich stabiler) Outlook automatisierung.
COM ist für sowas nicht ausgelegt.

Nimm für Massenmails entweder die EWS Schnittstelle, oder noch besser entsprechende Mail Provider, die auf sowas ausgelegt sind.
Der aktuell günstigste ist AWS Simple Mail Service. Siehe mein Beitrag in [Artikel] Die myCSharp.de Infrastruktur
private Nachricht | Beiträge des Benutzers
ChrisProg
myCSharp.de - Member

Avatar #avatar-3533.jpg


Dabei seit:
Beiträge: 170
Herkunft: Cloppenburg

Themenstarter:

beantworten | zitieren | melden

Hallo,

danke für die Tips ...

Zur EWS-Schnittstelle:

irgendwie begreife ich nicht, was AutodiscoverUrl jetzt wirklich für einen Wert von mir erwartet ?
(bei Google hab ich schon alles gesehen von Web-Adressen, Email-Adressen, UserName, etc... wobei das wahrscheinlich mit den verschieden Exchange-Servertypen (Netzwerk, Internet) zusammen hängt)

Ich will auf einen lokalen (in Netzwerk) Exchange-Server zugreifen , also ...


//Initialize Service
ExchangeService service = new ExchangeService();
//Use Integrated Authentification
service.UseDefaultCredentials = true;
und dann muss ich anscheinend den Zugriff benennen:


//Autodiscover Settings
service.AutodiscoverUrl(xxxx, RedirectionUrlValidationCallback);


Was kommt da jetzt rein ?

nehme ich meine E-Mail-Adresse läufts auf einen Fehler...
Fehler
the autodiscover service couldn´t be located.
Was wohl bedeutet, das dieser Dienst nicht installiert / freigeschaltet ist (also mit der IT reden ...)

Wobei ich auch irgendwie nicht verstehe, warum ich das brauche / dort was eintragen muss, denn ich will ja mit


service.UseDefaultCredentials = true;
die gespeicherten Anmeldedaten benutzen ...

Ich will ja nicht für jeden Rechner, auf dem dieses Programm ausgeführt wird, die Userdaten / E-Mail-Adressen / Passworte fest hinterlegen.
Gibt es keine Möglichkeit über das Intranet sich einfach "nur" einzuloggen ? Der User hat ja schon durch seine Anmeldung das Recht auf Exchange zuzugreifen, sonst würde Outlook ja nicht arbeiten, oder ?


Kann da jemand mal bitte Licht ins Dunkel bringen ?

MfG Christian
private Nachricht | Beiträge des Benutzers