2017-12-15 121 views
5

नहीं भेजता है, मैं अपने पृष्ठ पर एक संपर्क फ़ॉर्म से एक ईमेल भेजने की कोशिश कर रहा हूं, मैं इसे अपने ईमेल पर भेजने के लिए एक PHP स्क्रिप्ट का उपयोग कर रहा हूं, मैं this ट्यूटोरियल का अनुसरण कर रहा हूं, I मैंने उसका उदाहरण इस्तेमाल किया है और यह काम करता है ... लेकिन मुझे लगता है कि यह मेरे आवेदन में काम करने के लिए प्रतीत नहीं होता है, मुझे पहले 404 त्रुटियों के साथ कुछ परेशानी हो रही थी, लेकिन फिर मैंने अपनी साइट प्रकाशित की और इसे लाइव सर्वर पर रखा और अब मैं सफलता कोडईमेल एंगुलर 4 और PHP

enter image description here

लेकिन ऐसे ईमेल प्राप्त हो नहीं im हो रही है, तो मैं http://mysite/assets/email.php के पास गया और मैं इस त्रुटि

देखकर

enter image description here

get-में-touch.component.ts

import { Component, OnInit } from '@angular/core'; 
import { AppService, IMessage } from '../../services/email.service'; 

@Component({ 
    selector: 'app-get-in-touch', 
    templateUrl: './get-in-touch.component.html', 
    styleUrls: ['./get-in-touch.component.scss'], 
    providers: [AppService] 
}) 
export class GetInTouchComponent implements OnInit { 
    message: IMessage = {}; 

    constructor(
    private appService: AppService 
) { } 

    ngOnInit() { 
    } 

    sendEmail(message: IMessage) { 
    this.appService.sendEmail(message).subscribe(res => { 
     console.log('AppComponent Success', res); 
    }, error => { 
     console.log('AppComponent Error', error); 
    }); 
    } 

} 

app.module.ts

import { BrowserModule } from '@angular/platform-browser'; 
import { NgModule } from '@angular/core'; 
import { RouterModule, Routes, ActivatedRoute, ParamMap } from '@angular/router'; 


import { AppComponent } from './app.component'; 
import { GetInTouchComponent } from './get-in-touch/get-in-touch.component'; 
import { FormsModule, ReactiveFormsModule } from '@angular/forms'; 
import { httpModule } from @angular/forms; 

export const ROUTES: Routes = [ 
    { path: 'get-in-touch', component: GetInTouchComponent } 
]; 

@NgModule({ 
    declarations: [ 
    AppComponent, 
    GetInTouchComponent 
    ], 
    imports: [ 
    BrowserModule, 
    RouterModule.forRoot(ROUTES), 
    FormsModule, 
    HttpModule 
    ], 
    providers: [], 
    bootstrap: [AppComponent] 
}) 
export class AppModule { } 

email.service.ts

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'; 
import 'rxjs/add/observable/throw'; 

export interface IMessage { 
    name?: string; 
    email?: string; 
    message?: string; 
} 

@Injectable() 
export class AppService { 
    private emailUrl = '../app/get-in-touch/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); 
     }); 
    } 
} 

email.php

<?php 

header('Content-type: application/json'); 

$errors = ''; 

if(empty($errors)){ 
    $postdata = file_get_contents("php://input"); 
    $request = json_decode($postdata); 

    $from_email = $request->email; 
    $message = $request->message; 
    $from_name = $request->name; 

    $to_email = $from_email; 

    $contact = "<p><strong>Name: </strong> $from_name</p><p><strong>Email:</strong> $from_email</p>"; 
    $content = "<p>$message</p>"; 

    $website = "Thirsty Studios"; 
    $email_subject = "Contact Form"; 

    $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"; 

    mail($to_email,$email_subject,$email_body,$headers); 

    $response_array['status'] = 'success'; 
    $response_array['from'] = $from_email; 
    echo json_encode($response_array); 
    echo json_encode($from_email); 
    header($response_array); 
    return $from_email; 
} else { 
    $response_array['status'] = 'error'; 
    echo json_encode($response_array); 
    header('Location: /error.html'); 
} 
?> 

