首页 文章

从PHP页面使用GMail SMTP服务器发送电子邮件

提问于
浏览
359

我试图从PHP页面通过GMail的SMTP服务器发送电子邮件,但是我收到此错误:

身份验证失败[SMTP:SMTP服务器不支持身份验证(代码:250,响应:mx.google.com为您服务,[98.117.99.235] SIZE 35651584 8BITMIME STARTTLS ENHANCEDSTATUSCODES PIPELINING)]

有人可以帮忙吗?这是我的代码:

<?php
require_once "Mail.php";

$from = "Sandra Sender <sender@example.com>";
$to = "Ramona Recipient <ramona@microsoft.com>";
$subject = "Hi!";
$body = "Hi,\n\nHow are you?";

$host = "smtp.gmail.com";
$port = "587";
$username = "testtest@gmail.com";
$password = "testtest";

$headers = array ('From' => $from,
  'To' => $to,
  'Subject' => $subject);
$smtp = Mail::factory('smtp',
  array ('host' => $host,
    'port' => $port,
    'auth' => true,
    'username' => $username,
    'password' => $password));

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

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

13 回答

  • 28

    我有一个没有"@gmail.com" sufix的GSuite帐户的解决方案 . 另外我认为它适用于@ gmail.com的GSuite帐户,但还没有尝试过 . 首先,您应该拥有更改GSuite帐户选项"allos¿w less secure app"的权限 . 如果您具有权限(您可以签入帐户设置 - >安全性),则必须停用"two step factor authentication"转到页面末尾并设置为"yes"以允许不太安全的应用程序 . 就这样 . 如果您没有权限更改这些选项,则此线程的解决方案将无效 . 检查https://support.google.com/a/answer/6260879?hl=en以更改"allow less..."选项 .

  • 3

    我不推荐Pear Mail . 它自2010年以来一直没有更新 . 还阅读源文件;源代码几乎已过时,以PHP 4风格编写,并且已经发布了许多错误/错误(谷歌) . 我正在使用Swift Mailer .

    Swift Mailer 集成到用PHP 5编写的任何Web应用程序中,提供灵活而优雅的面向对象的方法来发送具有多种功能的电子邮件 .

    使用SMTP,sendmail,postfix或您自己的自定义传输实现发送电子邮件 . 支持需要用户名和密码和/或加密的服务器 . 在不剥离请求数据内容的情况下防止标头注入攻击 . 发送符合MIME的HTML /多部分电子邮件 . 使用事件驱动的插件来自定义库 . 处理内存使用率低的大附件和内嵌/嵌入式图像 .

    它是一个免费的开放源代码,您可以Download Swift Mailer并上传到您的服务器 . (功能列表从所有者网站复制) .

    Gmail SSL / SMTP和Swift Mailer的工作示例就在这里......

    // Swift Mailer Library
    require_once '../path/to/lib/swift_required.php';
    
    // Mail Transport
    $transport = Swift_SmtpTransport::newInstance('ssl://smtp.gmail.com', 465)
        ->setUsername('username@gmail.com') // Your Gmail Username
        ->setPassword('my_secure_gmail_password'); // Your Gmail Password
    
    // Mailer
    $mailer = Swift_Mailer::newInstance($transport);
    
    // Create a message
    $message = Swift_Message::newInstance('Wonderful Subject Here')
        ->setFrom(array('sender@example.com' => 'Sender Name')) // can be $_POST['email'] etc...
        ->setTo(array('receiver@example.com' => 'Receiver Name')) // your email / multiple supported.
        ->setBody('Here is the <strong>message</strong> itself. It can be text or <h1>HTML</h1>.', 'text/html');
    
    // Send the message
    if ($mailer->send($message)) {
        echo 'Mail sent successfully.';
    } else {
        echo 'I am sure, your configuration are not correct. :(';
    }
    

    我希望这有帮助 . 快乐的编码...... :)

  • 2

    问题中列出的代码需要进行两处更改

    $host = "ssl://smtp.gmail.com";
    $port = "465";
    

    SSL连接需要端口465 .

  • 0

    'auth' => false,
    

    另外,查看端口25是否有效 .

  • 13
    <?php
    date_default_timezone_set('America/Toronto');
    
    require_once('class.phpmailer.php');
    //include("class.smtp.php"); // optional, gets called from within class.phpmailer.php if not already loaded
    
    $mail             = new PHPMailer();
    
    $body             = "gdssdh";
    //$body             = eregi_replace("[\]",'',$body);
    
    $mail->IsSMTP(); // telling the class to use SMTP
    //$mail->Host       = "ssl://smtp.gmail.com"; // SMTP server
    $mail->SMTPDebug  = 1;                     // enables SMTP debug information (for testing)
                                               // 1 = errors and messages
                                               // 2 = messages only
    $mail->SMTPAuth   = true;                  // enable SMTP authentication
    $mail->SMTPSecure = "ssl";                 // sets the prefix to the servier
    $mail->Host       = "smtp.gmail.com";      // sets GMAIL as the SMTP server
    $mail->Port       = 465;                   // set the SMTP port for the GMAIL server
    $mail->Username   = "user@gmail.com";  // GMAIL username
    $mail->Password   = "password";            // GMAIL password
    
    $mail->SetFrom('contact@prsps.in', 'PRSPS');
    
    //$mail->AddReplyTo("user2@gmail.com', 'First Last");
    
    $mail->Subject    = "PRSPS password";
    
    //$mail->AltBody    = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test
    
    $mail->MsgHTML($body);
    
    $address = "user2@yahoo.co.in";
    $mail->AddAddress($address, "user2");
    
    //$mail->AddAttachment("images/phpmailer.gif");      // attachment
    //$mail->AddAttachment("images/phpmailer_mini.gif"); // attachment
    
    if(!$mail->Send()) {
      echo "Mailer Error: " . $mail->ErrorInfo;
    } else {
      echo "Message sent!";
    }
    
    ?>
    
  • 5

    使用phpMailer库通过Gmail发送邮件请从Github下载库文件

    <?php
    /**
     * This example shows settings to use when sending via Google's Gmail servers.
     */
    //SMTP needs accurate times, and the PHP time zone MUST be set
    //This should be done in your php.ini, but this is how to do it if you don't have access to that
    date_default_timezone_set('Etc/UTC');
    require '../PHPMailerAutoload.php';
    //Create a new PHPMailer instance
    $mail = new PHPMailer;
    //Tell PHPMailer to use SMTP
    $mail->isSMTP();
    //Enable SMTP debugging
    // 0 = off (for production use)
    // 1 = client messages
    // 2 = client and server messages
    $mail->SMTPDebug = 2;
    //Ask for HTML-friendly debug output
    $mail->Debugoutput = 'html';
    //Set the hostname of the mail server
    $mail->Host = 'smtp.gmail.com';
    // use
    // $mail->Host = gethostbyname('smtp.gmail.com');
    // if your network does not support SMTP over IPv6
    //Set the SMTP port number - 587 for authenticated TLS, a.k.a. RFC4409 SMTP submission
    $mail->Port = 587;
    //Set the encryption system to use - ssl (deprecated) or tls
    $mail->SMTPSecure = 'tls';
    //Whether to use SMTP authentication
    $mail->SMTPAuth = true;
    //Username to use for SMTP authentication - use full email address for gmail
    $mail->Username = "username@gmail.com";
    //Password to use for SMTP authentication
    $mail->Password = "yourpassword";
    //Set who the message is to be sent from
    $mail->setFrom('from@example.com', 'First Last');
    //Set an alternative reply-to address
    $mail->addReplyTo('replyto@example.com', 'First Last');
    //Set who the message is to be sent to
    $mail->addAddress('whoto@example.com', 'John Doe');
    //Set the subject line
    $mail->Subject = 'PHPMailer GMail 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('contents.html'), dirname(__FILE__));
    //Replace the plain text body with one created manually
    $mail->AltBody = 'This is a plain-text message body';
    //Attach an image file
    $mail->addAttachment('images/phpmailer_mini.png');
    //send the message, check for errors
    if (!$mail->send()) {
        echo "Mailer Error: " . $mail->ErrorInfo;
    } else {
        echo "Message sent!";
    }
    
  • 99

    要在Ubuntu中安装PEAR的Mail.php,请运行以下命令集:

    sudo apt-get install php-pear
        sudo pear install mail
        sudo pear install Net_SMTP
        sudo pear install Auth_SASL
        sudo pear install mail_mime
    
  • 338

    使用Swift mailer,通过Gmail凭据发送邮件非常简单:

    <?php
    require_once 'swift/lib/swift_required.php';
    
    $transport = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, "ssl")
      ->setUsername('GMAIL_USERNAME')
      ->setPassword('GMAIL_PASSWORD');
    
    $mailer = Swift_Mailer::newInstance($transport);
    
    $message = Swift_Message::newInstance('Test Subject')
      ->setFrom(array('abc@example.com' => 'ABC'))
      ->setTo(array('xyz@test.com'))
      ->setBody('This is a test mail.');
    
    $result = $mailer->send($message);
    ?>
    
  • 53
    // Pear Mail Library
    require_once "Mail.php";
    
    $from = '<fromaddress@gmail.com>';
    $to = '<toaddress@yahoo.com>';
    $subject = 'Hi!';
    $body = "Hi,\n\nHow are you?";
    
    $headers = array(
        'From' => $from,
        'To' => $to,
        'Subject' => $subject
    );
    
    $smtp = Mail::factory('smtp', array(
            'host' => 'ssl://smtp.gmail.com',
            'port' => '465',
            'auth' => true,
            'username' => 'johndoe@gmail.com',
            'password' => 'passwordxxx'
        ));
    
    $mail = $smtp->send($to, $headers, $body);
    
    if (PEAR::isError($mail)) {
        echo('<p>' . $mail->getMessage() . '</p>');
    } else {
        echo('<p>Message successfully sent!</p>');
    }
    
  • 20

    您的代码似乎没有使用TLS(SSL),即necessary to deliver mail to Google (and using ports 465 or 587) .

    您可以通过设置来完成此操作

    $host = "ssl://smtp.gmail.com";

    你的代码看起来很像this example,它引用了主机名方案中的ssl:// .

  • 32

    Gmail需要端口465,而且它是来自phpmailer的代码:)

  • 4

    我也有这个问题 . 我设置了正确的设置并启用了不太安全的应用程序,但它仍然无效 . 最后,我启用了这个https://accounts.google.com/UnlockCaptcha,它对我有用 . 我希望这可以帮助别人 .

  • -3

    SwiftMailer可以使用外部服务器发送电子邮件 .

    这是一个显示如何使用Gmail服务器的示例:

    require_once "lib/Swift.php";
    require_once "lib/Swift/Connection/SMTP.php";
    
    //Connect to localhost on port 25
    $swift =& new Swift(new Swift_Connection_SMTP("localhost"));
    
    
    //Connect to an IP address on a non-standard port
    $swift =& new Swift(new Swift_Connection_SMTP("217.147.94.117", 419));
    
    
    //Connect to Gmail (PHP5)
    $swift = new Swift(new Swift_Connection_SMTP(
        "smtp.gmail.com", Swift_Connection_SMTP::PORT_SECURE, Swift_Connection_SMTP::ENC_TLS));
    

相关问题