Commit 08ecfb7c by Mac Stephens

Add submitter confirmation emails; split contact vs demo logging into separate…

Add submitter confirmation emails; split contact vs demo logging into separate tagged log files; remove subject/submitted-on from confirmation; update text on forms
parent 0b809c28
...@@ -22,7 +22,6 @@ const ...@@ -22,7 +22,6 @@ const
' </a>' + ' </a>' +
' </div>' + ' </div>' +
' <div class="col-lg-4">' + ' <div class="col-lg-4">' +
' <div class="h6 mb-2">Explore</div>' +
' <ul class="list-unstyled mb-0 small">' + ' <ul class="list-unstyled mb-0 small">' +
' <li class="mb-1"><a href="#FHome" id="homefooter" class="link-light text-decoration-none">Home</a></li>' + ' <li class="mb-1"><a href="#FHome" id="homefooter" class="link-light text-decoration-none">Home</a></li>' +
' <li class="mb-1"><a href="#FAboutUs" id="aboutusfooter" class="link-light text-decoration-none">About Us</a></li>' + ' <li class="mb-1"><a href="#FAboutUs" id="aboutusfooter" class="link-light text-decoration-none">About Us</a></li>' +
......
...@@ -28,9 +28,9 @@ const ...@@ -28,9 +28,9 @@ const
' <li class="nav-item dropdown">' + ' <li class="nav-item dropdown">' +
' <a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">What We Do</a>' + ' <a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">What We Do</a>' +
' <ul class="dropdown-menu">' + ' <ul class="dropdown-menu">' +
' <li><a class="dropdown-item" href="#FPublicSafety">Public Safety Software</a></li>' +
' <li><a class="dropdown-item" href="#FRecordsManagement">Records Management Notification</a></li>' +
' <li><a class="dropdown-item" href="#FCustomSoftware">Custom Software</a></li>' + ' <li><a class="dropdown-item" href="#FCustomSoftware">Custom Software</a></li>' +
' <li><a class="dropdown-item" href="#FPublicSafety">Public Safety</a></li>' +
' <li><a class="dropdown-item" href="#FRecordsManagement">Records Management</a></li>' +
' </ul>' + ' </ul>' +
' </li>' + ' </li>' +
' <li class="nav-item"><a class="nav-link" href="#FContactUs">Contact Us</a></li>' + ' <li class="nav-item"><a class="nav-link" href="#FContactUs">Contact Us</a></li>' +
......
...@@ -10,18 +10,16 @@ ...@@ -10,18 +10,16 @@
<div class="text-wrapper-aboutus mx-auto p-3 p-md-5 rounded shadow"> <div class="text-wrapper-aboutus mx-auto p-3 p-md-5 rounded shadow">
<h2>Our Story</h2> <h2>Our Story</h2>
<p class="fs-6"> <p class="fs-6">
EM Systems was established in the early 1990s as a software development group. Over the last Located in Buffalo, New York, EM Systems has designed and delivered a wide range of custom software
two decades, EM Systems have developed a vast array of custom software applications for a variety of solutions across multiple industries, with the strongest emphasis on Public Safety Systems. Today, more
industries with a primary focus on the Public Safety and Healthcare fields. Currently, over 75 than 75 organizations throughout New York State depend on EM Systems applications to support their
organizations across New York State rely on EM Systems applications to meet the needs of their communities and agencies.
communities and
customers. EM Systems prides itself in its ability to create custom software solutions to meet the EM Systems is distinguished by its ability to develop tailored software solutions that address the
specific needs of unique requirements of each client. Our mission is to deliver reliable, efficient software that enhances
our customers. Our goal is to create software which facilitates and enhances current business practices and streamlines existing business or agency operations. In addition to deep expertise in software
in a development, we bring extensive experience in analyzing, refining, and improving operational workflows
reliable and efficient manner. Not only do we offer expert software development knowledge and skills but to drive greater efficiency and effectiveness.
we are also experienced in understanding and improving efficiency in current business processes and
practice.
</p> </p>
</div> </div>
</div> </div>
......
...@@ -15,22 +15,55 @@ ...@@ -15,22 +15,55 @@
<!--MAIN CONTAINER--> <!--MAIN CONTAINER-->
<div class="container-main"> <div class="container-main">
<div class="learn-boxes py-5"> <div class="learn-boxes">
<!-- CUSTOM SOFTWARE BOX 1 --> <!-- CUSTOM SOFTWARE BOX 1 -->
<div class="row mb-4 g-4 align-items-center bg-white shadow-sm rounded"> <div class="row mb-4 g-4 align-items-center bg-white shadow-sm rounded">
<div class="col-md-12"> <div class="col-md-12">
<div class="p-3 text-center"> <div class="p-3">
<h2>AutoPark</h2> <div class="text-center">
<p class="mx-auto" style="max-width: 850px;">AutoPark is our parking ticket management system. It streamlines and coordinates the process and procedures of managing a parking area. From parking tags, tickets and bills to payments and appeals, this solution has it all when it comes to parking management.</p> <h2>CJIS Compliance Commitment</h2>
<p class="mx-auto" style="max-width: 850px;">EM Systems is fully committed to meeting and exceeding CJIS
requirements across every component of the Public Safety Software programs, providing agencies with
secure, compliant, and reliable solutions that can be trusted to support mission-critical operations.
</p>
</div>
<div class="container">
<h3 class="text-center">List of Programs</h3>
<div class="row justify-content-center">
<div class="col-sm-6 col-md-auto mb-2 border-top pt-3" style="max-width: 350px;">
<ul class="text-start">
<li>Computer Aided Dispatch (CAD) - Police, Fire &amp; EMS</li>
<li>Mapping w/GPS tracking &amp; AVL</li>
<li>Records Management System (RMS)</li>
<li>Mobile Data System (MDS) w/Police Reports &amp; Arrest</li>
<li>Livescan Fingerprinting w/ Booking and Civil submissions</li>
</ul>
</div>
<div class="col-sm-6 col-md-auto text-md-start border-top pt-3" style="max-width: 350px;">
<ul>
<li>Jail Management System (JMS)</li>
<li>iPhone &amp; Android Apps - CAD Monitor &amp; Data Access</li>
<li>FireRMS w/NERIS reporting</li>
<li>Summons &amp; Accidents MDS modules (Tracs replacement)</li>
<li>Discovery module w/Interface to DEMS</li>
<li>Interfaces to State &amp; Federal Systems</li>
</ul>
</div>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
<!-- CUSTOM SOFTWARE BOX 2 --> <!-- CUSTOM SOFTWARE BOX 2 -->
<div class="row mb-4 g-4 align-items-center bg-gray shadow-sm rounded"> <div class="row mb-4 g-4 align-items-center bg-grey shadow-sm rounded">
<div class="col-md-12"> <div class="col-md-12">
<div class="p-3 text-center"> <div class="p-3 text-center">
<h2>Document Scanning Tools</h2> <h2>AutoPark</h2>
<p class="mx-auto" style="max-width: 850px;">Scan and transmit paper documents with ease. This software provides an easy way to scan and organize paper documents and send them electronically to a variety of configurable destinations including HL7, FTPS, HTTPS, CIFS and more.</p> <p class="mx-auto" style="max-width: 850px;">AutoPark is our parking ticket management system. It
streamlines and coordinates the process and procedures of managing a parking area. From parking tags,
tickets and bills to payments and appeals, this solution has it all when it comes to parking management.
</p>
</div> </div>
</div> </div>
</div> </div>
...@@ -38,17 +71,21 @@ ...@@ -38,17 +71,21 @@
<div class="row mb-4 g-4 align-items-center bg-white shadow-sm rounded"> <div class="row mb-4 g-4 align-items-center bg-white shadow-sm rounded">
<div class="col-md-12"> <div class="col-md-12">
<div class="p-3 text-center"> <div class="p-3 text-center">
<h2>Document Management System</h2> <h2>Document Scanning Tools</h2>
<p class="mx-auto" style="max-width: 850px;">Very easily scan and store all of your paper documents securely and safely and retrieve any of them instantly at any time. This software can save countless hours for document imaging projects and can be customized to fit specific needs.</p> <p class="mx-auto" style="max-width: 850px;">Scan and transmit paper documents with ease. This software
provides an easy way to scan and organize paper documents and send them electronically to a variety of
configurable destinations including HL7, FTPS, HTTPS, CIFS and more.</p>
</div> </div>
</div> </div>
</div> </div>
<!-- CUSTOM SOFTWARE BOX 4 --> <!-- CUSTOM SOFTWARE BOX 4 -->
<div class="row mb-4 g-4 align-items-center bg-gray shadow-sm rounded"> <div class="row mb-4 g-4 align-items-center bg-grey shadow-sm rounded">
<div class="col-md-12"> <div class="col-md-12">
<div class="p-3 text-center"> <div class="p-3 text-center">
<h2>Pawn Shop Pro</h2> <h2>Document Management System</h2>
<p class="mx-auto" style="max-width: 850px;">This is a pawn shop management system that will simplify record keeping, billing, and inventory management. If there is something specific that you need for your pawn shop the software can be modified to suit your needs.</p> <p class="mx-auto" style="max-width: 850px;">Very easily scan and store all of your paper documents securely
and safely and retrieve any of them instantly at any time. This software can save countless hours for
document imaging projects and can be customized to fit specific needs.</p>
</div> </div>
</div> </div>
</div> </div>
...@@ -56,8 +93,20 @@ ...@@ -56,8 +93,20 @@
<div class="row mb-4 g-4 align-items-center bg-white shadow-sm rounded"> <div class="row mb-4 g-4 align-items-center bg-white shadow-sm rounded">
<div class="col-md-12"> <div class="col-md-12">
<div class="p-3 text-center"> <div class="p-3 text-center">
<h2>Pawn Shop Pro</h2>
<p class="mx-auto" style="max-width: 850px;">This is a pawn shop management system that will simplify record
keeping, billing, and inventory management. If there is something specific that you need for your pawn
shop the software can be modified to suit your needs.</p>
</div>
</div>
</div>
<!-- CUSTOM SOFTWARE BOX 6 -->
<div class="row mb-4 g-4 align-items-center bg-grey shadow-sm rounded">
<div class="col-md-12">
<div class="p-3 text-center">
<h2>Employee Time Tracking</h2> <h2>Employee Time Tracking</h2>
<p class="mx-auto" style="max-width: 850px;">This software is an easy and useful way to track customers, projects, tasks, and resources over time and create reports from this information.</p> <p class="mx-auto" style="max-width: 850px;">This software is an easy and useful way to track customers,
projects, tasks, and resources over time and create reports from this information.</p>
</div> </div>
</div> </div>
</div> </div>
......
...@@ -9,15 +9,12 @@ ...@@ -9,15 +9,12 @@
<div class="text-wrapper"> <div class="text-wrapper">
<h1 class="display-4">Custom Software, Comprehensive Support</h1> <h1 class="display-4">Custom Software, Comprehensive Support</h1>
<!-- Constrain only the paragraph width -->
<div class="mx-auto" style="max-width: 540px;"> <div class="mx-auto" style="max-width: 540px;">
<p class="lead fs-3 mb-0">Real connections. Reliable support. Software made for you.</p> <p class="lead fs-3 mb-0">Real connections. Reliable support. Software made for you.</p>
</div> </div>
<!-- Button sits outside the max-width block -->
<div class="mt-5"> <div class="mt-5">
<button type="button" <button type="button" id="btn_demo"
id="btn_demo"
class="btn btn-lg rounded-pill fw-semibold text-white shadow px-4 px-sm-5 py-2" class="btn btn-lg rounded-pill fw-semibold text-white shadow px-4 px-sm-5 py-2"
onclick="window.location.hash='#FRequestDemo';"> onclick="window.location.hash='#FRequestDemo';">
Request a Demo Request a Demo
...@@ -30,6 +27,7 @@ ...@@ -30,6 +27,7 @@
<!--MAIN CONTAINER--> <!--MAIN CONTAINER-->
<div class="container-main"> <div class="container-main">
<!-- LEARN BOXES --> <!-- LEARN BOXES -->
<div class="learn-boxes"> <div class="learn-boxes">
<div class="row mb-4 g-4 align-items-center bg-white shadow-sm rounded"> <div class="row mb-4 g-4 align-items-center bg-white shadow-sm rounded">
...@@ -41,7 +39,10 @@ ...@@ -41,7 +39,10 @@
<div class="col-md-6"> <div class="col-md-6">
<div class="p-3 text-center"> <div class="p-3 text-center">
<h2>Integrated Public Safety Software</h2> <h2>Integrated Public Safety Software</h2>
<p>EM Systems maintains a full suite of proven integrated systems that can be tailored to fit the specific needs of your organization. Seeking to move from an older outdated, or more expensive solution? Facilitate a smooth transition and don’t lose a thing. Ask us about data conversion and training programs.</p> <p>EM Systems maintains a full suite of proven integrated public safety systems that can be tailored to fit
the specific needs of your organization. If you are seeking to move from an older outdated or more
expensive solution, we will facilitate a smooth transition to our customizable proven solutions. Ask us
about data conversion and training programs.</p>
<a href="#FPublicSafety" id="publicsafetylearn" class="btn btn-primary btn-black">Learn More</a> <a href="#FPublicSafety" id="publicsafetylearn" class="btn btn-primary btn-black">Learn More</a>
</div> </div>
</div> </div>
...@@ -55,7 +56,9 @@ ...@@ -55,7 +56,9 @@
<div class="col-md-6"> <div class="col-md-6">
<div class="p-3 text-center"> <div class="p-3 text-center">
<h2>Records Management Notification System</h2> <h2>Records Management Notification System</h2>
<p>EM Systems has several new records and information management systems which incorporate modern paradigms in the field. Thinking of integrating electronic medical records with public safety systems? We can help. Feel free to contact us any time.</p> <p>EM Systems has a suite of new records and information management solutions which incorporate modern
paradigms in the field. Learn about simplifying the management of your information through notification
processes and never miss a task by using this built in task related notification alerting system.</p>
<a href="#FRecordsManagement" id="recordsmanagementlearn" class="btn btn-primary btn-black">Learn More</a> <a href="#FRecordsManagement" id="recordsmanagementlearn" class="btn btn-primary btn-black">Learn More</a>
</div> </div>
</div> </div>
...@@ -69,7 +72,10 @@ ...@@ -69,7 +72,10 @@
<div class="col-md-6"> <div class="col-md-6">
<div class="p-3 text-center"> <div class="p-3 text-center">
<h2>Custom Software Development</h2> <h2>Custom Software Development</h2>
<p>EM Systems has great talent when it comes to working with customers to develop software solutions designed and tailored to their specific needs. Over the years we have created hundreds of custom solutions that have worked wonders for our customers.</p> <p>EM Systems brings exceptional expertise by partnering with customers to design software solutions
tailored to specific needs. We have developed hundreds of custom solutions that have delivered outstanding
results for our customers. Learn more about some of the custom solutions we have developed through
successful partnerships and collaboration with our clients.</p>
<a href="#FCustomSoftware" id="customsoftwarelearn" class="btn btn-primary btn-black">Learn More</a> <a href="#FCustomSoftware" id="customsoftwarelearn" class="btn btn-primary btn-black">Learn More</a>
</div> </div>
</div> </div>
...@@ -79,5 +85,3 @@ ...@@ -79,5 +85,3 @@
<div id="site_footer"></div> <div id="site_footer"></div>
</div> </div>
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
<img src="images\computer_code.jpg" alt="Hero Image" class="img-fluid hero-image"> <img src="images\computer_code.jpg" alt="Hero Image" class="img-fluid hero-image">
<div class="hero-overlay d-flex justify-content-center align-items-center"> <div class="hero-overlay d-flex justify-content-center align-items-center">
<div class="text-wrapper"> <div class="text-wrapper">
<h1 class="display-4">Integrated Public Safety</h1> <h1 class="display-4">Integrated Public Safety Software</h1>
</div> </div>
</div> </div>
</div> </div>
...@@ -15,17 +15,57 @@ ...@@ -15,17 +15,57 @@
<!--MAIN CONTAINER--> <!--MAIN CONTAINER-->
<div class="container-main"> <div class="container-main">
<div class="learn-boxes py-5"> <div class="learn-boxes">
<!-- PUBLIC SAFETY BOX 1 --> <!-- PUBLIC SAFETY BOX 1 -->
<div class="row mb-4 g-4 align-items-center bg-white shadow-sm rounded"> <div class="row mb-4 g-4 align-items-center bg-white shadow-sm rounded">
<div class="col-md-12"> <div class="col-md-12">
<div class="p-3"> <div class="p-3">
<div class="text-center"> <div class="text-center">
<h2>CJIS Compliance Commitment</h2>
<p class="mx-auto" style="max-width: 850px;">EM Systems is fully committed to meeting and exceeding CJIS
requirements across every component of the Public Safety Software programs, providing agencies with
secure, compliant, and reliable solutions that can be trusted to support mission-critical operations.
</p>
</div>
<div class="container">
<h3 class="text-center">List of Programs</h3>
<div class="row justify-content-center">
<div class="col-sm-6 col-md-auto mb-2 border-top pt-3" style="max-width: 350px;">
<ul class="text-start">
<li>Computer Aided Dispatch (CAD) - Police, Fire &amp; EMS</li>
<li>Mapping w/GPS tracking &amp; AVL</li>
<li>Records Management System (RMS)</li>
<li>Mobile Data System (MDS) w/Police Reports &amp; Arrest</li>
<li>Livescan Fingerprinting w/ Booking and Civil submissions</li>
</ul>
</div>
<div class="col-sm-6 col-md-auto text-md-start border-top pt-3" style="max-width: 350px;">
<ul>
<li>Jail Management System (JMS)</li>
<li>iPhone &amp; Android Apps - CAD Monitor &amp; Data Access</li>
<li>FireRMS w/NERIS reporting</li>
<li>Summons &amp; Accidents MDS modules (Tracs replacement)</li>
<li>Discovery module w/Interface to DEMS</li>
<li>Interfaces to State &amp; Federal Systems</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- PUBLIC SAFETY BOX 2 -->
<div class="row mb-4 g-4 align-items-center bg-grey shadow-sm rounded">
<div class="col-md-12">
<div class="p-3">
<div class="text-center">
<h2>Computer Aided Dispatch</h2> <h2>Computer Aided Dispatch</h2>
<p class="mx-auto" style="max-width: 850px;">EM Systems’ CAD program is designed for use by an unlimited number of police, fire, and emergency medical <p class="mx-auto" style="max-width: 850px;">EM Systems CAD solution is a powerful, scalable platform
services (EMS) agencies in a single or multi-agency environment. The system provides complaint and incident designed to support an unlimited number of police, fire, and emergency medical services (EMS) agencies
mapping, real-time tracking of vehicles, field communications, and alerts to potential hazards at an in both single-agency and multi-agency environments. Built to enhance operational awareness and
address.</p> responder safety, the system delivers advanced incident mapping, real-time vehicle tracking, seamless
field communications, and proactive alerts for potential hazards at specific locations.</p>
</div> </div>
<div class="container"> <div class="container">
<h3 class="text-center">System Features</h3> <h3 class="text-center">System Features</h3>
...@@ -38,7 +78,8 @@ ...@@ -38,7 +78,8 @@
<li>Field Communications</li> <li>Field Communications</li>
</ul> </ul>
</div> </div>
<div class="col-sm-6 col-md-auto text-md-start border-top pt-3" style="max-width: 250px;"> <!-- Set max-width and use Bootstrap's sizing --> <div class="col-sm-6 col-md-auto text-md-start border-top pt-3" style="max-width: 250px;">
<!-- Set max-width and use Bootstrap's sizing -->
<ul> <ul>
<li>Messaging and Bulletin Boards</li> <li>Messaging and Bulletin Boards</li>
<li>Alerts and Hazards Notification</li> <li>Alerts and Hazards Notification</li>
...@@ -51,23 +92,28 @@ ...@@ -51,23 +92,28 @@
</div> </div>
</div> </div>
</div> </div>
<!-- PUBLIC SAFETY BOX 2 --> <!-- PUBLIC SAFETY BOX 3 -->
<div class="row mb-4 g-4 align-items-center bg-gray shadow-sm rounded"> <div class="row mb-4 g-4 align-items-center bg-white shadow-sm rounded">
<div class="col-md-12"> <div class="col-md-12">
<div class="p-3"> <div class="p-3">
<div class="text-center"> <div class="text-center">
<h2>Record Management System</h2> <h2>Record Management System</h2>
<p class="mx-auto" style="max-width: 850px;">Our Records Management System (RMS) is a powerful menu-driven database system than can be used to track <p class="mx-auto" style="max-width: 850px;">Our Records Management System (RMS) is a powerful menu-driven
everything from arrest / booking information to court records (e.g., orders of protection, summons, etc.), database system than can be used to track
everything from arrest / booking information to court records (e.g., orders of protection, summons,
etc.),
and personnel information (e.g., training, promotions, etc.). The system provides for enhanced patrol, and personnel information (e.g., training, promotions, etc.). The system provides for enhanced patrol,
investigative, and administrative processes and provides a wealth of valuable analysis information. Users investigative, and administrative processes and provides a wealth of valuable analysis information.
can create reports based on data from any field in the software to help prevent and solve crimes, allocate Users
can create reports based on data from any field in the software to help prevent and solve crimes,
allocate
resources, and much more.</p> resources, and much more.</p>
</div> </div>
<div class="container"> <div class="container">
<h3 class="text-center">System Features</h3> <h3 class="text-center">System Features</h3>
<div class="row justify-content-center"> <div class="row justify-content-center">
<div class="col-sm-6 col-md-auto mb-2 border-top pt-3" style="max-width: 250px;"> <!-- Set max-width and use Bootstrap's sizing --> <div class="col-sm-6 col-md-auto mb-2 border-top pt-3" style="max-width: 250px;">
<!-- Set max-width and use Bootstrap's sizing -->
<ul class="text-start"> <ul class="text-start">
<li>Master Name including detailed data on persons, addresses, vehicles, etc.</li> <li>Master Name including detailed data on persons, addresses, vehicles, etc.</li>
<li>Tracking incident activity <li>Tracking incident activity
...@@ -78,7 +124,8 @@ ...@@ -78,7 +124,8 @@
</li> </li>
</ul> </ul>
</div> </div>
<div class="col-sm-6 col-md-auto text-md-start border-top pt-3" style="max-width: 250px;"> <!-- Set max-width and use Bootstrap's sizing --> <div class="col-sm-6 col-md-auto text-md-start border-top pt-3" style="max-width: 250px;">
<!-- Set max-width and use Bootstrap's sizing -->
<ul> <ul>
<li>Crime analysis</li> <li>Crime analysis</li>
<li>Personnel information / management <li>Personnel information / management
...@@ -94,14 +141,16 @@ ...@@ -94,14 +141,16 @@
</div> </div>
</div> </div>
</div> </div>
<!-- PUBLIC SAFETY BOX 3 --> <!-- PUBLIC SAFETY BOX 4 -->
<div class="row mb-4 g-4 align-items-center bg-white shadow-sm rounded"> <div class="row mb-4 g-4 align-items-center bg-grey shadow-sm rounded">
<div class="col-md-12"> <div class="col-md-12">
<div class="p-3"> <div class="p-3">
<div class="text-center"> <div class="text-center">
<h2>Mobile Data System</h2> <h2>Mobile Data System</h2>
<p class="mx-auto" style="max-width: 850px;">The Mobile Data System (MDS) we created provides multi-agency mobile data communications interoperability. <p class="mx-auto" style="max-width: 850px;">The Mobile Data System (MDS) we created provides multi-agency
The system provides mobile users the ability to perform onsite data checks, including plate checks, driver mobile data communications interoperability.
The system provides mobile users the ability to perform onsite data checks, including plate checks,
driver
checks, vehicle data checks, and name checks. The system also provides detailed information on the checks, vehicle data checks, and name checks. The system also provides detailed information on the
complaint, allows the user to view all units and their status, and enables the user to send and receive complaint, allows the user to view all units and their status, and enables the user to send and receive
messages from other users.</p> messages from other users.</p>
...@@ -109,7 +158,8 @@ ...@@ -109,7 +158,8 @@
<div class="container"> <div class="container">
<h3 class="text-center">System Features</h3> <h3 class="text-center">System Features</h3>
<div class="row justify-content-center"> <div class="row justify-content-center">
<div class="col-sm-6 col-md-auto mb-2 border-top pt-3" style="max-width: 250px;"> <!-- Set max-width and use Bootstrap's sizing --> <div class="col-sm-6 col-md-auto mb-2 border-top pt-3" style="max-width: 250px;">
<!-- Set max-width and use Bootstrap's sizing -->
<ul class="text-start"> <ul class="text-start">
<li>Wireless multi-agency interoperable data communications of real-time dispatch and complaint <li>Wireless multi-agency interoperable data communications of real-time dispatch and complaint
information information
...@@ -120,7 +170,8 @@ ...@@ -120,7 +170,8 @@
</li> </li>
</ul> </ul>
</div> </div>
<div class="col-sm-6 col-md-auto text-md-start border-top pt-3" style="max-width: 250px;"> <!-- Set max-width and use Bootstrap's sizing --> <div class="col-sm-6 col-md-auto text-md-start border-top pt-3" style="max-width: 250px;">
<!-- Set max-width and use Bootstrap's sizing -->
<ul> <ul>
<li>View all available units and their status <li>View all available units and their status
</li> </li>
...@@ -134,26 +185,30 @@ ...@@ -134,26 +185,30 @@
</div> </div>
</div> </div>
</div> </div>
<!-- PUBLIC SAFETY BOX 4 --> <!-- PUBLIC SAFETY BOX 5 -->
<div class="row mb-4 g-4 align-items-center bg-gray shadow-sm rounded"> <div class="row mb-4 g-4 align-items-center bg-white shadow-sm rounded">
<div class="col-md-12"> <div class="col-md-12">
<div class="p-3"> <div class="p-3">
<div class="text-center"> <div class="text-center">
<h2>Automated Vehicle Location System</h2> <h2>Automated Vehicle Location System</h2>
<p class="mx-auto" style="max-width: 850px;">Our AVL System is a real-time automatic vehicle location system used to pinpoint the location of equipped <p class="mx-auto" style="max-width: 850px;">Our AVL System is a real-time automatic vehicle location
vehicles and track their movement. The system allows you to visually see the location of units in the field, system used to pinpoint the location of equipped
vehicles and track their movement. The system allows you to visually see the location of units in the
field,
enhance dispatch operations, and increase officer safety.</p> enhance dispatch operations, and increase officer safety.</p>
</div> </div>
<div class="container"> <div class="container">
<h3 class="text-center">System Features</h3> <h3 class="text-center">System Features</h3>
<div class="row justify-content-center"> <div class="row justify-content-center">
<div class="col-sm-6 col-md-auto mb-2 border-top pt-3" style="max-width: 250px;"> <!-- Set max-width and use Bootstrap's sizing --> <div class="col-sm-6 col-md-auto mb-2 border-top pt-3" style="max-width: 250px;">
<!-- Set max-width and use Bootstrap's sizing -->
<ul class="text-start"> <ul class="text-start">
<li>Real-time GPS Vehicle Tracking</li> <li>Real-time GPS Vehicle Tracking</li>
<li>Mapping Application for Dispatch and Mobile</li> <li>Mapping Application for Dispatch and Mobile</li>
</ul> </ul>
</div> </div>
<div class="col-sm-6 col-md-auto text-md-start border-top pt-3" style="max-width: 250px;"> <!-- Set max-width and use Bootstrap's sizing --> <div class="col-sm-6 col-md-auto text-md-start border-top pt-3" style="max-width: 250px;">
<!-- Set max-width and use Bootstrap's sizing -->
<ul> <ul>
<li>XML-based Communications</li> <li>XML-based Communications</li>
<li>Complaint and Crime Mapping</li> <li>Complaint and Crime Mapping</li>
...@@ -164,25 +219,27 @@ ...@@ -164,25 +219,27 @@
</div> </div>
</div> </div>
</div> </div>
<!-- PUBLIC SAFETY BOX 5 --> <!-- PUBLIC SAFETY BOX 6 -->
<div class="row mb-4 g-4 align-items-center bg-white shadow-sm rounded"> <div class="row mb-4 g-4 align-items-center bg-grey shadow-sm rounded">
<div class="col-md-12"> <div class="col-md-12">
<div class="p-3"> <div class="p-3">
<div class="text-center"> <div class="text-center">
<h2>Jail Management System</h2> <h2>Jail Management System</h2>
<p class="mx-auto" style="max-width: 850px;">EM Systems’ Jail Management System (JMS) is designed to effectively assist in the management of a <p class="mx-auto" style="max-width: 850px;">EM Systems’ Jail Management System (JMS) is designed to
effectively assist in the management of a
detention detention
facility of any size. The system can operate independently or as a component of EM Systems’ Law facility of any size. The system can operate independently or as a component of EM Systems’ Law
Enforcement Enforcement
Management System (LEMS). It can also be integrated with other justice information systems from Management System (LEMS). It can also be integrated with other justice information systems from
third-party third-party
vendors. As with all EM Systems’ software, the JMS can be customized to meet the unique needs of your vendors. As with all &nbsp;&nbsp;EM Systems’ software, the JMS can be customized to meet the unique needs of your
agency.</p> agency.</p>
</div> </div>
<div class="container"> <div class="container">
<h3 class="text-center">System Features</h3> <h3 class="text-center">System Features</h3>
<div class="row justify-content-center"> <div class="row justify-content-center">
<div class="col-sm-6 col-md-auto mb-2 border-top pt-3" style="max-width: 250px;"> <!-- Set max-width and use Bootstrap's sizing --> <div class="col-sm-6 col-md-auto mb-2 border-top pt-3" style="max-width: 250px;">
<!-- Set max-width and use Bootstrap's sizing -->
<ul class="text-start"> <ul class="text-start">
<li>Facilitates booking procedures</li> <li>Facilitates booking procedures</li>
<li>Access to historical data</li> <li>Access to historical data</li>
...@@ -190,7 +247,8 @@ ...@@ -190,7 +247,8 @@
<li>Release date calculations and processing</li> <li>Release date calculations and processing</li>
</ul> </ul>
</div> </div>
<div class="col-sm-6 col-md-auto text-md-start border-top pt-3" style="max-width: 250px;"> <!-- Set max-width and use Bootstrap's sizing --> <div class="col-sm-6 col-md-auto text-md-start border-top pt-3" style="max-width: 250px;">
<!-- Set max-width and use Bootstrap's sizing -->
<ul> <ul>
<li>Property and custody management</li> <li>Property and custody management</li>
<li>Powerful search capabilities</li> <li>Powerful search capabilities</li>
......
...@@ -15,15 +15,24 @@ ...@@ -15,15 +15,24 @@
<!--MAIN CONTAINER--> <!--MAIN CONTAINER-->
<div class="container-main"> <div class="container-main">
<div class="learn-boxes py-5"> <div class="learn-boxes">
<!-- RECORDS MANAGEMENT BOX 1 --> <!-- RECORDS MANAGEMENT BOX 1 -->
<div class="row mb-4 g-4 align-items-center bg-white shadow-sm rounded"> <div class="row mb-4 g-4 align-items-center bg-white shadow-sm rounded">
<div class="col-md-12"> <div class="col-md-12">
<div class="p-3 text-center"> <div class="p-3 text-center">
<h2>Records Retention Notification</h2> <h2>Records Retention Notification</h2>
<p class="mx-auto" style="max-width: 850px;">Emergent.MD is an easy-to-use, full-featured, state-of-the-art Electronic Medical Records System. It works <p class="mx-auto" style="max-width: 850px;">With multi departmental government organizations constantly in
with just about any practice. It interfaces with your existing Practice Management System. And, we’ll tailor a state of flux, the Records Management Notification System is designed to provide consistent and informed
it to fit your unique workflow requirements. It will improve efficiency and save money for your practice. alerts to aid governments in following records management best practices.
This system is designed to help Town Clerk’s, Police Departments, and Records Managers fulfill records
retention mandates by providing alerts to complete standard records management practices. This software
will aid in the management of day-to-day records and help local government meet records retention
requirements.
The Records Retention RMNS is fully aligned with the New York State LG-1 schedule, integrating
comprehensive retention and disposition policies that streamline the management of both electronic and
paper records through a task-based notification system.
</p> </p>
</div> </div>
</div> </div>
...@@ -33,10 +42,11 @@ ...@@ -33,10 +42,11 @@
<div class="col-md-12"> <div class="col-md-12">
<div class="p-3 text-center"> <div class="p-3 text-center">
<h2>Legal Hold Notices</h2> <h2>Legal Hold Notices</h2>
<p class="mx-auto" style="max-width: 850px;">TeleCare Connex is a completely integrated telemonitoring solution that includes wireless mobile devices <p class="mx-auto" style="max-width: 850px;">The Legal Holds Notices RMNS module is designed to notify
for remote vital sign collection, and a web application for technicians and monitors to setup, enroll, and government officials and records managers of a current obligation to preserve evidence and ensure critical
actively or passively track patient status and provide health information accordingly. This helps to reduce information remains intact and accessible for review under a legal hold. The notification will remind key
hospititalizations, promote good health with its participants and saves money.</p> stakeholders that legal holds are current and in place; preventing governments from receiving penalties
for non-compliance.</p>
</div> </div>
</div> </div>
</div> </div>
...@@ -45,11 +55,11 @@ ...@@ -45,11 +55,11 @@
<div class="col-md-12"> <div class="col-md-12">
<div class="p-3 text-center"> <div class="p-3 text-center">
<h2>Freedom of Information Law (FOIL)</h2> <h2>Freedom of Information Law (FOIL)</h2>
<p class="mx-auto" style="max-width: 850px;">Dictation Notepad is a simple app for dictating and sending notes using an android powered device. It <p class="mx-auto" style="max-width: 850px;">The FOIL Requests RMNS module provides automated notifications
leverages speech recognition technology to accurately transform speech to text and it allows formatting and to government employees when a FOIL request is received and alerts users to the required tasks and steps
editing of the text using voice commands. The audio is recorded and encoded to a small file size and saved necessary to maintain compliance with the Freedom of Information Law. The system issues reminders to
along with the text. The text (in html format) and audio can be configured to send to variety of destination ensure requests are properly filed, delivers automatic status updates, and audits completed tasks to
protocols (SMTP, FTP/S, HTTP/S) with a user specified host.</p> support ongoing compliance and accountability.</p>
</div> </div>
</div> </div>
</div> </div>
......
...@@ -238,7 +238,7 @@ begin ...@@ -238,7 +238,7 @@ begin
radReqEmail.Checked := True; radReqEmail.Checked := True;
wcbInterest.ItemIndex := -1; wcbInterest.ItemIndex := -1;
ShowNotificationModal('Your demo request has been sent successfully. We will reach out shortly.'); ShowNotificationModal('Your demo request has been submitted. Please check your email for confirmation. If you did not recieve an email, reach out directly.');
end); end);
end; end;
......
[Settings] [Settings]
memoLogLevel=3 memoLogLevel=3
fileLogLevel=4 fileLogLevel=4
LogFileNum=44 LogFileNum=49
webClientVersion=1.0.1 webClientVersion=1.0.1
[SMTP] [SMTP]
......
...@@ -40,6 +40,19 @@ type ...@@ -40,6 +40,19 @@ type
procedure Send(logLevel: Integer; Log: ILog); procedure Send(logLevel: Integer; Log: ILog);
end; end;
TTaggedFileLogAppender = class( TInterfacedObject, ILogAppender )
private
FLogLevel: Integer;
FFilename: string;
FLogDirectory: string;
FTagPrefix: string;
FCriticalSection: TCriticalSection;
public
constructor Create(ALogLevel: Integer; AFilename: string; ATagPrefix: string);
destructor Destroy; override;
procedure Send(logLevel: Integer; Log: ILog);
end;
{ TMemoLogAppender } { TMemoLogAppender }
constructor TMemoLogAppender.Create(ALogLevel: Integer; ALogMemo: TMemo); constructor TMemoLogAppender.Create(ALogLevel: Integer; ALogMemo: TMemo);
begin begin
...@@ -71,7 +84,7 @@ begin ...@@ -71,7 +84,7 @@ begin
FormattedMessage := FormattedMessage + '[' + IntToStr(logLevel) +'] ' + LogMsg; FormattedMessage := FormattedMessage + '[' + IntToStr(logLevel) +'] ' + LogMsg;
if logLevel <= FLogLevel then if logLevel <= FLogLevel then
FLogMemo.Lines.Add( FormattedMessage ); FLogMemo.Lines.Add(FormattedMessage);
finally finally
FCriticalSection.Release; FCriticalSection.Release;
end; end;
...@@ -89,11 +102,11 @@ begin ...@@ -89,11 +102,11 @@ begin
if not DirectoryExists(FLogDirectory) then if not DirectoryExists(FLogDirectory) then
CreateDir(FLogDirectory); CreateDir(FLogDirectory);
iniFile := TIniFile.Create( ChangeFileExt(Application.ExeName, '.ini') ); iniFile := TIniFile.Create(ChangeFileExt(Application.ExeName, '.ini'));
try try
fileNum := iniFile.ReadInteger( 'Settings', 'LogFileNum', 0 ); fileNum := iniFile.ReadInteger('Settings', 'LogFileNum', 0);
FFilename := AFilename + Format( '%.4d', [fileNum] ); FFilename := AFilename + Format('%.4d', [fileNum]);
iniFile.WriteInteger( 'Settings', 'LogFileNum', fileNum + 1 ); iniFile.WriteInteger('Settings', 'LogFileNum', fileNum + 1);
finally finally
iniFile.Free; iniFile.Free;
end; end;
...@@ -116,7 +129,6 @@ begin ...@@ -116,7 +129,6 @@ begin
FCriticalSection.Acquire; FCriticalSection.Acquire;
try try
LogTime := Now; LogTime := Now;
// LogFile := ExtractFilePath(Application.ExeName) + FFilename + '.log';
LogFile := FLogDirectory + FFilename + '.log'; LogFile := FLogDirectory + FFilename + '.log';
FormattedMessage := FormatDateTime('[yyyy-mm-dd HH:nn:ss.zzz]', LogTime); FormattedMessage := FormatDateTime('[yyyy-mm-dd HH:nn:ss.zzz]', LogTime);
...@@ -127,14 +139,14 @@ begin ...@@ -127,14 +139,14 @@ begin
FormattedMessage := FormattedMessage + '[' + IntToStr(logLevel) +'] ' + LogMsg; FormattedMessage := FormattedMessage + '[' + IntToStr(logLevel) +'] ' + LogMsg;
try try
AssignFile( FLogFile, LogFile ); AssignFile(FLogFile, LogFile);
if logLevel <= FLogLevel then if logLevel <= FLogLevel then
begin begin
if FileExists(LogFile) then if FileExists(LogFile) then
Append( FLogFile ) Append(FLogFile)
else else
ReWrite( FLogFile ); Rewrite(FLogFile);
WriteLn( FLogFile, FormattedMessage ); WriteLn(FLogFile, FormattedMessage);
end; end;
finally finally
CloseFile(FLogFile); CloseFile(FLogFile);
...@@ -144,6 +156,67 @@ begin ...@@ -144,6 +156,67 @@ begin
end; end;
end; end;
{ TTaggedFileLogAppender }
constructor TTaggedFileLogAppender.Create(ALogLevel: Integer; AFilename: string; ATagPrefix: string);
begin
FLogLevel := ALogLevel;
FTagPrefix := ATagPrefix;
FCriticalSection := TCriticalSection.Create;
FLogDirectory := ExtractFilePath(Application.ExeName) + 'logs\';
if not DirectoryExists(FLogDirectory) then
CreateDir(FLogDirectory);
FFilename := AFilename;
end;
destructor TTaggedFileLogAppender.Destroy;
begin
FCriticalSection.Free;
inherited;
end;
procedure TTaggedFileLogAppender.Send(logLevel: Integer; Log: ILog);
var
FormattedMessage: string;
LogFile: string;
LogTime: TDateTime;
LogMsg: string;
FLogFile: TextFile;
begin
if logLevel > FLogLevel then
Exit;
LogMsg := Log.GetMessage;
if LogMsg.IsEmpty then
Exit;
if (FTagPrefix <> '') and (Copy(LogMsg, 1, Length(FTagPrefix)) <> FTagPrefix) then
Exit;
FCriticalSection.Acquire;
try
LogTime := Now;
LogFile := FLogDirectory + FFilename + '.log';
FormattedMessage := FormatDateTime('[yyyy-mm-dd HH:nn:ss.zzz]', LogTime);
FormattedMessage := FormattedMessage + '[' + IntToStr(logLevel) +'] ' + LogMsg;
try
AssignFile(FLogFile, LogFile);
if FileExists(LogFile) then
Append(FLogFile)
else
Rewrite(FLogFile);
WriteLn(FLogFile, FormattedMessage);
finally
CloseFile(FLogFile);
end;
finally
FCriticalSection.Release;
end;
end;
{$R *.res} {$R *.res}
var var
...@@ -156,7 +229,7 @@ begin ...@@ -156,7 +229,7 @@ begin
Application.Initialize; Application.Initialize;
Application.MainFormOnTaskbar := True; Application.MainFormOnTaskbar := True;
Application.CreateForm(TFMain, FMain); Application.CreateForm(TFMain, FMain);
// Read INI for log levels
IniFile := TIniFile.Create(ChangeFileExt(Application.ExeName, '.ini')); IniFile := TIniFile.Create(ChangeFileExt(Application.ExeName, '.ini'));
try try
memoLogLevel := IniFile.ReadInteger('Settings', 'memoLogLevel', 3); memoLogLevel := IniFile.ReadInteger('Settings', 'memoLogLevel', 3);
...@@ -168,6 +241,9 @@ begin ...@@ -168,6 +241,9 @@ begin
Logger.AddAppender(TMemoLogAppender.Create(memoLogLevel, FMain.memoInfo)); Logger.AddAppender(TMemoLogAppender.Create(memoLogLevel, FMain.memoInfo));
Logger.AddAppender(TFileLogAppender.Create(fileLogLevel, 'emSystemsWebServer')); Logger.AddAppender(TFileLogAppender.Create(fileLogLevel, 'emSystemsWebServer'));
Logger.AddAppender(TTaggedFileLogAppender.Create(fileLogLevel, 'contact', '[CONTACT]'));
Logger.AddAppender(TTaggedFileLogAppender.Create(fileLogLevel, 'demo', '[DEMO]'));
Application.Run; Application.Run;
end. end.
...@@ -6,7 +6,7 @@ uses ...@@ -6,7 +6,7 @@ uses
XData.Server.Module, XData.Server.Module,
XData.Service.Common, XData.Service.Common,
IdSMTP, IdMessage, IdSSLOpenSSL, IdText, IdExplicitTLSClientServerBase, IdSMTP, IdMessage, IdSSLOpenSSL, IdText, IdExplicitTLSClientServerBase, System.NetEncoding,
IdIOHandlerSocket, IdException, IdSSL, IdSMTPBase, IdGlobal, IdStack, IdWinsock2, IdIOHandlerSocket, IdException, IdSSL, IdSMTPBase, IdGlobal, IdStack, IdWinsock2,
IdStackConsts, IdIOHandler, IdIOHandlerStack, IdBaseComponent, System.JSON, IdStackConsts, IdIOHandler, IdIOHandlerStack, IdBaseComponent, System.JSON,
IdComponent, IdTCPConnection, IdTCPClient, IdMessageClient, VCL.Forms, Api.Service; IdComponent, IdTCPConnection, IdTCPClient, IdMessageClient, VCL.Forms, Api.Service;
...@@ -30,39 +30,89 @@ uses ...@@ -30,39 +30,89 @@ uses
function TApiService.SendEmail(Name, Email, Subject, Body: string): string; function TApiService.SendEmail(Name, Email, Subject, Body: string): string;
var var
SMTP: TIdSMTP; smtp: TIdSMTP;
Message: TIdMessage; message: TIdMessage;
SSL: TIdSSLIOHandlerSocketOpenSSL; confirmMsg: TIdMessage;
IniFile: TIniFile; ssl: TIdSSLIOHandlerSocketOpenSSL;
IniPath, HtmlBody: string; iniFile: TIniFile;
iniPath: string;
fromEmail: string;
recipientEmail: string;
safeSenderEmail: string;
safeSubject: string;
safeName: string;
submittedOn: string;
logPrefix: string;
htmlBody: string;
confirmHtml: string;
bodyHtml: string;
textPart: TIdText;
htmlPart: TIdText;
confirmTextPart: TIdText;
confirmHtmlPart: TIdText;
confirmSubject: string;
bodyLines: TArray<string>;
i: Integer;
begin begin
IniPath := ChangeFileExt(Application.ExeName, '.ini'); iniPath := ChangeFileExt(Application.ExeName, '.ini');
IniFile := TIniFile.Create(IniPath); iniFile := TIniFile.Create(iniPath);
try try
SMTP := TIdSMTP.Create(nil); fromEmail := iniFile.ReadString('SMTP', 'EmailWebsiteUses', '');
Message := TIdMessage.Create(nil); recipientEmail := iniFile.ReadString('SMTP', 'RecipientEmail', '');
SSL := TIdSSLIOHandlerSocketOpenSSL.Create(SMTP);
safeSenderEmail := Email.Replace(#13, '').Replace(#10, '').Trim;
safeSubject := Subject.Replace(#13, '').Replace(#10, '').Trim;
safeName := Name.Trim;
if SameText(safeSubject, 'Demo Request') then
logPrefix := '[DEMO]'
else
logPrefix := '[CONTACT]';
Logger.Log(2, logPrefix + ' ----------------------------------------');
Logger.Log(2, Format('%s SubmittedOn=%s', [logPrefix, FormatDateTime('yyyy-mm-dd HH:nn:ss', Now)]));
Logger.Log(2, Format('%s Name=%s', [logPrefix, safeName]));
Logger.Log(2, Format('%s Email=%s', [logPrefix, safeSenderEmail]));
Logger.Log(2, Format('%s Subject=%s', [logPrefix, safeSubject]));
Logger.Log(2, logPrefix + ' Body:');
bodyLines := Body.Replace(#13#10, #10).Replace(#13, #10).Split([#10]);
for i := 0 to High(bodyLines) do
Logger.Log(2, logPrefix + ' ' + bodyLines[i]);
smtp := TIdSMTP.Create(nil);
message := TIdMessage.Create(nil);
confirmMsg := TIdMessage.Create(nil);
ssl := TIdSSLIOHandlerSocketOpenSSL.Create(smtp);
try try
SMTP.IOHandler := SSL; smtp.IOHandler := ssl;
SMTP.UseTLS := utUseExplicitTLS; smtp.UseTLS := utUseExplicitTLS;
SMTP.AuthType := satDefault; smtp.AuthType := satDefault;
smtp.Host := iniFile.ReadString('SMTP', 'Host', '');
smtp.Port := iniFile.ReadInteger('SMTP', 'Port', 0);
smtp.Username := iniFile.ReadString('SMTP', 'Username', '');
smtp.Password := iniFile.ReadString('SMTP', 'Password', '');
SMTP.Host := IniFile.ReadString('SMTP', 'Host', ''); ssl.SSLOptions.Method := sslvTLSv1_2;
SMTP.Port := IniFile.ReadInteger('SMTP', 'Port', 0); ssl.SSLOptions.SSLVersions := [sslvTLSv1_2];
SMTP.Username := IniFile.ReadString('SMTP', 'Username', '');
SMTP.Password := IniFile.ReadString('SMTP', 'Password', '');
SSL.SSLOptions.Method := sslvTLSv1_2; submittedOn := FormatDateTime('yyyy-mm-dd hh:nn AM/PM', Now);
SSL.SSLOptions.SSLVersions := [sslvTLSv1_2];
Message.From.Address := IniFile.ReadString('SMTP', 'EmailWebsiteUses', ''); bodyHtml := TNetEncoding.HTML.Encode(Body);
Message.Recipients.EmailAddresses := IniFile.ReadString('SMTP', 'RecipientEmail', ''); bodyHtml := bodyHtml.Replace(#13#10, '<br>').Replace(#10, '<br>').Replace(#13, '<br>');
Message.Subject := Subject;
HtmlBody := Format( htmlBody := Format(
'<html>' + '<html>' +
'<body style="font-family: Arial, sans-serif; font-size: 14px; color:#222;">' + '<body style="font-family: Arial, sans-serif; font-size: 14px; color:#222;">' +
'<h2 style="color: #2E86C1; margin: 0 0 12px 0;">New "%s" message from EM Systems Website</h2>' + '<h2 style="color: #2E86C1; margin: 0 0 12px 0;">New %s message from EM Systems Website</h2>' +
'<p style="margin: 0 0 6px 0;"><strong>Submitted On:</strong> %s</p>' + '<p style="margin: 0 0 6px 0;"><strong>Submitted On:</strong> %s</p>' +
'<p style="margin: 0 0 6px 0;"><strong>From:</strong> %s &lt;%s&gt;</p>' + '<p style="margin: 0 0 6px 0;"><strong>From:</strong> %s &lt;%s&gt;</p>' +
'<p style="margin: 0 0 14px 0;"><strong>Subject:</strong> %s</p>' + '<p style="margin: 0 0 14px 0;"><strong>Subject:</strong> %s</p>' +
...@@ -72,39 +122,114 @@ begin ...@@ -72,39 +122,114 @@ begin
'</body>' + '</body>' +
'</html>', '</html>',
[ [
Subject, TNetEncoding.HTML.Encode(safeSubject),
FormatDateTime('yyyy-mm-dd hh:nn AM/PM', Now), submittedOn,
Name, TNetEncoding.HTML.Encode(safeName),
Email, TNetEncoding.HTML.Encode(safeSenderEmail),
Subject, TNetEncoding.HTML.Encode(safeSubject),
Body.Replace(#13#10, '<br>').Replace(#10, '<br>').Replace(#13, '<br>') bodyHtml
] ]
); );
Message.Body.Text := HtmlBody; message.Clear;
Message.ContentType := 'text/html'; message.From.Address := fromEmail;
message.Recipients.EmailAddresses := recipientEmail;
if safeSenderEmail <> '' then
message.ReplyTo.EmailAddresses := safeSenderEmail;
message.Subject := safeSubject;
message.MessageParts.Clear;
message.ContentType := 'multipart/alternative';
textPart := TIdText.Create(message.MessageParts, nil);
textPart.ContentType := 'text/plain; charset=utf-8';
textPart.Body.Text :=
'New message from EM Systems Website' + sLineBreak +
'Submitted On: ' + submittedOn + sLineBreak +
'From: ' + safeName + ' <' + safeSenderEmail + '>' + sLineBreak +
'Subject: ' + safeSubject + sLineBreak +
sLineBreak +
Body;
SMTP.Connect; htmlPart := TIdText.Create(message.MessageParts, nil);
htmlPart.ContentType := 'text/html; charset=utf-8';
htmlPart.Body.Text := htmlBody;
smtp.Connect;
try try
SMTP.Send(Message); smtp.Send(message);
Logger.Log(2, Format('%s InternalNotificationSent to=%s', [logPrefix, recipientEmail]));
if (safeSenderEmail <> '') and (Pos('@', safeSenderEmail) > 1) then
begin
if SameText(safeSubject, 'Demo Request') then
confirmSubject := 'We received your demo request'
else
confirmSubject := 'We received your message';
confirmHtml := Format(
'<html>' +
'<body style="font-family: Arial, sans-serif; font-size: 14px; color:#222;">' +
'<p style="margin:0 0 10px 0;">Hi %s,</p>' +
'<p style="margin:0 0 10px 0;">Thanks for reaching out. This is a quick confirmation that we received your message.</p>' +
'<p style="margin:0 0 10px 0;"><strong>Subject:</strong> %s</p>' +
'<p style="margin:0 0 10px 0;"><strong>Submitted On:</strong> %s</p>' +
'<p style="margin:0;">Well reply as soon as we can.</p>' +
'</body>' +
'</html>',
[
TNetEncoding.HTML.Encode(safeName),
TNetEncoding.HTML.Encode(safeSubject),
submittedOn
]
);
confirmMsg.Clear;
confirmMsg.From.Address := fromEmail;
confirmMsg.Recipients.EmailAddresses := safeSenderEmail;
confirmMsg.Subject := confirmSubject;
confirmMsg.ExtraHeaders.Values['Auto-Submitted'] := 'auto-replied';
confirmMsg.ExtraHeaders.Values['X-Auto-Response-Suppress'] := 'All';
confirmMsg.MessageParts.Clear;
confirmMsg.ContentType := 'multipart/alternative';
confirmTextPart := TIdText.Create(confirmMsg.MessageParts, nil);
confirmTextPart.ContentType := 'text/plain; charset=utf-8';
confirmTextPart.Body.Text :=
'Hi ' + safeName + ',' + sLineBreak +
sLineBreak +
'Thanks for reaching out. We have received your message and will be in touch soon.' + sLineBreak +
sLineBreak +
'-EM Systems Team';
confirmHtmlPart := TIdText.Create(confirmMsg.MessageParts, nil);
confirmHtmlPart.ContentType := 'text/html; charset=utf-8';
confirmHtmlPart.Body.Text := confirmHtml;
smtp.Send(confirmMsg);
Logger.Log(2, Format('%s ConfirmationSent to=%s', [logPrefix, safeSenderEmail]));
end
else
Logger.Log(2, logPrefix + ' ConfirmationSkipped: invalid sender email');
finally finally
SMTP.Disconnect; smtp.Disconnect;
end; end;
Logger.Log(1, Format('Contact form submitted. Name: %s, Email: %s, Subject: %s, Message: %s', [Name, Email, Subject, Body]));
finally finally
SSL.Free; ssl.Free;
Message.Free; confirmMsg.Free;
SMTP.Free; message.Free;
smtp.Free;
end; end;
finally finally
IniFile.Free; iniFile.Free;
end; end;
Result := 'Email sent successfully'; Result := 'Email sent successfully';
end; end;
function TApiService.VerifyVersion(ClientVersion: string): TJSONObject; function TApiService.VerifyVersion(ClientVersion: string): TJSONObject;
var var
iniFile: TIniFile; iniFile: TIniFile;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment