2012-07-20 11 views
9

So che questa domanda è stata posta alcune volte in vari contesti, ma non ho trovato una risposta chiara. Ho installato la posta elettronica per un'applicazione di accesso che utilizza Outlook, ma mi piacerebbe andare via da questo. Uno degli scopi dell'e-mail è di inviare a un utente via e-mail la sua/o password se l'ha dimenticato. Possono selezionare il loro nome utente per la schermata di accesso e se fanno clic su "password dimenticata" e l'e-mail viene inviata contenente le loro informazioni di accesso (all'indirizzo e-mail associato al nome utente).MS Access invia email (non da Outlook o posta elettronica dell'utente)

Il problema con questo è che la funzione di posta elettronica come è invia un'e-mail con Outlook dal computer dell'utente. Quindi, gli utenti sarebbero in grado di 'dimenticato la password' altri nomi utente e visualizzare la propria outbox di Outlook (articoli inviati) per vedere le informazioni sensibili.

C'è un modo per inviare e-mail come la funzione di posta di php, l'invio di posta dal server? Desidero che le e-mail vengano inviate dallo stesso indirizzo e-mail ([email protected]), anziché dall'indirizzo Outlook dell'utente dopo una richiesta di sicurezza. Se questo non è possibile, sono aperto all'idea di qualsiasi altra soluzione alternativa.

Aggiungerò anche che l'installazione di qualsiasi software che dovrebbe essere installato su ogni macchina di un potenziale utente non è fattibile.

È possibile?

+1

L'accesso davvero non può fare quello che vuoi. È un database desktop. –

+0

Sono aperto all'idea di risolvere il problema: l'idea per un esempio di soluzione alternativa potrebbe essere: inviare solo l'e-mail di 'password dimenticata' se l'e-mail di Outlook per l'utente ('da') corrisponde all'e-mail per il nome utente nel database (a). – Scotch

+1

Non ho familiarità con il codice di accesso, ma se c'è qualche funzione che invia la posta a un servizio SMTP, dovresti essere in grado di utilizzare qualsiasi servizio SMTP che desideri invece di Outlook locale dell'utente. – David

risposta

10

Windows include un oggetto chiamato Collaborative Data Objects o CDO. Questo oggetto consente di inviare e-mail utilizzando qualsiasi server SMTP supponendo che siano soddisfatti altri prerequisiti (firewall aperto, ISP che non blocca le porte, l'account è configurato sul server SMTP, il server SMTP consente l'inoltro, ecc.).

La maggior parte degli esempi che ho trovato utilizzano l'associazione tardiva, che è preferibile. Nei miei test su XP è risultato che il riferimento di libreria corretto, se si preferisce utilizzare l'associazione anticipata, è "Microsoft CDO per Windows 2000 Library".

È importante sapere che ogni volta che si invia un'e-mail, è necessario inviarla tramite (o da) una qualche tipo di server di posta elettronica. Ciò significa che dovrai autenticarti con quel server di posta elettronica e in genere significa anche che devi inviare l'e-mail utilizzando un indirizzo di posta "Da" presente su quel server di posta.

Ecco po 'di codice utilizzando l'associazione tardiva:

Const cdoSendUsingPickup = 1 
Const cdoSendUsingPort = 2 
Const cdoAnonymous = 0 
' Use basic (clear-text) authentication. 
Const cdoBasic = 1 
' Use NTLM authentication 
Const cdoNTLM = 2 'NTLM 

Public Sub SendEmail() 
    Dim imsg As Object 
    Dim iconf As Object 
    Dim flds As Object 
    Dim schema As String 

    Set imsg = CreateObject("CDO.Message") 
    Set iconf = CreateObject("CDO.Configuration") 
    Set flds = iconf.Fields 

    ' send one copy with SMTP server (with autentication) 
    schema = "http://schemas.microsoft.com/cdo/configuration/" 
    flds.Item(schema & "sendusing") = cdoSendUsingPort 
    flds.Item(schema & "smtpserver") = "mail.myserver.com" 
    flds.Item(schema & "smtpserverport") = 25 
    flds.Item(schema & "smtpauthenticate") = cdoBasic 
    flds.Item(schema & "sendusername") = "[email protected]" 
    flds.Item(schema & "sendpassword") = "password" 
    flds.Item(schema & "smtpusessl") = False 
    flds.Update 

    With imsg 
     .To = "[email protected]" 
     .From = "[email protected]" 
     .Subject = "Test Send" 
     .HTMLBody = "Test" 
     '.Sender = "Sender" 
     '.Organization = "My Company" 
     '.ReplyTo = "[email protected]" 
     Set .Configuration = iconf 
     .Send 
    End With 

    Set iconf = Nothing 
    Set imsg = Nothing 
    Set flds = Nothing 
End Sub 
+0

* "Da" l'indirizzo e-mail che esiste su quel server e-mail * - questo non funziona per me nel mio locale, e dalla mia lettura capisco che è necessario utilizzare il server fornito dal proprio ISP. spam – Fionnuala

+0

