Angular 2 如何用 PHP 发送邮件?

2024-02-23

我学习 Angular 2,但我在网上没有看到任何将简单的联系表单从 Angular 2 发送到 php scrip 的示例。

我的 html 模板。

<form novalidate="" (ngSubmit)="guardar(forma)" #forma="ngForm">
    <div class="field">
        <label for="name">Nombre:</label>
        <input type="text"
               id="name"
               name="name"
               required
               minlength="3"
               ngModel>
    </div>

    <div class="field">
        <label for="email">Email:</label>
        <input type="email"
               id="email"
               name="email"
               required
               ngModel
               pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,3}$">
    </div>

    <div class="field">
        <label for="message">Mensaje:</label>
        <textarea id="message"
                  name="message"
                  required
                  ngModel></textarea>
    </div>

    <div class="field">
        <button [disabled]="!forma.valid"
                type="submit">
            Enviar
        </button>
    </div>
</form>

PHP脚本

<?php
    $name = strip_tags(trim($_POST["name"]));
    $name = str_replace(array("\r","\n"),array(" "," "),$name);
    $email = filter_var(trim($_POST["email"]), FILTER_SANITIZE_EMAIL);
    $message = trim($_POST["message"]);

    $recipient = "[email protected] /cdn-cgi/l/email-protection";
    $subject = "New contact from $name";

    $email_content = "Name: $name\n";
    $email_content .= "Email: $email\n\n";
    $email_content .= "Message:\n$message\n";

    $email_headers = "From: $name <$email>";

    mail($recipient, $subject, $email_content, $email_headers)
?>

我的不完整的 Angular 2 组件。 我已经在我的应用程序组件中导入了 HttpModule 和 FormsModule

import { Component } from '@angular/core';
import { NgForm } from '@angular/forms';
import { Http } from '@angular/http';

@Component({
    selector: 'app-contacto',
    templateUrl: './contacto.component.html',
    styleUrls: ['./contacto.component.scss']
})
export class ContactoComponent {
    title = 'Contacto';

    constructor( private http: Http){}

    url='http://myUrl.com/mailerscript.php';

    name:string;
    email:string;
    message:string;

    guardar( forma:NgForm ) {

        this.name = 'name='+forma.value.name;
        this.email = 'email='+forma.value.email;
        this.message = 'message='+forma.value.message;

        /*??*/
        this.http.post(this.url, "");

    }
}

您似乎陷入了 Angular 和 PHP 之间的接口 - 这是可以理解的,因为它不像通过访问变量那么简单$_POST超全球。

默认情况下,Angular 将请求正文中传递给它的数据作为json字符串,因此您必须访问原始请求正文并将其解析为可用的 PHP 变量。

以下示例显示了无需额外框架或其他依赖项即可执行此操作的最基本方法。您可以(并且应该)遵循更好的组织实践并将这些内容移动到服务中,但这会增加一层不需要的复杂性:

import { Component, OnInit } from '@angular/core';
import {Http} from "@angular/http";

@Component({
  selector: 'app-mailer',
  template: '<button (click)="sendEmail()">Send the Email</button>'
})
export class MailerComponent implements OnInit {

  email : string;
  name : string;
  message : string;
  endpoint : string;

  http : Http;

  constructor(http : Http) {
    this.http = http;
  }

  ngOnInit() {
    //This data could really come from some inputs on the interface - but let's keep it simple.
    this.email = "[email protected] /cdn-cgi/l/email-protection";
    this.name = "Hayden Pierce";
    this.message = "Hello, this is Hayden.";

    //Start php via the built in server: $ php -S localhost:8000
    this.endpoint = "http://localhost:8000/sendEmail.php";
  }

  sendEmail(){
    let postVars = {
      email : this.email,
      name : this.name,
      message : this.message
    };

    //You may also want to check the response. But again, let's keep it simple.
    this.http.post(this.endpoint, postVars)
        .subscribe(
            response => console.log(response),
            response => console.log(response)
        )
  }
}

还有 PHP 脚本。请注意,这会检查多个请求方法。它还检查 OPTIONS 请求。看看为什么这是必要的 https://stackoverflow.com/questions/20035101/no-access-control-allow-origin-header-is-present-on-the-requested-resource.

为了使其尽可能简单,我已经跳过了对输入的清理来自 Angular,这被认为是一个严重的安全问题。您应该将其添加到面向生产的应用程序中:

<?php

