it-swarm-vi.com

Sử dụng swiftmailer của php với gmail

Tôi đang viết một tập lệnh đơn giản trong đó tài khoản gmail được sử dụng để gửi email đến chính nó. 

Tôi đã thay đổi tập lệnh từ Reference của SwiftMail, nhưng tôi không nhận được kết quả nào. Chuyện gì vậy? 

Chỉnh sửa: sau khi gỡ lỗi thêm tôi đã thấy rằng tuyên bố

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

làm cho mã bị lỗi (tiếng vang bên dưới nó không in).

Tại sao lại thế này? Chỉ vì tin nhắn không được gửi chương trình bị treo? : / 

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

Mẫu kiểm tra:

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

Đừng có nghĩa là làm sống lại một bài viết cũ, nhưng chỉ trong trường hợp những người khác đang tìm kiếm câu trả lời, và vì bài đăng này xuất hiện trong quá trình tôi tìm kiếm một giải pháp bất chấp tuổi tác.

Khi sử dụng PHP SwiftMailer để kết nối với tài khoản email Gmail hoặc Google Apps, bạn cần sử dụng những điều sau đây

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

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

Cái này làm việc tốt cho tôi. Trong mã gốc, bạn đang sử dụng cổng 587 chứ không phải 465 và bạn không chỉ định giao thức (ssl). Không biết điều đó có quan trọng không, nhưng đối với tôi, cổng 587 đã thất bại và 465 hoạt động tốt.

Mong rằng sẽ giúp.

85
fullybaked

Tôi tìm thấy câu hỏi này khi thực hiện tìm kiếm google và sử dụng mã trong câu trả lời được cung cấp đầy đủ. Nó đưa tôi đến điểm mà tôi có thể thấy trong Ngoại lệ ném rằng máy chủ Google smtp đang phản hồi với mã lỗi cho biết mật khẩu và tên người dùng không được chấp nhận. Sau khi điều tra thêm tôi tìm thấy các bước sau. Bây giờ nó hoạt động rất tốt và tôi có thể tiếp tục bổ sung mã cho sản xuất.

Không chắc chắn khi Google thực hiện thay đổi nhưng ngoài việc định cấu hình mã của bạn với tên người dùng, mật khẩu và cổng Google (465/ssl hoặc 587/tls), bạn cần thực hiện các bước sau để có thể sử dụng máy chủ Google smtp.

Để sử dụng máy chủ smtp gmail với tài khoản gmail của bạn, bạn cần phải:

1) Trong Google "Cài đặt tài khoản" cho phép "Truy cập các ứng dụng kém bảo mật" bằng cách đặt thành "Cho phép".

2) Trong cài đặt gmail trong tab "Chuyển tiếp và POP/IMAP", hãy kiểm tra Trạng thái IMAP, nó cần được kích hoạt . (Điều này sẽ cho phép các email được gửi sẽ được lưu trong thư mục đã gửi.)

3) Nếu sau bước 1 và 2, bạn vẫn ném ngoại lệ smtp máy chủ không chấp nhận tên người dùng và mật khẩu bạn cần mở một trình duyệt, truy cập gmail và đăng nhập, sau đó mở một tab khác trong cùng một trình duyệt đến địa chỉ này:
https://accounts.google.com/DisplayUnlockCaptcha

According to Google you may have to enter a captcha.

4) Ngay lập tức gửi email từ mã của bạn vì điều này sẽ cho phép nó là ủy quyền sử dụng tài khoản gmail của bạn.

Hi vọng điêu nay co ich.

35
Gene

Tôi thấy rằng những gì evad nói là đúng, nhưng tôi đã phải thay đổi công việc của anh ấy một chút cho phiên bản Swift Mailer hiện tại . Bây giờ là:

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

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

Nên làm việc tốt.

6
Richard

465 là cổng cho ssl, 587 được sử dụng để mã hóa tls (xem tại http://swiftmailer.org/docs/seinating.html#encrypted-smtp )

3
ducin

Hệ thống SMTP của Gmail có các vấn đề liên quan đến SSL và cổng. Tôi thấy thật khó để làm cho nó hoạt động tốt với PHP.

Điều tốt nhất tôi đã tìm thấy, nó hoạt động là phpGMailer . Bạn có thể chọn lọc mã đó để xem cách chúng hoạt động, nhưng nó luôn hoạt động hoàn hảo đối với tôi. 

Tôi biết điều này không giải quyết được vấn đề SwiftMail, chỉ cần hình dung tôi sẽ chỉ ra điều đó :)

3
Brad F Jacobs

Tôi cũng đến đây sau nhiều giờ nghiên cứu. Cuối cùng tôi đã tìm thấy câu trả lời đúng. Tôi muốn gửi email TỪ các máy chủ mail của google chứ không phải từ Máy chủ của tôi với xác thực smtp.

Bạn có thể theo dõi một email với các tiêu đề đầy đủ bên trong gmail, hãy làm theo hướng dẫn này.

https://support.google.com/mailals/29436?hl=vi

@fullybaken đã có câu trả lời đúng để xác thực email của bạn qua smtp nhưng bạn vẫn sẽ gửi qua Máy chủ của mình.

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

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

@ducin đã đúng với các cổng và loại mã hóa khác nhau.

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

HOẶC hiện đại hơn và an toàn hơn, sử dụng;

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

Nếu bạn muốn gửi trực tiếp từ máy chủ gmail, bạn cần đặt chế độ ủy quyền. Đồng bằng là mặc định.

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

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

@gene cũng đúng, bạn phải xác thực ứng dụng của mình, vì vậy hãy làm theo hướng dẫn của anh ấy.

Hơn nữa để ngăn email của bạn hạ cánh trong thư mục thư rác, bạn cũng sẽ phải thêm bản ghi văn bản dns bằng DKIM (khóa miền)

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

Bản ghi SPF

https://support.google.com/a/a/33/338686/hl=vi

và DMARC

https://support.google.com/aals/2466580?hl=vi

0
Dan Kinchen