(Özellikle SMTP aracılığıyla) e-posta göndermek için Gmail OAuth API uygulamak nasıl?

2 Cevap php

Ben bir giriş yapmış kullanıcı adına e-postalar göndermek bir web uygulama geliştiriyorum.

Ben yeni Gmail OAuth protokolü kullanmaya çalışıyorum here kullanıcının Gmail hesabı üzerinden bu e-postaları göndermek için açıklanan açıkladı (tercihen SMTP yerine IMAP kullanarak, ama kolay değilim). Ancak, örnek PHP kod bana sorunları bir çift verir.

  1. Örnek kod tüm IMAP, SMTP değil dayanmaktadır. Nasıl kullanılacağını insanlara göstermek için gidiyoruz değil neden SMTP protokolü "destek"?
  2. Örnek kod bana bir yakalanmamış Zend istisna bir ölümcül hata veriyor - bu "GELEN" klasörünü bulamıyorum.

Ölümcül hata: \ # 0 yolu: 467 Yığın izleme: mesajla yakalanmamış istisna 'Zend_Mail_Storage_Exception' xoauth-php-örnekler Zend \ Mail \ Storage \ Imap.php için \ \ \ yolu olarak 'belki yok, klasör değiştiremez' \ için xoauth-php-örnekler Zend \ Mail \ Storage \ \ Imap.php (248): Zend_Mail_Storage_Imap-> SelectFolder üç legged.php (184) \ xoauth-php-örnekleri için \ ('INBOX') # 1 yol \ : Zend_Mail_Storage_Imap-> __construct (Object (Zend_Mail_Protocol_Imap)) mesajıyla # 2 {ana} Sonraki istisna 'Zend_Mail_Storage_Exception' Gelen kutusunu seçemezsiniz, bu geçerli bir taşıma nedir? ' Zend_Mail_Storage_Imap-> __construct: 254 Yığın izleme: Üç-legged.php (184) \ xoauth-php-örnekleri için \ # 0 yol \ xoauth-php-örnekleri \ yolunu \ Zend \ Mail \ Storage \ \ Imap.php (Object (Zend_Mail_Protocol_Imap)) # 1 {main} \ yolunu \ içinde xoauth-php-örnekler hattında 254 Zend \ Mail \ Storage \ \ Imap.php

Ben geri iyi OAuth belirteçleri alıyorum doğruladıktan, ben sadece gerçek e-posta işlem gerçekleşmesi için nasıl bilmiyorum. Bu protokol hala oldukça yeni, bu yüzden bu konuda çok resmi olmayan topluluk belgeler orada değil ve resmi dokümanlar SMTP RFC hakkında unhelpfully kuru şeyler vardır. Herkes bu olacak yardımcı olabilir eğer öyleyse, ben çok takdir ediyorum.

Note: Ben zaten kullanıcı benim uygulamayı onun / Gmail kullanıcı adı ve şifre verilmiş olması şartıyla, bir e-posta göndermek SSL üzerinden başarıyla Gmail'in SMTP sunucusuna bağlanmak mümkün oldum. Bu phishing teşvik ve güvenlik fikirli kullanıcıları bunu kabul etmeyecek, çünkü bu yöntemi önlemek istiyorum. Bu soru o değil.

2 Cevap

Bir Google Apps hesabı kullanıyorsanız ve benim kullanıcıların yeni Oauth yetki ile SMTP üzerinden mail göndermek için izin veren bir uygulama oluşturmak için çalışıyorum. Ben bu tartışma bazı bilgileri kullanarak işe almak başardı. Ancak, ben üzerinde tökezledi bir kaç şeyi açıklığa kavuşturmak gerektiğini düşünüyorum ...

1) SMTP için Zend Framework görünüşte otomatik olarak bir dosya adı için Zend / Mail / Protokol / SMTP / Auth klasörüne bakar. Php, bu durumda bunu oluşturmak sürece normalde Zend yok "Xoauth.php" in. Ben Xoauth.php için mevcut login.php dosya kopyalama ve bu web sayfasında yapılan önerileri ile hafifçe değiştirerek başarıyla bunu başardı.

Bu çok yararlı oldu ama (login.php bir kopyasını düzenleyin ve eşdeğer bir alan göreceksiniz) Xoauth.php dosyanın sadece bir parçasıdır:

// Ensure AUTH has not already been initiated.
parent::auth();
$this->_send('AUTH XOAUTH ' . $this->_xoauth_request);
$this->_expect(235);
$this->_auth = true;

2) açık bir yol kullanmadan kendi Loader.php dosyası ile kendisini başvuru deneyebilirsiniz çünkü PHP doğrudan başvuru bile kesinlikle PHP include_path üzerinde Zend olması gerektiğini unutmayın.

3) bariz IMAP fonksiyonlarını kaldırılması ve eşdeğer SMTP fonksiyonları ile yerine yanı sıra ben PHP için Google OAuth örneklerinden kodunu değiştirmek gerek yoktu. Ben e-posta ve gerçekten çalışmak için test için e-posta göndermek için gerekli kodu eklemek için Zend / mail.php 'yi dosyayı eklemek zorunda.

Eğer bir Google Apps hesabı kullanıyor musunuz?

OAuthAuthorize belirteç URL'ye yönlendirme, ben yanlışlıkla hd = default belirterek edildi. Bu standart bir Google hesabı için bir belirteç yetki OAuth son nokta söyler ve NOT Google Apps ile çalışır.

Yani, üç-legged.php de diyor satırı değiştirin:

$consumer->redirect(array('hd' => 'default'));

ile

$consumer->redirect();

And everything should be fine-- you should be asked to select between your consumer and Google Apps account if logged in ile both.

Umarım bu yardımcı olur - Ben bu sorunu gidermek için kod yama olacak.

Cheers, -Ryan

#

SMTP kullanarak Re - Ben iyi belgelenmiş olan bir şekilde henüz tam Birlikte bu kazanılmış değil - ama burada temelleri bulunuyor.

1) oluşturma Zend / Mail / Protokol / auth () yöntemi oldukça basittir SMTP / Auth / Xoauth.php:

// Ensure AUTH has not already been initiated.
parent::auth();
$this->_send('AUTH XOAUTH ' . $this->_xoauth_request);
$this->_expect(235);
$this->_auth = true;

2) Generate $initClientRequest slightly differently, as the URL changes for SMTP versus IMAP 3) Send mail like the following:

  // where getXoauthClientRequest abstracts out line 116-165 in existing three-legged.php
  $smtpInitClientRequestEncoded = getXoauthClientRequest($smtpUrl, $accessToken);

  $config = array('ssl' => 'ssl',
                  'port' => '465',
                  'auth' => 'xoauth',
                  'xoauth_request' => $smtpInitClientRequestEncoded);

  $transport = new Zend_Mail_Transport_Smtp('smtp.gmail.com', $config);
  $mail = new Zend_Mail();
  $mail->setBodyText('This is the text of the mail.');
  $mail->setFrom($email_address, 'Some Sender');
  $mail->addTo($email_address, 'Some Recipient');
  $mail->setSubject('TestSubject');
  $mail->send($transport);

() Sadece auth sınıfları yüklemek için orada yazılır zerdüştlerin 'ad' de sınıflar oluşturarak gerektirmez, ama muhtemelen çünkü yol _sendMail çok Zend_Mail_Transport_Smtp uzanan gerektiren ediyorum - Ben daha iyi belgelenmiş bir şey yaratmak için çalışacağım Zend_Mail_Protocol_Smtp_Auth_ * 'paketi' dan