Tipik bir e-postanın üç ana bileşeni vardır:
- Bir alıcı (e-posta adresi olarak gösterilir)
- Bir konu
- Bir mesaj gövdesi
PHP’de mail göndermek, yerleşik mail() işlevini çağırmak kadar basit olabilir. mail() işlevi beş parametre alabilir, ancak bir e-posta göndermek için gereken tek şey ilk üçüdür (aşağıda gösterileceği gibi dört parametre yaygın olarak kullanılmasına rağmen). İlk üç parametre şunlardır:
- Alıcının e-posta adresi (string)
- E-postanın konusu (string)
- E-postanın gövdesi (dize) (örneğin, e-postanın içeriği)
Minimal bir örnek aşağıdaki koda benzer:
mail('recipient@example.com', 'E-posta Konusu', 'Bu e-posta mesajı gövdesidir');
Yukarıdaki basit örnek, dahili bir sistem için bir e-posta uyarısının sabit kodlanması gibi sınırlı durumlarda iyi çalışır. Ancak, kodu daha temiz ve yönetimi daha kolay hale getirmek için mail() için parametre olarak aktarılan verileri değişkenlere yerleştirmek yaygındır (örneğin, bir form gönderiminden dinamik olarak bir e-posta oluşturmak gibi).
Ayrıca mail(), e-postanızla birlikte ek posta başlıklarının gönderilmesini sağlayan dördüncü bir parametre kabul eder. Bu başlıklar şunları ayarlamanıza izin verebilir:
- Kullanıcının göreceği Kimden adı ve e-posta adresi
- kullanıcının yanıtının gönderileceği Reply-To e-posta adresi
- X-Mailer gibi alıcıya bu e-postanın PHP ile gönderildiğini söyleyebilen standart dışı ek başlıklar
$to = 'alici@example.com'; // ya da $to = $_POST['recipient'];
$subject = 'Email Konusu'; // ya da $subject = $_POST['subject'];
$message = 'Email gövdesi'; // ya da $message = $_POST['message'];
$headers = implode("\r\n", [
'From: John Conde <webmaster@example.com>',
'Reply-To: webmaster@example.com',
'X-Mailer: PHP/' . PHP_VERSION
]);
İsteğe bağlı beşinci parametre, sendmail_path yapılandırma ayarı tarafından tanımlandığı gibi, posta gönderirken kullanılmak üzere yapılandırılan programa komut satırı seçenekleri olarak ek bayraklar iletmek için kullanılabilir. Örneğin, -f sendmail seçeneği ile sendmail/postfix kullanılırken zarf gönderen adresini ayarlamak için kullanılabilir.
$fifth = '-fno-reply@example.com';
mail() kullanmak oldukça güvenilir olsa da, mail() çağrıldığında bir e-postanın gönderileceği hiçbir şekilde garanti edilmez. E-postanızı gönderirken olası bir hata olup olmadığını görmek için mail() işlevinden dönen değeri yakalamanız gerekir. Posta başarıyla teslim edilmek üzere kabul edilmişse TRUE döndürülür. Aksi takdirde FALSE değerini alırsınız.
$result = mail($to, $subject, $message, $headers, $fifth);
NOT: mail() işlevi TRUE değerini döndürse de, bu e-postanın gönderildiği veya alıcı tarafından alınacağı anlamına gelmez. Yalnızca postanın sisteminizin posta sistemine başarıyla teslim edildiğini gösterir.
Bir HTML e-posta göndermek istiyorsanız, yapmanız gereken çok fazla iş yoktur. Yapmanız gerekenler:
- MIME-Version başlığını ekleyin
- Content-Type başlığını ekleyin
- E-posta içeriğinizin HTML olduğundan emin olun
$to = 'alici@example.com';
$subject = 'Email başlığı';
$message = '<html><body>Email gövdesi</body></html>';
$headers = implode("\r\n", [
'From: John Conde <webmaster@example.com>',
'Reply-To: webmaster@example.com',
'MIME-Version: 1.0',
'Content-Type: text/html; charset=ISO-8859-1',
'X-Mailer: PHP/' . PHP_VERSION
]);
PHP’nin mail() işlevini kullanan tam bir örneğe bakalım:
<?php
// Hata ayıklama araçları. Bunları yalnızca geliştirme ortamınızda açın.
error_reporting(-1);
ini_set('display_errors', 'On');
set_error_handler("var_dump");
// Postaların spam olarak değerlendirilme olasılığını azaltabilecek özel posta ayarları
// ve teknik zorluklar durumunda günlük kaydı sunar.
ini_set("mail.log", "/tmp/mail.log");
ini_set("mail.add_x_header", TRUE);
// E-posta bileşenlerimiz
$to = 'alici@example.com';
$subject = 'Email Konusu';
$message = 'Email gövdesi';
$headers = implode("\r\n", [
'From: webmaster@example.com',
'Reply-To: webmaster@example.com',
'X-Mailer: PHP/' . PHP_VERSION
]);
// maili gönder
$result = mail($to, $subject, $message, $headers);
// Sonuçları kontrol edin ve buna göre tepki verin
if ($result) {
// Başarılı! Bir teşekkür sayfasına yönlendirin. Kullanıcı sayfayı yenilediğinde formun yeniden gönderilmesini önlemek için POST/REDIRECT/GET kalıbını kullanın.
header('Location: http://example.com/path/to/thank-you.php', true, 303);
exit;
}
else {
// Postanız gönderilmedi. Sebebin rapor edilip edilmediğini görmek için günlüklerinizi kontrol edin.
}
PHP mail Fonksiyonu Kullanarak HTML E-posta Gönderme
<?php
$to = 'alici@example.com';
$subject = 'PHP'de mail() kullanarak HTML e-posta gönderme';
$message = '<html><body><p><b>Bu paragraf koyu yazılmıştır.</b></p><p><i>Bu metin italiktir.</i></p></body></html>';
$headers = implode("\r\n", [
"From: John Conde <webmaster@example.com>",
"Reply-To: webmaster@example.com",
"X-Mailer: PHP/" . PHP_VERSION,
"MIME-Version: 1.0",
"Content-Type: text/html; charset=UTF-8"
]);
mail($to, $subject, $message, $headers);
Bu, düz metin e-posta göndermekten çok farklı sayılmaz. Temel farklar, içerik gövdesinin bir HTML belgesi gibi yapılandırılmış olması ve e-posta istemcisinin e-postayı HTML olarak işlediğini bilmesi için eklenmesi gereken iki ek başlık olmasıdır. Bunlar
- MIME-Version: 1.0
- Content-Type: text/html; charset=UTF-8
mail() Kullanarak Ek İçeren E-posta Gönderme
<?php
$to = 'alici@example.com';
$subject = 'E-posta Konusu';
$message = 'Email gövdesi';
$attachment = '/gondereceginiz/dosyanin/yolu/adi.pdf';
$content = file_get_contents($attachment);
/* Base64 kodlamasında aktarılan ek içeriği 76 karakter uzunluğunda parçalara bölünmelidir. RFC 2045 bölüm 6.8 tarafından belirtilmiştir. Varsayılan olarak chunk_split() işlevi 76'lık bir yığın uzunluğu kullanır ve sondaki bir CRLF (\r\n). 76 karakter gereksinimi satır başı ve satır beslemesini içermez */
$content = chunk_split(base64_encode($content));
$prefix = "part_"; // Bu isteğe bağlı bir ön ektir
$boundary = uniqid($prefix, true);
// headers
$headers = implode("\r\n", [
'From: webmaster@example.com',
'Reply-To: webmaster@example.com',
'X-Mailer: PHP/' . PHP_VERSION,
'MIME-Version: 1.0',
// sınır parametresi gereklidir, tırnak içine alınmalıdır
'Content-Type: multipart/mixed; boundary="' . $boundary . '"',
"Content-Transfer-Encoding: 7bit",
"Bu MIME kodlu bir mesajdır." // kısıtlı aktarımlar için mesaj
]);
// mesaj ve ek
$message = implode("\r\n", [
"--" . $boundary, // başlık sınırı sınırlayıcı satırı
'Content-Type: text/plain; charset="iso-8859-1"',
"Content-Transfer-Encoding: 8bit",
$message,
"--" . $boundary, // içerik sınırlayıcı sınır çizgisi
'Content-Type: application/octet-stream; name="RenamedFile.pdf"',
"Content-Transfer-Encoding: base64",
"Content-Disposition: attachment",
$content,
"--" . $boundary . "--" // kapanış sınırlayıcı çizgisi
]);
$result = mail($to, $subject, $message, $headers); // maili gönder
if ($result) {
// Başarılı! Bir teşekkür sayfasına yönlendirin. Kullanıcı sayfayı yenilediğinde formun yeniden gönderilmesini önlemek için POST/REDIRECT/GET kalıbını kullanın.
header('Location: http://example.com/path/to/thank-you.php', true, 303);
exit;
}
else {
// Postanız gönderilmedi. Sebebin rapor edilip edilmediğini görmek için günlüklerinizi kontrol edin.
}
PHPMailer Kullanarak Düz Metin E-posta Gönderme
Temel Metin E-postası
<?php
$mail = new PHPMailer();
$mail->From = "gonderen@example.com";
$mail->FromName = "Ad Soyad";
$mail->addReplyTo("reply@example.com", "Cevap Adresi");
$mail->Subject = "Konu Metni";
$mail->Body = "Bu, PHPMailer kullanan örnek bir temel metin e-postasıdır.";
if($mail->send()) {
// Başarılı! Bir teşekkür sayfasına yönlendirin. Kullanıcı sayfayı yenilediğinde formun yeniden gönderilmesini önlemek için POST/REDIRECT/GET kalıbını kullanın.
header('Location: http://example.com/path/to/thank-you.php', true, 303);
exit;
}
else {
echo "Mail Hatası: " . $mail->ErrorInfo;
}
Ek alıcılar, CC alıcıları, BCC alıcıları ekleme
<?php
$mail = new PHPMailer();
$mail->From = "gonderen@example.com";
$mail->FromName = "Ad Soyad";
$mail->addReplyTo("reply@example.com", "Cevap Adresi");
$mail->addAddress("alici1@example.com", "Alıcı Adı");
$mail->addAddress("alici2@example.com");
$mail->addCC("cc@example.com");
$mail->addBCC("bcc@example.com");
$mail->Subject = "Konu Metni";
$mail->Body = "Bu, PHPMailer kullanan örnek bir temel metin e-postasıdır.";
if($mail->send()) {
// Başarılı! Bir teşekkür sayfasına yönlendirin. Kullanıcı sayfayı yenilediğinde formun yeniden gönderilmesini önlemek için POST/REDIRECT/GET kalıbını kullanın.
header('Location: http://example.com/path/to/thank-you.php', true, 303);
exit;
}
else {
echo "Hata: " . $mail->ErrorInfo;
}
PHPMailer Kullanarak HTML E-posta Gönderme
<?php
$mail = new PHPMailer();
$mail->From = "gonderen@example.com";
$mail->FromName = "Ad Soyad";
$mail->addReplyTo("reply@example.com", "Cevap Adresi");
$mail->addAddress("recepient1@example.com", "Alıcı Adı");
$mail->addAddress("recepient2@example.com");
$mail->addCC("cc@example.com");
$mail->addBCC("bcc@example.com");
$mail->Subject = "Konu Metni";
$mail->isHTML(true);
$mail->Body = "<html><body><p><b>Bu paragraf kalın yazılmıştır.</b></p><p><i>Bu metin italiktir.</i></p></body></html>";
$mail->AltBody = "TBu paragraf kalın değildir.\n\nBu metin italik değildir.";
if($mail->send()) {
// Başarılı! Bir teşekkür sayfasına yönlendirin. Kullanıcı sayfayı yenilediğinde formun yeniden gönderilmesini önlemek için POST/REDIRECT/GET kalıbını kullanın.
header('Location: http://example.com/path/to/thank-you.php', true, 303);
exit;
}
else {
echo "Hata: " . $mail->ErrorInfo;
}
PHPMailer Kullanarak Ek ile E-posta Gönderme
<?php
$mail = new PHPMailer();
$mail->From = "gonderen@example.com";
$mail->FromName = "Ad Soyad";
$mail->addReplyTo("reply@example.com", "Cevap Adresi");
$mail->Subject = "Konu Metni";
$mail->Body = "Bu, PHPMailer kullanan bir ek içeren örnek bir temel metin e-postasıdır.";
// Statik Ek Ekle
$attachment = '/gondereceginiz/dosyanin/yolu/adi.pdf';
$mail->AddAttachment($attachment , 'RenamedFile.pdf');
// İkinci Ek Ekle; çalışma zamanı oluşturulmuş olsun. örn: Excel ile açılacak CSV
$csvHeader = "header1,header2,header3";
$csvData = "row1col1,row1col2,row1col3\nrow2col1,row2col2,row2col3";
$mail->AddStringAttachment($csvHeader ."\n" . $csvData, 'your-csv-file.csv', 'base64', 'application/vnd.ms-excel');
if($mail->send()) {
// Başarılı! Bir teşekkür sayfasına yönlendirin. Kullanıcı sayfayı yenilediğinde formun yeniden gönderilmesini önlemek için POST/REDIRECT/GET kalıbını kullanın.
header('Location: http://example.com/path/to/thank-you.php', true, 303);
exit;
}
else {
echo "Hata: " . $mail->ErrorInfo;
}