Diese Seite mit anderen teilen ...

Informationen zum Thema:
Forum:
WinDev Forum
Beiträge im Thema:
18
Erster Beitrag:
vor 2 Jahren, 8 Monaten
Letzter Beitrag:
vor 2 Jahren, 8 Monaten
Beteiligte Autoren:
Allard, Alexandre Leclerc, Tor-Bjarne, Fabrice Harari, steve erts, DarrenF, Stefan Bentvelsen

DYNAMIC FIELDS IN AN EMAIL

Startbeitrag von Allard am 06.06.2015 09:39

Hi,

In the past I have seen in an example the functionality to add fields to a text field like this:

[ firstname] I cannot find the example. Does anyone have a quick answer to this

regards
Allard

Antworten:

Hi Allard,

I'm not sure what you are asking here...

Maybe you're looking for the "replace" function? or stringbuild?

Best regards

von Fabrice Harari - am 06.06.2015 15:01
Hi,

I have to give it a try . If no one knows it . I know there is an example that does it.

Something like this

if hreadseekfirst ( file , fileid id ) then

"[Name]" = file.name
etc
end

Then when creating the email in a text field say something like this:

Hello mister [Name] you have won a price

when the mail is sent it takes the tekst in the email and replaces [name] with file.name


regards
allard

ps
A cool way to let the user of the app make emails to sent to selected customers

von Allard - am 07.06.2015 17:16
Hi Allard,

try

[%MyFile.Name%]

or %[MyFile.Name]%

I've seen this use somewhere in the report editor.

von Stefan Bentvelsen - am 07.06.2015 18:00
Hi,

