PDA

View Full Version : سوال: چند سوال در مورد کار با smtp



idocsidocs
دوشنبه 29 خرداد 1391, 01:15 صبح
1- چطور می تونم تک تک ایملها رو چک کنم که ایمیلها با موفقیت ارسال شدن؟

2- چطور می تونم قبل از اسال چک کنم که می تونم از سرور smtp استفاده کنم یا نه؟

3- آیا می شه محدودیت ارسال ایمیل رو از سرور smtp بگیرم؟

MostafaEs3
دوشنبه 29 خرداد 1391, 01:21 صبح
اصلا smtp هیچ چیز خاصی نیست !! یکسری هدر بوسیله ی سوکت ارسال میشن به پورت مخصوص و سرور جواب میده

نه معمولا محدودیت رو نمیشه فهمید . مثلا یاهو 100 تا بیشتر نمیشه ارسال کرد بهش (بعد از اینکه به 100 برسی توی پیام بازگشتی میگه اینو )

بیشتر smtp ها محدودیت ندارن . اکانت هایی که توی سایتا به فروش میره ، میان سرعت ارسال رو کم میکنن که اسپم نشه (تاخیر توی ارسال)

idocsidocs
دوشنبه 29 خرداد 1391, 10:52 صبح
الان دارم با smtp یه خبرنامه می نویسم.

ممکنه به یاهو وصل بشم و بخوام بجای 100 تا، 200 تا ایمیل بفرستم. در این صورت یاهو چیکار می کنه؟ امکان داره در صورت توجه نکردن به این محدودیت، حساب من بلوکه بشه؟

مسئله دیگه این که چطور می تونم چک کنم که اطلاعات smtp که کاربر وارد کرده درسته؟ یعنی وقتی مدیر این اطلاعات رو توی قسمت تنظیمات وارد کرد، چک کنم که آیا از طریق این حساب می شه ایمیل فرستاد یا نه؟

MostafaEs3
دوشنبه 29 خرداد 1391, 14:33 عصر
ممکنه به یاهو وصل بشم و بخوام بجای 100 تا، 200 تا ایمیل بفرستم. در این صورت یاهو چیکار می کنه؟ امکان داره در صورت توجه نکردن به این محدودیت، حساب من بلوکه بشه؟

نه .. وقتی مثلا 100 تا بزنی بعدش هرچی تلاش کنی عدد دیگه ای رو برمیگردونه



مسئله دیگه این که چطور می تونم چک کنم که اطلاعات smtp که کاربر وارد کرده درسته؟ یعنی وقتی مدیر این اطلاعات رو توی قسمت تنظیمات وارد کرد، چک کنم که آیا از طریق این حساب می شه ایمیل فرستاد یا نه؟

توی هرقسمت از مراحل باید عدد 200 بگرده .. در غیر اینصورت یعنی یک مشکلی وجود داره ... تو فقط اطلاعات لاگین رو بفرست اگه 200 برگشت توی مراحل اولیه بگو که این وجود داره

idocsidocs
دوشنبه 29 خرداد 1391, 20:55 عصر
توی هرقسمت از مراحل باید عدد 200 بگرده .. در غیر اینصورت یعنی یک مشکلی وجود داره ... تو فقط اطلاعات لاگین رو بفرست اگه 200 برگشت توی مراحل اولیه بگو که این وجود داره
الان توی تنظیمات می شه کانکشن رو روی none قرار داد. این نوع کانکشن برای چه کاری استفاده می شه؟ برای این نوع کانکشن باید کلمه رمز، کلمه کاربری و شماره پورت رو هم وارد کرد؟

توی هرقسمت از مراحل باید عدد 200 بگرده .. در غیر اینصورت یعنی یک مشکلی وجود داره ... تو فقط اطلاعات لاگین رو بفرست اگه 200 برگشت توی مراحل اولیه بگو که این وجود داره
می شه یه اتصال اولیه ایجاد کرد و بدون ارسال ایمیل، عدد خروجی رو گرفت؟

