Sending Email From VFP
-
Thursday, January 17, 2008 12:32 AM
We are using VFP 8.0 and have an outside ISP host our email.
We want to use VFP to send a somewhat standardized email with a single attachment (PDF).
I have tried using Blat and w3JMail (v4.4) to send email from VFP. Both seem to give me errors in sending the mail related to not being able to contact the email server. I have tried entering the server name using the name (i.e. smtp.myhost.net) and by IP address (reverse lookup of the name). I can ping the server from my workstation (XP PRO).
I seem to be missing something basic here, ANY suggestions would greatly be appreciated (debugging code to help troubleshoot?).
Thanks
All Replies
-
Thursday, January 17, 2008 4:54 AM
there are multiple option to send email by using vfp
1. using shellexecute visit
http://www.tek-tips.com/faqs.cfm?fid=3894
2.
LOCAL loConfig AS CDO.Configuration, loFlds AS Object, loMsg AS CDO.Message
loConfig =
CREATEOBJECT("CDO.Configuration")loFlds = loConfig.
FieldsWITH
loFlds *- Set the CDOSYS configuration fields to use port 25 on the SMTP server. .Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 *- Enter name or IP address of remote SMTP server. .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.gmail.com".Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 465
*- Assign timeout in seconds
.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 10
.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = .t.
*- Commit changes to the object
.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "your user login"
.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "yourpassword"
.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 3
* .item("http://schemas.microsoft.com/cdo/configuration/cdoURLProxyServer") = "smtp.mail.yahoo.com"
.Update()ENDWITH
*- Create and send the message.
loMsg =
CREATEOBJECT("CDO.Message")WITH
loMsg.Configuration = loConfig
.
To = "test@test.com".
From = "yourlogin@gmail.com".Subject = "This is a test of CDO sending e-mail"
.HTMLBody = "This is the HTML content of the mail message"
.AddAttachment("file with full path")
*- Set priority to HIGH if needed
*!* IF tlUrgent
*!* .Fields("Priority").Value = 1 && -1=Low, 0=Normal, 1=High
*!* .Fields.Update()
*!* ENDIF
TRY
.Send()CATCH TO
oerr MESSAGEBOX(oerr.message)ENDTRY
ENDWITH
-
Thursday, January 17, 2008 11:45 AM
Greg BC wrote: I have tried using Blat and w3JMail (v4.4) to send email from VFP. Both seem to give me errors in sending the mail related to not being able to contact the email server. I have tried entering the server name using the name (i.e. smtp.myhost.net) and by IP address (reverse lookup of the name). I can ping the server from my workstation (XP PRO).
You may find the information at these links helpful:
http://fox.wikis.com/wc.dll?Wiki~SendSmtpEmail~VFP
-
Friday, January 18, 2008 2:12 AM
I'm happy with Jmail.dll, the free version.
You can find it here: www.dimac.net
Go to Free Downloads and download w3JmailThe installation program extract some files, but the only necessary piece is jmail.dll.
Attached the function I have wrapped around it.
Jmail can manage smtp authentication, also with a complete email as user name.
The latter is handled in a special way in my code.To use smtp authentication specify the smtp server prefaced with username and password
in the following way:Normal smtp server: smtp.libero.it
Auth smpt server sample 1: io_gianni:mypass@smtp.libero.it
Auth smpt server sample 2: io_gianni@libero.it:mypass@smtp.libero.itSample use:
do TEST_JMAIL01
do TEST_JMAIL02
RETURN
*
PROCEDURE TEST_JMAIL01local m.server, m.subject, m.body, m.receipt_requested
m.server = "smtp.libero.it"
m.subject = "Test Email"
m.body = "A very short body ...
"* if you need html email
*m.body = filetostr("save\html email.html")m.receipt_requested = .t.
local m.sender, m.address, m.attachment
m.sender = "io_gianni@libero.it"
m.address = "io.gianni@virgilio.it"
m.attachment = "file01.zip"m.success = MY_JMAIL(m.server, m.sender, m.address, m.subject, m.body, m.attachment, m.receipt_requested)
if m.success
messagebox("Email successfully sent")
else
messagebox("Jmail failed to send mail")
endifRETURN
*
PROCEDURE TEST_JMAIL02local m.server, m.subject, m.body, m.receipt_requested
m.server = "smtp.libero.it"
m.subject = "Test Email"
m.body = "A very short body ...
"* if you need html email
*m.body = filetostr("save\html email.html")m.receipt_requested = .t.
local array a_sender[1, 2]
a_sender[1, 1] = "io_gianni@libero.it"
a_sender[1, 2] = "Gianni"local array a_address[2, 3]
a_address[1, 1] = "io.gianni@virgilio.it"
a_address[1, 2] = "Giannino Uno"
a_address[1, 3] = "TO"a_address[2, 1] = "io_gianni@virgilio.it"
a_address[2, 2] = "Giannino Due"
a_address[2, 3] = "CC"local array a_attachment[2]
a_attachment[1] = "FILE02.pdf"
a_attachment[2] = "FILE03.doc"m.success = MY_JMAIL(m.server, @a_sender, @a_address, m.subject, m.body, @a_attachment, m.receipt_requested)
if m.success
messagebox("Email successfully sent")
else
messagebox("Jmail failed to send mail")
endifRETURN
*
FUNCTION MY_JMAIL
parameters m.pp_server, m.pp_sender, m.pp_address, m.pp_subject, m.pp_body, m.pp_attachment, m.pp_receipt_requestedif ! file("JMAIL.DLL")
messagebox("JMAIL NOT installed")
RETURN .f.
endifif ! empty(m.pp_server) and occurs("@", m.pp_server) > 1
* "io_gianni@libero.it:mypass@smtp.libero.it"
RETURN MY_JMAIL_AUTH()
endiflocal s_MailMessage, llExecuted
if type("s_MailMessage") # "O" or isnull(s_MailMessage)
local m.riprova, m.errore
m.riprova = .t.
m.errore = .f.do while m.riprova
try
s_MailMessage = newobject("JMail.SMTPMail")
m.riprova = .f.
catch
try
RUN REGSVR32.EXE /s JMAIL.DLL
catch
m.riprova = .f.
m.errore = .t.
endtry
endtry
enddoif m.errore
messagebox("Cannot register JMAIL.DLL")
RETURN .f.
endif
endifwith s_MailMessage
.Logging = .t.
.ISOEncodeHeaders = .f.
if ! empty(m.pp_server)
.ServerAddress = m.pp_server
endifif type("pp_sender[1]") = "C"
external array pp_sender.Sender = pp_sender[1, 1]
.SenderName = left(.Sender, at("@", .Sender) -1)
if alen(pp_sender, 2) = 2
.SenderName = pp_sender[1, 2]
endif
else
.Sender = m.pp_sender
.SenderName = left(.Sender, at("@", .Sender) -1)
endifif ! empty(m.pp_subject)
.Subject = alltrim(m.pp_subject)
else
* an empty subject generate an email without the subject field
* and this cause OFFICE OUTLOOK to generate an error if you have asked for ReturnReceipt.Subject = " "
endif.Body = alltrim(m.pp_body)
.ReturnReceipt = m.pp_receipt_requested
if m.pp_receipt_requested
* added for OFFICE OUTLOOK that does not understand Return-Receipt-To.AddNativeHeader("Disposition-Notification-To", '"' + .SenderName + '" <' + .Sender + ">")
endif.AddNativeHeader("X-Mailer", "Microsoft Outlook Express 6.00.2900.2670")
.AddNativeHeader("X-MimeOLE", "Produced By Microsoft MimeOLE V6.00.2900.2670")if type("pp_address[1]") = "C"
external array pp_addresslocal lnRows, lnColumns, lnIndex, lcAddress, lcDisplayName, lcType
lnRows = alen(pp_address, 1)
lnColumns = alen(pp_address, 2)for lnIndex = 1 to lnRows
if lnColumns = 0
lcAddress = pp_address[lnIndex]
else
lcAddress = pp_address[lnIndex, 1]
endif
lcDisplayName = left(lcAddress, at("@", lcAddress) -1)
lcType = "TO"
if lnColumns >= 2
lcDisplayName = pp_address[lnIndex, 2]
endif
if lnColumns >= 3
lcType = pp_address[lnIndex, 3]
endif
do case
case lcType == "TO"
.AddRecipientEx(lcAddress, lcDisplayName)
case lcType == "CC"
.AddRecipientCC(lcAddress)
case lcType == "BCC"
.AddRecipientBCC(lcAddress)
endcase
endfor
else
.AddRecipientEx(m.pp_address, left(m.pp_address, at("@", m.pp_address) -1))
endifif type("pp_attachment[1]") = "C"
external array pp_attachmentlocal lnRows, lnColumns, lnIndex, lcPathname, lcName
lnRows = alen(pp_attachment, 1)
lnColumns = alen(pp_attachment, 2)for lnIndex = 1 to lnRows
if lnColumns = 0
lcPathname = pp_attachment[lnIndex]
else
lcPathname = pp_attachment[lnIndex, 1]
endif
lcName = justfname(lcPathname)
if lnColumns >= 2
lcName = pp_attachment[lnIndex, 2]
endif
if file(lcPathname)
.AddAttachment(lcPathname)
endif
endfor
else
if ! empty(m.pp_attachment) and file(m.pp_attachment)
.AddAttachment(m.pp_attachment)
endif
endif.Silent = .t.
llExecuted = .Execute()
if ! llExecuted
local m.msg
m.msg = ;
"Email NOT sent!" + chr(13) + chr(10) + chr(13) + chr(10) + ;
iif(.ErrorCode # 0, ltrim(str(.ErrorCode)) + " " + .ErrorMessage + " " + .ErrorSource + "." + ;chr(13) + chr(10) + chr(13) + chr(10), "") + ;
.Log
messagebox(m.msg)
endifif llExecuted
.Close
endif
endwithRETURN llExecuted
*
FUNCTION MY_JMAIL_AUTHlocal s_MailMessage, llExecuted
if type("s_MailMessage") # "O" or isnull(s_MailMessage)
local m.riprova, m.errore
m.riprova = .t.
m.errore = .f.do while m.riprova
try
s_MailMessage = newobject("JMail.Message")
m.riprova = .f.
catch
try
RUN REGSVR32.EXE /s JMAIL.DLL
catch
m.riprova = .f.
m.errore = .t.
endtry
endtry
enddoif m.errore
messagebox("Cannot register JMAIL.DLL")
RETURN .f.
endif
endiflocal m.server, m.auth_name, m.auth_pw
m.server = m.pp_server
m.auth_name = ""
m.auth_pw = ""if ! empty(m.server) and occurs("@", m.server) > 1
* "io_gianni@libero.it:mypass@smtp.libero.it"
m.auth_name = left(m.server, at(":", m.server) -1)
m.server = substr(m.server, at(":", m.server) +1)
m.auth_pw = left(m.server, at("@", m.server) -1)
m.server = substr(m.server, at("@", m.server) +1)
endifwith s_MailMessage
.Logging = .t.
.ISOEncodeHeaders = .f.
if type("pp_sender[1]") = "C"
external array pp_sender.From = pp_sender[1, 1]
.FromName = left(.From, at("@", .From) -1)
if alen(pp_sender, 2) = 2
.FromName = pp_sender[1, 2]
endif
else
.From = m.pp_sender
.FromName = left(.From, at("@", .From) -1)
endifif ! empty(m.pp_subject)
.Subject = alltrim(m.pp_subject)
else
* an empty subject generate an email without the subject field
* and this cause OFFICE OUTLOOK to generate an error if you have asked for ReturnReceipt.Subject = " "
endif.Body = alltrim(m.pp_body)
.ReturnReceipt = m.pp_receipt_requested
if m.pp_receipt_requested
* added for OFFICE OUTLOOK that does not understand Return-Receipt-To.AddNativeHeader("Disposition-Notification-To", '"' + .FromName + '" <' + .From + ">")
endif.AddNativeHeader("X-Mailer", "Microsoft Outlook Express 6.00.2900.2670")
.AddNativeHeader("X-MimeOLE", "Produced By Microsoft MimeOLE V6.00.2900.2670")if type("pp_address[1]") = "C"
external array pp_addresslocal lnRows, lnColumns, lnIndex, lcAddress, lcDisplayName, lcType
lnRows = alen(pp_address, 1)
lnColumns = alen(pp_address, 2)for lnIndex = 1 to lnRows
if lnColumns = 0
lcAddress = pp_address[lnIndex]
else
lcAddress = pp_address[lnIndex, 1]
endif
lcDisplayName = left(lcAddress, at("@", lcAddress) -1)
lcType = "TO"
if lnColumns >= 2
lcDisplayName = pp_address[lnIndex, 2]
endif
if lnColumns >= 3
lcType = pp_address[lnIndex, 3]
endif
do case
case lcType == "TO"
.AddRecipient(lcAddress, lcDisplayName)
case lcType == "CC"
.AddRecipientCC(lcAddress)
case lcType == "BCC"
.AddRecipientBCC(lcAddress)
endcase
endfor
else
.AddRecipient(m.pp_address, left(m.pp_address, at("@", m.pp_address) -1))
endifif type("pp_attachment[1]") = "C"
external array pp_attachmentlocal lnRows, lnColumns, lnIndex, lcPathname, lcName
lnRows = alen(pp_attachment, 1)
lnColumns = alen(pp_attachment, 2)for lnIndex = 1 to lnRows
if lnColumns = 0
lcPathname = pp_attachment[lnIndex]
else
lcPathname = pp_attachment[lnIndex, 1]
endif
lcName = justfname(lcPathname)
if lnColumns >= 2
lcName = pp_attachment[lnIndex, 2]
endif
if file(lcPathname)
.AddAttachment(lcPathname)
endif
endfor
else
if ! empty(m.pp_attachment) and file(m.pp_attachment)
.AddAttachment(m.pp_attachment)
endif
endif.Silent = .t.
if ! empty(m.auth_name) and ! empty(m.auth_pw)
.MailServerUserName = m.auth_name
.MailServerPassWord = m.auth_pw
endifif ! empty(m.server)
llExecuted = .Send(m.server)
else
llExecuted = .Send()
endifif ! llExecuted
local m.msg
m.msg = ;
"Email NOT sent!" + chr(13) + chr(10) + chr(13) + chr(10) + ;
iif(.ErrorCode # 0, ltrim(str(.ErrorCode)) + " " + .ErrorMessage + " " + .ErrorSource + "." + ;chr(13) + chr(10) + chr(13) + chr(10), "") + ;
.Log
messagebox(m.msg)
endifif llExecuted
.Close
endif
endwithRETURN llExecuted
* -
Friday, January 18, 2008 2:17 AM
Surinder
Thanks for the reply.
Correct me if I am wrong, ShellExecute uses your default email client. I do not want to use any email client on the workstation.
CDO may or may not work on XP, and the examples I've seen need an Exchange Server?? Can you send attachments using CDO?
When I tried you example code the .Update failed.
-
Friday, January 18, 2008 11:52 AM
Greg BC wrote: Correct me if I am wrong, ShellExecute uses your default email client. I do not want to use any email client on the workstation.
CDO may or may not work on XP, and the examples I've seen need an Exchange Server?? Can you send attachments using CDO?
You are correct that ShellExecute uses the e-mail client on the local machine.
CDO does work on XP and you do not need an Exchange Server. All you need is access to an SMTP Server either locally or on the internet. The easiest way to configure CDO is to make sure that Outlook Express is properly configured to send e-mail. You never have to use it for this purpose, but configuring it creates the registry entries necessary to configure CDO automatically.
You can send attachments using CDO.
-
Saturday, January 19, 2008 12:26 AM
Gianni
Thanks for the help, I think I'm still have problems connecting to my ISP SMTP server. No matter how I shape the server name I get the error message:
The message was undeliverable. All servers failed to receive the message
Number of attachments: 1
attachments:
{
Encoding "C:\mytextfile.txt"
}
.execute
{
Trying server mail:MyServer.net
MyServer.net failed with the message: "WSAGetLastError() returned 10053, Software caused connection abort"
No socket for server.ConnectToServer()
1 of 1 servers failed.
}
Any ideas?
Thanks
-
Saturday, January 19, 2008 1:12 AM
I discovered my problem, my antivirus was blocking it. NOW IT WORKS!!!
Thanks again.
-
Wednesday, August 25, 2010 6:19 PM
hi, i just tried you code and am getting this msg
"must be a variable or array"

