web-dev-qa-db-ja.com

GmailでPHPのswiftmailerを使用する

私は、Gmailアカウントを使用して自分自身にメールを送信する簡単なスクリプトを書いています。

スクリプトをSwiftMailerの reference から変更しましたが、結果が得られません。どうしましたか?

編集:さらにデバッグした後、私はステートメントを発見した

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

コードが失敗します(その下のエコーは出力されません)。

どうしてこれなの?メッセージが送信されないだけでプログラムがクラッシュしますか? :/

<!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('[email protected]')
      ->setPassword('softrain1234')
    ;
*/

    $transport = Swift_SmtpTransport::newInstance('smtp.gmail.com', 587)
      ->setUsername('[email protected]')
      ->setPassword('password')
    ;

    echo 'line 40 <br />';
    $mailer = Swift_Mailer::newInstance($transport);
    $message = Swift_Message::newInstance('Wonderful Subject')
      ->setFrom(array('[email protected]' => 'Evaluaciones'))
      ->setTo(array('[email protected]'=> 'A name'))
      ->setBody('Test Message Body')
    ;
    echo 'line 52 <br />';

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

?>
</body>
</html>

テストフォーム:

<!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>
37
andandandand

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

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は正常に機能しました。

お役に立てば幸いです。

86
fullybaked

私はこの質問をグーグル検索で見つけて、fullbakedが提供する回答のコードを使用しました。スローされた例外で、パスワードとユーザー名が受け入れられないことを示すエラーコードでGoogle smtpサーバーが応答していることがわかりました。さらに調査すると、次の手順が見つかりました。これでうまく動作し、本番用のコードを肉付けし続けることができます。

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

GmailアカウントでGmail SMTPサーバーを使用するには、次の手順を実行する必要があります。

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

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

3)手順1と2を実行しても例外がスローされる場合、Googleのsmtpサーバーがユーザー名とパスワードを受け入れない場合、ブラウザーを開いてGmailにアクセスし、ログインしてから、同じブラウザーで別のタブを開いてこのアドレスに移動します:
https://accounts.google.com/DisplayUnlockCaptcha

According to Google you may have to enter a captcha.

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

お役に立てれば。

36
Gene

Evadが言ったことは真実であることがわかりましたが、現在のバージョンSwift Mailer。

$transporter = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, 'ssl')
  ->setUsername('[email protected]')
  ->setPassword('password');

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

正常に動作するはずです。

6
Richard

465はsslのポート、587はtls暗号化に使用されます( http://swiftmailer.org/docs/sending.html#encrypted-smtp をご覧ください)

3
ducin

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

私が見つけた最も良いことは、それが phpGMailer であるということです。あなたはそのコードをふるいにかけて、どのように機能するかを見ることができるかもしれませんが、それは私にとって常に完璧に機能しています。

私はこれがSwiftMailの問題に対処していないことを知っています、ちょうどそれを指摘するだろうと考えました:)

3
Brad F Jacobs

何時間も研究した後、私もここに来ました。私はついに本当の答えを見つけました。 SMTP認証を使用してホストからではなく、Googleメールサーバーからメールを送信したかった。

Gmail内のヘッダー全体を含むメールをトレースするには、このガイドに従ってください。

https://support.google.com/mail/answer/29436?hl=en

@fullybakedは、smtp経由でメールを認証するための正しい答えを持っていましたが、あなたはまだホスト経由で送信しています。

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

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

@ducinは、さまざまなポートと暗号化タイプで正しいものでした。

$transporter = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, 'ssl')

または、より現代的で安全な使用。

$transporter = Swift_SmtpTransport::newInstance('smtp.gmail.com', 587, 'tls')

Gmailサーバーから直接送信する場合は、認証モードを設定する必要があります。デフォルトはプレーンです。

$transporter = Swift_SmtpTransport::newInstance('smtp.gmail.com', 587, 'tls')
->setAuthMode('login')
->setUsername('[email protected]')
->setPassword('password');

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

@geneも正しいので、アプリを認証する必要があるので、彼の指示に従ってください。

さらに、電子メールがスパムフォルダーに届かないようにするには、DKIM(ドメインキー)を含むDNSテキストレコードも追加する必要があります。

https://support.google.com/a/answer/174124?hl=en

SPFレコード

https://support.google.com/a/answer/33786?hl=en

およびDMARC

https://support.google.com/a/answer/2466580?hl=en

1
Dan Kinchen