2016-03-29 21 views
1

Im yerini ediliyor test e-postası göndermek için:PHP: bağlantısından Normal karakterler basit script kullanarak

$sql = "SELECT name, update_url FROM `accounts` WHERE `subscription_id` = '4692'"; 
$res = mysqli_query($con, $sql); 
$row = mysqli_fetch_assoc($res); 

$name = $row["name"]; 
$updateUrl = $row["update_url"]; 

echo $updateUrl; 

$subject = 'Subscription Payment Has Failed'; 
$message = 'Hi ' . $name . ', 

Your subscription payment has failed. You can use the link below to update your payment information if needed: 
' . $updateUrl .' 

Cheers, 
test name'; 
     $headers = 'From: test ' . "\r\n"; 
     $headers .= "Content-type: text/plain; charset=\"UTF-8\"; format=flowed \r\n"; 
     $headers .= "Mime-Version: 1.0 \r\n"; 
     $headers .= "Content-Transfer-Encoding: quoted-printable \r\n"; 

     mail($email, $subject, $message, $headers); 

Ben $ updateURL bunun doğru saklanır halde, yani karşılaşmak sorun DB, postayla gönderilir.

daha kesin olmak gerekirse: DB olarak böyle depolanır: https://test.testsite.com/sub/update?user=406530&subscription=4692&hash=01d75f25e599e3c842ea5288f47e

Ve böyle alındığında gönderilen postada : https://test.testsite.com/sub/[email protected]&subscriptionF92&hash d75f25e599e3c842ea5288f47e '= 40' dir

Bildirim o '@', '= 46' yerine 'F' ve '= 01' ile boş alan doldurulur.

Buna ne sebep olabilir, bu karakterlerin ne tür bir gösterimi/kodlaması bu?

hala bu söz değer

+0

E-posta sağlayıcınıza bağlı olarak, e-postalarını, kullanıcılarını kötü amaçlı e-postalara karşı korumak için gelen kutunuza ulaşmadan önce sterilize edilmesi çok olasıdır. – MonkeyZeus

+0

UTF-8'i gönderdiğinizden emin misiniz? Veritabanınız UTF-8 mi saklıyor? – Machavity

+1

Bir çeşit ASCII hex-code değiştirme işlemi gerçekleştiriyorsunuz: ASCII hex 40 = '@' ACII hex 46 = 'F' ASCII hex 1 yazdırılamıyorken bir yer kaplıyorsunuz. – CD001

cevap

3

Bu, RFC2045 quoted-printable encoding ve tamamen normaldir. Sorun şu ki, içerik aktarım kodlaması bildiriyorsunuz, ancak içeriği eşleştirmek için kodlama yapmıyorsunuz, dolayısıyla QP-kodlamasına benzeyen her şey yanlış bir şekilde çözülüyor. Ayrıca 76 karakter hatlarına metin kaydırılır bu çağrılması

mail($email, $subject, quoted_printable_encode($message), $headers); 

: Böyle quoted_printable_encode kullanarak, (senin durumunda bütün mesajı olan) tüm MIME kısmına URL'yi değil onu uygulamak gerekir ancak kodlamanın kayıpsız olması nedeniyle iletilen mesajın görünümünü etkilemez.

Eğer PHPMailer kullanmıyorsanız lütfen sorularınızı PHPMailer olarak etiketlemeyin.

+0

Evet, işe yaradı. Not; Yanlış etiketi kaldırdım, işaret ettiğin için teşekkürler –

1

Sen quoted_printable_encode kullanmalıdır içerik türü text/html ile HTML olarak gönderilen ne olur:

PHPMailer

o kullanıyor ise (iletinin her satırı kodlamak için bu kodu kullanıyor 'alıntı-yazdırılabilir' kodlama:

public function encodeQP($string, $line_max = 76) 
{ 
    // Use native function if it's available (>= PHP5.3) 
    if (function_exists('quoted_printable_encode')) { 
     return quoted_printable_encode($string); 
    } 
    // Fall back to a pure PHP implementation 
    $string = str_replace(
     array('%20', '%0D%0A.', '%0D%0A', '%'), 
     array(' ', "\r\n=2E", "\r\n", '='), 
     rawurlencode($string) 
    ); 
    return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string); 
} 

sen mesaja Gönderdiğiniz bunu yapmak zorunda en azından

..

PHPMailer'in kullandığı kodu gözden geçirin. E-posta göndermek siyah bir sanattır.

+0

Alıntıyla basılabilir kodlamayı kullanmanın yanlış yolu budur. Sadece bir kısmını değil, tüm MIME bölümüne uygulamanız gerekir. – Synchro

+0

İyi bir plan gibi görünüyorsun @Synchro :) – jacmoe

İlgili konular