Just nu i M3-nätverket
Gå till innehåll

Skicka mail med VB


Kalle Dator1

Rekommendera Poster

Kalle Dator1

Hej !

 

Jag har ett uppdrag att förse vårt kontor med ett program där man kan hantera kölistor av olika slag.

 

Programmet är färdigt och används redan flitigt.

Det producerar resultat i form av filer, och dessa ska i sin tur ligga till grund för att placera listorna på föreningens hemsida av dess webbmaster.

För att webbmastern ska få vetskap om när listorna har uppdaterats, behöver han ha en signal, och då har jag tänkt mig en funktion i programmet som automatiskt skickar kopior av listorna som attachments i ett mail, genererat direkt från programmet.

 

Kort sagt, programmet ska skicka ett e-mail med bifogade dokument till en given mailadress !

 

Jag vill inte att någon Outlook ska blandas in, då proceduren ska vara enklast möjlig och inte medföra några extra krångligheter.

Listor uppdateras - klart och avsluta - mail skickas - end !

 

Har tittat på några uppslag med API MAPI, CDO m m, men tycker att de verkar onödigt tillkrånglade.

Kan möjligen VBSendmail.dll vara någonting att använda ? Jag måste tydligen importera det till min dator vid koplettering av programmet, sedan ha med det vid en ny installation i den dator som ska använda det.

 

Någon som har erfarenhet av VbSendMail ?

 

Vänliga hälsningar

 

/Kalle

Länk till kommentar
Dela på andra webbplatser

CDo är inte speciellt krångligt. Om du inte går via ett mailprogram måste du helt enkelt ställa upp hela miljön i din kod, dvs adresser, portar, säkerhetsinställningar, lösen, avsändare osv.

Samt det har ju fördelen att det redan finns i Windows/VB.

 

VbSendmail har jag inte använt. Söker på det, hittar

http://www.vbforums.com/showthread.php?t=517734

där just VBSendmail initialt diskuteras men där CDO snart kommer in.

Länk till kommentar
Dela på andra webbplatser

Kalle Dator1

Hej Monshi och tack för ditt svar !

 

Har kört ett antal försök med CDO, dock utan att lyckas få iväg ett testmail. Det stupar på .send i koden nedan, där felangivelsen är att Transmissionen ej har lyckats, och så en nummerserie....

 

Dim objEmail, objmessage, objConf, objFlds, schema

Const cdoBasic = 1
schema = "http://schemas.microsoft.com/cdo/configuration/"
Set objEmail = CreateObject("CDO.Message")
With objEmail
   .From = "min_egen@hotmail.com"
   .To = "min_egen@yahoo.se"
   .Subject = "Test Mail"
   .TextBody = "The quick brown fox " & Chr(10) & "jumps over the lazy dog"
   .AddAttachment "C:\Temp\Testfil.txt"
   With .Configuration.Fields
       .Item(schema & "sendusing") = 2
       .Item(schema & "smtpserver") = "Hotmail.com" ' Provat flera tänkbara...
       .Item(schema & "smtpserverport") = 25
       .Item(schema & "smtpauthenticate") = cdoBasic
       .Item(schema & "sendusername") = "min_egen@hotmail.com"
       .Item(schema & "sendpassword") = "mitt_hotmail_lösenord"
   End With
   .Configuration.Fields.Update
   .Send
End With
End

 

 

Är det någonting som ska definieras med Type... i Module ? Det finns ingenstans, där jag kollat, som säger detta !

 

Vänliga hälsningar

 

/Kalle

Länk till kommentar
Dela på andra webbplatser

Är servern verkligen korrekt?

"Hotmail.com"

 

borde den inte vara något i stil med

smtp.hotmail.com

eller troligen

smtp.live.com

Samt du bör nog ha SSL aktiverat och därmed använda port 587

 

Nu har jag använt CDO inom VBA men det bör se ungefär lika ut där som i VB.

Till att börja med ställer jag in alla serverdata enligt