MostafaEs3
سه شنبه 30 خرداد 1391, 02:46 صبح
می شه یه اتصال اولیه ایجاد کرد و بدون ارسال ایمیل، عدد خروجی رو گرفت؟

سوال اولت رو درست نفهمیدم چطور شد .. ولی این مورد آره میشه .. باید اول به سرور سلام کنی توی سوکت ! :لبخند: (HELO) ... این یک ارسال کننده ی ایمیل ساده که فکر کنم راحت بتونی ازش سردربیاری (یک قسمت داره که مقدار بازگشتی از سرور رو parse میکنه و عددش رو درمیاره ، مثلا اول سلام میکنه به سرور . اگه عدد بازگشتی 250 بود میگه سرور درسته . به همین ترتیب میره جلو . اول HELO ، بعد ارسال اطلاعات لاگین ، بعد یکسری هدرهای ارسال ، و درنهایت خروج )



<?php

Class sendmail{

public $smtp_host;
public $smtp_port = 25;
public $smtp_user;
public $smtp_password;
public $from_name;
public $SendFromMail;
public $mail_to;
public $subject;
public $message;
public $headers = '';
public $ContentType = 'html';
public $charset = 'windows-1251';
public $smtp_debug = true;
public $socket;
public $error;
public $SendMailVia = 'smtp';

public function __construct()
{
if($this->SendFromMail == ''){
$this->SendFromMail = $this->smtp_user;
}
}

public function Send($mail_to = '', $subject = '', $message = '')
{
if($mail_to!=''){$this->mail_to = stripslashes($mail_to);}
if($subject!=''){$this->subject = stripslashes($subject);}
if($message!=''){$this->message = $message;}
$meilsArr = array_filter($this->GetMailAndNameArr());
if(trim($this->mail_to)==''){$this->error = 'Enter the recipient address'; }
if($meilsArr == array()){$this->error = 'Please enter a valid recipient address'; }
foreach ($meilsArr as $val)
{
$validEmail = $this->validEmail($val[2]);
if($validEmail)
{
if($this->SendMailVia=='smtp'){
return $this->SMTPsend($mail_to = $val[2], $name_to = $val[1]);
}
else{
return $this->MAILsend($mail_to = $val[2], $name_to = $val[1]);
}
}
}
}

public function MAILsend($mail_to, $name_to)
{
if($this->ContentType=="text"){
$header="Content-Type: text/plain; charset=".$this->charset."";
}
else{
$header="Return-Path: ".$this->smtp_user."\n".
"Reply-To: ".$this->SendFromMail."\n".
"From: ".$this->from_name." <".$this->SendFromMail.">\n".
"Subject: ".$this->subject."\n".
"Content-Type: text/html; charset=".$this->charset."\n";
}
if(mail("$name_to <$mail_to>",$this->subject,$this->message,$header)){
return true;
}else{
return false;
}
}

public function SMTPsend($mail_to, $name_to)
{
$SEND = "Date: ".date("D, d M Y H:i:s") . "\r\n";
$SEND .= 'Subject: =?'.$this->charset.'?B?'.base64_encode($this->subject)."=?=\r\n";
if ($this->headers!=''){ $SEND .= $this->headers."\r\n\r\n"; }
else
{
$SEND .= "Reply-To: ".$this->SendFromMail."\r\n";
$SEND .= "MIME-Version: 1.0\r\n";
$SEND .= "Content-Type: text/".$this->ContentType."; charset=\"".$this->charset."\"\r\n";
$SEND .= "Content-Transfer-Encoding: 8bit\r\n";
$SEND .= "From: \"".$this->from_name."\" <".$this->SendFromMail.">\r\n";
$SEND .= "To: $name_to <$mail_to>\r\n";
$SEND .= "X-Priority: 3\r\n\r\n";
}
$SEND .= $this->message."\r\n";

$socket = fsockopen($this->smtp_host, $this->smtp_port, $errno, $errstr, 30);
if(!socket)
{
if($this->smtp_debug) $this->error = $errno." - ".$errstr;
return false;
}

if (!$this->server_parse($socket, "220", __LINE__)){ return false; }

fputs($socket, "HELO ".$this->smtp_host. "\r\n");
if (!$this->server_parse($socket, "250", __LINE__)) {
if ($this->smtp_debug) $this->error = '<p>Can not send HELO!</p>';
fclose($socket);
return false;
}
fputs($socket, "AUTH LOGIN\r\n");
if (!$this->server_parse($socket, "334", __LINE__)) {
if ($this->smtp_debug) $this->error = '<p>Can not find an answer to a request authorization.</p>';
fclose($socket);
return false;
}
fputs($socket, base64_encode($this->smtp_user) . "\r\n");
if (!$this->server_parse($socket, "334", __LINE__)) {
if ($this->smtp_debug) $this->error = '<p>Login authorization was not accepted by server!</p>';
fclose($socket);
return false;
}
fputs($socket, base64_encode($this->smtp_password) . "\r\n");
if (!$this->server_parse($socket, "235", __LINE__)) {
if ($this->smtp_debug) $this->error = '<p>No password was not accepted as a true server! Authorization Error!</p>';
fclose($socket);
return false;
}
fputs($socket, "MAIL FROM: <".$this->smtp_user.">\r\n");
if (!$this->server_parse($socket, "250", __LINE__)) {
if ($this->smtp_debug) $this->error = '<p>Unable to send command MAIL FROM: </p>';
fclose($socket);
return false;
}
fputs($socket, "RCPT TO: <" . $mail_to . ">\r\n");
if (!$this->server_parse($socket, "250", __LINE__)) {
if ($this->smtp_debug) $this->error = '<p>Unable to send command RCPT TO: </p>';
fclose($socket);
return false;
}
fputs($socket, "DATA\r\n");
if (!$this->server_parse($socket, "354", __LINE__)) {
if ($this->smtp_debug) $this->error = '<p>Unable to send command DATA</p>';
fclose($socket);
return false;
}
fputs($socket, $SEND."\r\n.\r\n");
if (!$this->server_parse($socket, "250", __LINE__)) {
if ($this->smtp_debug) $this->error = '<p>Unable to send the message body. The letter was sent!</p>';
fclose($socket);
return false;
}
fputs($socket, "QUIT\r\n");
fclose($socket);
return TRUE;
}



private function GetMailAndNameArr(){
$mailingArr = array();
$tos = preg_split("/;|,/",$this->mail_to);
$pregcode = '/(.*?)<(.*?)>/i';
foreach($tos as $to)
{
if(preg_match('/(.*?)<(.*?)>/i',$to,$matches))
{
unset($matches[0]);
$matches[1] = trim(str_replace('"','',$matches[1]));
$matches[2] = trim($matches[2]);
$mailingArr[] =$matches;
}
elseif(preg_match('/\b([A-Z0-9._%-]+)@([A-Z0-9.-]+\.[A-Z]{2,4})\b/i',$to,$matches2))
{
unset($matches[0]);
$matches[1] = trim(str_replace('"','',$matches2[1]));
$matches[2] = trim($matches2[0]);
$mailingArr[] =$matches;
}
}
return $mailingArr;
}

private function server_parse($socket, $response, $line = __LINE__) {
while (substr($server_response, 3, 1) != ' ') {
if (!($server_response = fgets($socket, 256))) {
if ($this->smtp_debug) $this->error = "<p>$line Problems sending mail! $response</p>";
return false;
}
}
if (!(substr($server_response, 0, 3) == $response)) {
if ($this->smtp_debug) $this->error = "<p>$line Problems sending mail! $response</p>";
return false;
}
return true;
}

function validEmail($email)
{
$isValid = true;
$atIndex = strrpos($email, "@");
$msg = '';
if (is_bool($atIndex) && !$atIndex)
{
$isValid = false;
}
else
{
$domain = substr($email, $atIndex+1);
$local = substr($email, 0, $atIndex);
$localLen = strlen($local);
$domainLen = strlen($domain);
if ($localLen < 1 || $localLen > 64){
$msg = 'local part length exceeded';
$isValid = false;
}
else if ($domainLen < 1 || $domainLen > 255){
$msg = ' domain part length exceeded ';
$isValid = false;
}
else if ($local[0] == '.' || $local[$localLen-1] == '.'){
$msg = ' local part starts or ends with .';
$isValid = false;
}
else if (preg_match('/\\.\\./', $local)){
$msg = 'local part has two consecutive dots';
$isValid = false;
}
else if (!preg_match('/^[A-Za-z0-9\\-\\.]+$/', $domain)){
$msg = 'character not valid in domain part';
$isValid = false;
}
else if (preg_match('/\\.\\./', $domain)){
$msg = ' domain part has two consecutive dots';
$isValid = false;
}
else if(!preg_match('/^(\\\\.|[A-Za-z0-9!#%&`_=\\/$\'*+?^{}|~.-])+$/', str_replace("\\\\","",$local))){
$msg = ' character not valid in local part unless local part is quoted';
if (!preg_match('/^"(\\\\"|[^"])+"$/',str_replace("\\\\","",$local))){
$isValid = false;
}
}
if ($isValid && !(checkdnsrr($domain,"MX") || checkdnsrr($domain,"A"))){
$msg = ' domain <b>'.$domain.'</b> not found in DNS';
$isValid = false;
}
}
$this->error = $msg;
return $isValid;
}

}
?>







