I'm using node.js mailer module to send email template. I manage to send the template with the correct json replacements to the designated email address.
However, I am wondering if there's a shortcut to set the values of the replacement when there's too many similar replacements.
For example, i have an object "userNameList". It contains a list of usernames. I want to send the list of usernames using an email template. Instead of...
data: {
"username1":userNameList[1],
"username2":userNameList[2],
"username3":userNameList[3],
"username4":userNameList[4],
"username5":userNameList[5],
"username6":userNameList[6],
...
"username100":userNameList[100]
}
Is there a way to reduce the number of lines and for the code to work more effectively?
thanks.
You can use the following:
data = {};
for(var i=0; i<userNameList.length; i++) {
data["username" + (i+1)] = userNameList[i]; // Array indexes start at 0
}
Related
GOAL:
I'm trying to validate the user's email address as he/she types.
I'm just using simple regex because I don't want to use any external library. Also if use the regex like in here regex email for java I'm encountering error PatternSyntaxException that's why I prefer simple regex for now.
So I put the TextFormatter and UnaryOperator inside the initialize method.
#FXML
public void initialize()
{
//1. USE UNARY FIRST TO MAKE FILTER BEFORE USING TEXTFORMATTER
UnaryOperator <TextFormatter.Change> filterEmail = (change ->{
if(change.getControlNewText().matches("^(.+)#(.+)$*"))
{
lblEmailError.setVisible(false);
txtEmailAdd.setBorder(null);
return change;
}
else
{
lblEmailError.setText("Invalid Email");
lblEmailError.setVisible(true);
txtEmailAdd.setBorder(new Border(new BorderStroke(Color.RED, BorderStrokeStyle.SOLID, new CornerRadii(3), new BorderWidths(2), new Insets(-2))));
return null;
}
});
TextFormatter <String> tf = new TextFormatter<String>(filterEmail);
txtEmailAdd.setTextFormatter(tf);
}
But as long as the FXML loads I can't type anymore in the TextField and can't be edited anymore. I can't type anything. Maybe there is something wrong with my condition or I'm wrong putting it inside the initialize method.
I'm lost. I have already dug the web on how to validate email in java using regex.
like this Java regex email
I'm also using SceneBuilder to build the fxml. Any help will do thanks in advance.
I have been working on legacy application where i am using Aspose.Words.jdk15.jar to print the .doc file. I have a requirement where i am getting list of value then we have to loop & print it in the doc file.
And that value we are replacing in doc using range.replace() method . This doc already exists in my workspace where we have mapped the value like this
Component Name:$COMPONENT_NAME
Billing Effective Date:$EFFECTIVE_DATE
Billing End Date:$END_DATE
and the code which i have written to replace the value of doc. So, my requirement is I need this value multiple times in my doc as per size of list.
for(int i=0;i<details.size();i++)
{
doc.getRange().replace("$COMPONENT_NAME" , checkNull(details.get(i).getComponentName()) + “,”, false, false);
doc.getRange().replace("$EFFECTIVE_DATE" , checkNull(details.get(i).getBillEffectiveDate()) + “,”, false, false);
doc.getRange().replace("$END_DATE" , checkNull(details.get(i).getBillEndDate()) + “,”, false, false);
}
The best way to achieve what you need is using mail Merge feature.
https://docs.aspose.com/words/java/about-mail-merge/
But in this case you need to replace your placeholders with mergefields in your template.
If you cannot change the template, you can clone the the document for each item in your list, replace values in the cloned document and them merge documents together to get the final result. Code will look like the following:
// Open template
Document doc = new Document("C:\\Temp\\in.doc");
// Create document where result will be stored to.
// Simply clone the original template without children,
// In this case styles of the original document will be kept.
Document result = (Document)doc.deepClone(false);
for(int i=0; i<details.length; i++)
{
Document component = doc.deepClone();
component.getRange().replace("$COMPONENT_NAME", details[i].getComponentName());
component.getRange().replace("$EFFECTIVE_DATE", details[i].getBillEffectiveDate().toString());
component.getRange().replace("$END_DATE", details[i].getBillEndDate().toString());
// Append the result to the final document.
result.appendDocument(component, ImportFormatMode.USE_DESTINATION_STYLES);
}
result.save("C:\\Temp\\out.doc");
But I would preferer Mail Merge approach.
I want to get the email body from my Gmail account for an email so i use this code i found it in an example for how to read emails using c++ builder pop3
the code to extract body used
TIdText *EText;
int message = SpinEdit1->Value;
MyPoP3->Retrieve(message, MyEmail);
Edit1->Text = MyEmail->Subject + " | " + MyEmail->From->Address;
Memo1->Clear();
for (int i = 0; i < MyEmail->MessageParts->Count; i++) {
Memo1->Lines->Add(MyEmail->MessageParts->Items[i]->ContentType);
EText = dynamic_cast<TIdText*>(MyEmail->MessageParts->Items[i]);
Memo1->Lines->Add(EText->Body);
}
the problem is that i got undefine symbol to TidText and what i tried is to change it from TIdText to TIdMessage, but i got that i can't convert to it.
also i tried to try this without loop or something MyEmail->Body->Text
this return empty string.
the video i got this code from it here i don't know maybe the c++ builder he use is old. now i want to know how to extract the body text from the email address.
Thanks in advance.
the problem is that i got undefine symbol to TidText
Your code is missing an #include <IdText.hpp> statement.
what i tried is to change it from TIdText to TIdMessage, but i got that i can't convert to it.
Because TIdMessage does not contain nested TIdMessage objects.
also i tried to try this without loop or something MyEmail->Body->Text this return empty string.
If your email is MIME encoded, its text is not stored in the TIdMessage::Body property, but in a nested TIdText object within the TIdMessage::MessageParts collection. You have to look at the TIdMessage::ContentType property to know what kind of structure the email contains. For instance, if the CT begins with text/, the text is in the TIdMessage::Body. But if the CT begins with multipart/, the text is somewhere in the TIdMessage::MessageParts instead.
You should read this blog article on Indy's website for an example of how emails might be structured:
HTML Messages
the video i got this code from it here i don't know maybe the c++ builder he use is old.
No, it is not.
Is it somehow possible to add the sub-group of a cetrain group the address is assigned to the html output?
In the template I have ###MAINGROUP### and ###GROUPLIST###. I can't use maingroup, cause it's not the case that the group I need is always the maingroup. And with the grouplist I can't say which group is the sub-group of the one group.
Anyone have an idea how I could do it?
And in addition to that I also need the value of a self created field in the tt_address table.
Edit:
I try it like #lorenz say. What I have so far:
ext_localconf.php:
<?php
$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['tt_address']['extraItemMarkerHook'][]
='EXT:txnextaddresssort/class.tx_next_address_sort_addmarkers.php:tx_next_address_sort_addmarkers';
class.tx_next_address_sort_addmarkers.php:
<?php
class tx_next_address_sort_addmarkers {
function extraItemMarkerProcessor(&$markerArray, &$address, &$lConf,
&$pObj) {
$lcObj = t3lib_div::makeInstance('tslib_cObj');
$lcObj->data = $address;
$markerArray['###SORTBEREICH###'] =
$lcObj->stdWrap($address['tx_nextaddresssort_sort_bereich'],
$lConf['tx_nextaddresssort_sort_bereich.']);
}
}
Extentionkey: next_address_sort
All I get is a blank screen, but no errors in apache log
No, there is no possibility to do that.
Yet you can write a custom extension that integrates the extraItemMarkerProcessorhook in tt_address. In ext_localconf.php, add:
$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['tt_address']['extraItemMarkerHook'][] ='EXT:myextension/class.tx_myextension_filename.php:tx_myextension_classname';
Then add a file class.tx_myextension_filename.php to your extension.:
class tx_myextension_classname {
public function extraItemMarkerProcessor(&$markerArray, &$address, &$lConf, &$pObj) {
$lcObj = t3lib_div::makeInstance('tslib_cObj');
$lcObj->data = $address;
$markerArray['###MYFIELD###'] = $lcObj->stdWrap($address['myfieldlikeindatabase'], $lConf['myfieldlikeindatabase.']);
return $markerArray;
}
}
This would be an example for getting a field that is in the tt_address table and adding it to the markers so they can be used in a template. It is also stdWrap enabled.
Now, instead of getting a field, you should replace $address['myfieldlikeindatabase'] with a variable that contains the information you need. To receive the data, you can use the TYPO3 database API functions ($GLOBALS['TYPO3_DB']).
I'm retrieving a list of names from a SharePoint list in my client program. The names are populated from a name picker in SharePoint. In the XML returned from the list query, the list looks like this:
"#10;#Some Name;#12;#Another Name;#15;#Yet AnotherName"
My program needs to get the account name (or the email address) of each user. I can use GetUserProfileByName("domain\\username"), but I don't have the account name. I can't do something like GetUserProfileByName("Some Name") because it has to be the account name.
The number before each name is the index or the ID, but I can't use GetUserProfileByIndex(10) because I have to be managing my own data or have administrator credentials.
So basically it is providing me with two important pieces of information, but I can't retrieve any further information using them.
Are you sure the number is an index, i think it might be the userid for the site collection. And it seems to be an odd sort of user list too, but anyway:
string result = "#10;#Some Name;#12;#Another Name;#15;#Yet AnotherName";
string[] users = result.Substring(1).Split(new string[2] { ";", "#" }, StringSplitOptions.RemoveEmptyEntries);
for (int j = 0; j < users.Length; j = j + 2) {
using (ClientContext context = new ClientContext("http://yoursite")) {
List list = context.Web.SiteUserInfoList;
ListItem item = list.GetItemById(int.Parse(users[j]));
context.Load(item, i => i.Id, i => i["Name"]);
context.ExecuteQuery();
object username = item["Name"];
}
}
I have a very messy solution working, but I'd love to hear of some ideas for a proper/elegant solution.
Right now I'm using GetListItems on the UserInfo list and creating a dictionary of ows_ImnName and ows_Name entries, then parsing the string from the list query into the names and using them as lookup values.
There has to be a better way.