【问题标题】:PHP/HTML form data to send as an email from my GMAIL accountPHP/HTML 表单数据作为电子邮件从我的 GMAIL 帐户发送
【发布时间】:2014-02-21 12:34:11
【问题描述】:

当有人在我的网页上填写表格时,我正在尝试向自己发送电子邮件。我的表单如下所示:

    <form id="contactForm" action="#" method="post">
                <fieldset>                      
                    <p>
                        <label for="name" >Name</label>
                        <input name="name"  id="name" type="text" class="form-poshytip" title="Enter your full name" />
                    </p>
                    <p>
                        <label for="email" >Email</label>
                        <input name="email"  id="email" type="text" class="form-poshytip" title="Enter your email address" />
                    </p>
                    <p>
                        <label for="web">Website</label>
                        <input name="web"  id="web" type="text" class="form-poshytip" title="Enter your website" />
                    </p>
                    <p>
                        <label for="comments">Message</label>
                        <textarea  name="comments"  id="comments" rows="5" cols="20" class="form-poshytip" title="Enter your comments"></textarea>
                    </p>
                    <!-- send mail configuration -->
                    <input type="hidden" value=EMAIL" name="to" id="to" />
                    <input type="hidden" value="Email received from Website" name="subject" id="subject" />
                    <input type="hidden" value="send-mail.php" name="sendMailUrl" id="sendMailUrl" />
                    <!-- ENDS send mail configuration -->

                    <p><input type="button" value="Send" name="submit" id="submit" /> <span id="error" class="warning">Message</span></p>
                </fieldset>

            </form>

我拥有的 PHP 看起来像这样:

<?php
//vars
$subject = $_POST['subject'];
$to = explode(',', $_POST['to'] );

$from = $_POST['email'];

//data
$msg = "NAME: "  .$_POST['name']    ."<br>\n";
$msg .= "EMAIL: "  .$_POST['email']    ."<br>\n";
$msg .= "WEBSITE: "  .$_POST['web']    ."<br>\n";
$msg .= "COMMENTS: "  .$_POST['comments']    ."<br>\n";

//Headers
$headers  = "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html; charset=UTF-8\r\n";
$headers .= "From: <".$from. ">" ;

$smtp = Mail::factory('smtp', array(
        'host' => 'ssl://smtp.gmail.com',
        'port' => '465',
        'auth' => true,
        'username' => 'EMAIL',
        'password' => 'PASSWORD'
    ));

$mail = $smtp->send($to, $headers, $msg);
?>

其中 EMAIL 和 PASSWORD 被替换为值......

谁能给点建议?

【问题讨论】:

  • 这里有什么问题?
  • 电子邮件永远不会通过
  • 试试if($mail) echo "mail sent"; else echo "mail not sent";这个告诉send()有没有问题
  • 我认为Gmail的端口是587。另外,为什么不在邮件功能的php.ini中设置SMTP详细信息,使用sendmail然后@mail($to,$subject,$味精,$标头)
  • 不幸的是,我没有 PHP 经验!只是不高兴地试图弄清楚这一点!

标签: php forms email gmail


【解决方案1】:

将主机更新为 smtp.gmail.com 并将端口更新为 587,然后将结果更新给我们。