Set iMsg = CreateObject("CDO.Message")
Set iConf = CreateObject("CDO.Configuration")

iConf.Load -1	' CDO Source Defaults
Set Flds = iConf.Fields
With Flds
    	'SSL?
   	.item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = serverData.SSL
   	'Krävs autenciering?
   	.item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = serverData.Autenticate
   	'användarnamn
   	.item("http://schemas.microsoft.com/cdo/configuration/sendusername") = serverData.UserName
   	'lösenord
   	.item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = serverData.passWord
   	'smtp-server
   	.item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = serverData.Server

   	.item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
   	'port
   	.item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = serverData.Port
   	.Update
End With

där jag då tidigare sparat in alla data i en klass för enkel hantering.

 

och sedan sänder jag

	With iMsg
   	Set .Configuration = iConf
   	.To = adr
   	.CC = ""
   	.BCC = ""
   	.From = serverData.Email

   	.ReplyTo = fromAdress
   	.subject = subject
   	.TextBody = body

   	.AddAttachment fileName
   	.Send

End With

 

kanske kan ge dig någon ledtråd om vad du missar?

Länk till kommentar
Dela på andra webbplatser

Kalle Dator1

Tack Monshi !

 

Börjat lite smått med din lösning, men undrar:

 

Hur definierar du "serverdata" i din uppställning ? Som ett object, eller...

 

Kan du visa något exempel på hur du kopplar variabeln till CDO...

 

 

Sedan tror jag inte att mailinnehållet kommer att vara av den arten att det behöver skyddas speciellt

 

Vänligen

 

/Kalle

Länk till kommentar
Dela på andra webbplatser

Det där är gjort i VBA, lite mer begränsat än VB men det jag gjort är att skapat en klass i vilken jag sparar allt jag behöver.

 

Option Explicit

Public Server As String
Public UserName As String
Public passWord As String
Public Port As Integer
Public SSL As Boolean
Public Email As String
Public name As String
Public Autenticate As Boolean

det är allt.

Sedan fyller jag den med data i en annan procedur och skickar med denna klass istället för att skicka med alla data som enskilda argument till den funktion som skapar själva meddelandet.

Alla data är sparade på ett av kalkylbladen, en egen procedur för att hämta upp dessa från bladet helt enkelt.

Länk till kommentar
Dela på andra webbplatser

Kalle Dator1

Kört ett test med SSL och port 587:

 

Så här har jag kodat:

 

Classmodul (med namnet 'C_Class'):

 

Option Explicit

Public Server As String
Public UserName As String
Public passWord As String
Public Port As Integer
Public SSL As Boolean
Public Email As String
Public name As String
Public Autenticate As Boolean

 

Subrutin för sändning:

 

Public Sub Send_Mail()

Dim iMsg, iConf, Flds

Dim ServerData As C_Class
Set ServerData = New C_Class

With ServerData
   .UserName = "min första webbadress"
   .passWord = "mitt lösenord"
   .Server = "smtp.live.com"
   .Port = 587
   .Email = "Min första webbadress"
   .Autenticate = True
   .name = "Kalle"
End With

Set iMsg = CreateObject("CDO.Message")
Set iConf = CreateObject("CDO.Configuration")

iConf.Load -1   ' CDO Source Defaults
Set Flds = iConf.Fields

With Flds
       'SSL?
   .Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = ServerData.SSL
       'Krävs autenciering?
   .Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = ServerData.Autenticate
       'användarnamn
   .Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = ServerData.UserName
       'lösenord
   .Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = ServerData.passWord
       'smtp-server
   .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = ServerData.Server

   .Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
       'port
   .Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = ServerData.Port
   .Update
End With

With iMsg
   Set .Configuration = iConf
       .To = "Min andra webbadress" 'adr
       .CC = ""
       .BCC = ""
       .From = ServerData.Email

       .ReplyTo = ServerData.Email 'fromAdress
       .Subject = "Hejsan !" 'Subject
       .TextBody = "En hälsning" 'body

       .AddAttachment "en fil" 'FileName
       .Send

