Benutzer mit den meisten Antworten
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
- Bearbeitet Winfried.Sonntag Donnerstag, 8. November 2012 15:54 Zusatz
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.
- Als Antwort markiert Winfried.Sonntag Montag, 19. November 2012 15:08
-
Im Grunde ja. Hier sind die Schritte für VB.NET dargestellt.
- Als Antwort markiert Winfried.Sonntag Montag, 19. November 2012 15:08
-
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- Bearbeitet Josef Pötzl Sonntag, 11. November 2012 09:15
- Als Antwort markiert Winfried.Sonntag Montag, 19. November 2012 15:08
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.
- Als Antwort markiert Winfried.Sonntag Montag, 19. November 2012 15:08
-
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
- Bearbeitet Winfried.Sonntag Donnerstag, 8. November 2012 17:02
-
Im Grunde ja. Hier sind die Schritte für VB.NET dargestellt.
- Als Antwort markiert Winfried.Sonntag Montag, 19. November 2012 15:08
-
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- Bearbeitet Josef Pötzl Sonntag, 11. November 2012 09:15
- Als Antwort markiert Winfried.Sonntag Montag, 19. November 2012 15:08
-
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/ -
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 :)