Bu PHP ile e-posta göndermek için doğru yolu nedir?

2 Cevap php

Bu fonksiyon e-posta ve webmail o, özellikle ben bu şüpheler hakkında en çok endişe duyuyorum gereken yolu çoğunluğu doğru kabul edilebilir e-postalar gönderen eğer biraz endişeliyim:

  • UTF-8 bildirimleri ve ekleri de oluşur?
  • Ben (quoted_printable_decode kullanmanız gerekir mi?) Evet, varsa nerede?
  • Content-Transfer-Encoding: 7 veya 8 bit? Ben hep 7 gördüm ama UTF-8 kodlu mail yolluyorum beri ben emin değilim.
  • I mb_send_mail () işlevini veya mail () kullanmanız gerekir yeterli mi?

EDIT: I don't know why but the code is not showing up correctly, I made it available @ http://gist.github.com/104818

EDIT 2: I'm aware of other alternatives (libraries) for email handling, but for the sake of my own curiosity and knowledge I just wish to know if this code is 100% good, or if it's buggy.

function Email($name, $from, $to, $subject, $message, $bcc = null, $attachments = null)
{
    ini_set('SMTP', 'localhost');
    ini_set('sendmail_from', $from);

    $name = filter_var($name, FILTER_SANITIZE_STRING);
    $from = filter_var($from, FILTER_SANITIZE_EMAIL);
    $subject = filter_var($subject, FILTER_SANITIZE_STRING);

    $boundary = '_Boundary_' . md5(microtime(true) . mt_rand(0, PHP_INT_MAX));

    $headers = array
    (
    	'MIME-Version: 1.0',
    	'Content-Type: multipart/mixed; boundary="Mixed' . $boundary . '"',
    	'Date: ' . date('r', time()),
    	'From: "' . $name . '" <' . $from . '>',
    	'Reply-To: "' . $name . '" <' . $from . '>',
    	'Return-Path: "' . $name . '" <' . $from . '>',
    	'X-Mailer: PHP ' . phpversion(),
    	'X-Priority: 2',
    	'X-MSMail-Priority: High',
    	'X-Originating-IP: ' . $_SERVER['SERVER_ADDR'],
    );

    if (is_null($to) === false)
    {
    	if (is_array($to) === false)
    	{
    		$to = explode(',', $to);
    	}

    	foreach ($to as $key => $value)
    	{
    		$to[$key] = filter_var($value, FILTER_SANITIZE_EMAIL);
    	}

    	$to = implode(', ', array_filter($to));
    }

    if (is_null($bcc) === false)
    {
    	if (is_array($bcc) === false)
    	{
    		$bcc = explode(',', $bcc);
    	}

    	foreach ($bcc as $key => $value)
    	{
    		$bcc[$key] = filter_var($value, FILTER_SANITIZE_EMAIL);
    	}

    	$headers[] = 'BCC: ' . implode(', ', array_filter($bcc));
    }

    if (is_null($attachments) === false)
    {
    	settype($attachments, 'array');

    	foreach ($attachments as $key => $value)
    	{
    		if (is_file($value) === true)
    		{
    			$attachments[$key] = array
    			(
    				'',
    				'--Mixed' . $boundary,
    				'Content-Type: application/octet-stream; name="' . basename($value) . '"',
    				'Content-Disposition: attachment; filename="' . basename($value) . '"',
    				'Content-Transfer-Encoding: base64',
    				'',
    				trim(chunk_split(base64_encode(file_get_contents($value)))),
    			);

    			$attachments[$key] = implode("\n", $attachments[$key]);
    		}

    		else
    		{
    			unset($attachments[$key]);
    		}
    	}

    	$attachments = implode("\n", $attachments) . "\n";
    }

    $message = array
    (
    	'This is a multi-part message in MIME format.',
    	'',
    	'--Mixed' . $boundary,
    	'Content-Type: multipart/alternative; boundary="Alt' . $boundary . '"',
    	'',
    	'--Alt' . $boundary,
    	'Content-Type: text/plain; charset="UTF-8"',
    	'Content-Disposition: inline',
    	'Content-Transfer-Encoding: 8bit',
    	'',
    	trim(strip_tags($message, '<a>')),
    	'',
    	'--Alt' . $boundary,
    	'Content-Type: text/html; charset="UTF-8"',
    	'Content-Disposition: inline',
    	'Content-Transfer-Encoding: 8bit',
    	'',
    	trim($message),
    	'',
    	'--Alt' . $boundary . '--',
    	$attachments,
    	'--Mixed' . $boundary . '--',
    );

    if (@mail($to, stripslashes($subject), implode("\n", $message), implode("\n", $headers)) === true)
    {
    	return true;
    }

    return false;
}