【讨论】:

    【解决方案2】:

    编辑(多合一)

    PHP - 和 HTML 一起(并用您自己的 SMTP 替换 mail() 函数)

    即:

    $mail = $smtp->send($to, $subject, $msg, $headers);
    

    新代码:

    <?php
    //vars
    
    if(isset($_POST['submit'])){
    $subject = $_POST['subject'];
    
    $to = "email@example.com";
    
    $from = $_POST['email'];
    
    //data
    $msg = "NAME: "  .$_POST['name']    ."<br>\n";
    $msg .= "EMAIL: "  .$_POST['email']    ."<br>\n";
    $msg .= "WEBSITE: "  .$_POST['web']    ."<br>\n";
    $msg .= "COMMENTS: "  .$_POST['comments']    ."<br>\n";
    
    //Headers
    $headers  = "MIME-Version: 1.0\r\n";
    $headers .= "Content-type: text/html; charset=UTF-8\r\n";
    $headers .= "From: <".$from. ">" ;
    
    // insert with your SMTP
    
    mail ($to, $subject,$msg, $headers); 
    echo "sent";
    }
    ?>
    
    
    <form id="contactForm" action="" method="post">
        <fieldset>                      
            <p>
                <label for="name" >Name</label>
                <input name="name"  id="name" type="text" class="form-poshytip" title="Enter your full name" />
            </p>
            <p>
                <label for="email" >Email</label>
                <input name="email"  id="email" type="text" class="form-poshytip" title="Enter your email address" />
            </p>
            <p>
                <label for="web">Website</label>
                <input name="web"  id="web" type="text" class="form-poshytip" title="Enter your website" />
            </p>
            <p>
                <label for="comments">Message</label>
                <textarea  name="comments"  id="comments" rows="5" cols="20" class="form-poshytip" title="Enter your comments"></textarea>
            </p>
            <!-- send mail configuration -->
            <input type="hidden" value="Email received from Website" name="subject" id="subject" />
    
            <!-- ENDS send mail configuration -->
    
            <p><input type="submit" value="Send" name="submit" id="submit" /> <span id="error" class="warning">Message</span></p>
        </fieldset>
    
    </form>
    

    原答案

    您的代码存在很多问题。

    您的参数已关闭 ($to, $headers, $msg) 标头排在最后,并且 $subject 不包括在内;它一定在里面。

    语法是($to, $subject,$msg, $headers)

    是 TO,然后是主题,然后是消息,然后是标题。根据the mail() manual,即使您使用的是 SMTP,邮件就是邮件。

    我不知道你为什么这样做:

    <input type="hidden" value="send-mail.php" name="sendMailUrl" id="sendMailUrl" />
    

    只需将其设置在表单的action=

    这对我有用:您可以替换:

    mail ($to, $subject, $msg, $headers);
    

    with(如果它适合你)似乎还有其他答案。

    $smtp = Mail::factory('smtp', array(
            'host' => 'ssl://smtp.gmail.com',
            'port' => '465',
            'auth' => true,
            'username' => 'EMAIL',
            'password' => 'PASSWORD'
        ));
    
    $mail = $smtp->send($to, $headers, $msg);
    

    PHP - 测试 (send-mail.php)

    <?php
    //vars
    
    if(isset($_POST['submit'])){
    $subject = $_POST['subject'];
    
    $to = "email@example.com";
    
    $from = $_POST['email'];
    
    //data
    $msg = "NAME: "  .$_POST['name']    ."<br>\n";
    $msg .= "EMAIL: "  .$_POST['email']    ."<br>\n";
    $msg .= "WEBSITE: "  .$_POST['web']    ."<br>\n";
    $msg .= "COMMENTS: "  .$_POST['comments']    ."<br>\n";
    
    //Headers
    $headers  = "MIME-Version: 1.0\r\n";
    $headers .= "Content-type: text/html; charset=UTF-8\r\n";
    $headers .= "From: <".$from. ">" ;
    
    mail ($to, $subject,$msg, $headers);
    echo "sent";
    }
    ?>
    

    HTML 表单

    <form id="contactForm" action="send-mail.php" method="post">
        <fieldset>                      
            <p>
                <label for="name" >Name</label>
                <input name="name"  id="name" type="text" class="form-poshytip" title="Enter your full name" />
            </p>
            <p>
                <label for="email" >Email</label>
                <input name="email"  id="email" type="text" class="form-poshytip" title="Enter your email address" />
            </p>
            <p>
                <label for="web">Website</label>
                <input name="web"  id="web" type="text" class="form-poshytip" title="Enter your website" />
            </p>
            <p>
                <label for="comments">Message</label>
                <textarea  name="comments"  id="comments" rows="5" cols="20" class="form-poshytip" title="Enter your comments"></textarea>
            </p>
            <!-- send mail configuration -->
            <input type="hidden" value="Email received from Website" name="subject" id="subject" />
    
            <!-- ENDS send mail configuration -->
    
            <p><input type="submit" value="Send" name="submit" id="submit" /> <span id="error" class="warning">Message</span></p>
        </fieldset>
    
    </form>
    

    脚注:

    value=EMAIL" 中缺少引号,但在我的 PHP 中已替换为:

    $to = "email@example.com";
    

    【讨论】:

    • 我删除了我的表单并替换为您的代码。现在当我点击提交按钮时,代码会像一个新页面一样打开,这让我很着迷。我是一名 Java/Web 开发人员,认为这很容易,只是我不知道语法
    • 我发布的代码基本上应该是“开箱即用”的。我的 HTML 和 PHP 都应该使用。如果您只使用了其中的 1/2 并且仍在使用相同的表单,那么它就会这样做。我在发布之前对此进行了预测试。 @MarkMcK
    • 我将发布一个编辑以将所有内容都放在同一页面内。这样,它应该按原样工作。您将需要用您自己的 SMTP 替换某些功能。 @MarkMcK - 给我一分钟左右;-)
    • 不客气。好的,重新加载以查看我的 Edit @MarkMcK
    • 我对@9​​87654337@ 功能提出了质疑。这是一个似乎没有被调用的函数。你如何使用它? @MarkMcK
    【解决方案3】:

    您必须首先检查变量 $to 的值是正确的邮件方向。根据您发布的代码可能会出错。

    在您调用 Mail 类但不包含/要求的 php 代码上,添加以下内容:

    // Pear Mail Library
    require_once "Mail.php";
    

    发送邮件后,您无法显示结果:

    if (PEAR::isError($mail)) {
        echo('<p>' . $mail->getMessage() . '</p>');
    } else {
        echo('<p>Message successfully sent!</p>');
    }
    

    【讨论】:

      【解决方案4】:

      首先,检查邮箱中的垃圾邮件。如果 gmail 收到了您的邮件,它一定在那里。如果没有,请检查您的邮件服务器配置,以及它是否有权为您的域发送邮件。您还可以检查邮件服务器日志是否存在潜在问题。

      无论如何,我建议您使用MailjetMailChimp 之类的解决方案。您可以注册基本套餐并获取您的电子邮件。这样的解决方案的优点是您不需要维护您的邮件服务器,您可以检查正在处理的每封邮件的状态。

      【讨论】:

        【解决方案5】:

        这是一种既便宜又简单的方法。

        在您的 php.ini 中将邮件功能的相关部分替换为

        [mail function]
        ; For Win32 only.
        SMTP = smtp.gmail.com
        smtp_port = 587
        
        ; For Win32 only.
        sendmail_from = EMAILADDRESSHERE
        

        将 sendmail.ini 替换为

        [sendmail] 
        smtp_server=smtp.gmail.com
        
        smtp_port=587
        
        error_logfile=error.log
        
        auth_username=EMAILADDRESSHERE
        auth_password=PASSWORDHERE
        
        force_sender=EMAILADDRESSHERE
        

        然后在您的代码中,发送一封几乎相同的电子邮件,只是将其写为

         mail($to, $subject, $msg, $headers)
        

        或修改以适应。

        【讨论】:

        • @mail 不应使用@
        • 天哪,你是对的。刚刚从我正在测试的文件中粘贴了最后一个函数,忘记了我已经取消了警告。
        • 而且在某些情况下,它甚至会阻止邮件发送。
        • 好奇:什么情况下抑制会导致mail()不发送?
        猜你喜欢
        • 1970-01-01
        • 2013-03-24
        • 2012-03-16
        • 1970-01-01
        • 1970-01-01
        • 2011-12-15
        • 2012-03-30
        • 2013-12-19
        • 2019-06-21
        相关资源
        最近更新 更多