使用PHPmaeller创建邮件表单

时间:2017-06-22 作者:kyrie

我正在学习编码插件。

我试图在插件页面中创建一个表单,它可以发送邮件。

这是我的代码,但它不起作用(我没有收到电子邮件,也没有显示任何错误)。

add_action(\'admin_menu\', \'add_contact_us_page\');

function add_contact_us_page() {
     add_menu_page(
        __( \'Contact Us\', \'textdomain\' ),
        __( \'Contact Us\',\'textdomain\' ),
        \'manage_options\',
        \'support_form_page\',
        \'support_form\',
        \'\'
    );
}

 function support_form() {
     ?>
    <form action="" method="post" enctype="text/plain">
Name:<br>
<input type="text" name="name"><br>
E-mail:<br>
<input type="text" name="email"><br>
Message:<br>
<input type="text" name="message" size="50"><br><br>
<input type="submit" value="save">
</form>

<?php
 }


if ( isset($_POST["submit"])) {
    do_action(\'my_phpmailer_example\');
}

add_action( \'phpmailer_init\', \'my_phpmailer_example\' );
function my_phpmailer_example( $phpmailer ) {
    $phpmailer->isSMTP();     
    $phpmailer->Host = \'smtp.sendgrid.net\';
    $phpmailer->SMTPAuth = true; 
    $phpmailer->Port = 587;
    $phpmailer->Username = \'****\';
    $phpmailer->Password = \'****\';
    $phpmailer->SMTPSecure = "tls"; 
    $phpmailer->From = "[email protected]";
    $phpmailer->FromName = "Your Name";
    $phpmailer->Subject = "Subject Text";
    $phpmailer->Body = "<i>Mail body in HTML</i>";
    $phpmailer->AltBody = "This is the plain text version of the email content";
    $phpmailer->AddAddress("[email protected]", "name"); 
    $phpmailer->SMTPDebug = true;
    $smtp_debug = ob_get_clean();
    if(!$phpmailer->send()) 
     {
    echo "Mailer Error: " . $phpmailer->ErrorInfo;
     } 
      else 
      {
     echo "Message has been sent successfully";
     echo $smtp_debug;
    }
}
请帮忙,谢谢!

2 个回复
最合适的回答,由SO网友:Paul Burilichev 整理而成

我建议您首先将代码与标记分开,尤其是像函数一样划分执行文件support_form().

下一步,请尝试发送无格式且带有硬编码消息的电子邮件。如果您在本地计算机上开发,则服务器上可能存在错误配置。

最后,你应该填写action 的属性<form> 标签这必须引用可执行脚本。否则,它会尝试在没有此代码的地方执行您的主页。如果您不打算分离标记和代码,我想您应该将您的操作链接到包含此脚本的文件。当这种情况发生时,您的代码

if ( isset($_POST["submit"])) {
   do_action(\'my_phpmailer_example\');
}
将执行。

SO网友:Brian Layman

为了记录在案,以防以后有人看到这一点,原始代码存在一些问题。第一个是这一行:

do_action(\'my_phpmailer_example\');
do\\u action()需要操作/挂钩的名称,并将执行与该挂钩关联的所有函数。在您的行中,您使用定义的函数名而不是操作名来调用它。通常您不必使用do\\u action()。WordPress本身会在适当的时间调用“phpmailer\\u init”操作。在本例中,您使用了试图调用的函数的名称。所以你告诉WP要做的就是寻找一个名为“my\\u phpmailer\\u example”的钩子,并执行添加到其中的所有操作。这就是为什么在提交表单时,您的行什么都没做。

第二,您正在组合两个不同的任务。您希望从与“phpmailer\\u init”挂钩关联的函数中删除发送代码。这只用于初始化phpmailer-设置服务器和值,诸如此类的事情。每次WordPress准备发送电子邮件时,都会执行“phpmailer\\u init”操作。而且你不希望你的插件在WordPress刚刚启动时发送电子邮件。所以,把WordPress从我的\\u phpmailer\\u example()中发出的所有电子邮件都不适用的东西都拿出来。

第三,您需要的是wp\\u邮件功能。看起来像这样:

if ( isset( $_POST[\'submit\'] ) ) {
   $to = \'[email protected]\';
   $subject = \'The subject\';
   $body = \'The email body content\';
   $headers = array(\'Content-Type: text/html; charset=UTF-8\');
   wp_mail( $to, $subject, $body, $headers );
}
但你会使用你的表格提交。您可以在此处阅读该函数:https://developer.wordpress.org/reference/functions/wp_mail/

第四,您需要在表单中构建安全机制,否则每个人及其叔叔都会使用它发送垃圾邮件。如果要允许html电子邮件,请查看如何在WordPress表单和current\\u user\\u can()上使用nonce,以及如何正确过滤用户提供的内容。

这些话题应该能让任何人朝着正确的方向看这个问题。

大家干杯!

结束