मैंने पहले (कोणीय + PHP) इस तरह कुछ भी कभी नहीं किया है, लेकिन मैं सब कुछ ट्यूटोरियल में कहा जाता है कि किया है और मैं समझ नहीं कर पा रहे काम करने के लिए, किसी भी मदद की सराहना की जाएगी और अगर आपको अधिक जानकारी की आवश्यकता है तो कृपया मुझे बताएं

+0

क्या आप वास्तव में इस URL को http: // localhost: 4200/app/get-in-touch/email.php तक पहुंच सकते हैं, क्योंकि आपके पास 404 त्रुटि है। – ksoni

+0

अरे हाँ, मैंने उस यूआरएल तक पहुंचने की कोशिश की और यह काम नहीं किया, इसलिए मैंने जो किया था, वह मेरे संपत्ति फ़ोल्डर में email.php को स्थानांतरित कर दिया गया था और मैं इसे एक्सेस करने में सक्षम था .. लेकिन मुझे अभी भी वही त्रुटि मिल रही है सोच रहा है कि यह काम नहीं कर रहा है क्योंकि मैं लोकलहोस्ट पर हूं? – A61NN5

+0

पृष्ठ का पूरा URL क्या है जहां फ़ॉर्म प्रदर्शित होता है? – ksoni

उत्तर

3

इस बिंदु पर ऐसा लगता है कि अनुरोध आपकी PHP स्क्रिप्ट तक भी नहीं पहुंचता है क्योंकि अनुरोध 404 देता है। पहली त्रुटि संभव होती है क्योंकि नोड सर्वर .php फ़ाइलों को निष्पादित नहीं करेगा। xammp (या आपका पसंदीदा विकल्प) जैसे कुछ का उपयोग करके आपको एक अलग बंदरगाह पर एक स्थानीय अपाचे सर्वर स्थापित करने की आवश्यकता होगी। या अन्यथा आपका अनुरोध लाइव वेब सर्वर पर करें।

यह दूसरे और तीसरे त्रुटि संदेश की तरह लगता है अपने ईमेल सेवा में अपने .catch कॉलबैक प्रपत्र आ जा सकता है, का उपयोग कर प्रयास करें:

.catch((error: Error) => { 
    console.log('Sending email got error', error.message); 
    return Observable.throw(error.message); 
}); 

ऐसे formspree या यहाँ तक कि के रूप में PHP का उपयोग करने के लिए कुछ विकल्प हैं, Gmail API और मुझे यकीन है कि आप दूसरों को कुछ गुगलिंग के साथ पाएंगे। लेकिन यहां एक example using fromspree है।

तुम भी थोड़ा आप PHP स्क्रिप्ट को आसान बनाने के लिए सक्षम इस प्रकार होना चाहिए:

<?php 
$errors = ''; 

if(empty($errors)) { 

    $response_array = array(); 

    $from_email = $_POST['email']; 
    $message = $_POST['message']; 
    $from_name = $_POST['name']; 

    $to_email = $from_email; 

    $contact = "<p><strong>Name: </strong> $from_name</p><p><strong>Email:</strong> $from_email</p>"; 
    $content = "<p>$message</p>"; 

    $website = "Thirsty Studios"; 
    $email_subject = "Contact Form"; 

    $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"; 

    mail($to_email, $email_subject, $email_body, $headers); 

    $response_array['status'] = 'success'; 
    $response_array['from'] = $from_email; 
    echo json_encode($response_array); 

} else { 

    $response_array['status'] = 'error'; 
    echo json_encode($response_array); 
} 
?> 
+0

अपडेट करूँगा इसलिए मैंने अपनी प्रोजेक्ट प्रकाशित की और इसे लाइव देव सर्वर पर रखा, मुझे अपना सफलता संदेश मिल रहा है (अपडेट किया गया प्रश्न देखें) लेकिन मैं वास्तव में ईमेल प्राप्त नहीं कर रहा हूं .. – A61NN5

