简体   繁体   中英

how to send emails with PHPmailer from WordPress Rest API end point

function my_send_email($name,$email, $current_user, $status, $subject, $Message) {
    //most of the code here is from https://github.com/PHPMailer/PHPMailer/tree/master/examples

    require_once ABSPATH . WPINC . '/class-phpmailer.php'; 
    require_once ABSPATH . WPINC . '/class-smtp.php';

    // build message body`enter code here`
   $body = '
    <html>
        <body>
        <h1>My Email</h1>
        </body>
    </html>
    ';

    try {
        //Create a new PHPMailer instance
        $mail = new PHPMailer;

        //Tell PHPMailer to use SMTP
        $mail->isSMTP();

        //Enable SMTP debugging
        $mail->SMTPDebug = 2;

        //Ask for HTML-friendly debug output
        $mail->Debugoutput = 'html';

        //Set the hostname of the mail server
        $mail->Host = "mail.example.com";

        //Set the SMTP port number - likely to be 25, 465 or 587
        $mail->Port = 25;

        //Whether to use SMTP authentication
        $mail->SMTPAuth = true;

        //Username to use for SMTP authentication
        $mail->Username = "contact@example.com";

        //Password to use for SMTP authentication
        $mail->Password = "1234";

        //Set who the message is to be sent from
        $mail->setFrom('contact@example.com', 'sender_name');

        //Set an alternative reply-to address
        $mail->addReplyTo('alternative_contact@example.com', 'alternative_contact_name');

        //Set who the message is to be sent to
        $mail->addAddress($email, $name);
        //Set the subject line
        $mail->Subject = 'PHPMailer SMTP test';
        //Read an HTML message body from an external file, convert referenced images to embedded,
        //convert HTML into a basic plain-text alternative body
        //$mail->msgHTML(file_get_contents(dirname(__FILE__) .'/contents.html'));
        $mail->MsgHTML($body);
        //Replace the plain text body with one created manually
        $mail->AltBody = 'This is a plain-text message body';

        $success=$mail->send();
        //send the message, check for errors
        if ($success) {
            return array('mailError' => false, 'message' => 'email sent! ' . $mail->ErrorInfo , 'body'=>$body);
        } else {
            return array('mailError' => true, 'message' => 'email error! ' . $mail->ErrorInfo , 'body'=>$body);
        }
    } catch (phpmailerException $e) {
        return array('mailError' => false, 'message' => 'email error! ' . $e->errorMessage() , 'body'=>$body);  //Pretty error messages from PHPMailer
    } catch (Exception $e) {
        return array('mailError' => false, 'message' => 'email error! ' . $e->getMessage() , 'body'=>$body); //Boring error messages from anything else!
    }

}

function my_register_endpoints(){
    register_rest_route(

        'my_namespace/v1',
        '/abc/',
        array(
            'methods' => 'POST',
            'callback' => 'my_end_point',
            'args' => array(
                    .....
            ),
            'permission_callback' => function (WP_REST_Request $request) {

                if(!is_user_logged_in()){
                .....
                }
                return true;

            }
        )

    );
}

add_action('rest_api_init','my_register_endpoints'); 

//endpoint
function my_end_point(WP_REST_Request $request){

        global $current_user;
        $sender = wp_get_current_user();
        $shortMsg=$request['shortMessage'];
        $subject="Some text";

        $email_resualt=my_send_email("reciver_name","reciver_email",$sender,$status,$subject,$shortMsg);

        if($email_resualt['mailError']==false){

            process.. $itemes, $item ..    
            $message='email sent!';
            return array('message' => $message,'items' => $items, 'item'=>$item);

        } else {

             return new WP_Error('email error',__('some message','email-error'),$request['id']);

        }   

}

I am using angularJS $http.post to call the API end point, The emails are sent and I can see them on my inbox, but for some reason I am getting back undefined response:

Related errors on Chrome console: 1) SyntaxError: Unexpected token S in JSON at position 0

2) TypeError: Cannot read property 'message' of undefined

I use response.message in my client side code but as I stated above but as the response is empty I am getting errors.

I have other end points in my WordPress PHP code that looks the same but doesn't include send emails with PHPmailer and works fine. and even this end point without the send email functionality was also working fine.

I tried to debug it for two days but still I am not sure where the issue in my code?

I found what the issue was, In my send email function I had the lines:

//Enable SMTP debugging

$mail->SMTPDebug = 2;

$mail->Debugoutput = 'html';

And appears that because debugging was turned on the response from my end point was to match for angular to handle after I commented these two lines the response was well structured for for angular to be able to parse it.

The hint to solve it was in the following post Syntax error: Unexpected number at Object.parse, PHP to AngularJS

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM