Skip to main content

PostgreSQL Veritabanı Üzerinden Mail Atılması (SQL İle)

Merhaba,

PostgreSQL'de veritabanı üzerinden mail atmak için bir kaç yol bulunuyor. Bu yollar açık kaynak kodlu araçları kullanmaktan geçiyor örneğin pgMail ya da bir fonksiyon içindeki bir python koduyla da yapabilirsiniz. Bunlar, kullanabileceğiniz yöntemlerden sadece ikisi.

Veritabanı üzerinden sadece SQL scripti kullanarak mail atılması için bir script hazırladım. Bu yazıda farklı bir araç tanıtmayacağım. Postgres'in kendi özelliğini kullanarak bu işlemi gerçekleştirmek için aşağıdaki adımları kullanmanız yeterli olacaktır. (Linux tarafında mail atılması için gereken kurulumlarınız hazırsa tabi)

Maili Postgres'in in-core özelliği olan COPY ifadesini kullanarak atacağız. COPY ifadesini kullanarak farklı kaynaklardaki verileri Postgres veritanabındaki tablolara yazabileceğimiz gibi, Postgres veritabanındaki bir tabloyu da sunucu üzerinde, postgres kullanıcısnın yetkisi dahilindeki dizinlere aktarmamız mümkün. COPY ile ilgili daha fazla bilgiye bu linkten ulaşabilirsiniz. 

Yazdığım scriptteki gibi COPY FROM PROGRAM komutu ile sunucu üzerindeki bir komutu çalıştırmamız mümkün. Burada yer alan PROGRAM komutunun peşine yazacağınız linux komutlarının sonucunu bir tabloya aktarır. Bu komutun sonucu ile tablonuzun yapısının uyması yeterli olacaktır.

Burada önemli nokta, sunucunuz üzerinde mail atılması için uygun kurulumları yapmanız gerekecek(mail, mutt .. gibi). Bu düzenlemelerin yapıldığını düşünerek ilerleyelim.

Öncelikle sunucu üzerinde mail komutunu kullanarak mail atma işlemini test ediyorum. Test sonrası bu komutu yukarıda bahsettiğim COPY komutuyla birlikte kullanacağım.

echo "Mailinizin body içeriğini buraya ekleyin...." | mail -s "Test Başlık" test@test.com

Sonraki adım, COPY FROM PROGRAM komutunun sonucunun files_log adındaki bir tabloya yazılacağını düşünerek tabloyu oluşturuyorum çünkü COPY FROM PROGRAM komutunu kullanırken tablo kullanmak zorundayız fakat tablonun yer kaplamasını da istemiyorsanız ya da herhangi bir tabloya ihtiyacım yok diyorsanız böyle bir durum için, permanent(kalıcı) tablo oluşturmak yerine temporary(geçici) tablo oluşturma yöntemini seçebilirsiniz. Aşağıdaki örnekte TEMPORARY tablo oluşturdum.

NOT: Temporary tabloların sadece o session için oluşturulduğunu, backend session'u bittiğinde o tablonun da silindiğini unutmayın!

CREATE TEMPORARY TABLE IF NOT EXISTS files_log(result_ text);

COPY komutunun kullanımı aşağıdaki gibi olmalı. 

COPY <table_name>(<column1>) FROM PROGRAM 'linux commands..';

Yukarıdaki yapıya uygun, mail atmak için linux üzerinde çalıştırdığım komutumu PROGRAM komutu sonrası tek tırnak içinde yazıyorum.

COPY files_log (result_) FROM PROGRAM 'echo "Mailinizin body içeriğini buraya ekleyin...." | mail -s "Test Başlık" test@test.com';

Yukarıdaki komutu çalıştırmanız sonrası mail kutunuzu kontrol etmeyi unutmayın.

Eğer bu komutları bir fonksiyon içinde birleştirmek istersek aşağıdaki gibi ilerleyebiliriz. Şimdi fonksiyonu oluşturalım. 

CREATE OR REPLACE FUNCTION public.send_mail_func()
 RETURNS text
 LANGUAGE plpgsql
AS $function$

BEGIN
  CREATE TEMP TABLE IF NOT EXISTS files_log(result_ text);

  COPY files_log (result_) FROM PROGRAM 'echo "Mailinizin body içeriğini buraya ekleyin...." | mail -s "Mailinizin Başlığını buraya ekleyin..." test@test.com';

  RETURN 'Açıklama... ';
END;
$function$;

Son olarak oluşturduğunuz fonksiyonu çalıştırın ve yeniden mail kutunuzu kontrol etmeyi unutmayın. 

SELECT send_mail_func();

Sevgiler,

Comments

Popular posts from this blog

pg_ctl: command not found

Hi, If you can not reach pg_ctl command in bash also you are sure this command exists in your server, check $PATH. -bash-4.2$ echo $PATH /usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin So, the directory of pg_ctl is not seem in PATH. Input directory of pg_ctl and check it then run it.

PostgreSQL Foreign Data Wrappers

Hi all, I would like to mention about generating Foreign Data Wrappers(FDW) on PostgreSQL 9.6. FDW is used for remote access to tables from external data storage. If needed to use remote table in a query, you can use FDW tables. For instance you can get a table from remote database, but there is a condition. The condition is that user should have proper privileges on FDW table. There is two extension for FDW on PostgreSQL. First one is used for accessing PostgreSQL database to PostgreSQL database, called postgres_fdw . Second one is used for accessing PostgreSQL database to different databases (SQL Server, Sysbase) called tds_fdw .  Foreign Data Wrappers feature lets you to cross-query between remote database tables. Postgres_fdw and tds_fdw has different structure. Tds_fdw usign Tabular Data Stream application layer protocol to transfer data between database server and client. Generating Tds_fdw and Postgres_fdw is similar. I share an example for generating FDW between tw...

PostgreSQL High Availability - Patroni 2

Patroni kurulumuyla ilgili oldukça fazla kaynak bulunmakta fakat kurulum ve yönetimini beraber barındıran kaynağa denk gelmedim. Bu yazıda hem Patroni kurulumu hem de kurulum sonrası yönetimiyle alakalı detaylara ulaşabilirsiniz. PostgreSQL cluster'larının yönetimi için kullanılan Patroni ile ilgili temel bilgilerin yer aldığı Autofailover üzerine hazırladığım yazı serisine aşağıdaki linklerden erişebilirsiniz. PostgreSQL ve Autofailover PostgreSQL'de Autofailover ve Patroni 1 (Giriş) PostgreSQL'de Autofailover ve Patroni 2 (Kurulum, Konfigürasyon ve Yönetim) PostgreSQL'de Autofailover ve Patroni 3 (Mevcut PostgreSQL Cluster'inin Patroni'ye Geçirilmesi) Patroni, PostgreSQL veritabanlarının kurulumundan ve konfigürasyonundan sorumludur. Yani Patroni'yi kurduğumuz sunucular aynı zamanda Patroni ile kurulmuş PostgreSQL'leri barındıracak. Üç node'lu PostgreSQL ve üç node'lu ETCD cluster'larını oluşturacağım. Kuruluma önce üç no...