I`ve done this with a small parseclass.

1. You let the user build a email template using "tokens" for example database fields. and build tokens from for example the customer table.

//Example of build tokens
s is string = HListItem(Kunde)
ss is string
FOR EACH STRING sAstr OF s SEPARATED BY CR
// ss = "["+sastr+"]"
ss = sAstr
TableAddLine(TABLE_token2,ss)
END


2. Then before you send each mail you parse in the field value this can be as advanced you want:


//Adds tokens to internal array
//To call for a customer table,Call is AddTokens(Customer..name)

PROCEDURE AddTokensFromFile(iFileName)

s is string = HListItem({iFileName},hLstDetail)
tn is string
tv is string
n is int


FOR EACH STRING sArec OF s SEPARATED BY CR
tn = ExtractString(sArec,1,TAB,FromBeginning)
IF tn "" THEN
n = Seek(:Tokens,asLinear,"TokenName",tn,1)
IF n = -1 THEN
n = Add(:Tokens)
Tokens[n].TokenName = tn
Tokens[n].FTokenName = "["+tn+"]"
Tokens[n].Type = ExtractString(sArec,2,TAB)
Tokens[n].HFType = ExtractString(sArec,3,TAB)
Tokens[n].Size = ExtractString(sArec,4,TAB)
Tokens[n].nSubScripts=ExtractString(sArec,5,TAB)
Tokens[n].sCaption = ExtractString(sArec,6,TAB)
tv = iFileName+"."+tn
Tokens[n].TokenValue = ""
END
END
END

// Set the record value when record is retrived..
//Perhaps a when exception end could do here to
// Call is:
// Hreadfirst(Vustomer)
//Class:SetToken(Customer)

PROCEDURE SetTokenValueRecord(ifilename)
s is string = HListItem({ifilename})
n is int
tv is string

FOR EACH STRING sTn OF s SEPARATED BY CRLF
n = Seek(:Tokens,asLinear,"TokenName",sTn,1)
IF n >= 1 THEN
tv = ifilename+"."+sTn
:Tokens[n].TokenValue = {tv}
END
END


//The actuall parse
PROCEDURE Parse(iStr)

sPstring is string = iStr
nFound is int = 0
s is ANSI string
d is Date
t is Time
st is DateTime
LOOP
nFound = 0
FOR EACH ds OF :Tokens
// MyTrace(">>Type: "+ds.Type+" - "+ds.tokenname,ds.HFType)
IF Position(sPstring,ds.FTokenName,1) >= 1 THEN
SWITCH ds.HFType
CASE 1,2
sPstring = Replace(sPstring,ds.FTokenName,ds.TokenValue)
nFound = 1
CASE 11
t = ds.TokenValue
sPstring = Replace(sPstring,ds.FTokenName,TimeToString(t,maskSystemTime))
CASE 24
st = ds.TokenValue
d = st..Date
t = st..Time
sPstring = Replace(sPstring,ds.FTokenName,DateToString(d,maskSystemDate)+" "+TimeToString(t,maskSystemTime))
nFound = 1
CASE "N"
sPstring = Replace(sPstring,ds.FTokenName,ds.TokenValue)
nFound = 1
OTHER CASE
MyTrace("Type",ds.Type,ds.HFType,ds.TokenName,"Unknown")
END
END
END
IF nFound = 0 THEN
BREAK
END
END
RESULT sPstring


3. If you build this into a class the call would be:

PD is object ParseString_Class dynamic = new ParseString_Class
PD.AddTokensFromFile(Customer..Name)
PD.SetTokenValueRecord(Customer)
sMailContent is string = PD.Parse(fLoadText(gsEtiFolder+"\EPOSTmal.txt"))

// EPOSTmal.tx


von Tor-Bjarne - am 07.06.2015 19:09
Hi Allard

as I was saying, just use the replace function to replace the [name] tag by it's value in your loop on your recipient

Best regards

von Fabrice Harari - am 07.06.2015 20:45
Hi

Yep . I found it

thanks

Allard

von Allard - am 07.06.2015 22:33
That's what I do; as Fabrice says, I insert a place holder (variable) in the text of the email and then use the "Replace" function.

von DarrenF - am 08.06.2015 08:38
Hi Allard,

Sorry about my bloated answer, if it was just the replace/stringbuild command you where looking for. :)

Cheers
Tor-Bjarne

von Tor-Bjarne - am 08.06.2015 09:48
Hi , indeed,

Coding is not so difficelt.

However I have an odd problem. It works with little mails. Bigger mails are not sent. I saw in the documnetation that email.html can handle 4 gb. That is enormous.

My php settings are limited to 10 mb per mail. So that is ok as well.


Ok if I try to sent this mail it isnot sent:

Hallo [voornaam] [achternaam],

U heeft uw gegevens opgeslagen op [datum] om [tijd] en daarbij aangegeven dat u deze gegevens ook via de mail wilt ontvangen, Hierbij uw gegevens zoals ze zijn geregistreerd:

[bedrijfsnaam]
[gebruikersnaam]
[voornaam]
[achternaam]
[wachtwoord]
[adres]
[postcode]
[woonplaats]
[tel]
[mobiel]
[emailadres]


then when I remove some fileds and it looks like this it is sent:

Hallo [voornaam] [achternaam],

U heeft uw gegevens opgeslagen op [datum] om [tijd] en daarbij aangegeven dat u deze gegevens ook via de mail wilt ontvangen, Hierbij uw gegevens zoals ze zijn geregistreerd:

[bedrijfsnaam]
[gebruikersnaam]
[voornaam]
[achternaam]
[wachtwoord]
[adres]
[postcode]

in my sql the property is tekslong . If I take a look at it it has quite some makup in it . But it is save good. I have a preview option and when I run that in a web page the preview of the email looks just fine.

So the problem is in the sending of the email . any one an Idea How to fix this?

regards
Allard

von Allard - am 08.06.2015 21:48
Hmm

The problem lies in the fact that it has , somehow , no valid html. and the spamfilter of the hosting company does not allow it to be sent

Hmm odd huh

regards

allard

von Allard - am 08.06.2015 22:26
I do this quite extensively in my application using the REPLACE. Users can build their own library of HTML email templates using a set of predefined tags and then I have a procedure that manages the whole thing that I call when the user selects a template. Works really nicely.

I recommend using double brackets in HTML. [[TagName]]

von steve erts - am 08.06.2015 22:30
Hi, yes it is great.

I made it so that users can drag the [ stuff] into a html edt control. But the spam filter is the problem.

Ok so I shoudl change for instance [name] to [[name]] ? I Will give it a try

Thanks
Allard

von Allard - am 09.06.2015 08:14
Hi,

tried that but no succes

I sent the hosting company an email. Itis clearly a spamfilter problem


regards
Allard

von Allard - am 09.06.2015 09:40
Hi Allard,

The problem is the content of the email sent. Check it out. If you send an email with no HTML formatting, simply use the Text property to send plain text instead of incorrectly formatted HTML. Otherwise, create an HTML template, put your [tags] in it, the when you Replace() make sure to convert the TextToHTML().

Make sure the content does not look like spam. Again, the problem is not on code side (as far as code is concerned) but the actual content of the email seen as spam. Just make sure the content you send does not look like spam to the spam algorithm on the email server.

Best regards,
Alexandre Leclerc

von Alexandre Leclerc - am 10.06.2015 12:39
Hi Alexandre

Well they worked on it but it doesnot work yet. Indeed it is the html sent is pcsoft makeup with a lot of tags in it.

ButI cannot change the html edtit box, I after I repalce the [stuff] I put the string in the
email.html . And I cannot change anything on that as well.

So I should do something like this?

newstring is string
newstring = texttohtml(variabele after replece)

email.html = newstring

thanks
Allard

von Allard - am 10.06.2015 20:24
Hi Allard,

Yes, this is the principle. Here is an example:


Email.HTML = ReplaceAllTagsToValue(sHTMLTemplate)

PROCEDURE ReplaceAllTagsToValue(sHTMLTemplate is string) : string
s is string = sHTMLTemplate
s = Replace(s,"[tag1]",TextToHTML("Value1"))
s = Replace(s,"[tag2]",TextToHTML("Value2"))
//...
RESULT s


Best regards,
Alexandre Leclerc

von Alexandre Leclerc - am 10.06.2015 20:44
Hi . Iam sorry but I think i donnot get it completely I did following

when sending the mail:
IF EmailTeksten.Gebruiktekst = 1 THEN
sBericht is string = EmailTeksten.emailtekst
stringmail is string
sHtmlstring is string
stringmail = email_gebruikers_variabele_items(

sBericht,gnMemberID)

sHtmlstring = TextToHTML(stringmail)
Trace( sHtmlstring)
Trace( "_____________")
Trace( stringmail)
Email.HTML = sHtmlstring

//The procedure with the replace to get the [stuff]

PROCEDURE email_gebruikers_variabele_items(sMessageType, sgebruikerID)
sDatumgoed is string
sDatumgoed = DateToString(DateSys(),"DD-MM-YYYY")

IF HReadSeekFirst(gebruikers,gebruikersID,sgebruikerID) THEN
sContent is string = sMessageType
sContent = Replace(sContent, "[bedrijfsnaam]",gebruikers.Bedrijfsnaam )
sContent = Replace(sContent, "[gebruikersnaam]]",gebruikers.gebruikersnaam)
sContent = Replace(sContent,"[voornaam]",gebruikers.VoorNaam)
sContent = Replace(sContent,"[achternaam]",gebruikers.Achternaam)
sContent = Replace(sContent,"[wachtwoord]",gebruikers.wachtwoord)
sContent = Replace(sContent,"[adres]",gebruikers.Adres)
sContent = Replace(sContent,"[postcode]",gebruikers.Postcode)
sContent = Replace(sContent,"[woonplaats]",gebruikers.Woonplaats)
sContent = Replace(sContent,"[huisnummer]",gebruikers.huisnummer)
sContent = Replace(sContent,"[tel]",gebruikers.Tel)
sContent = Replace(sContent,"[mobiel]",gebruikers.Mobtel)
sContent = Replace(sContent,"[emailadres]",gebruikers.Emailadres)
sContent = Replace(sContent,"[datum]",sDatumgoed)
sContent = Replace(sContent,"[tijd]",TimeToString(Now(), " : HH h MM "))
RESULT sContent
END

this gets a whole lot of more html like code that is not accepted by the spamfilter.


regards

Allard

von Allard - am 11.06.2015 09:32
Zur Information:
MySnip.de hat keinen Einfluss auf die Inhalte der Beiträge. Bitte kontaktieren Sie den Administrator des Forums bei Problemen oder Löschforderungen über die Kontaktseite.
Falls die Kontaktaufnahme mit dem Administrator des Forums fehlschlägt, kontaktieren Sie uns bitte über die in unserem Impressum angegebenen Daten.