Twilio SendGrid ve Mezzio Kullanarak PHP İle E-posta Nasıl Gönderilir

Yayınlanan: 2021-03-24

E-posta, her zamankinden daha önemli bir iletişim aracıdır. E-postadan daha iyi yararlanmanıza yardımcı olmak için, PHP'nin Mezzio çerçevesini ve Twilio SendGrid'in API'sini kullanarak nasıl e-posta göndereceğinizi göstereceğim.

Özellikle, hem düz metin hem de HTML gövdeli ve buna bir PDF eki içeren e-postaların nasıl gönderileceğini öğreneceksiniz. Ayrıca, hem geliştirme ekibi hem de kuruluşunuzdaki diğer ekipler tarafından e-posta gövdeleri oluşturmayı kolaylaştırmak için Twilio SendGrid'in işlem şablonları işlevini nasıl kullanacağınızı öğreneceksiniz.

Kulağa iyi geliyor? Hadi başlayalım.

Hızlı uygulamaya genel bakış

Bu öğreticiyi daha anlamlı hale getirmenin bir yolu olarak, yazacağımız kodun, Mezzio ile oluşturulmuş, The Little PHP Shop adlı hayali, çevrimiçi bir e-ticaret mağazasının parçası olduğunu varsayın; özellikle, bir müşterinin satın alma işlemini gerçekleştirmesinden hemen sonraki bölüm. Kullanıcı akışının bu noktasında müşteri, satın aldığı için teşekkür eden bir e-posta alır ve kayıtları için bir PDF faturası içerir.

Müşteri tarafından tamamlanan bir siparişten satın alma ayrıntılarını alacak olan satın alma sonrası e-postayı göndermek için bir İşleyici sınıfı oluşturacağız. Bu satın alma bilgileriyle, Handler sınıfı daha sonra satın alma onayı e-postasını oluşturmak ve göndermek için SendGrid PHP API'sindeki birkaç sınıfı kullanır.

Bunlardan en önemlileri “SendGrid\Mail\Mail” ve “\SendGrid”dir. “SendGrid\Mail\Mail”, Twilio SendGrid aracılığıyla göndereceğimiz bir e-posta mesajının tüm özelliklerini saklayan nesnedir. “SendGrid” nesnesi taşıma katmanını oluşturarak Twilio SendGrid aracılığıyla e-posta gönderilmesini kolaylaştırır.

Önkoşullar

Bu öğreticiyi tamamlamak için yerel geliştirme ortamınızda aşağıdaki 4 şeye ihtiyacınız olacak:

  1. Twilio SendGrid hesabı
  2. cURL , mbstring ve O pen SSL uzantılarının kurulu ve etkin olduğu PHP 7.4
  3. Besteci küresel olarak yüklendi
  4. cURL

Mezzio uygulamasını iskele

İlk önce temel uygulamayı oluşturmamız gerekiyor. Bunu yapmak için, her zaman olduğu gibi, bizim yerimize yapması için Mezzio Skeleton'ı kullanacağız. Temel uygulamayı bir kez oluşturduğumuzda, yeni oluşturulan proje dizinine geçeceğiz. Ardından, ilk komut istemlerini izleyerek terminalinizde aşağıdaki komutları çalıştırın:

Gerekli bağımlılıkları yükleyin

Proje iskelesi ile projeyi tamamlamak için 3 ek bağımlılık eklememiz gerekiyor. Bunlar:

  • Twilio SendGrid API ile etkileşim için Twilio SendGrid'in PHP API kitaplığı
  • HTTP istekleri göndermek için PHP HTTP istemcisi
  • Ortam değişkenlerini depolamak ve almak için PHP Dotenv

Bunları kurmak için terminalinizde aşağıdaki komutu çalıştırın:

PHP Dotenv'i başlat

Bağımlılıkları yükledikten sonra, PHP Dotenv'i “.env” içinde ayarlanan değişkenleri okuyacak ve onları ortam değişkenleri olarak PHP'ye sunacak şekilde yüklüyoruz. Bunu yapmak için, "public/index.php" içine, "require seller/autoload.php"nin hemen ardından aşağıdaki kodu ekleyin.

Twilio SendGrid hesap ayrıntılarınızı ekleyin