End With

End Sub

 

Jag får följande felmeddelande:

 

"

Run-time error '-2147220978 (8004020e)':

 

Servern avvisade avsändaradressen. Servern svarade: 530 5.7.0

Must issue a STARTTLS command first

"

 

Vad är STARTTLS och hur aktiveras den ?

 

Har säkert missat något....

 

 

/Kalle

Länk till kommentar
Dela på andra webbplatser

Det borde räcka om du ser till att sätta ServerData.SSL = True

 

Du sätter inte den variabeln i klassen till något. Sedan kan man se användandet av klass lite som en överdrift här kanske, du matar ändå in allt förhand i samma procedur men men.

Länk till kommentar
Dela på andra webbplatser

Kalle Dator1

Hej och hå...

 

Tack för ditt tålamod ! Mitt eget lär hålla ett tag till....

 

Med port 587 får jag ett nytt felmeddelande:

 

"Run-time error '-2147220973 (80040213)':

Transporten lyckades inte ansluta till servern."

 

Ändrar till port 25. Allt i övrigt samma.

 

Programmet jobbar ett slag, men inga felmeddelanden. Kommer heller inget mail till mottagaradressen !

 

/Kalle

Länk till kommentar
Dela på andra webbplatser

Det här fungerade för mig, bytte till port 25 så gick det. Mystiskt då det i mailprogrammet fungerar med port 587

Public Function GetServerData() As clsServerData
Dim serverData As New clsServerData

   	serverData.name = "smtp.live.com"
   	serverData.Server = "smtp.live.com"
   	serverData.Email = "xxxxxxxx@live.se"
   	serverData.SSL = True
   	serverData.Autenticate = True
   	serverData.UserName = "xxxxxxxxxx@live.se"


   	serverData.passWord = "xxxxxxxxxxx"
   	serverData.Port = 25

Set GetServerData = serverData
End Function


Sub test()
CDO_Mail_Small_Text "xxxxxxxxx@gmail.com", "xxxxxxxxxxx@live.se", "testCDO2", "Testar CDO igen", GetServerData()

End Sub


Function CDO_Mail_Small_Text(mailto As String, fromAdress As String, subject As String, _
                       	body As String, serverData As clsServerData) As Boolean
Dim iMsg As Object
Dim iConf As Object
Dim strbody As String
Dim Flds As Variant
Err.Clear

Set iMsg = CreateObject("CDO.Message")
Set iConf = CreateObject("CDO.Configuration")

iConf.Load -1	' CDO Source Defaults
Set Flds = iConf.Fields
With Flds
    	'SSL?
   	.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = serverData.SSL
   	'Krävs autenciering?
   	.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = serverData.Autenticate
   	'användarnamn
   	.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = serverData.UserName
   	'lösenord
   	.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = serverData.passWord
   	'smtp-server
   	.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = serverData.Server

   	.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
   	'port
   	.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = serverData.Port
   	.Update
End With


Dim str As Variant
Dim adr As String

adr = mailto

On Error GoTo errHandle
With iMsg
   	Set .Configuration = iConf
   	.To = adr
   	.CC = ""
   	.BCC = ""
   	.From = serverData.Email

   	.ReplyTo = fromAdress
   	.subject = subject
   	.TextBody = body


   	.Send
   	CDO_Mail_Small_Text = True
End With
Exit Function
errHandle:

  If MsgBox("Fel vid sänding av E-post, kontrollera inställningarna för " & vbNewLine _
   	& "SMTP-servern.)" & vbNewLine & vbNewLine _
   	& "Vill du se ett mer detaljerat felmeddelande klicka ja. ", vbYesNo, "E-posfel") = vbYes Then
   	MsgBox Err.Description, vbInformation, "Felmeddelande"
End If

CDO_Mail_Small_Text = False
End Function