+0

ठीक है, मुझे लगता है कि आप अपनी मेल स्क्रिप्ट को थोड़ा सा सरल बना सकते हैं, अद्यतन उत्तर देखें। – Und3rTow

+0

@ ए 61 एनएन 5 क्या आपने अपना स्पैम फ़ोल्डर चेक किया था? जब आप ईमेल स्क्रिप्ट ब्राउज़ करते हैं तो क्या आपको ईमेल प्राप्त होता है? पहले परीक्षण करें और आपको तब बग समझना चाहिए। इसके अलावा आपके कोड से इसे डबल कोट के अंदर होना चाहिए, अन्यथा यह केवल '$ email_body को मुद्रित करेगा।= '$ संपर्क $ सामग्री'; ' – Manzurul

3

मैं 100% विश्वास है कि मैं तुम्हें एक सटीक जवाब दे सकते हैं नहीं कर रहा हूँ, लेकिन मुझे लगता है कि वहाँ कुछ समग्र मुद्दे हैं/भ्रम/गलतफहमी जो आप चल रहे हैं, और उन्हें समझने से आपको सही दिशा में आगे बढ़ने में मदद मिल सकती है।

सबसे पहले, आपको अब कोणीय को अनदेखा करना चाहिए और केवल PHP (जिसे आपने करने का प्रयास किया है) पर विचार करना चाहिए। कोणीय मूल रूप से एक लाल हेरिंग है: यदि आप अपनी PHP स्क्रिप्ट को कोणीय का उपयोग किये बिना ईमेल भेजने के लिए प्राप्त कर सकते हैं, तो कोणीय को PHP एंडपॉइंट का उपयोग करके ईमेल भेजने के लिए आसान हो जाएगा।चाल यह है कि आपकी स्क्रिप्ट वर्तमान में JSON के साथ POST body के माध्यम से अपना इनपुट स्वीकार करती है, इसलिए यदि आप इसे अपने ब्राउज़र में बस लोड करना चाहते हैं, तो कुछ भी नहीं होगा। इसके बजाय आप सीधे इस तरह के अंतराल की जांच कर सकते हैं जैसे कर्ल। आप कर्ल स्थापित किया है आप कमांड लाइन से कुछ इस तरह कर सकते हैं:

curl -d '{"email":"[email protected]", "message": "Hi", "name": "Conor Mancone"}' 'http://example.com/email.php' 

d झंडा पद डेटा (और एक पोस्ट अनुरोध के लिए परोक्ष झंडे) निर्दिष्ट करता है। यदि आपके पास स्थानीय रूप से स्थापित कर्ल नहीं है तो आप online curl का उपयोग कर सकते हैं या पोस्टमैन इंस्टॉल कर सकते हैं। ये वे औजार हैं जिन्हें आप सीखना शुरू कर सकते हैं।

यह आपको अपने PHP एंडपॉइंट को अधिक प्रभावी ढंग से डीबग करने देगा। सबसे महत्वपूर्ण बात यह है कि आप सीधे आउटपुट देख पाएंगे। अगला चरण आउटपुट को कॉपी और पेस्ट करना है जैसे jsonlint। ऐसा लगता है कि आपका PHP एंडपॉइंट JSON को ठीक तरह से वापस नहीं कर रहा है, और यह आपको उस भाग को समझने देगा। सबसे महत्वपूर्ण बात यह है कि, आप कोणीय को अनदेखा कर सकते हैं और यह पता लगा सकते हैं कि आप ईमेल क्यों नहीं भेज रहे हैं। कि नोट पर, के PHP में कूद और सामान्य मुद्दों में से कुछ अपने कोड है, जो या अपने समस्याओं के कारण नहीं किया जा सकता में बारे में बात करते हैं, लेकिन निश्चित रूप से आपके कारण मदद नहीं कर रहे हैं:

