none
Mail über SMTP Server verschicken

    Frage

  • Hallo zusammen,

    in meiner MDB, die erfolgreich als Dienst läuft, werden täglich Mails verschickt. Prinzipiell funktioniert das auch. Mit diesem Code funktioniert der Versand über den Exchange mit dem Port 587 und der damit notwendigen Authentifizierung einwandfrei. Mich stört das Passwort im Code. Werden die Mails über Port 25 und ohne Authentifizierung verschickt, werden die Mails als Spam klassifiziert und bei den Usern im Junk Mail Ordner einsortiert. Die Benutzer tun sich bekanntlich sehr schwer mit der neuen Situation und ich möchte es ganz einfach abstellen.

        Dim CDOMSG As Object
        Set CDOMSG = CreateObject("CDO.message")
        With CDOMSG.Configuration.Fields
            .Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 'NTLM method
            .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = strSMTPServer
            .Item("http://schemas.microsoft.com/cdo/configuration/smptserverport") = 587
            .Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
            .Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
            .Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 60
            .Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "Beutzername@domain.TLD" 
            .Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "GeheimesPW"
            .Update
        End With
        ' build email parts
        With CDOMSG
            .To = strMailEmpfaenger
            .From = strAbsendername & " " & strAbsendermail
            .Subject = strBetreff
            .TextBody = strText
            .send
        End With
        Set CDOMSG = Nothing

    Ursache ist das Senden der Mails ohne Authentifizierung am Exchange.

    smtpauthenticate" = 0

    Für .Net gibt es eine Klasse: http://msdn.microsoft.com/de-de/library/system.net.mail.smtpclient.aspx Die habe ich in einem .Net Programm auch erfolgreich im Einsatz. Das wichtige daran ist:  .UseDefaultCredentials = True. Damit kann ich den Port 587 zur Übergabe an den Exchange angeben, schon wird der ausführende Benutzer mit seinen Anmeldedaten am Exchange authentifziert und kann das Mail übergeben. Und dieses Mail wird mehr als Spam klassifiziert, denn im Header ist dieser Eintrag zu finden: X-MS-Exchange-Organization-AuthAs: Internal Und es wird kein Passwort im Code benötigt.

    Nun zur Frage, hat jemand eine Idee wie und ob man die Klasse von .Net in Access VBA einbinden kann?

    EDIT: Ich nehme natürlich auch Ideen oder andere Klassen gerne auf, sofern ich nicht das PW im Klartext im Code hinterlegen muss. ;)

    Servus

    Winfried

    X-Used_WebInterface=True


    Donnerstag, 8. November 2012 15:52

Antworten