Şimdi uygulamaya SendGrid API anahtarınızı sağlamanız gerekiyor. Bunu yapmak için Twilio SendGrid'de oturum açtıktan sonra “Settings -> API Keys . " Orada bir kez:

  1. API anahtarı oluşturmak içinAPI Anahtarı Oluştur ”a tıklayın
  2. Yeni API anahtarına bir ad verin , " Tam Erişim "in varsayılan API anahtarı iznini kabul edin ve " Oluştur ve Görüntüle " yi tıklayın.

API anahtarı oluşturulduğunda, anahtarı tıklayıp kopyalayın, ardından “ Bitti ”yi tıklayın .

Bundan sonra, dosyaya 2 anahtar daha ekleyin: "SENDGRID_DEFAULT_SENDER_ADDRESS" ve "SENDGRID_DEFAULT_SENDER_NAME." Adlarından da anlaşılacağı gibi, bunlar geçersiz kılınmadıkça uygulamamızdan gönderilen tüm e-postalar için kullanacağımız e-posta adresi ve addır.

Not: Bunu yapmak için Gönderici Kimlik Doğrulaması'nda "Tek Gönderici Doğrulaması" tablosunda "Doğrulandı" yazdığından emin olun.

Uygulama postası yapılandırma ayrıntılarını ayarlayın

Twilio SendGrid API anahtarına ek olarak, birkaç genel posta yapılandırma ayarı daha depolayacağız. Spesifik olarak, her e-posta iletisinde kullanacağımız bir e-posta adresi ve adı ayarlayacak ve bu adrese yanıt vereceğiz. Bu şekilde, her seferinde onları ayarlamak zorunda değiliz.

Ayrıca 2 e-posta gövdesi şablonu oluşturacağız: biri düz metin e-postalar için ve diğeri HTML e-postaları için. Bunu yapmak için, "config/autoload"da "mail.global.php" adında yeni bir dosya oluşturun ve içine aşağıdaki kodu ekleyin.

Bir posta nesnesini başlatmak için bir sınıf oluşturun

Anahtar uygulama yapılandırma ayrıntıları ayarlandığında, şimdi varsayılan özellikler kümesiyle temel bir posta nesnesini somutlaştıracak bir sınıf oluşturalım. Bunu yapmak için, "src/App/src/Mailer" adlı yeni bir dizinde "SendGridMailMessageFactory.php" adlı yeni bir dosya oluşturun ve içine aşağıdaki kodu ekleyin.

Sınıfı çağırdığımızda, uygulamanın "config/autoload/mail.global.php" içinde depoladığımız yapılandırma ayrıntılarını alacağı bağımlılık ekleme (DI) kabına erişimi olur.

Bundan sonra, yeni bir "SendGrid\Mail\Mail" nesnesini başlatacak ve ilgili yapılandırma ayrıntılarını sırasıyla "Mail", "setFrom" ve "setReplyTo" yöntemlerine çağrılara ileterek ayrıntıları ayarlayacak ve ayrıntıları yanıtlayacaktır. Bundan sonra, somutlaştırılmış “Mail” nesnesini döndürür.

Yine de kullanmak için DI kapsayıcısına kaydetmeniz gerekir. Bunu yapmak için, "src/App/src/ConfigProvider" içinde, "getDependencies" yönteminden döndürülen dizideki "factories" öğesine aşağıdaki girişi ekleyin.

E-posta göndermek için bir İşleyici oluşturun

Daha sonra e-posta oluşturmak ve göndermek için bir İşleyici sınıfı oluşturmamız gerekiyor. Bunu yapmak için, aşağıdaki komutu çalıştırarak Composer aracılığıyla kullanılabilen Mezzio'nun CLI araçlarını kullanacağız.

Yukarıdaki komutu çalıştırmak bizim için dört şey yapar:

  1. "src/App/Handler/EmailSenderHandler.php" adlı yeni bir İşleyici sınıfı oluşturur .
  2. İşleyici sınıfını başlatmak için bir fabrika sınıfı oluşturur, "src/App/Handler/EmailSenderHandlerFactory.php"
  3. İhtiyacımız olmayacak bir şablon dosyası (“src/App/templates/app/email-sender.html.<ext>”) oluşturur . “<ext>” dosya adı , “proje oluştur” aşamasında seçtiğiniz şablon motoru tarafından belirlenir .
  4. "config/autoload/mezzio-toling-factories.global.php" dosyasına bir giriş ekleyerek yeni İşleyici sınıfını DI kapsayıcısında bir hizmet olarak kaydeder.

E-posta göndermek için İşleyiciyi yeniden düzenleyin

