<!DOCTYPE html>
<html>
<head>
<script data-require="angular.js@4.0.0" data-semver="4.0.0" src="https://code.angularjs.org/latest/angular.min.js"></script>
<link rel="stylesheet" href="style.css" />
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous" />
</head>
<body>
<app-root>
Loading...
</app-root>
<script src="https://unpkg.com/zone.js@0.8.4/dist/zone.js"></script>
<script src="https://unpkg.com/reflect-metadata@0.1.9/Reflect.js"></script>
<script src="https://unpkg.com/systemjs@0.19.41/dist/system.js"></script>
<script src="https://unpkg.com/typescript@2.1.4/lib/typescript.js"></script>
<script src="config.js"></script>
<script>
System.import('app')
.catch(console.error.bind(console));
</script>
</body>
</html>
<form (submit)="sendEmail(message)" #f="ngForm">
<input type="hidden" value="theEnsuite" id="room" name="room" [(ngModel)]="message.room" #room="ngModel">
<div class="input-group" style="margin-bottom: 10px;">
<label for="name" class="input-group-addon">Name</label>
<input type="text" name="name" class="form-control" placeholder="Name" [(ngModel)]="message.name" required #name="ngModel">
</div>
<div class="form-control" *ngIf="name.invalid && name.touched" style="border: 2px solid red; margin-bottom: 10px;">
<p style="color: red; text: bold;">Please enter your name.</p>
</div>
<div class="input-group" style="margin-bottom: 10px;">
<label for="email" class="input-group-addon">Email</label>
<input type="email" name="email" class="form-control" placeholder="Email" [(ngModel)]="message.email" required pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$" #email="ngModel">
</div>
<div class="form-control" *ngIf="email.invalid && email.touched" style="border: 2px solid red; margin-bottom: 10px;">
<p style="color: red; text: bold;">Please enter a valid email address.</p>
</div>
<div class="input-group" style="margin-bottom: 10px;">
<label for="message" class="input-group-addon">Message</label>
<textarea class="form-control" rows="3" name="message" [(ngModel)]="message.message" required minlength="10" #textmessage="ngModel" placeholder="Your message"></textarea>
</div>
<div class="form-control" *ngIf="textmessage.invalid && textmessage.touched" style="border: 2px solid red; margin-bottom: 10px;">
<p style="color: red; text: bold;">Please enter a message longer than 10 characters.</p>
</div>
<div class="text-center" style="margin-bottom: 10px;">
<button type="submit" class="btn btn-success" [disabled]="f.invalid" *ngIf="!f.submitted">Submit</button>
</div>
<div class="form-control" *ngIf="f.submitted" style="border: 2px solid blue; margin-bottom: 10px;">
<p style="color: blue; text: bold;">Thank you!</p>
</div>
</form>
.ng-valid[required], .ng-valid.required {
border: 1px solid #42A948;
}
import { Component, OnInit, HostBinding } from '@angular/core';
import { AppService, IMessage } from './contact.service';
@Component({
selector: 'app-root',
templateUrl: 'contact.component.html',
styleUrls: ['contact.component.css']
})
export class ContactComponent implements OnInit {
message: IMessage = {};
constructor(private appService: AppService) { }
sendEmail(message: IMessage) {
this.appService.sendEmail(message).subscribe(res => {
console.log('ContactComponent Success', res);
}, error => {
console.log('ContactComponent Error', error);
})
}
ngOnInit() {
}
}
import { Injectable } from '@angular/core';
import { Http } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import { Resolve } from '@angular/router';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';
export interface IMessage {
name?: string,
email?: string,
room?: string,
daterange?: string,
message?: string
}
@Injectable()
export class AppService {
private emailUrl = '/email.php';
constructor(private http: Http) {
}
sendEmail(message: IMessage): Observable<IMessage> | any {
return this.http.post(this.emailUrl, message)
.map(response => {
console.log('Sending email was successfull', response);
return response;
})
.catch(error => {
console.log('Sending email got error', error);
return Observable.throw(error)
})
}
}
<?php
header('Content-type: application/json');
$errors = '';
if(empty($errors))
{
$postdata = file_get_contents("php://input");
$request = json_decode($postdata);
$from_email = 'general@myawesomewebsite.com';
$message = $request->message;
$from_name = $request->name;
$to_email = "mycoolemail@gmail.com";
$contact = "<p><strong>Name:</strong> $from_name</p>
<p><strong>Email:</strong> $request->email</p>
<p><strong>Room:</strong> $request->room</p>
<p><strong>Dates:</strong> $request->daterange</p>";
$content = "<p><strong>Message:</strong><p>$message</p>";
$website = 'My Awesome Website';
$email_subject = "$website: Received a message from $from_name";
$email_body = '<html><body>';
$email_body .= "$contact $content";
$email_body .= '</body></html>';
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n";
$headers .= "From: $from_email\n";
$headers .= "Reply-To: $from_email";
$result = mail($to_email,$email_subject,$email_body,$headers);
$response_array['status'] = 'success';
$response_array['from'] = $from_email;
$response_array['result'] = $result;
echo json_encode($response_array);
header($response_array);
return $from_email;
} else {
$response_array['status'] = 'error';
echo json_encode($response_array);
header('Location: /error.html');
}
?>
System.config({
transpiler: 'typescript',
typescriptOptions: {
emitDecoratorMetadata: true,
experimentalDecorators: true
},
map: {
app: "./src",
'@angular/core': 'npm:@angular/core@4.0.0/bundles/core.umd.js',
'@angular/common': 'npm:@angular/common@4.0.0/bundles/common.umd.js',
'@angular/compiler': 'npm:@angular/compiler@4.0.0/bundles/compiler.umd.js',
'@angular/platform-browser': 'npm:@angular/platform-browser@4.0.0/bundles/platform-browser.umd.js',
'@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic@4.0.0/bundles/platform-browser-dynamic.umd.js',
'@angular/http': 'npm:@angular/http@4.0.0/bundles/http.umd.js',
'@angular/router': 'npm:@angular/router@4.0.0/bundles/router.umd.js',
'@angular/forms': 'npm:@angular/forms@4.0.0/bundles/forms.umd.js',
'@angular/animations': 'npm:@angular/animations@4.0.0/bundles/animations.umd.js',
'@angular/core/testing': 'npm:@angular/core@4.0.0/bundles/core-testing.umd.js',
'@angular/common/testing': 'npm:@angular/common/bundles@4.0.0/common-testing.umd.js',
'@angular/compiler/testing': 'npm:@angular/compiler@4.0.0/bundles/compiler-testing.umd.js',
'@angular/platform-browser/testing': 'npm:@angular/platform-browser@4.0.0/bundles/platform-browser-testing.umd.js',
'@angular/platform-browser-dynamic/testing': 'npm:@angular/platform-browser-dynamic@4.0.0/bundles/platform-browser-dynamic-testing.umd.js',
'@angular/http/testing': 'npm:@angular/http@4.0.0/bundles/http-testing.umd.js',
'@angular/router/testing': 'npm:@angular/router@4.0.0/bundles/router-testing.umd.js',
'rxjs': 'npm:rxjs@5.1.0',
'lodash': 'npm:lodash@4.17.4/'
},
//packages defines our app package
packages: {
app: {
main: './main.ts',
defaultExtension: 'ts'
},
rxjs: {
defaultExtension: 'js'
},
lodash: {
defaultExtension: 'js'
}
},
paths: {
'npm:': 'https://unpkg.com/'
}
});
{
"compilerOptions": {
"baseUrl": "",
"declaration": false,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"lib": ["es6", "dom"],
"mapRoot": "./",
"module": "es6",
"moduleResolution": "node",
"sourceMap": true,
"target": "es5"
}
}