Länk till kommentar
Dela på andra webbplatser

Kalle Dator1

Hej Monshi !

 

Har tagit hem ditt senaste förslag och satt det i test.

 

Jag får upp ditt meddelande, olika snabbt beroende på om jag sätter port 25 (några sekunder) eller port 587 (direkt).

 

Jag har förstått att man måste sätta smtp-server efter vilken internetleverantör man har I mitt fall gäller Tele2, varför jag sätter "smtp.tele2.se".

 

Sedan är det ju en fråga om vilka portar som routers släpper igenom.

 

Jag kan givetvis ställa portarna 25 och/eller 587 på vid gavel för min egen dator under testförfarandet. Men det är ingenting som jag varken vill, kan eller får utföra hos den som ska köra det färdiga programmet.

Så detta med portöppningar måste jag komma förbi vad avser utgående mail från programmet, om det nu är en väsentlighet...

 

Ska jag anse mina tappra försök, med god assistans av dina förslag, som hopplösa och bara-att-ge-upp-projekt ?

 

Med vänlig hälsning och tack för hittills

 

/Kalle

Länk till kommentar
Dela på andra webbplatser

Testa med ditt mailprogram. Sätt upp exakt samma identitet som du försöker sända med via CDO i ditt vanliga epostprogram. testa inställningarna där. Fungerar det där, då borde även CDO fungera.

 

Annars finns det väl alternativa metoder i VB för att skicka epost vill jag tro.

Som sagt, VBA är jag bättre på...

 

har du Excel kan du testa denna fil.

CDOtest.xls

Länk till kommentar
Dela på andra webbplatser

Kalle Dator1

Jag har ett program som heter PopPeeper.

Det servar mig genom att vissa tidsintervaller gå ut på mina mailkonton och kolla om jag har fått några nya mail, vilka sedan presenteras - om befintliga..

 

Genom inställningarna för varje mailkonto på detta program kan jag se exakt vilka servrar som används och beteckningen på respektive SMTP-server, samt vilken port som gäller.

 

PopPeeper fungerar utmärkt och har inga som helst svårigheter att kolla mail. Jag kan även skicka mail via programmet genom respektive mailkonto, helt utan att jag behöver logga in på något av dem. Lösenord och användarnamn ligger krypterade någonstans på min dator.

 

Trots att jag slaviskt följer dessa parametrar i mitt VB-program för att skicka mail, lyckas jag bara åstadkomma en upplysningsruta, att "Transporten inte fungerade...".

Någonstans utom synhåll sitter en liten rackare och pekar finger åt mig...

 

Något måste finnas där som hindrar och spärrar ! Så pass många försök med alla slags koder...

 

Såg någonstans att det var betydliga bekymmer att med VB-program skicka mail, om man kör Windows7 (vilket jag gör) mot om man använder WindowsXP... Vad detta nu kan betyda för mitt problem...

 

/Kalle

Länk till kommentar
Dela på andra webbplatser

Kalle Dator1

Som tillägg till mitt senaste inlägg, har jag hämtat in och registrerat vbsendmail.dll till datorn och provat några uppslag, som jag hittat genom google.

Inte heller med dessa har jag lyckats att skicka något mail..

 

Antingen har jag missat något grundläggande, som inte framgår vare sig i dina hjälpsamma svar - Monshi - eller i någon av de olika varianter som jag hittat på internet och testat, eller så är min dator vaccinerad att inte släppa ifrån sig några som helst mail medelst Visual Basic.

Resultatet verkar alltid bli detsamma - ett tjurigt "Transporten lyckades inte..." eller liknande bud...

 

Är avundsjuk på alla som lättvindigt lyckas - även i detta avseende...

 

/Kalle

Länk till kommentar
Dela på andra webbplatser

kan ju vara så enkelt som att din operatör, som du var inne på, blockerar trafiken ut från nätet på dessa portar...

 

Därav tanken att du ska testa med ett epostprogram. PopPeeper har jag ingen erfarenhet av.

