Günümüzde en eski elektronik iletişim araçlarından biri olmasına rağmen, e-posta (elektronik posta) çeşitli amaçlarla kullanılmaya devam etmektedir:
- Kişisel iletişim
- İdari bildirimler
- Uyarılar
- Kimlik doğrulama
Otomatik uygulamaları nedeniyle, komut satırından e-posta göndermek için pratik bir yol bulmak önemli hale gelmiştir. Bu makalede, curl
aracını kullanarak shell’den e-posta gönderme yöntemlerini inceleyeceğiz. Öncelikle, curl
aracını genel hatlarıyla tanıtacak, ardından komut satırından e-posta göndermenin neler içerdiğini keşfedeceğiz ve son olarak curl
ile e-posta göndermenin farklı yollarını inceleyeceğiz.
Bu makalede sunulan kodları Debian 12 (Bookworm) üzerinde GNU Bash 5.1.4 ile test ettik. Belirtilmediği takdirde, çoğu POSIX uyumlu ortamda çalışması beklenmektedir.
1. curl
curl
, veri aktarımı konusunda yaygın olarak kullanılan bir araçtır. Birçok protokol ve standartı destekler:
- Dosya Transfer Protokolü (FTP), Güvenli Dosya Transfer Protokolü (FTPS), Güvenli Dosya Transfer Protokolü (SFTP), Basit Dosya Transfer Protokolü (TFTP)
- Gopher, Gophers
- Dict
- Hiper Metin Transfer Protokolü (HTTP), HTTPS
- Hafif Dizin Erişim Protokolü (LDAP), LDAPS
- Posta Ofisi Protokolü sürüm 3 (POP3), POP3S
- Güvenli Kopya Protokolü (SCP)
- İnternet Mesaj Erişim Protokolü (IMAP)
- Sunucu Mesaj Bloğu (SMB), Ortak İnternet Dosya Sistemi (CIFS), SAMBA
- Basit Posta Transfer Protokolü (SMTP), SMTPS
- Telnet
- Güvenli Soket Katmanı (SSL)
- SOCKS4, SOCKS5
- UNIX soketleri
Örnek Kullanım
Bir HTTPS isteği yapmak için bir örnek görelim:
$ curl --data-urlencode "user=eminbuyuk" --data-urlencode "pass=PAROLA" https://cpynet.com.tr/
{
"user": "eminbuyuk",
"pass": "PAROLA"
}
Bu örnekte, curl
ile https://cpynet.com
adresine basit bir HTTPS isteği göndermekteyiz. İki parametre (kullanıcı ve şifre) --data-urlencode
seçeneği ile gönderilmektedir. Sunucu, geçen parametreleri ve değerlerini JSON formatında geri döndürmektedir.
2. Komut Satırından E-posta Gönderme
curl
, birçok büyük posta protokolünü desteklediği için terminalden e-posta göndermek mümkündür. E-posta göndermenin temel bileşenlerini ve adımlarını inceleyelim.
2.1. E-posta Sunucusu
E-posta göndermek için, e-postamızı kabul edebilen ve uygun şekilde işleyebilen bir hizmete ihtiyacımız vardır. Bu hizmet genellikle bir posta sağlayıcısı veya posta sunucusu olarak adlandırılmakta ve aşağıdaki bileşenlerden oluşmaktadır:
- MTA (Mail Transport Agent): SMTP aracılığıyla sunucular arası e-posta yönlendirmesi ve aktarımı yapar.
- MDA (Mail Delivery Agent): POP3 veya IMAP üzerinden e-postaları depolar.
- MUA (Mail User Agent): Kullanıcı olarak e-postaları alır.
Bu bağlamda, bir e-posta sunucusu genellikle SMTP sunucusu ile eş anlamlıdır.
2.2. SMTP Sunucusu Bulma
İlk olarak, uygun bir SMTP sunucusu bulmalıyız:
$ nc -v smtp.cpynet.com 587
Connection to smtp.cpynet.com (IP_ADRESİ) 587 port [tcp/submission] succeeded!
220 smtp.cpynet.com ESMTP Postfix
Bu örnekte, netcat (nc
) aracını kullanarak smtp.cpynet.com
mail sunucusuna bağlantı sağladık. Bu tür bir bağlantıyı smtp.gmail.com
gibi diğer sunucularla ve 465 gibi varsayılan portlarla da gerçekleştirebiliriz. Elbette, kendi sunucumuzu yerel olarak da barındırabiliriz.
2.3. Hesap Oluşturma
Herhangi bir mail sunucusu ile bağlantı kurabilmek için bir kimlik doğrulama yöntemine ihtiyacımız vardır. Bu genellikle bir kullanıcı adı ve şifre ile sağlanır. Bu kimlik bilgilerini, kendi barındırdığımız mail sunucusunda bir hesap oluşturarak veya daha yaygın olarak, ProtonMail, Gmail gibi çevrimiçi bir e-posta hizmet sağlayıcısında hesap oluşturarak elde edebiliriz.
Hesap oluşturduktan sonra genellikle aşağıdaki gibi bir dizi kimlik bilgisi alırız:
- kullanıcı adı: eminbuyuk@cpynet.com
- şifre: PAROLA
3. curl ile E-posta Gönderme
Gerekli bilgilere sahip olduktan sonra, e-posta göndermek için curl
komutları verelim. Tüm durumlarda, ilgili bilgileri saklamak için açıklayıcı isimlere sahip değişkenler kullanacağız.
3.1. Temel E-posta Gönderimi
Bir alıcıya basit bir e-posta göndermek için şu komutu kullanabiliriz:
$ curl --ssl-reqd --url "smtps://$SERVER:$PORT"
--user "$USER:$PASS"
--mail-from "$SENDER_ADDRESS"
--mail-rcpt "$RECIPIENT_ADDRESS"
--upload-file "$MAIL_CONTENT_FILE"
Burada bazı curl
seçeneklerini kullanmaktayız:
--ssl-reqd
: SSL/TLS kullanmak için--url
: isteğin gönderileceği URL--user
: kimlik doğrulama için kullanılacak kimlik bilgileri--mail-from
: e-postanın gönderenini belirtir--mail-rcpt
: e-postanın alıcısını belirtir--upload-file
: e-posta içeriğinin yükleneceği dosya
3.2. E-posta İçeriği
$MAIL_CONTENT_FILE
dosyası ya da standart giriş, e-posta gövdesini temsil eden basit bir metin mesajı içerebilir:
$ cat mailfile
Bu, e-posta gövdesinin içeriğidir.
Ancak, ayrıca SMTP’ye uygun olarak farklı satırlarda iki nokta üst üste ile ayrılmış başlıklar da ekleyebiliriz:
HEADER_NAME: HEADER_VALUE
Başka standart başlıklar da bulunmaktadır:
From
: Gönderenin adı ve adresiTo
: Alıcının adı ve adresiSubject
: E-postanın konusu
Daha karmaşık bir e-posta örneği için:
$ cat mailfile
From: "Emin Buyuk" <eminbuyuk@cpynet.com>
To: "Müşteri" <musteri@cpynet.com>
Subject: Temel Mesaj
Content-Type: text/html; charset="utf-8"
Content-Transfer-Encoding: quoted-printable
<b>Kalın metin</b>
3.3. curl Başlıkları
Tüm başlıklar için, mailfile
içinde belirttiğimiz başlıkları doğrudan --header
seçeneği ile de kullanabiliriz.
3.4. Ekli E-posta Gönderme
E-posta ile birlikte veri ve meta veriler eklemenin yanı sıra, e-postalara ek dosyalar da ekleyebiliriz:
$ cat xsendmail.sh
#!/usr/bin/env bash
SERVER='smtp.cpynet.com'
PORT='587'
USER='eminbuyuk@cpynet.com'
PASS='PAROLA'
SENDER_ADDRESS="$USER"
SENDER_NAME='Emin'
RECIPIENT_NAME='Müşteri'
RECIPIENT_ADDRESS='musteri@cpynet.com'
SUBJECT='Eklili E-posta'
MESSAGE='İlk Satırnİkinci Satır'
ATTACHMENT_FILE='/home/user/ekli_dosya.txt'
ATTACHMENT_TYPE="$(file --mime-type '$ATTACHMENT_FILE' | sed 's/.*: //')"
curl --ssl-reqd --url "smtps://$SERVER:$PORT"
--user "$USER:$PASS"
--mail-from "$SENDER_ADDRESS"
--mail-rcpt "$RECIPIENT_ADDRESS"
--header "Subject: $SUBJECT"
--header "From: $SENDER_NAME <$SENDER_ADDRESS>"
--header "To: $RECIPIENT_NAME <$RECIPIENT_ADDRESS>"
--upload-file <(echo -e "$MESSAGEnn"
"Content-Type: $ATTACHMENT_TYPE; name="$(basename "$ATTACHMENT_FILE")"n"
"Content-Transfer-Encoding: base64n"
"Content-Disposition: attachment; filename="$(basename "$ATTACHMENT_FILE")"n"
"$(base64 "$ATTACHMENT_FILE")")
Bu örnekte, basit bir e-posta ile birlikte bir dosya ekleyerek gönderiyoruz. Yine de, ATTACHMENT_TYPE
değişkeni ile dosyanın içeriği belirlenmekte ve başlıklar arasına yerleştirilmektedir.
4. Sonuç
Bu makalede, curl
ile terminalden e-posta gönderme yöntemlerini ayrıntılı bir şekilde inceledik. curl
, çok çeşitli uygulamalar için kullanılabilen güçlü bir araçtır. E-posta gönderme özellikleri sayesinde otomatik bildirimler ve uyarılar gibi işlevsellikleri kolayca gerçekleştirebiliriz. Bu örnekler ve yaklaşımlar, e-posta gönderiminde daha fazla deneyim kazanmak isteyen geliştiricilere ve sistem yöneticilerine yardımcı olacaktır.
E-posta göndermenin, sunucular arası iletişim için sağladığı kolaylıkları ve otomasyon yeteneklerini göz önünde bulundurarak, bu yöntemi uygulamalarımızda kullanabiliriz.