MAIL erstellen, unerklärliches Problem.



  • Hi,

    also ich arbeitet momentan an ein Projekt, womit es möglich sein soll eine Mail zu erstellen (inkl. Betreff, Absender, Empfänger, Anhang), die über Outlook versendet werden kann (aktu. angemeldeten Account).

    Ich habe das schon in einen anderen Forum gefragt, allerdings wusste da -bisher- keiner wirklich bescheid.

    Also erstmal der Code :

    using System;
    using System.Drawing;
    using System.Collections;
    using System.ComponentModel;
    using System.Windows.Forms;
    using System.Data;
    using _C= System.Console;
    
    //using MSExcel=Microsoft.Office.Interop.Excel;
    using MSOutlook=Microsoft.Office.Interop.Outlook; 
    using System.Runtime.InteropServices;
    using System.Reflection; 
    //using Office = Microsoft.Office.Core;
    
    namespace MailTest
    {
    	/// <summary>
    	/// Summary description for Form1.
    	/// </summary>
    	public class Form1 : System.Windows.Forms.Form
    	{
                       ....
    
                       ....
    private void button1_Click(object sender, System.EventArgs e)
    		{
    
    			string empfänger, betreff, absender;
    			_C.Write(" Empfänger : ");
    			empfänger=_C.ReadLine();
    			_C.Write(" Betreff   : ");
    			betreff=_C.ReadLine();
    			_C.Write(" Absender  : ");
    			absender=_C.ReadLine();
    
    			MSOutlook.Application outlook;
    
    			try 
    			{
    				outlook = (MSOutlook.Application) System.Runtime.InteropServices.Marshal.GetActiveObject("Outlook.Application");
    			}
    			catch(System.Exception exc)
    			{
    				outlook = new MSOutlook.ApplicationClass();
    			}
    
    MSOutlook.MailItem mail = new MSOutlook.MailItemClass();
    
    			mail.Recipients.Add(empfänger);
    			mail.SentOnBehalfOfName = absender;
    			mail.Subject = betreff;
    			mail.BodyFormat = MSOutlook.OlBodyFormat.olFormatPlain;
    			mail.Body = "Test!";
    			mail.Body = "TEST!";
    			mail.Display(mail);
    		}
    }
    }
    

    Das ist eigentlich soweit richtig, da ich das von einer Vorlage erstellt habe.
    Das PRoblem dabei ist dieses :

    C:\...\MailTest\Form1.cs(10): The type or namespace name 'Interop' does not exist in the class or namespace 'Microsoft.Office' (are you missing an assembly reference?)
    

    Tjo, manche sagen jetzt, wo ist das Problem einfach Ref... so einfach ist das leider nicht, merkte ich...

    Ich habe folgende Referencen eingebaut :

    Microsoft Office 11.0 Object Libary
    Microsoft Outlook 11.0 Object Libary
    

    Die benötigt man eigentlich dafür, das Problem dabei ist, das ich maximal bis Microsoft.Office komme, danach kann ich nur noch .Core auwählen und kein .Interop .

    Ich hoffe hier kan mir jemand helfen und mir sagen, was evtl. falsch sein könnte.

    Ich muss dieses Projekt diese Woche noch fertig bekommen, das ist das Problem dabei 😕

    Danke für eure Hilfe.
    Gruß.



  • Also, ich kenne mich mit der Fernsteuerung von Office unter .NET nicht aus, aber unter COM würde ich für das Versenden von E-Mails die CDO (Collaboration Data Objects) verwenden, denn die sind dafür da. (Es gibt unter .NET zwar auch Klassen zum Ansteuern eines SMTP-Servers, aber das lassen wir mal beiseite.)

    Outlook nur für das Versenden von E-Mails fernzusteuern ist überflüssig und frisst zuviele Ressourcen. Ich würde Outlook nur verwenden, um die GUI-Elemente von Outlook anzusteuern.

    Übrigens verwendet Outlook selbst die CDO zum Versenden und Empfangen von E-Mails und ist quasi nur die GUI, die über die CDO drüber gestülpt wurde.

    TIPP: Zum Versenden von E-Mails würde ich überlegen, MAPI zu verwenden, wenn deine Software auch auf Rechnern funktionieren soll, die kein Outlook sondern ein anderes E-Mail-Programm installiert haben.

    HTH,
    Axel



  • Naja, allerdings unterwas steht die CDO ?
    Auch unter COM oder .NET ?

    Ich habe schon unter .NET und CDO gesucht, allerdings hatte ich weder unter Collaboration Data Objects noch unter CDO etwas gefunden. Bis auf diese CDOSYS.dll.
    Ist das diese ?

    Ich denke mal, wenn ich das verwende, würde das wieder dazu führen einen komplett neuen Code zu programmieren.
    Allerdings habe ich nicht mehr allzu viel Zeit (morgen muss ich fertig sein) deswegen würde ich gerne bei Outlook bleiben, obwohl es natürlich besser ist, ein Programm zu schreiben, mit den man ohne Outlook E-Mails versenden kann.
    Problem ist nur, das die Funktionalität ausreichen muss, sprich: ich müsste die Mail von Betreff, über Absender und Empfänger sowie 'Nachrichtenfeld' + Anhänge bearbeiten können.

    Allerdings stelle ich gerade fest, wenn ich die Referencen nicht benutzen kann, so ist auch der Rest des Programmes sinnlos.
    D.h. mit den Programm ist es auch möglich, ein FAX zu schreiben und zu speichern, das Daten aus einer Excel-Datenbank (vorgegeben) ausließt und die in dem FAX unterbringt.

    Das Problem dabei ist, das ich

    using MSExcel=Microsoft.Office.Interop.Excel;
    

    Nicht einbinden kann, da er immer bei Interop meckert.
    Ich habe das schon in einen anderen Forum bequatscht, allerdings meldet sich da keiner mehr.
    Warscheinlich, weil die Nachricht doch etwas zu lang war 😕

    Ich wäre froh, wenn ihr mir helfen könntet.
    Bis dann...



  • kannst du mal den ganzen Code posten bzw. irgendwo zum download bereit stellen?



  • An die CDO (die wie ich jetzt sehe, sich sogar als MAPI meldet) kommst du, indem du...

    1. (wie immer) mit rechts auf "Verweise" klickst,
    2. "Verweis hinzufügen..." wählst,
    3. den "COM"-Reiter anklickst,
    4. "Microsoft CDO 1.21 Library" auswählst.

    Deine ersten Zeilen im Code wären dann (wahrscheinlich - hab keine Erfahrung):

    MAPI.SessionClass mapiSess=new MAPI.SessionClass();
    

    Rest steht in der MSDN unter CDO. Ist übrigens dasselbe Objektmodell wie unter Outlook, musst also nicht viel Neues lernen.

    Viel Spaß! 🙂
    Axel



  • Hi,

    also, bei mir waren die Microsoft.Office.Interop... noch nicht installiert die musste ich erst hinzufügen.

    Allerdings funktioniert der ganze Spass immer noch nicht.

    Folgende Fehlermeldung:

    C:\...\TestMailing\Class1.cs(25): 'Microsoft.Office.Interop.Outlook.MailItemClass' denotes a 'class' which is not valid in the given context
    

    In einen anderen Forum, sagte man mir, das ich vererben soll. Allerdings weiss ich nicht von wo und was geerbt werden soll.
    Irgendwie steig ich da nicht mehr richtig durch.

    Hier ist der Code von einen Testprogramm, was ich geschrieben habe.
    Das Programm soll nur die Funktion eine Mail zu erstellen (und evtl. wegschicken) erfüllen.
    Für mehr ist das nicht da:

    using System;
    //using MSExcel=Microsoft.Office.Interop.Excel;
    using MSOutlook=Microsoft.Office.Interop.Outlook;
    using System.Runtime.InteropServices;
    using System.Reflection; 
    
    class TestMailing
    {
    	void Main()
    	{
    		// Variable für die laufende Outlook-Instanz anlegen
    		MSOutlook.Application outlook;
    
    		try
    		{
    			// Laufende Outlook-Instanz ermitteln
    			outlook = (MSOutlook.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Outlook.Application");
    		}
    		catch (System.Exception ex)
    		{
    			// Neue Outlook-instanz öffnen
    			outlook = new MSOutlook.ApplicationClass();
    		}
    		// Neue E-Mail in Outlook erzeugen
    		MSOutlook.MailItem mail =  new MSOutlook.MailItemClass(); //hier kommt der Fehler bei dem New.
    
    		string betreff="TestMailing", empfänger="lala@lala.net";
    
    		// E-Mail Eigenschaften festlegen
    		mail.Recipients.Add(empfänger); // Empfänger zufügen
    		mail.Subject = betreff; // Betreffzeile
    		mail.BodyFormat = MSOutlook.OlBodyFormat.olFormatPlain; // Body als Text
    		// mail.Display(); // Outlook-Mail anzeigen
    		// mail.Send(); // Mail sofort versenden
    	}
    }
    

    Bis dann.



  • Versuchs mal damit:

    Outlook._MailItem oMailItem = (Outlook._MailItem)oApp.CreateItem(Outlook.OlItemType.olMailItem);

    oAPP ist in meinem Fall die Outlook Instanz.

    Viel Glück!

    Tigerkatze


Anmelden zum Antworten