switch($_SERVER['REQUEST_METHOD']){
    case("OPTIONS"): //Allow preflighting to take place.
        header("Access-Control-Allow-Origin: *");
        header("Access-Control-Allow-Methods: POST");
        header("Access-Control-Allow-Headers: content-type");
        exit;
    case("POST"): //Send the email;
        header("Access-Control-Allow-Origin: *");

        $json = file_get_contents('php://input');

        $params = json_decode($json);

        $email = $params->email;
        $name = $params->name;
        $message = $params->message;

        $recipient = '[email protected] /cdn-cgi/l/email-protection';
        $subject = 'new message';
        $headers = "From: $name <$email>";

        mail($recipient, $subject, $message, $headers);
        break;
    default: //Reject any non POST or OPTIONS requests.
        header("Allow: POST", true, 405);
        exit;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Angular 2 如何用 PHP 发送邮件? 的相关文章

随机推荐

  • 为什么4.2.0版本没有maven Resteasy-jaxrs包?

    我在 Maven 中看到的最后一个版本resteasy jaxrs是 3 8 1 当尝试升级时resteasy client到 4 2 0 存在依赖关系resteasy jaxrs 4 2 0 org jboss resteasy plug
  • 防止片段着色器中的循环展开

    我正在使用最新版本的 Chrome 和 Firefox 为 WebGL GLSL ES 1 0 编写一个片段着色器 并且编写了一个迭代算法 首先 我发现循环的长度是非常有限的 文档说它必须在编译时是可猜测的 这意味着它必须是一个常量或非常接
  • Zend Framework 2 - 自定义表单验证

    我需要自定义表单验证 所以我写了一个类似的函数this http framework zend com manual 2 0 en modules zend validator writing validators html one 到目前
  • 如何在 Java Swing 应用程序中播放 MP4 视频

    有谁知道我可以在 JPanel 中播放 mp4 视频文件的方法吗 我尝试过使用 avi 文件使用 JMF 但没有成功 现在我对播放视频文件这样一个简单的任务变得如此乏味感到困惑和沮丧 请任何人告诉我我可以走什么路 我将不胜感激 我听说过 V
  • android recyclerview 不显示项目

    我想在我的回收视图中显示这些项目 但它根本不显示 而且我看不到错误 也许你们可以帮助我 MainActivity java RecyclerView recyclerView RecyclerView findViewById R id r
  • pandas 数据帧索引:to_list() 与 tolist()

    我最近为某人编写了一个 python 脚本 其中我使用以下命令将 pandas 数据帧的索引转换为列表to list 然而 这对他们不起作用 因为他们得到 AttributeError Index object has no attribu
  • 如何将 django 中的 InMemoryUploadedFile 转换为 flickr API 的格式?

    我有一个类将文件上传到 Flickr 该文件的类型为 内存中上传文件 我想知道如何将 InMemoryUploadedFile 文件中的数据转换或传递为 flickr API 的格式 Eg photo image jpg
  • Django 管理员:一对一关系作为内联?

    我正在为 satchmo 应用程序整理管理员 Satchmo 使用 OneToOne 关系来扩展基础Product模型 我想在一页上全部编辑 是否可以将 OneToOne 关系作为内联关系 如果没有 将一些字段添加到我的管理的给定页面 最终
  • Python - 快速修复:尝试登录时 getHeader() 属性错误

    我正在使用 Quickfix 并修改了 toAdmin 函数以将用户名和密码插入登录消息中 我根据 C 指令改编了代码 但遇到了奇怪的 getHeader 属性错误 回溯如下 lt 20151223 10 48 31 142 FIX 4 2
  • 为什么用 python 编写的决策树代码的预测结果与用 R 编写的代码不同?

    我正在 python 和 R 中使用 sklearn 的 load iris 数据集 在 R 中称为 iris 我使用 基尼 索引以两种语言构建了模型 并且当直接从虹膜数据集中获取测试数据时 我能够在两种语言中正确测试模型 但是 如果我给出
  • CoreData:无法在路径加载优化模型

    I am getting this warning multiple times when i goto a view using google maps This started as soon as i migrated to swif
  • 如何在 Vim 中向行范围添加行号?

    如何向在 Vim 中打开的文件中的一系列行添加行号 不像在 set nu 这只是displays行号 但实际上是否将它们添加到文件中的每一行前面 With s line 编辑 总结评论 该命令可以根据需要进行调整 假设您想在视觉选择的行前面
  • 如何在 fastapi 响应中包含非 pydantic 类?

    我想将自定义类包含到路线的响应中 我主要使用嵌套pydantic BaseModels 在我的应用程序中 因此最好返回整个内容 而无需编写从内部数据表示到路由返回内容的转换 只要一切继承自pydantic BaseModel这很简单 但我正
  • 我如何从网站上阅读? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试制作一个机器人 如何从网站读取 1800 1800 这样的值 Console WriteLine Health Console
  • JWT 令牌存储在服务器的哪里以及其他相关问题

    正如标题所示 JWT 令牌存储在服务器端的哪里 在数据库中还是在内存中 我知道实施可能会因不同的要求而有所不同 但一般来说您会将其存储在哪里 如果我想提供一个非常基本的令牌身份验证服务器 这意味着在通过 POST 请求收到用户名和密码后 我
  • Docker - 检查容器内是否从主机安装了目录

    我需要检查目录是否在我正在运行的容器中是否从主机安装 示例 使用docker run v host data data 命令 如果未安装 我想警告用户 当容器终止时 此目录上的数据将丢失 我找到了一个粗略但简单的解决方案 mount gre
  • 在运行时石墨烯上创建动态模式

    我几乎花了 3 天找到一种在 python graphene 中创建动态模式的方法 我能找到的唯一相关结果是以下链接 https github com graphql python graphene blob master graphene
  • 我应该如何引用角度自定义元素(Web 组件)中的资源

    我创建了一个 Web 组件 并从其中引用了我的资产文件夹中的图像 as below img src assets bot png alt 在本地一切都很好 我将自定义元素发布到 firebase 主机 并且 javascript css 和
  • @media 查询中的字体大小不适用

    我已经设法让 iFrame 和正文内容宽度随着 media规则但是我无法成功调整字体大小 在我的 HTML 中 media规则位于我的样式 css 之后 位于单独的文件中 我看不出是什么在阻止font size改变字体大小 JSFiddle
  • Angular 2 如何用 PHP 发送邮件?

    我学习 Angular 2 但我在网上没有看到任何将简单的联系表单从 Angular 2 发送到 php scrip 的示例 我的 html 模板