Jump to content
  • Welcome To FMForums

    Welcome to our community, full of great ideas on developing your FileMaker solutions effectively,
     for peer-to-peer support of the FileMaker Platform and related products and services.

    Register and join the conversation!

     

    fmf AD.jpg

     

     

All Activity

This stream auto-updates

  1. Today
  2. Yesterday
  3. Join Jacob Taylor this entire week at 1PM Pacific for a complete FileMaker Server deployment on AWS tutorial! Register for Day 1: https://fmtraining.tv/register.php?eventid=5229916340448395273284332695105701686724772640084971830651 support@rcconsulting.com www.FMTraining.TV www.FMStartingPoint.com www.rcconsulting.com
  4. Last week
  5. A client asked about using Gmail with oAuth 2 and our SendMail functions in MBS FileMaker Plugin. We have an existing example for Microsoft Office 365, which we can adapt for Google Mail. We change a couple of URLs, the scope and then it works fine. But let's go step by step. As part of the oAuth, we later get a callback. Usually this is for contacting a web server, but we like to do it locally. We use our WebHook functions to do within the FileMaker Pro application and catch the answer from the JavaScript running in the browser. Set Variable [ $$WebHooks ; Value: MBS("WebHook.Create") ] Set Variable [ $r ; Value: MBS("WebHook.Listen"; $$WebHooks; 9999) ] Set Variable [ $r ; Value: MBS("WebHook.SetScript"; $$WebHooks; Get(FileName); "WebHookReceived") ] Set Variable [ $text ; Value: "<html><p>Request arrived.</p></html>" ] Set Variable [ $text ; Value: "HTTP/1.1 200 OK¶Server: MyServer 1.0¶Connection: close¶Content-Type: text/html¶Content-Length: 36¶¶" & $text ] Set Variable [ $text ; Value: MBS( "Text.ReplaceNewline"; $Text; 3 ) ] Set Variable [ $r ; Value: MBS("WebHook.SetAutoAnswer"; $$Webhooks; $text; "UTF-8") ] As you see we let the WebHook just answer any request with OK and a short html answer. That one is sent to the JavaScript in the WebViewer and it only cares for the 200 OK. The plugin triggers a script to report the incoming connection. Next we like to load the sign-in page for the google service into the WebViewer. We pass our localhost URL with the port 9999 to taget the WebHook above. Then we request permissions for the mail scope. Faking the custom user agent often helps if the website rejects the WebViewer. Set Variable [ $clientID ; Value: Trim(GMail oAuth SMTP::ClientID) ] Set Variable [ $TenantID ; Value: Trim(GMail oAuth SMTP::TenantID) ] Set Variable [ $redirectURI ; Value: "http://localhost:9999/" ] Set Variable [ $redirectURI ; Value: MBS("Text.EncodeURLComponent"; $redirectURI; "UTF-8") ] Set Variable [ $scope ; Value: "https://mail.google.com/" ] Set Variable [ $scope ; Value: MBS("Text.EncodeURLComponent"; $scope; "UTF-8") ] Set Variable [ $URL ; Value: "https://accounts.google.com/o/oauth2/v2/auth?response_type=code&scope=" & $scope & "&redirect_uri=" & $redirectURI & "&client_id=" & $clientID & "&state=test&prompt=consent" ] # let web viewer be Safari Set Variable [ $r ; Value: MBS("WebView.SetCustomUserAgent"; "web"; "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Safari/605.1.15") ] # Load the URL Set Variable [ $r ; Value: MBS( "WebView.LoadURL"; "web"; $URL) ] We have a callback script for the WebHook and then query the raw data from the request for later. Since we may get additional requests like favicon.ico, we just ignore these. Set Variable [ $WebRequest ; Value: Get(ScriptParameter) ] # # we got the answer Set Variable [ $URLComponents ; Value: MBS( "WebRequest.URLComponents"; $WebRequest ) ] If [ Position ( JSONGetElement ( $URLComponents ; "RelativeURL" ); "favicon.ico"; 1; 1 ) > 0 ] # ignore query for favicon Exit Script [ Text Result: ] End If Set Field [ GMail oAuth SMTP::Answer ; $URLComponents ] # # and show full request for debugging Set Variable [ $Text ; Value: MBS( "Text.ReplaceNewline"; MBS("WebRequest.GetRawData"; $WebRequest; "UTF-8"); 1) ] Set Field [ GMail oAuth SMTP::Debug ; $Text ] # # free the webhook and request Set Variable [ $r ; Value: MBS("WebRequest.Release"; $WebRequest) ] Set Variable [ $r ; Value: MBS("WebHook.Release"; $$WebHooks) ] Set Variable [ $$WebHooks ; Value: "" ] # # clear web viewer Set Variable [ $r ; Value: MBS( "WebView.LoadURL"; "web"; "about:blank") ] Next we need to extract the code from the answer and then make a request to the Google Set Variable [ $URLComponents ; Value: GMail oAuth SMTP::Answer ] Set Variable [ $Parameters ; Value: JSONGetElement ( $URLComponents ; "Parameters" ) ] Set Variable [ $code ; Value: JSONGetElement ( $Parameters ; "code" ) ] Set Variable [ $state ; Value: JSONGetElement ( $Parameters ; "state" ) ] Set Variable [ $session_state ; Value: JSONGetElement ( $Parameters ; "session_state" ) ] Once we have the code, we run a request to turn it into an access code with the google server. Set Variable [ $clientID ; Value: Trim ( GMail oAuth SMTP::ClientID ) ] Set Variable [ $clientSecret ; Value: Trim(GMail oAuth SMTP::ClientSecret) ] Set Variable [ $URL ; Value: "https://oauth2.googleapis.com/token" ] Set Variable [ $redirectURI ; Value: MBS("Text.EncodeURLComponent"; "http://localhost:9999/"; "UTF-8") ] # Set Variable [ $Data ; Value: "code=" & $code & "&client_id=" & $clientID & "&client_secret=" & $clientSecret & "&grant_type=authorization_code" & "&redirect_uri=" & $redirectURI ] Set Variable [ $curl ; Value: MBS("CURL.New") ] Set Variable [ $result ; Value: MBS("CURL.SetOptionURL"; $curl; $URL) ] Set Variable [ $result ; Value: MBS("CURL.SetOptionPostFields"; $curl; $Data; "UTF-8") ] Set Variable [ $result ; Value: MBS("CURL.SetOptionHTTPHeader"; $curl; "application/x-www-form-urlencoded") ] Set Variable [ $result ; Value: MBS("CURL.Perform"; $curl) ] # Pick Result Set Variable [ $code ; Value: MBS( "CURL.GetResponseCode"; $curl ) ] Set Variable [ $resultText ; Value: MBS("CURL.GetResultAsText"; $curl) ] Set Variable [ $debugText ; Value: MBS("CURL.GetDebugAsText"; $curl) ] Set Field [ GMail oAuth SMTP::CURL Debug ; $DebugText ] Set Field [ GMail oAuth SMTP::CURL Result ; $resultText ] If [ $result = "OK" and $code = 200 ] Perform Script [ “Extract Access Token” ; Specified: From list ; Parameter: ] Else Show Custom Dialog [ "SMTP" ; "Failed to query token." ] End If Set Variable [ $result ; Value: MBS("CURL.Cleanup"; $curl) ] We got an answer and now need to parse it from the JSON answer and store it in a field. Set Variable [ $Result ; Value: GMail oAuth SMTP::CURL Result ] # get access token Set Variable [ $token_type ; Value: JSONGetElement ( $Result ; "token_type" ) ] Set Variable [ $scope ; Value: JSONGetElement ( $Result ; "scope" ) ] Set Variable [ $expires_in ; Value: JSONGetElement ( $Result ; "expires_in" ) ] Set Variable [ $ext_expires_in ; Value: JSONGetElement ( $Result ; "ext_expires_in" ) ] Set Variable [ $access_token ; Value: JSONGetElement ( $Result ; "access_token" ) ] Set Variable [ $refresh_token ; Value: JSONGetElement ( $Result ; "refresh_token" ) ] # If [ Length ( $access_token ) > 0 ] Set Field [ GMail oAuth SMTP::access_token ; $access_token ] If [ Length ( $refresh_token ) > 0 ] # we only get one, if offline_access scope is set Set Field [ GMail oAuth SMTP::refresh_token ; $refresh_token ] End If Show Custom Dialog [ "Got token!" ] End If When you send an email, you pass the access token with the CURL.SetOptionXOAuth2Bearer option instead of passing a user name and password. Make sure you request TLS 1.2 or 1.3 like this: # use google server Set Variable [ $r ; Value: MBS("SendMail.SetSMTPServer"; $EmailID; "smtp.gmail.com") ] # later set options for curl: Set Variable [ $r ; Value: MBS("CURL.SetOptionPort"; $curl; 587) ] Set Variable [ $r ; Value: MBS("CURL.SetOptionUseSSL"; $curl; 3) ] Set Variable [ $r ; Value: MBS("CURL.SetOptionSSLVersion"; $curl; 6) ] Set Variable [ $r ; Value: MBS("CURL.SetOptionXOAuth2Bearer"; $curl; GMail oAuth SMTP::access_token) ] Finally you need to do a refresh of the token regularly. The access token is only valid a limited time, so you may refresh the token every day or if it is older than an hour. The example file will be included in next plugin version with the example for Microsoft Office 365. Or email us if you need a copy.
  6. Finish the week with Christian Schmitz at 1PM Pacific to learn all about the latest MonkeyBread Plug-in 15.2 release. Register for the LiveStream: https://fmtraining.tv/register.php?eventid=809123821662612783734956270981249872194503437221875530854 support@rcconsulting.com www.FMTraining.TV www.FMStartingPoint.com www.rcconsulting.com
  7. A bit of chicken and egg question here: Matt wrote: 1. Call to get the login Url and pass in the current token store, or and empty string 2. If the url is returned prompt the user to login by opening a browser with the URL, if not continue (check for ERROR as well) 3. Call EmailOffice365ConnectSMTP (or IMAP), make sure to save the response as this will contain the token if connected successfully 4. Check the response for a token or for an ERROR 5. If no error Store the token into a field and continue to email creation Note that at Step 3, I should "save the response as this will contain the token." How does it RESPOND? Do you mean that I should capture the RESULT, the value of the variable (assuming I'm using the variables vs script steps method)? But back to the farm: That function has parameters: EmailOffice365ConnectSMTP ( username ; tokenStore { ; office365ClientId ; office365ClientSecret ; office365TenantId ; state } ) So "tokenStore" (I have to stop thinking of this as a purchase and start considering a STORED value) is EMPTY the very first time, but then uses that RESULT (per above) every time after? Also, I'm not sure about state - I am setting $$state at the start of my script, and using it as a paramter for connect. Should I not RESET that variable each time the script is called? Should it only be once per session? I just got off the phone with the client's IT guy. I ran my script and it got to the Microsoft message to send him a text message, which he got and gave me the code. Nothing was "responded" back. Curiously, after entering the code he gave me into my browser, MS came back and asked if I wanted to skip "(2 times left") or Next. I did Next. But there were just more prompts to set up stuff in MS and I don't see any reason I should be doing that. I thought maybe I'd try again, and click Skip instead, but couldn't. I tried a couple more times, including after restarting FM, and I could see the MS prompt for only a split second, then I got the 360Works screen (Success, I can close the window), but I still couldn't do a connect, I get the 360Works Email Error dialog with "authentication failed." This is similar - maybe the same - as what was going on previously: preliminary prompts to text him from MS, then 360Works stuff in the browser - with no final success. I thought maybe closing the file and re-opening it was what helped "clear out" the token as mentioned but, frankly, I don't see there was a token to be cleared and restarting did not help. FM is so good in letting us send simple emails - IF you're using Apple Mail, especially. And, at least right now, that's all I'm looking for - no HTML, attachments, mailbox control, etc. - just with MSOffice365. All help is appreciated!
  8. Kristian Olsen joins us today at 1PM Pacific to discuss his ChatGPT FileMaker Add-on! Register for the LiveStream: https://fmtraining.tv/register.php?eventid=3614694288955383683273482599222495102174289096230728870519 support@rcconsulting.com www.FMTraining.TV www.FMStartingPoint.com www.rcconsulting.com
  9. Testing is a crucial part of building reliable FileMaker solutions, whether you're a freelancer or a citizen developer. This guide explores smart testing strategies, from applying the "Zero, One, Many" rule to leveraging FileMaker’s Script Debugger for efficient troubleshooting. Learn how to think like a user, anticipate errors, and implement best practices that will make your applications more robust, user-friendly, and scalable. Includes demo file and video. Testing Your Work in Claris FileMaker dbservices.com
  10. Thanks! I just have to remember to disable the "Do not store calculated results--recalculate when needed" checkbox in the calculated field for it the value list to work. *blush*
  11. Earlier
  12. It wouldn't have worked even with an indexed field, because a value list based on a field will never include a blank value. You could define a calculation field in the related table that combines the "real" value with a placeholder, for example: List ( Valuefield ; " " ) Then define the value list to use values from this calculation field and (if necessary) make the target field auto-enter a calculated value substituting 3 consecutive spaces with nothing.
  13. (I can't seem to find a definitive answer here after poking around, so I apologize if this has been covered before.) I have a related value list that I'd like to use in a pop-up menu. The problem is, I always have to include an adjacent "clear" button to clear the field and it looks amateurish to say the least...so I'd like to have a null/blank value at the top of the value list so users can "clear" the field of an unwanted value. I thought I'd be clever and try this: Let ( [ _relatedValues = List ( fieldname ); _blank = "" ]; _blank & ¶ & _relatedValues ) ...but that won't work because it being a calculation using related values, it can't be indexed. Is there an elegant way to make this happen? Cheers, Rich
  14. Breaking down complex logic into manageable chunks of code is the smartest thing you can do when it comes to conditional formatting. Especially when it needs to account for an increasingly wider number of conditions. This week's video deals with what seems like a simple solution to solve, yet it comes with all kinds of complex little pieces to make the solution provide the end result desired. If you enjoy the type of video which is a bit of a solution walk-thru, where I discuss how things are solved, then make sure to spend a bit of time with this technique and video. Click the title or link to this article to view the video. View the full article
  15. Breaking down complex logic into manageable chunks of code is the smartest thing you can do when it comes to conditional formatting. Especially when it needs to account for an increasingly wider number of conditions. This week's video deals with what seems like a simple solution to solve, yet it comes with all kinds of complex little pieces to make the solution provide the end result desired. If you enjoy the type of video which is a bit of a solution walk-thru, where I discuss how things are solved, then make sure to spend a bit of time with this technique and video. Click the title or link to this article to view the video. View the full article
  16. You cannot use the Insert from URL script step for this because it supports only a limited set of protocols and the fmp:// URL scheme is not among them. You should be able to use the Open URL script step.
  17. Hi comment, The URL call looks like it would do what I want, but I can't seem to make it go. I keep getting Error 5: "Command is invalid (for example, a Set Field script step does not have a calculation specified)" My script step looks like: Insert from URL [With dialog: Off ; Target: $result ; "fmp://my.server.name/HelloTest?script=SayHello" ; Do not automatically encode URL ] I started with my intended final use, and kept simplifying things when it didn't work. I have made a simple file (HelloTest) that uses the Guest account, to eliminate possible hangups with login, etc. I made sure to add the "fmurlscript" extended privilege. The "SayHello" script just shows a custom dialog. I tried using the IP address instead of DNS name of the server, with and without the script parameter, etc. Still only getting Error Code 5. I found a Google result that said Error 5 used to be a problem with the Insert from URL script step, but that it was fixed in FMS 21.1.1. I am running FMS 21.1.1.40, so that shouldn't be a problem. Also, I have several other places where I use Insert from URL to call an API, and they work just fine. Maybe it's the "fmp://" protocol? FMPro is not installed on the server, so maybe that protocol isn't registered and causing it to barf. But it should work when trying to debug locally . . . 🤷‍♂️
  18. Nickenich, Germany - (May 6th, 2025) -- Monkeybread Software today is pleased to announce MBS FileMaker Plugin 15.2 for Claris FileMaker for macOS, iOS, Linux and Windows, the latest update to their product that is easily the most powerful plugin currently available for Claris FileMaker produce line. As the leading database management solution for Windows, macOS, iOS and the web, the Claris FileMaker Pro Integrated Development Environment supports a plugin architecture that can easily extend the feature set of the application. MBS FileMaker Plugin 15.2 has been updated and now includes over 7600 different functions, and the versatile plugin has gained more new functions: Our Integration of the Saxon XML processing library into Xojo completed with the Saxon 12.6 release. You can use XSLT 3.0 for transformations, XQuery 3.1 for queries, XSD 1.1 for document validation and XPath 3.1 for navigation within documents. We added new shortcuts for developers on macOS for calculation dialogs defining formulas: Press key combinations to define the return type just like field types, e.g. command-N for number. For DynaPDF we have a new DynaPDF.RenderJob function to perform rendering pages in a background thread. This keeps the main thread free while you receive a script trigger when it finished. The DynaPDF library can now incrementally update PDF documents and better handle big TIFF images. We added functions to control bidi modes for right to left languages and ReadImageFormatFile and DynaPDF.ReadImageResolutionFile functions to query information for image files. We improved our ListDialog functions. You can define the value returned for the buttons and define whether an extra button needs a selection. And you can control whether we swap OK and cancel button on Windows. You can use auto complete on macOS for file path dialogs. The auto completion now handles XL function names better with two dots. The If/Loop highlighting can show the blocks defined by enter find mode and perform find. Plugin defined variables can contains value lists. Use Variable.ValueCount to count values in the variable and use Variable.AppendValue and Variable.PopValue to add and remove values. Similarly you can store JSON in a plugin based variable and add JSON using Variable.AppendJSON and remove it later using Variable.PopJSON thread safely. For auditing you can set the name of the table occurence for the AuditLog table. If you use UUIDs as primary key, you can use Audit.SetUUIDFields to define the exact names of the fields with the UUID. We added the XL functions to define styled tables in an Excel files, a JSON.ToCSV function to turn JSON into CSV text and added ExtensionFilter parameter for Files.ListRecursive function. Finally we updated the CURL library to version 8.13.0, DynaPDF to 4.0.100.285, expat to 2.7.1, libarchive to 3.7.9, LibXL to 4.6, SQLAPI to 5.3.6, Saxon to 12.6 and we updated the plugin SDK. See release notes for a complete list of changes. More details in the release notes. Please take the time to check our 600 example databases and check where you can use our plugin features in your solutions. System Requirements: * macOS 10.13 or later * Windows 10 and newer, Windows 7 and 8 on request. * FileMaker Pro 7 to 21.1 * FileMaker iOS SDK * FileMaker Server for Linux, Windows or macOS Pricing and Availability: MBS FileMaker Plugin is available directly from the MonkeyBread Software website with licenses starting at just $149 USD. You can just download and try the plugin without a license or request a trail license. Not all functions are available in all platforms, please check specifications. Please join us on the next conferences and visit our booth. Monkeybread Software Website https://monkeybreadsoftware.com/filemaker/ Documentation: https://mbsplugins.eu/ Release notes: https://monkeybreadsoftware.com/filemaker/releasenotes.shtml Located in beautiful Nickenich, Germany, MonkeyBread Software is a privately held company founded in 2000 by Christian Schmitz. MonkeyBread Software focuses on the Macintosh, Linux and Windows platforms. With over twenty years as a software developer, Christian's aim is developing unique and useful utilities, complemented by first-class customer support. Copyright 2000-2025 Christian Schmitz Software GmbH. MonkeyBread Software is a registered trademark of Christian Schmitz, Nickenich. All Rights Reserved. Apple, and the Apple logo are registered trademarks of Apple Computer in the U.S. and/or other countries. FileMaker Pro and FileMaker are trademarks of Claris International, Inc. Other trademarks and registered trademarks may be the property of their respective owners. Greetings Christian Schmitz Monkeybread Software
  19. Matt et al - THANK YOU. I'm going to take a moment, digest your info, revise my process, and - no doubt - get back with more questions. Again, thanks!
  20. Hello Satin, I am a developer at 360Works and can answer your questions. We separate functions and script steps because in some cases you would like to store the results of the step, for this you can run it as a function. I typically encourage his approach as all of our script steps will return "ERROR" if there was an issue. While there is a method to handle errors with script steps doing so as a calculation is easier. We have documentation on handling this situation here. You can also chain calls to the plugin, for example you can create an email, add a body, attach a file, and send it all within a single SetVariable call. There are also some script steps that do not support all the same parameters, beyond that it comes down to personal preference. Yes, you are correct, and this is possible. Office365 does require OAuth, and a typical workflow would look something like this Call to get the login Url and pass in the current token store, or and empty string If the url is returned prompt the user to login by opening a browser with the URL, if not continue (check for ERROR as well) Call EmailOffice365ConnectSMTP (or IMAP), make sure to save the response as this will contain the token if connected successfully Check the response for a token or for an ERROR If no error Store the token into a field and continue to email creation This token is typically good for 90 days and will refresh without the need to login if used during this time, meaning that the user will not need to login in the majority of use cases, and the token should last virtually indefinitely. If you expect that 90 days may elapse without the token being used you can configure a scheduled script to connect and refresh the token, though that may not be considered the most secure option as it will prevent unused tokens from ever expiring. This token will work across devices so long as the user is logging in with the same Email. Many users will login on the client, save the token to a field, and then perform script on server to use the token in a headless environment. Keep in mind if there was a failed attempt and invalid text was saved to the token field you will need to manually clear this out, it can often be the cause of having trouble getting a valid token from the connect step. We do have documentation on the steps here. Now as for the 360Works Client and Secret this one is a bit tricky. In recent weeks Google has rolled back support for basic authentication and 3rd party app support for 'Unverified' apps. We have found that without a Client and Secret setup many implementations are failing. While I have not heard of Microsoft doing this I would encourage you to consider setting this up if possible, as it could prevent potential issues in the future if they follow suit. For your use case this is likely not something you need to consider. The primary use would be if an organization wants the auth app to be within their organization. This is typically a security restriction or similar internal policy. Please let me know if you have any other questions. Matt 360Works Developer
  21. Hi Satin Doll, I'll try to address each of your questions as best I can. Firstly, the script step vs calculation function methods: These are effectively equivalent to one another. Starting in FileMaker 16, plugin functions became registrable using script steps in addition to the previously supported calculation function method. It's personal preference which you'd prefer to use, it simply changes how you do error capturing slightly. One thing to note is that if you're running scripts on the server, you will want to invoke EmailRegister at the beginning of each script, since the server does not retain in-memory sessions between script calls. Next, Office365 Integration The plugin (and really Microsoft) requires that you use OAuth to authenticate the email APIs. A couple of years ago Microsoft sunsetted the traditional IMAP login methods in favor of OAuth 2.0. if there is multi-factor authentication set up on any account you want to use with the plugin, you'll have to complete the MFA challenges in order to authenticate that account. Each account you want to send/receive mail with must be authenticated separately. That being said, re-authentication is usually never necessary. So long as you use the token and update it in your database at least once every 90 days, the refresh token will remain valid, and you won't need to re-authenticate any of your accounts. Once you have a token, it can be used from any instance of the Email plugin, whether FileMaker Pro or FileMaker Server, just remember what I said earlier about calling EmailRegister at the beginning of your server-side scripts. You may configure your own Azure Developer Account if you'd prefer to keep the OAuth application within your own organization. Most people choose to use our Developer Account, which is also just fine as long as the organization allows it, which most do. If you'd like more hands-on support, send us an email at support@360works.com and we'd be happy to help you out! We also offer integration services so you can sit back and let us do all the heavy lifting! Hopefully I've answered all your questions, please reach back out here or at our support inbox if you have any followup questions!
  22. Hi, I'm trying to obtain or refresh a Google Cloud OAuth 2.0 Access Token using a Service Account Key and FileMaker native Base64Encode. Dependencies: Service Account JSON key from the secure container field. Using FileMaker's native TextDecode function to interpret the container data as UTF-8 text. I'm out of ideas on what could be causing the fail. Anyone care to pitch in with ideas? All the very best, Daniel
  23. I am working with 360Works Email plugin, 5.05 Enterprise version and FileMaker 20 - or, at least, trying to. 😉 I have seen some samples with the approach: set variable [ $result = EmailRegister (bunch of stuff) and ... and ... and Email Disconnect ] Examples: http://docs.360works.com/index.php/360Works_Email/Documentation#Function_Detail I have also seen that many of the email functions are listed as script steps. I'm comfortable with functions and script steps, but am wondering: why we have both, if there are differences in their usage, if there are best practices to use one over the other, etc. Instead of using a complicated multi-part function, I'm trying to set separate actions for each Email function. This is partly so I can follow and debug the process more closely, but also because, ultimately, I expect to break out certain portions of the plugin use to be included at different points in the users' experience - for instance, verify registsration at startup, but don't create or send an email until a special button is clicked. Most of the commands/functions are pretty straightforward, and I'm comfortable with verifying the plugin early, and creating an email later. But I'm having some difficulty in-between - with getting the URL and actually connecting. The plugin has been purchased specifically for users on Mac with Office365 and Outlook. When I first tried connecting through FileMaker's native options, I got prompted to have verification sent to a phone number that belongs to the client's IT guy. We tried a few things that didn't work. I asked if we needed to use OAuth, and he said "no." But now that I'm into the plugin, I'm reading that EmailOffice365Connect requires OAuth. Now that I'm playing with the plugin, I'm still getting prompts. I think I haven't received a solid token yet, so I'm kind of stuck. I want to be able to put it in a field (text, right?), be able to see it and call it as I would any other chunk of data. Is that possible? I especially don't want the end-user to have to click past a browser to go back and click in FileMaker to make the magic happen. I was able to get to that point a couple of times, but it is not how I want this all to work. Some of the documentation says it's OK to use blanks, that 360Works has their own authentication, and I think I saw that work at one point. But now I'm just getting that Microsoft web page that wants to send a text to their IT guy again. I really hate bothering him unless it's going to solve the problem once and for all. If I could just get it to work in the demo file, I'd be more confident I could get it to work in my production file. Once I get a token, is it good just for me (my client FMP)? for the file (hosted by FM Server)? for all the FM files I use with my client app? or ... ? I keep hearing the token only needs to be refreshed periodically. How do I prevent an end-user from having to go through the initial set-up at some point in the future? Specifically, for a 90-day token (seems that's common), and a once-a-year activity, how would that work? I keep seeing references to the Microsoft Azure Developer Account. Is that something I should set up? WOuld it be for me or for the client or the project or ...? At this point, we expect to send one email (providing an account name and default, volatile, initial password with basic instructions for using WebDirect screens), one at a time, with a click of a button at the layout for the account holder - no builk mail, no multiple recipients, no attachments, no email reading. Just need to send a basic email. Any and all help appreciated!
  24. Rendering text in a PDF might seem straightforward—until you try working with languages like Arabic or Hebrew. These languages require more than just placing characters from left to right. Without proper handling, the result can be unreadable or even misleading. Let’s look at how DynaPDF handles this challenge using Bidirectional (Bidi) Mode and Complex Text Rendering. The Problem with Basic Text Rendering When rendering Latin-based languages like English, you can often get away with simply passing text directly to DynaPDF and letting it handle the rest. But try the same with Arabic, and you’ll see this: Anyone who reads Arabic would instantly notice something's wrong. Arabic, like many other languages, has context-sensitive glyph shaping. The shape of a character can change depending on whether it appears at the beginning, middle, or end of a word. On top of that, the text flows right-to-left, adding more complexity. Enter Bidirectional Mode To handle this, DynaPDF offers Bidi Mode. When enabled, this mode uses the Unicode Bidirectional Algorithm, as defined by the Unicode Consortium, to determine how to properly order characters in a mixed left-to-right (LTR) and right-to-left (RTL) context. DynaPDF supports the entire UCS-2 character range and handles most use cases well. However, the results can differ slightly from what you'd get using Microsoft's Uniscribe, which is often used in Windows applications to process complex text. If you need to match Uniscribe’s output, you should: Pre-process your text using Uniscribe or a similar Unicode library. Disable the internal Bidi algorithm in DynaPDF. Load the font with the Unicode code page to maintain compatibility. Once you do this, your output will look like this: Using Complex Text Rendering On Windows, DynaPDF can take this even further using the ComplexText flag. When enabled, this lets DynaPDF **leverage Uniscribe to perform both bidirectional processing and advanced glyph shaping, all before the text is rendered. This results in output that is significantly more legible and natural for RTL languages like Arabic: Best Practices for Arabic (and RTL) Text If you're working with Arabic or any RTL language in DynaPDF, follow these recommendations: Enable BidiMode = RightToLeft This activates the Unicode Bidirectional Algorithm. Enable ComplexText (on Windows) This allows DynaPDF to use Uniscribe for shaping and ordering. Pre-process text using an external Unicode library (if needed) Especially when working on non-Windows platforms or aiming to match a specific rendering engine. Use Unicode fonts Make sure your fonts support the full range of characters and glyphs needed for the language. With these tools, DynaPDF makes it possible to render complex languages properly, whether you're creating invoices in Arabic or supporting multilingual user interfaces. If you need help setting this up in your application, feel free to reach out—we’re happy to help you get beautiful, readable results!
  25. I am not sure how applicable this is to your situation but the URL scheme allows you to call a script in another file with the credentials passed in the call itself: https://help.claris.com/en/pro-help/content/opening-files-url.html Another option you may consider is the Data API: https://help.claris.com/en/data-api-guide/content/run-a-script.html
  26. Hello, I'm creating a "mailer" file to send HTML emails from FileMaker without the need for a third-party plugin. The idea is that whenever another FM app needs to send an email, it can just ball up some JSON and call the "Send Mail" script from the central mailer file with the JSON as the script parameter. I've read that if the same credential set exists for the logged-in user in both files, opening the secondary file will be transparent. However, if not, the user is presented with a login dialog. Since the "Open File" script step is not supported on WebDirect, I can't just detect if the file is open (via the DatabaseNames function) and have the script log in. Using PSOS still shows the dialog. Is there any way to run a script from another FM file without the user seeing a login dialog and without needing to duplicate user accounts in the second file?
  27. If you enjoyed Kyle’s basic overview of JSinFM, you won’t want to miss this deeper dive! Join Kyle today at 1PM Pacific to learn more about injecting JavaScript into existing FileMaker webviewers. Register for the LiveStream: https://fmtraining.tv/register.php?eventid=5368803657973188027105354062945446996115129825983705852975 support@rcconsulting.com www.FMTraining.TV www.FMStartingPoint.com www.rcconsulting.com
  28. Rick Kalman from Claris joins us today at 1PM Pacific for the latest FileMaker News and to answer your community questions! Register for the LiveStream: https://fmtraining.tv/register.php?eventid=1212623626360485692070330154464255243402192886437052523874 support@rcconsulting.com www.FMTraining.TV www.FMStartingPoint.com www.rcconsulting.com
  29. Hi, below are the message I got. You have denied access to Google- IMAP. please grant office access to Google- IMAP and try again. For more information: http://go.microsoft.com/fwlink/?linkid=2297591
  1. Load more activity
×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.