40

I'm writing a simple script in which a gmail account is used to send an email to itself.

I altered the script from SwiftMailer's reference, but I'm not getting any results. What's wrong?

Edit: after further debugging I've found that the statement

$result = $mailer->send($message);

causes the code to fail (the echo below it doesn't print).

Why is this? Just cause the message isn't sent the program crashes? :/

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>

<body>
<?php
    require_once '/var/www/swift/lib/swift_required.php';
    echo 'Mail sent <br />';  

/*  //create the transport
    $transport = Swift_SmtpTransport::newInstance('smtp.gmail.com', 587);
      ->setUsername('softrain.evaluaciones@gmail.com')
      ->setPassword('softrain1234')
    ;
*/

    $transport = Swift_SmtpTransport::newInstance('smtp.gmail.com', 587)
      ->setUsername('softrain.evaluaciones@gmail.com')
      ->setPassword('password')
    ;

    echo 'line 40 <br />';
    $mailer = Swift_Mailer::newInstance($transport);
    $message = Swift_Message::newInstance('Wonderful Subject')
      ->setFrom(array('softrain.evaluaciones@gmail.com' => 'Evaluaciones'))
      ->setTo(array('softrain.evaluaciones@gmail.com'=> 'A name'))
      ->setBody('Test Message Body')
    ;
    echo 'line 52 <br />';

    $result = $mailer->send($message);
    echo $result;
    echo 'line 58 <br />';

?>
</body>
</html>

The test form:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
    <head>
       <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
        <title>Test Mail Script</title>
    </head>
    <body>
        <form action="scriptmail.php" method="post">
            <input type="submit"/>
            </table>
        </form>
  </body>
</html>
4

6 に答える 6

89

古い投稿を復活させるつもりはありませんが、他の人が答えを探している場合に備えて、この投稿は年齢にもかかわらず解決策を探しているときに出てきたからです.

PHP SwiftMailer を使用して Gmail または Google Apps メール アカウントに接続する場合は、次を使用する必要があります。

$transporter = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, 'ssl')
  ->setUsername($this->username)
  ->setPassword($this->password);

$this->mailer = Swift_Mailer::newInstance($transporter);

これは私にとってはうまくいきます。元のコードでは、465 ではなくポート 587 を使用しており、プロトコル (ssl) を指定していません。そのビットが重要かどうかはわかりませんが、私にとってはポート 587 が失敗し、465 が正常に機能しました。

それが役立つことを願っています。

于 2011-01-14T12:44:48.427 に答える
40

Google 検索でこの質問を見つけ、fullbaked が提供する回答のコードを使用しました。スローされた例外で、Google SMTPサーバーがパスワードとユーザー名が受け入れられなかったことを示すエラーコードで応答していることを確認できるようになりました. さらに調査したところ、次の手順が見つかりました。今ではうまく機能しており、本番用のコードを肉付けし続けることができます.

Google がいつ変更を行ったかはわかりませんが、Google のユーザー名、パスワード、およびポート (465/ssl または 587/tls) を使用してコードを構成することに加えて、Google smtp サーバーを使用できるようにするために次の手順を実行する必要があります。

gmail アカウントで gmail smtp サーバーを使用するには、次のことを行う必要があります。

1) Google の [アカウント設定] で、[安全性の低いアプリへのアクセス] を [許可] に設定して有効にします。

2) [転送と POP/IMAP] タブの Gmail 設定で、IMAP の状態を確認します。有効にする必要があります。(これにより、送信されたメールが送信済みフォルダーに保存されます。)

3) 手順 1 と 2 を実行しても Exception Google の smtp サーバーがユーザー名とパスワードを受け入れないというエラーが発生する場合は、ブラウザを開く必要があります。Gmail に移動してログインし、同じブラウザで別のタブを開き、このアドレスに移動します。 :
https://accounts.google.com/DisplayUnlockCaptcha

According to Google you may have to enter a captcha.

4) コードからすぐに電子メールを送信します。これにより、Gmail アカウントの使用が承認されます。

お役に立てれば。

于 2015-04-19T09:03:16.780 に答える
5

evad の言ったことは正しいことがわかりましたが、現在のバージョンの Swift Mailer では、彼の作業を少し変更する必要がありました。今は次のとおりです。

$transporter = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, 'ssl')
  ->setUsername('username@gmail.com')
  ->setPassword('password');

$mailer = Swift_Mailer::newInstance($transporter);

うまくいくはずです。

于 2012-02-15T11:22:55.303 に答える
4

GMail SMTP システムには、SSL とポートに関する問題があります。PHPでうまく動作させるのは難しいと思います。

私が見つけた最高のものは、動作するphpGMailerです。そのコードをふるいにかけて、彼らがどのように機能したかを確認できるかもしれませんが、それは私にとって常に完璧に機能しています.

これがSwiftMailの問題に対処していないことはわかっていますが、それを指摘するだけだと思いました:)

于 2010-08-13T16:47:18.183 に答える
3

465 は SSL のポートで、587 は TLS 暗号化に使用されます ( http://swiftmailer.org/docs/sending.html#encrypted-smtpを参照) 。

于 2012-09-23T12:07:20.023 に答える