USING EXAMPLE:




<?php
include "sendmail.class.php";
$Mail = new sendmail();

// Set congif
$Mail->SendMailVia = 'smtp'; // Send via smtp server or mail function
$Mail->smtp_host = 'mail.myhost.com';
$Mail->smtp_port = 25;
$Mail->smtp_user = 'user@myhost.com';
$Mail->smtp_password = 'mypassw';


// Example 1 (mail from me)
if($Mail->Send('mymail1@mydomain.com; recipient2 name <recipientmail2@mydomain.com>,"recipient name" <recipient@mail.com>','My subject','My message here.'))
{
echo 'message Mail send!';
}
else
{
echo $Mail->error;
}

// Example 2 (mail from me)
$Mail->mail_to = 'mymail1@mydomain.com; recipient2 name <recipientmail2@mydomain.com>,"recipient name" <recipient@mail.com>';
$Mail->subject = 'My subject';
$Mail->message = 'My message here';

if($Mail->Send())
{
echo 'message Mail send!';
}
else
{
echo $Mail->error;
}


// Example 3 (mail from another user: example user2@site2.com)

$Mail->mail_to = 'Recipient Name <recipientmail@domain.com>';
$Mail->subject = 'My subject';
$Mail->message = 'My message here';
$Mail->from_name = 'User2 Name';
$Mail->SendFromMail = 'user2@site2.com';

if($Mail->Send())
{
echo 'message Mail send!';
}
else
{
echo $Mail->error;
}

?>

idocsidocs
سه شنبه 30 خرداد 1391, 02:52 صبح
این کلاس رو از کجا گرفتید؟

MostafaEs3
سه شنبه 30 خرداد 1391, 10:34 صبح
:لبخند: احتمالا از توی سایت اسنیپت های php !

idocsidocs
سه شنبه 30 خرداد 1391, 11:55 صبح
این اسکریپت خیلی شلوغه !
من فقط می خوام تست کنم که smtp کار می کنه یا نه. برای ای کار یه تابع جمع و جور وجود نداره؟

سوال دیگه اینکه برای ارسال کلمه کاربری به سرور smtp باید آدرس ایمیل رو بصورت کامل بفرستیم یا اینکه فقط کلمه کاربری باید ارسال بشه؟

masato
چهارشنبه 11 اردیبهشت 1392, 20:07 عصر
سلام
میشه با ست کردن این متغیرها با

$Mail->smtp_host = 'mail.google.com';
$Mail->smtp_port = 25;
$Mail->smtp_user = 'user@gmail.com';
$Mail->smtp_password = 'mypassw';

توی لوکال ایمیل فرستاد؟