Laden...

Outlook Timing / Objektprobleme

Erstellt von ChrisProg vor 2 Jahren Letzter Beitrag vor 2 Jahren 1.068 Views
ChrisProg Themenstarter:in
174 Beiträge seit 2009
vor 2 Jahren
Outlook Timing / Objektprobleme

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: > Fehlermeldung:

********** 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

D
261 Beiträge seit 2015
vor 2 Jahren

Zum eigentlichen Problem kann ich leider nichts beitragen.

...
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.

87 Beiträge seit 2016
vor 2 Jahren

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

16.832 Beiträge seit 2008
vor 2 Jahren

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

ChrisProg Themenstarter:in
174 Beiträge seit 2009
vor 2 Jahren

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... > Fehlermeldung:

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