$errors = ''; 

if(empty($errors)){ 
    // send email 
} else { 
    // return error 
} 

यह पहला हिस्सा किसी ऐसे व्यक्ति के लिए बिल्कुल स्पष्ट है जो पहली बार आपका कोड देखता है। आप $errors खाली बनाते हैं और फिर आपके सभी ईमेल भेजने वाले तर्क को if (empty($errors)) स्थिति में लपेटा जाता है। $errors चर खोना। अगर वह और हार गया। कभी भी अपने एप्लिकेशन में कोड न छोड़ें जो वास्तव में कुछ भी नहीं करता है। यह आपको किसी भी कारण से बग पेश करने के लिए और अवसर प्रदान करता है।

इसके अलावा, यह एक मामूली बिंदु है, लेकिन आप कोई इनपुट सत्यापन नहीं कर रहे हैं। यदि आपके एंडपॉइंट पर जेएसओएन पोस्ट किया गया है तो कुछ स्क्रिप्ट गायब हो जाएगी, आपकी स्क्रिप्ट क्रैश हो जाएगी। कोई व्यक्ति उस संदेश में एचटीएमएल डाल सकता है जो सबसे खराब या खतरनाक रूप से अप्रिय हो सकता है।

आप भी अपनी स्क्रिप्ट के अंत में कीड़े का एक समूह मिल गया है:

echo json_encode($response_array); 
echo json_encode($from_email); 
header($response_array); 
return $from_email; 

आप ब्राउज़र के लिए JSON के रूप में $response_array outputting रहे हैं, तो आप एक स्ट्रिंग पर json_encode चल रहे हैं ($from_email) जीता जो वैध JSON भी नहीं बनाते हैं, और उनमें से दोनों का संयोजन निश्चित रूप से मान्य JSON नहीं होगा। आपके पास केवल एक echo json_encode होना चाहिए, अन्यथा परिणाम वैध JSON नहीं होगा, और आपको अपने कोणीय फ्रंट-एंड में एक पार्स त्रुटि मिलेगी।

अगला, आप अपने $response_array को php header फ़ंक्शन में पास कर रहे हैं। यह निश्चित रूप से आपके लिए कुछ भी नहीं कर रहा है। header स्ट्रिंग की अपेक्षा कर रहा है, एक सरणी नहीं, और HTTP प्रतिक्रिया में HTTP शीर्षलेख कुंजी/मान जोड़े सेट करने के लिए उपयोग किया जाता है। मैं कल्पना नहीं कर सकता कि आप अपने $response_array में किसी भी डेटा को HTTP शीर्षलेख प्रतिक्रिया मान के रूप में सेट करना चाहते हैं, और यहां तक ​​कि यदि आप ऐसा करना चाहते हैं, तो आप इसे $response_array में पास करके ऐसा नहीं कर सकते हैं। इसलिए, निश्चित रूप से इस लाइन को मार डालो। PHP इसे चुपचाप अनदेखा कर रहा है।

इसी प्रकार, कुछ भी वापस करने का कोई कारण नहीं है। HTTP अनुरोध द्वारा निष्पादित फ़ाइल से लौटने पर कोई प्रभाव नहीं पड़ेगा। आम तौर पर, आपको कार्यों के बाहर वापस नहीं आना चाहिए (और यह एक समारोह नहीं है)। जबकि मुझे विश्वास नहीं है कि यह लाइन किसी भी त्रुटि का कारण बन रही है, यह कुछ भी नहीं कर रही है। अगर यह कुछ भी नहीं कर रहा है तो इसे हटा दें। स्पष्ट होने के लिए, मैं इस पंक्ति के बारे में बात कर रहा हूं: return $from_email;