Länk till kommentar
Dela på andra webbplatser

Kalle Dator1

Jag har konsekvent använt samma identiteter i mitt VB-program, som jag har i mina mailprogram, Yahoo och Hotmail. Har växlat med att skicka från det ena till det andra och tvärtom. dessutom från vart och ett till en tredje fristående mailadress.

 

Någon begränsning i mailsändandet med mina vanliga e-postprogram har jag aldrig märkt. Jag skickar och tar emot mail så gott som dagligen, utan några besvär.

Så problemen finns bara när jag försöker att skapa ett program i Visual Basic, alltså är det där som begränsningen bör finnas...

 

Jag tittade på din Excel-fil. Går bra att ta fram formuläret för att skriva själva mailet, men sedan...? Var hittar jag sänd-kontrollen ?

Hur kommer jag in på Excel's Visual Basic och kan se programkoden, om det nu - förhoppningsvis - skulle fungera med sändning ! Jag har sysslat med bakomliggande basic-kod tidigare, men i en avlägsen forntid och en stenåldersversion, så jag har omsorgsfullt förträngt kunskapen....

 

/Kalle

Länk till kommentar
Dela på andra webbplatser

Vad menar du?

 

Okej, VBA tar du fram via exempel ALT+f11. Sedan ligger all kod utom knappens i Modul1 och i klassmodulen. Samma kod som jag gett dig i princip .

 

Alla inställningar som har med sändningen av epost att gör bör vara de som finns på bladet. fast det kan visserligen finnas någon inställning i CDO som jag missat men samtidigt fungerar det för mig och alla de andra som använder denna funktion i det ark där jag har det.

Länk till kommentar
Dela på andra webbplatser

Kalle Dator1

Vad jag menar ? Om vad ?

 

Gäller ditt frågetecken excel-filen, så klickade jag först på en av de länkar som finns på excelbladet, kom in i formuläret för att skriva mailet.

Sedan letade jag efter "Sänd mail" eller liknande, men hittade ingenting sådant. För det var väl tänkt att fungera som en avsändare av mail - eller...

Så ursäkta ytterligare en dum fråga: Var finns avtryckaren ?

 

Jag hade nog en känsla av att F11 var inblandat och tryckte också på den funktionsknappen, utan att något hände, så jag var väl på rätt spår då...

Ska kolla den bakomliggande koden i morgon..

 

Annars känner jag mig som någon av användarna till mina egna program måste känna, när jag svarar honom eller henne att "Jag och alla andra, såvitt jag vet, kan köra programmet utan problem. Vad kan det bero på att inte du kan ?"

 

Angående Windows7 kontra WindowsXP; Jag antar att kanske du och flera andra, med framgång kör samma kod på Windows7 ! ?

 

Sammanfattningsvis:

Alla i hela världen kan tydligen skriva koderna för CDO och/eller VBSendMail, göra ett litet program av dem och problemfritt skicka mail till olika mailadresser. Dock inte jag !

 

Men vem har sagt att det finns någon gudomlig rättvisa här i världen ?

 

Med vänlig hälsning och tack för att jag fick vara besvärlig...

 

/Kalle

Länk till kommentar
Dela på andra webbplatser

Ah ok.

 

De som upplevs som länkar i Excel-filen ska du inte klicka på, du ska redigera dessa och skriva in din epostadress i de cellerna. Fyll i cellerna i B-kolumnen med dina uppgifter, din epost, ditt lösen, din server osv.

 

Därefter tryck på knappen som finns och epost ska gå iväg, med hjälp av CDO, till den mottagare du angett, med de inställningar du gett.

 

Jag kör arket på Win Vista, Excel 2007/2010 utan problem. vet att CDO har fungerar på WinXp, relativt säker på även Win 7. Kan testa det senare.

 

Samt ja, kolla upp din brandvägg. Kan vara så enkelt att Excel/ditt VB-program stoppas av Windows brandvägg.

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...