Alle Antworten

  • Jo. In dem du das ganze in .Net schreibst und COM-Visible machst. Dann kannst du es über die Referenzen einbinden und ansprechen. Z.B. Making a .NET Dll COM-Visible.

    Donnerstag, 8. November 2012 16:06
    Moderator
  • Wow, das ging ja flott. Danke. ;)


    Geht das auch mit VS2005? Etwas anderes habe ich nicht zur Verfügung.


    Ich habe in der neu erstellten DLL also nur die funktionierende Function zum versenden des Mail drin, richtig? Hmm, ist das wirklich so 'einfach'? Das ist der Code in dem .Net Programm.


    Imports System.Net.Mail
    
    Module modNachrichtVersenden
    
        Public Sub NachrichtVersenden(ByVal absender As String, ByVal empfänger As String, _
                                       ByVal kopieEmpfänger As String, ByVal betreff As String, _
                                      ByVal mailText As String, ByVal ipAdrSmtpServer As String, _
                                      Optional ByVal anhang As String = "")
    
            ' Neues MailMessage-Objekt mit Absender und 
            ' Empfänger-Adresse erstellen
            If empfänger = "" Or empfänger Is Nothing Then
                If kopieEmpfänger <> "" Or kopieEmpfänger <> Nothing Then
                    empfänger = kopieEmpfänger
                End If
            End If
            Dim oMail As New MailMessage(absender, empfänger)
    
            ' SMTP-Server
            Dim oSMTP As New SmtpClient
            With oSMTP
                ' Mailserver
                .Host = ipAdrSmtpServer
                .Port = 587
                'Die UseDefaultCredentials von False auf True geändert, ebenfalls wegen Spamfilterung.
                .UseDefaultCredentials = True
                .DeliveryMethod = SmtpDeliveryMethod.Network
            End With
    
            With oMail
                .Subject = betreff
                .IsBodyHtml = False
                .Body = mailText
                If kopieEmpfänger = "" Then
                    kopieEmpfänger = "Empfänger@domain.tld"
                End If
                .CC.Add(New MailAddress(kopieEmpfänger))
                ' ggf. BCC-Empfänger hinzufügen
                ' .Bcc.Add(New MailAddress("emailadresse"))
                ' Anlagen hinzufügen
                If anhang <> "" Then
                    .Attachments.Add(New Attachment((anhang)))
                End If
                ' Priorität einstellen
                .Priority = MailPriority.Normal
            End With
    
            Try
                ' Nachricht senden
                oSMTP.Send(oMail)
                'MsgBox("Nachricht wurde versandt.")
            Catch oEx As Exception
                'MsgBox("Fehler: " & oEx.Message.ToString)
            End Try
        End Sub
    
    End Module

    Servus

    Winfried


    Donnerstag, 8. November 2012 17:02
  • Im Grunde ja. Hier sind die Schritte für VB.NET dargestellt.
    Donnerstag, 8. November 2012 17:43
    Moderator
  • Hallo Winfried!

    Ein Beispiel (mit VS 2005 Express erstellt): http://access.joposol.com/know-how/com-activex/office-com-add-in-mit-visual-basic-2005-express-edition-erstellen.html
    Im Beispiel wird ein COM-Add-In erstellt. Du kannst daher den Teil mit IDTExtensibility2 weglassen.

    Falls du auch noch die Registrierung weglassen willst: http://source.access-codelib.net/filedetails.php?repname=CodeLib+%28Entwurf%2C+branches%2Fdraft%29&path=%2Fcom%2FNetComDomain.cls
    Tipp: cls mit dem AcLib Import Wizard hochladen, dann musst du dich nicht um die Abhängigkeiten kümmern. ;-)

    Wenn du die tlb vom Client aus erreichbar hältst, kannst du in VBA auch mit Early binding arbeiten.

    Diskussion zum Thema COM ohne Registrierung: http://social.msdn.microsoft.com/Forums/de-DE/dotnetframeworkde/thread/b25144d7-f99a-4951-b16e-b1e1d1194207 (in diesem Thread gibt es auch eine Beispiel-Anwendung)

    mfg
    Josef


    Code-Bibliothek für Access-Entwickler
    AccUnit - Testen von Access-Anwendungen
    Virtueller Access-Stammtisch


    Sonntag, 11. November 2012 09:11
  • Am 08.11.2012 schrieb Winfried Sonntag [MVP]:

    Nun zur Frage, hat jemand eine Idee wie und ob man die Klasse von .Net in Access VBA einbinden kann?

    Hallo Stefan,
    hallo Josef.

    Vielen Dank euch beiden für die Vorschläge. Im Laufe dieser Woche
    werde ich mir die Zeit nehmen und alles probieren. Rückmeldung folgt.
    ;)

    Servus
    Winfried


    Connect2WSUS: http://www.grurili.de/tools/Connect2WSUS.exe
    GPO's: http://www.gruppenrichtlinien.de
    Community Forums NNTP Bridge: http://communitybridge.codeplex.com/

    Montag, 12. November 2012 18:51
  • Hallo ihr beiden,

    ich habe den Vorschlag von Josef soeben erfolgreich umgesetzt. Da ich davon ausgehe dass der Vorschlag von Stefan ebenfalls einwandfrei funktioniert, den Link in der zweiten Antwort sieht fast genauso aus wie der Lösungsvorschlag von Josef, habe ich alle Antworten als Antwort markiert.

    Vielen Dank, jetzt kann ich Mails ohne Benutzernamen und PW im Code über den Exchange im LAN versenden. Und da ich Port 587 angebe, wird das Mail auch nicht als Spam klassifiziert. :)

    @Josef, ich musste in deinem Beispiel eine Kleinigkeit anpassen:

    Private Sub EarlyBindingAufruf()
     
        Dim ComObject As BeispielComAddIn.AddInStarter
     
        Set ComObject = New BeispielComAddIn.AddInStarter
        MsgBox(ComObject.Testfunktion)
        Set ComObject = Nothing
     
    End Sub

    Das fehlende Set wurde im VBA-Editor bemängelt. Dann lief das Beispiel gleich durch.

    Servus

    Winfried

    x-Use-Webinterface=True :)

    Montag, 19. November 2012 15:16