यह सब स्क्रिप्ट पोस्ट डेटा में पढ़ना, ईमेल भेजना, और फिर json_encode पर एक कॉल को गूंजना चाहिए।इससे भी कुछ भी अमान्य JSON के साथ समाप्त हो जाएगा जो आपका फ्रंट-एंड ऐप पढ़ने में सक्षम नहीं होगा। दोबारा, अपनी PHP स्क्रिप्ट को सीधे कॉल करने के लिए curl (या अन्य समान टूल) का उपयोग करें और इसे अधिक आसानी से डीबग करें। इस तरह आप देख सकते हैं कि यह क्या आउटपुट कर रहा है और सत्यापित करता है कि यह उचित JSON लौटा रहा है।

ईमेल

अब तो, मुख्य मुद्दा पर: ईमेल की कमी भेज दिया। आपको निश्चित रूप से कुछ विकृत मेल हेडर मिल गए हैं। प्रत्येक मेल हेडर को \r\n में समाप्त होना आवश्यक है। आप अच्छा शुरू करते हैं, लेकिन आपकी पिछली दो शीर्षलेख रेखाएं ठीक से समाप्त नहीं होती हैं। यह आपके ईमेल भेजने के प्रयासों को डुबोने के लिए पर्याप्त हो सकता है। पीएचपी mail फ़ंक्शन में निर्मित त्रुटियों को सूचित करने का एक अच्छा काम नहीं करता है, इसलिए आप वास्तव में अधिक मजबूत मेलर का उपयोग करके बेहतर हो सकते हैं। यदि आप अपने ईमेल को कॉन्फ़िगर करते समय गलतियां करते हैं तो यह आपको बेहतर प्रतिक्रिया देगा।

https://github.com/PHPMailer/PHPMailer

मैं अपना ईमेल हेडर फिक्सिंग से शुरू करते हैं और अगर है कि आप के लिए यह करता है देखना होगा: PHP में एक आम एक इस आदमी है। अन्यथा, आपको एक वास्तविक मेलर आज़माने की आवश्यकता हो सकती है। इसका कारण यह है कि ईमेल भेजने की अगली सबसे आम वजह स्पैम शमन के आधुनिक प्रयासों के कारण नहीं है। PHP mail फ़ंक्शन सीधे सर्वर से ईमेल भेजने जा रहा है। कई आधुनिक ईमेल सिस्टम (विशेष रूप से जीमेल) स्वचालित रूप से ऐसे ईमेल अस्वीकार कर देंगे जब तक कि आप जिस डोमेन नाम से भेज रहे हैं वह DNS स्तर पर ठीक से कॉन्फ़िगर नहीं किया गया है। हालांकि, आप मनमानी ईमेल पते से भेज रहे हैं ($from_email चर की सामग्री, जो उपयोगकर्ता से आता है)। इन दिनों कई ईमेल प्रदाता स्वचालित रूप से ऐसे ईमेल अस्वीकार कर देंगे, और PHP को यह नहीं पता होगा कि ऐसा हुआ और आपको इसका कोई संकेत नहीं मिलेगा।

इसके बजाय, एक निश्चित पते से भेजें जिसे आप नियंत्रित करते हैं। या तो ईमेल संदेश में $from_email के साथ पास करें, या इसे उत्तर-के रूप में सेट करें। आपका सबसे अच्छा शर्त वास्तविक ईमेल पता का उपयोग करना और SMTP का उपयोग करके प्रमाणित करना है। जीमेल वास्तव में इसके लिए ठीक काम करता है। आपको अपने जीमेल पते से सीधे भेजने के लिए जीमेल के साथ उपरोक्त PHPMailer का उपयोग करने के कुछ उदाहरण खोजने में सक्षम होना चाहिए। इससे आपके ईमेल को स्पैम के रूप में अस्वीकार कर दिया जा सकता है, और आपको अतिरिक्त प्रतिक्रिया भी मिल जाएगी (यदि यह आपके भेजे गए बॉक्स में है, लेकिन दिखाई नहीं दे रहा है, तो इसे स्पैम के रूप में खारिज कर दिया गया था)।

ईमेल भेजना इन दिनों मुश्किल है। यह mail फ़ंक्शन को कॉल करने जितना आसान नहीं है।

संबंधित मुद्दे