Oluşturulan “EmailSenderHandler.php” ile şimdi e-posta gönderebilmesi için yeniden düzenlememiz gerekiyor. Bunu yapmak için önce “EmailSenderHandler'ın” yapıcısını yeniden düzenleyeceğiz ve “TemplateRendererInterface” parametresini 3 yeni parametre ile değiştireceğiz. Bunlar 3 yeni sınıf üye değişkenini başlatacak:

  • Bir “\SendGrid\Mail\Mail” nesnesi
  • Bir “\SendGrid” nesnesi
  • Gerekli yapılandırma ayrıntılarını içeren bir dizi

Aşağıdaki örnekte revize edilmiş kurucuyu, ilgili sınıf üyesi değişkenleriyle birlikte görebilirsiniz. Mevcut sınıf üyesi değişkenini ve yapıcıyı bu kodla değiştirin.

Not: Ardından, “handle” yöntemini yeniden düzenlememiz gerekiyor. “EmailSenderHandler” “handle” yönteminin mevcut içeriğini aşağıdaki kod ile değiştirin, ardından ne yaptığına geçelim.

İstek gövdesinde sağlanan herhangi bir parametreyi almak için “$request->getParsedBody()” kullanılarak başlar ve bu, “$details”i başlatan bir ilişkisel dizi döndürecektir. Mevcut parametrelerle, e-postanın alıcısını ayarlamak için “SendGrid\Mail\Mail” nesnesinin “addTo” yöntemini çağırır, ilk 2 bağımsız değişkende alıcının e-posta adresini ve adını ve üçüncü bağımsız değişkende bir dizi ikameyi iletir.

Değiştirmeler, her alıcı için e-posta mesajlarını özelleştirmenize olanak tanır. Düz metin e-postalarda, kısa çizgilerle çevrelenen herhangi bir dize, örneğin "-first_name-" bir ikamedir. HTML e-postalarında, dizeleri çift parantez ile çevreleyen Gidon sözdizimini kullanır , örneğin, "{{ first_name }}."

Ardından, mesajın konusunu belirledik ve bir düz metin ve HTML mesaj gövdesi ekledik. Bununla, e-postamız gönderilmeye hazır. Bu nedenle, göndermek için "$this->mailer" olan "SendGrid" nesnesini kullanırız, iletiyi gönderme girişiminden gelen yanıtla birlikte yeni bir "$response" değişkenini başlatırız. Son olarak, yanıttan durum kodunu ve gövdeyi içeren bir JsonResponse nesnesi döndürürüz.

Not: Refactor EmailSenderHandlerFactory'nin __invoke yöntemi