2 Cevap

Çalışmalı, ben kesinlikle bu tür Zend_Mail olarak önceden oluşturulmuş bir Posta / SMTP sınıfını kullanarak öneriyoruz. Ben bütün Zend Framework kedinin pijama olduğunu sanmıyorum da, ben kendi posta işleme kod çok iyi bir fikir var.

EDIT: Ben de eklemek gerekir ki hazır bir Posta / SMTP sınıfını kullanarak olacak soyut neredeyse tüm çok parçalı e-postaların karmaşıklığı / yapısı.

Update 2009-05-06: doğrudan sorunuzu cevaplama.

  • UTF-8 bildirimleri ve ekleri de oluşur?

Onlar yeterince iyi görünüyorsun.

  • Ben kullanmak gerekiyor quoted_printable_decode()? Evet, varsa nerede?

Hayır bir e-posta mesajı çözme iseniz quoted_printable_decode() kullanmak isteyeyim. Değil birini kodlayan zaman. Eğer kullanmanız gerekir quoted_printable_encode() ? Ben önümüzdeki tartışırız.

  • Content-Transfer-Encoding: 7 veya 8 bit? Ben hep 7 gördüm ama UTF-8 kodlu mail yolluyorum beri ben emin değilim.

Eğer hedef SMTP sunucusu destek olduğunu biliyorum eğer sadece 8bit kodlamasını kullanır. Ancak, yerel MTA için e-postanızı kapalı geçiyoruz beri, ben bu değerin ayarlanması tavsiye etmem. Varsayılan değer 7bit kodlama, ama o kısıtlamaları kendi ayarlanmıştır vardır: Yalnızca biten CRLF çizgisinin bir parçası olarak görünür izin CR ve LF kod aralığı 1-127 hattı başına 998 oktet ({[(0) ]}).

Seni Gören-yazdırılabilir (http://tools.ietf.org/html/rfc2045#section-6.7) Content-Transfer-Encoding kullanmanızı tavsiye ederim. Nereye trim(strip_tags($message, '<a>')) çağırıyor ve trim($message) Eğer quoted_printable_encode(trim(...)) olanlarda içine isteyeceksiniz.

  • I mb_send_mail() veya mail() yeterli mi kullanmalıyım?

Sen kendini biliyorsan not (Japonca, Korece, Çince, vb) Multibyte mesajları işleme olacak sonra mail() yeterli olacaktır.

Şimdi başlangıçtaki sorularını yanıtladı ettik, bazı sorunlar var nerede sana söyleyeyim.

  1. Eğer gerçekten onlar gerçekten UTF-8 kodlu olmasının sağlanması gibi ancak görünmüyor, senin düz metin ve HTML içerik parça Karakter seti UTF-8 olduğunu belirterek vardır.
  2. Eğer süreç onları daha önce, ancak, bir şey yapmıyor null $attachments $to, $bcc, içinde kontrol edilir aslında olabilir null. Eğer $to, siz değişken işlemez için null almak olur, ama eğer Yani, null bir e-posta göndermeye devam.

Şu an itibariyle, ben gitmek için gidiyorum ama yine de hata çalışmak için kullanıcı / çok zaman oldu gibi çok önceden inşa çözüm önermek için gidiyorum hepsi.

Ben haddeleme-your-kendi çoğu durumlarda tüm değilim, ama bu mail geldiğinde Yürekten (kendine daha kolay yapma ve Swift Mailer veya PHPMailer gibi bir şey kullanmanızı tavsiye ediyorum bu sırayla, benim para için).

Yan ikramiye (ve vb, cevap-belirtmek varsayarak) gibi, siz de spam olarak etiketlenmiş olmanın çok daha az şansı var.