Tutto dipende dal tuo ISP Alcuni consentono solo di utilizzare la porta 25 per comunicare con il proprio server SMTP e alcuni non hanno questa limitazione Alcuni dei tuoi grandi fornitori di servizi via cavo lo fanno, ma molti dei tuoi ISP più piccoli non lo fanno Ad esempio, Windstream e CenturyLink non hanno questa limitazione. È possibile aggirare questo problema utilizzando una porta alternativa (supponendo che il server SMTP esponga una porta alternativa) poiché la maggior parte degli ISP impone questa limitazione solo sulla porta 25. Come Ad esempio, è possibile utilizzare GMail come server SMTP: GMail utilizza 587 o 465 con SSL. – HK1

+0

Sto anche lavorando su uno stesso tipo di requisito e mi sono reso conto che il codice sopra consente di inviare e-mail da un y indirizzo email (ad es. qualsiasi email errata [email protected]) e senza specificare la password corretta. È solo che dovresti inserire l'indirizzo del server corretto (ad esempio mail.myserver.com) – braceyourself

12

Questo funziona per me in Access MS 2010/Windows 7

sMailServer = "myISPsmtp" 'Not just any old smtp 
sMailFromAddress = "me" 
sMailToAddress = "me" 

Set ObjMessage = CreateObject("CDO.Message") 
sToAddress = sMailToAddress 
sSubject = "Subject" 
sBody = "MailBody" 

ObjMessage.Subject = sSubject 
ObjMessage.From = sMailFromAddress 
ObjMessage.To = sToAddress 
'ObjMessage.cc = sCCAddress 
ObjMessage.TextBody = sBody 
'ObjMessage.AddAttachment sMailAttachment 
ObjMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 
ObjMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = sMailServer 
ObjMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25 
ObjMessage.Configuration.Fields.Update 
ObjMessage.send 

Maggiori informazioni: http://msdn.microsoft.com/en-us/library/ms526318(v=exchg.10).aspx

+0

Quindi dovrei impostare sMailServer sul server di posta elettronica del mio ufficio? e mailFromAddress è l'account fittizio che creo? ('[email protected]') e sMailTo per essere un indirizzo email di userName dal databasE? – Scotch

+1

+1 Sono troppo lento^_^ma questo è un ottimo metodo. Mi concentrerò invece su una delle mie preoccupazioni. Non dovresti memorizzare password non crittografate all'interno del tuo database, e sicuramente non dovresti inviare tali informazioni via e-mail (anche se alla persona giusta). Invece è necessario crittografare le password e offrire agli utenti la possibilità di reimpostare la password piuttosto che inviarla. –

+0

Non sono affatto sicuro di quale server di posta funzionerà per te, ho dovuto usare il server fornito dal mio ISP, apparentemente questa è una misura di sicurezza per bloccare lo spam. – Fionnuala

2

Non posso aggiungere questo ai commenti perché non ho abbastanza reputazione, quindi per favore non mi AX.

"Sembra che questo metodo consente di spoof di nulla sul mio server. Appena notato che c'è un metodo AddAttachment. Potrebbe che funzionano solo con un percorso relativo a dire, un foglio di Excel?"

Funziona per me (Access 2010, Exchange 2010):

.AddAttachment ("URL HERE")

https://msdn.microsoft.com/en-us/library/ms526453(v=exchg.10).aspx https://msdn.microsoft.com/en-us/library/ms526983(v=exchg.10).aspx

1

Il seguente codice di lavoro MS-Access VBA s per smtp.office365.com.DO DO indica smtpusessl = true, ma NON si specifica la porta, altrimenti si ottiene l'errore 5.7.57.

Sub SMPTTest2() 
Set emailObj = CreateObject("CDO.Message") 

emailObj.From = "[email protected]" 
emailObj.To = "[email protected]" 
emailObj.Subject = "Test CDO" 
emailObj.TextBody = "Test CDO" 
'emailObj.AddAttachment "c:\windows\win.ini" 

Set emailConfig = emailObj.Configuration 


emailConfig.Fields("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 
emailConfig.Fields("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1 
emailConfig.Fields("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.office365.com" 
'Exclude the following line  
'emailConfig.Fields("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 587 
emailConfig.Fields("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True 
emailConfig.Fields("http://schemas.microsoft.com/cdo/configuration/sendusername") = "[email protected]" 
emailConfig.Fields("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "mypassword" 
emailConfig.Fields.Update 

emailObj.Send 

If Err.Number = 0 Then MsgBox "Done" 
End Sub 
0

Nella mia azienda ho utilizzato un'altra soluzione. Ho creato una libreria di classi C# con classi/oggetti COM. Le classi COM possono essere implementate nell'applicazione Access e in questo modo è possibile utilizzare tutti i vantaggi di C# (Mailing ad esempio) e comunque utilizzarlo (chiamandolo) in Access.

L'unico svantaggio è che è necessario registrare la libreria di classi (DLL) in tutti i computer che utilizzano l'applicazione di accesso. L'ho fatto con un semplice script power-shell che viene eseguito all'avvio dell'applicazione Access.

Un buon inizio per una libreria a base COM è qui: https://www.codeproject.com/Articles/7859/Building-COM-Objects-in-C

Se volete qualche informazione in più su di esso, allora io sono sempre felice di aiutarvi.

Problemi correlati