Artık “EmailSenderHandler”ı yeniden düzenlemeyi tamamladığımıza göre, “EmailSenderHandlerFactory”yi yeniden düzenlememiz gerekiyor. Bu, “EmailSenderHandler”ı doğru şekilde başlatacaktır. Bunu yapmak için, “__invoke`” yönteminin mevcut tanımını aşağıdaki kodla değiştirin.

Bu, DI kapsayıcısından bir "\SendGrid\Mail\Mail" nesnesi alır, gönderen ve e-posta ayrıntılarına yanıt verir ve "$message" adlı yeni bir nesneyi başlatır. Ardından, posta mesajını göndermek için "$mailer" adlı yeni bir "SendGrid" nesnesini başlatır. Son olarak, uygulamanın yapılandırmasından posta yapılandırmasını alır. Ardından bunları “EmailSenderHandler” nesnesini başlatmak ve döndürmek için kullanır.

Yönlendirme tablosunu güncelle

Tüm bu değişikliklerde, kodu test edip bir e-posta göndermeden önce yapmamız gereken son bir değişiklik var. Varsayılan rotanın “HomePageHandler” yerine rotanın işleyicisi olarak yeni İşleyici sınıfımızı kullanması için yönlendirme tablosunu güncellememiz gerekiyor. Bunu yapmak için, “config/routes.php” içindeki varsayılan rota tanımını aşağıdaki örnekle değiştirin.

İlk e-postayı gönder

Şimdi ilk e-postayı gönderme zamanı. Bunun için öncelikle terminalde aşağıdaki komutu çalıştırarak uygulamayı başlatın.

Ardından, cURL'yi kullanarak, aşağıdaki örnekte olduğu gibi " http://localhost:8080 " için bir GET isteği yapın ve köşeli parantez içindeki değerleri e-postanız için ilgili ayrıntılarla değiştirin.

Terminale “{“status”:202,“message”:””}” çıktısını görmeli ve aşağıdaki görüntüye benzeyen bir e-posta almalısınız.

Not: Tarayıcınızı veya Şablon dizeleri yerine işlemsel e-posta şablonlarını kullanın

Hem düz metin hem de HTML gövdeli bir e-posta gönderebilsek de, bunu nasıl yaptığımız ideal olmaktan uzaktır. Gönderdiğimiz her e-posta için - ve uygulamamız birkaç tane gönderebilir - onlar için bir düz metin ve HTML gövdesi eklememiz gerekecek.

Ancak e-posta gövdesi tanımlarını kodda saklamak, çabanın çoğunu geliştirme ekibine bırakır. Ancak, en azından deneyimlerime göre, genellikle pazarlama yapan, e-posta şablonları oluşturan ve sürdüren diğer ekipler genellikle böyledir.

Bu nedenle ve geliştirmeyi hızlandıracağı ve yükü birden çok ekip arasında paylaşacağı için, uygulamayı işlemsel e-posta şablonlarını kullanacak şekilde yeniden değerlendireceğiz . Bunları, kod yerine çok az teknik deneyimi olan veya hiç olmayan ekip üyeleri tarafından Twilio SendGrid UI aracılığıyla oluşturabilir ve koruyabilirsiniz.

Bunları duymadıysanız, Twilio SendGrid sözlüğü bunları şu şekilde tanımlar :

İşlemsel e-posta şablonları, pazarlamacıların, tasarımcıların ve geliştiricilerin hızlı ve kolay bir şekilde işlemsel e-posta kampanyaları oluşturmak için kullanabileceği önceden kodlanmış e-posta düzenleridir. Twilio SendGrid'in işlemsel e-posta şablonları, teknik olmayan ve teknik olmayan kişilerin, alıcılarının aldığı e-postada gerçek zamanlı değişiklikler yapmasına olanak tanır.

Bu makale için yalnızca oldukça basit bir makaleye ihtiyacımız var. Bunu yapmak için Twilio SendGrid belgelerindeki ayrıntıları izleyin ve içeriği yalnızca tek metin modülünde olan bir tane oluşturun. Ardından, gövde metni için aşağıdaki metni kullanın.

E-postada 6 değişiklik olduğunu unutmayın:

  • "first_name": Müşterinin adı
  • "last_name": Müşterinin soyadı
  • “sender_name”: E-ticaret mağazasının adı (The Little PHP Shop)
  • "sender_state": E-ticaret mağazasının durumu
  • "sender_country": E-ticaret mağazasının ülkesi
  • "support_email": Müşterilerin satış sonrası destek almak için kullanabilecekleri destek e-postası

Buna göre, bu bilgiyi uygulamamız için kullanılabilir hale getirmemiz gerekiyor. Müşterinin adı ve soyadı zaten elimizde. Kalan 4 değişiklik global olacak, bu yüzden daha önce yaptığımız gibi, aşağıdaki konfigürasyonu " config/autoload/mail.global.php " dosyasına "şablonlar" öğesinden sonra ekleyeceğiz.

Oluşturulan yeni yapılandırma dosyasıyla, “EmailSenderHandler” “handle” yönteminde “$this->mail->addContent()”e yapılan 2 çağrıyı aşağıdaki kodla değiştirin.

2 yöntem çağrısı, gönderen ayrıntılarını ekler ve e-posta adresini genel ikameler olarak destekler. Bu değiştirmeler, diğer değiştirmelerden önce e-posta gövdesi için geçerlidir, ancak bir e-posta alıcısı için aynı anahtara sahip ikameler varsa geçersiz kılınır.

Ardından, işlemsel e-posta şablonunun kimliğini almanız gerekir. Aşağıdaki ekran görüntüsünde de görebileceğiniz gibi , şablonlar listesinde şablonun adına tıklayarak bulabilirsiniz .

Kopyalayın ve “config/autoload/mail.global.php” içinde “template_id” anahtarıyla yeni bir öğede saklayın ve ardından “plain” ve “HTML”yi kaldırın. Bitirdiğinizde, döndürülen dizinin “mail/templates” öğesi, şablonunuzun kimliğinin yerini “<şablonun kimliği>”nin aldığı aşağıdaki koda benzer.

Konfigürasyon güncellendiğinde, şimdi “config/autoload/mail.global” a yeni eklediğimiz şablon kimliğini ileterek “EmailSenderHandler” “handle” yönteminde “Mail” “setTemplateId” yöntemine bir çağrı eklememiz gerekiyor. php." Aşağıdaki kodda bir örnek görebilirsiniz.

Değişiklikleri test edelim

Daha önce olduğu gibi, cURL kullanarak , değişikliklerin beklendiği gibi çalışıp çalışmadığını test etmek için http://localhost:8080 ” adresine bir GET isteği yapın . Önceki örnekte olduğu gibi terminale “{“status”:202,“message”:””}” çıktısını görmelisiniz. E-posta gelen kutunuzda, aşağıdaki ekran görüntüsünde olduğu gibi, ikamelerin değiştirildiği hoş bir e-posta görmelisiniz.

PDF faturası ekleyin

Artık dinamik şablonlar kullandığımıza göre, yazının başına bahsettiğimiz PDF faturasını ekleyelim. Kendiniz arama veya oluşturma zahmetinden ve zamandan tasarruf etmek için , bu makale için kullanabileceğiniz örnek bir PDF fatura oluşturdum. Uygulamanın “ veri” dizinine kaydedin .

Not: Fatura eklemek için bir sonraki kod örneğinde göreceğiniz “Mail” “addAttachment” yöntemini kullanmamız gerekiyor. Yöntem 5 bağımsız değişken alır, ancak yalnızca ilk 4'ü sağlıyoruz. Bunlar:

  1. Bir “ Ek” nesnesi veya Base64 kodlu dize . Bu parametrenin değeri base64 kodlu değilse, yöntem bunu bizim için yapacaktır.
  2. Ekin mime türü (artık medya türü olarak bilinir ).
  3. Ekin dosya adı . Bu, kullanıcı değiştirmedikçe dosyanın varsayılan olarak kaydedeceği addır.
  4. Ekin içerik düzeni . İçerik düzenine aşina değilseniz, satır içi içerik düzeni, mesaj görüntülendiğinde ekin otomatik olarak görüntülenmesi gerektiği anlamına gelir ve ek içerik düzeni, ekin otomatik olarak görüntülenmediği ve kullanıcının bir tür eylem gerektirdiği anlamına gelir. aç onu.

Aşağıdaki kod örneğinde, PHP'nin file_get_contents yöntemi, dosyanın içeriğini “$invoice” adlı yeni bir değişkene okur. Ardından PDF, “addAttachment” yöntemini çağırarak mesaja eklenir.

Burada, biz:

  • Base64 kodlu olacak faturanın içeriğini iletin
  • Bir PDF dosyası eklerken MIME türünü “application/pdf” olarak ayarlayın
  • Faturanın dosya adını, müşterinin makul bir şekilde bekleyebileceği hayali bir adla ayarlayın
  • İçerik düzenini "ek" olarak ayarlayın

Şimdi bu değişiklikleri bitirdiğimize göre, çalışıp çalışmadıklarını test edelim. Önceki 2 kez çalıştırdığımız aynı cURL isteğini çalıştırın. Ardından, e-posta gelen kutunuzda, e-postayı görüntülerken görünen örnek PDF faturası ile hoş bir e-posta görmelisiniz.

Twilio SendGrid ve Mezzio kullanarak PHP ile e-posta nasıl gönderilir

Twilio SendGrid ve Mezzio ile e-posta gönderirken mümkün olanın yalnızca yüzeyini kazımış olsak da, artık düz metin ve HTML gövdesi ile ek içeren bir e-posta gönderebilirsiniz. Ayrıca, küresel olarak ve alıcı bazında ayarlayabileceğiniz işlem şablonlarını ve ikameleri nasıl kullanacağınızı da öğrendiniz.

E-posta gönderimlerini planlamak, Amazon S3'ten bir dosya eklemek, başlıklar eklemek ve bölümler ve kategoriler eklemek gibi başka nelerin mevcut olduğunu görmek için PHP kitaplığının belgelerine bakmanızı şiddetle tavsiye ederim .

Matthew Setter, Twilio Voices ekibinde bir PHP Editörü ve doğal olarak bir PHP geliştiricisidir. Aynı zamanda Mezzio Essentials'ın da yazarıdır . PHP kodu yazmadığı zamanlarda Twilio'da harika PHP makaleleri düzenliyor. Kendisine şu şekilde ulaşılabilir:

  • E-posta: [email protected]
  • Web: http://matthewsetter.com
  • Twitter: @settermjd
  • GitHub: https://github.com/settermjd