10/10/2018, 09:29

Please tell me how to build a web-base email by PHP ?

Mình muốn viết một web-base email bằng PHP, có tính năng send email, send attached files sử dụng IMAP hoặc POP3. Bạn nào đã làm qua web site dạng này xin chia sẻ 1 số kinh nghiệm để mình có thể học hỏi đc ko ?
Nếu các bạn có sẵn source code của website thì vui lòng send cho mình qua địa chỉ jacksvo2005@gmail.com hoặc có thể liên lạc qua nick Yahoo : congchinh.03t1@yahoo.com

Mục đích của mình chỉ là training.

Rất mong các bạn có kinh nghiệm lập trình web hướng dẫn cho mình biết. Xin chân thành cảm ơn. Hy vọng rằng mình sẽ thu thập được nhiều kiến thức bổ ích từ các bạn.
DigiPower viết 11:40 ngày 10/10/2018
Có rất nhiều open source về việc build webmail. Bạn chịu khó search trên NET sẽ thấy. Hãy tận dụng những gì google có thể giúp ta trước khi đi kêu gọi hỗ trợ nhé.

Mội cái rất hay cho bạn tham khảo: www.roundcube.net nó hỗ trợ cả tiếng Việt và chơi toàn Ajax.
ovantin viết 11:35 ngày 10/10/2018
Cái gì cũng search trên mạng thì vất vả lắm..hihi
to tegieng79: Vì bạn có post bài trên mục Java thì mình cũng trả lời cho bạn là:

1)Nếu bạn làm test trên mạng LAN:
thì cách thức như mình đã trình bày http://www.ddth.com/showthread.php?t=120203, còn muốn gửi file attach trên mail thì đơn giản thôi-->chỉ cần gửi đường dẫn là okie vì máy bạn là sever mà.
2) Nếu là trên internet thì up lên host, xin tên miền(đã có domain) sau đó bạn up file attach mà bạn cần gửi lên mạng. như trang yousendit chẳng hạn sau đó là gán link vào body(vui lòng coi code mình đã post).

Đó là ví dụ đơn giản. Cách thức là như vậy thôi...còn code Php

libmail.php:
<?php
class Mail
{
/*
list of To addresses
@var array
*/
var $sendto = array();
/*
@var array
*/
var $acc = array();
/*
@var array
*/
var $abcc = array();
/*
paths of attached files
@var array
*/
var $aattach = array();
/*
list of message headers
@var array
*/
var $xheaders = array();
/*
message priorities referential
@var array
*/
var $priorities = array( '1 (Highest)', '2 (High)', '3 (Normal)', '4 (Low)', '5 (Lowest)' );
/*
character set of message
@var string
*/
var $charset = "us-utf8";
var $ctencoding = "7bit";
var $receipt = 0;


/*

Mail contructor

*/

function Mail()
{
$this->autoCheck( true );
$this->boundary= "--" . md5( uniqid("myboundary") );
}


/*

activate or desactivate the email addresses validator
ex: autoCheck( true ) turn the validator on
by default autoCheck feature is on

@param boolean $bool set to true to turn on the auto validation
@access public
*/
function autoCheck( $bool )
{
if( $bool )
$this->checkAddress = true;
else
$this->checkAddress = false;
}


/*

Define the subject line of the email
@param string $subject any monoline string

*/
function Subject( $subject )
{
$this->xheaders['Subject'] = strtr( $subject, "\r\n" , " " );
}


/*

set the sender of the mail
@param string $from should be an email address

*/

function From( $from )
{

if( ! is_string($from) ) {
echo "Class Mail: error, From is not a string";
exit;
}
$this->xheaders['From'] = $from;
}

/*
set the Reply-to header
@param string $email should be an email address

*/
function ReplyTo( $address )
{

if( ! is_string($address) )
return false;

$this->xheaders["Reply-To"] = $address;

}


/*
add a receipt to the mail ie. a confirmation is returned to the "From" address (or "ReplyTo" if defined)
when the receiver opens the message.

@warning this functionality is *not* a standard, thus only some mail clients are compliants.

*/

function Receipt()
{
$this->receipt = 1;
}


/*
set the mail recipient
@param string $to email address, accept both a single address or an array of addresses

*/

function To( $to )
{

// TODO : test validité sur to
if( is_array( $to ) )
$this->sendto= $to;
else
$this->sendto[] = $to;

if( $this->checkAddress == true )
$this->CheckAdresses( $this->sendto );

}


/* Cc()
* set the CC headers ( carbon copy )
* $cc : email address(es), accept both array and string
*/

function Cc( $cc )
{
if( is_array($cc) )
$this->acc= $cc;
else
$this->acc[]= $cc;

if( $this->checkAddress == true )
$this->CheckAdresses( $this->acc );

}



/* Bcc()
* set the Bcc headers ( blank carbon copy ).
* $bcc : email address(es), accept both array and string
*/

function Bcc( $bcc )
{
if( is_array($bcc) ) {
$this->abcc = $bcc;
} else {
$this->abcc[]= $bcc;
}

if( $this->checkAddress == true )
$this->CheckAdresses( $this->abcc );
}


/* Body( text [, charset] )
* set the body (message) of the mail
* define the charset if the message contains extended characters (accents)
* default to us-ascii
* $mail->Body( "mél en français avec des accents", "iso-8859-1" );
*/
function Body( $body, $charset="" )
{
$this->body = $body;

if( $charset != "" ) {
$this->charset = strtolower($charset);
if( $this->charset != "us-ascii" )
$this->ctencoding = "8bit";
}
}


/* Organization( $org )
* set the Organization header
*/

function Organization( $org )
{
if( trim( $org != "" ) )
$this->xheaders['Organization'] = $org;
}


/* Priority( $priority )
* set the mail priority
* $priority : integer taken between 1 (highest) and 5 ( lowest )
* ex: $mail->Priority(1); => Highest
*/

function Priority( $priority )
{
if( ! intval( $priority ) )
return false;

if( ! isset( $this->priorities[$priority-1]) )
return false;

$this->xheaders["X-Priority"] = $this->priorities[$priority-1];

return true;

}


/*
Attach a file to the mail

@param string $filename : path of the file to attach
@param string $filetype : MIME-type of the file. default to 'application/x-unknown-content-type'
@param string $disposition : instruct the Mailclient to display the file if possible ("inline") or always as a link ("attachment") possible values are "inline", "attachment"
*/

function Attach( $filename, $filetype = "", $disposition = "inline" )
{
// TODO : si filetype="", alors chercher dans un tablo de MT connus / extension du fichier
if( $filetype == "" )
$filetype = "application/x-unknown-content-type";

$this->aattach[] = $filename;
$this->actype[] = $filetype;
$this->adispo[] = $disposition;
}

/*

Build the email message

@access protected

*/
function BuildMail()
{

// build the headers
$this->headers = "";
// $this->xheaders['To'] = implode( ", ", $this->sendto );

if( count($this->acc) > 0 )
$this->xheaders['CC'] = implode( ", ", $this->acc );

if( count($this->abcc) > 0 )
$this->xheaders['BCC'] = implode( ", ", $this->abcc );


if( $this->receipt ) {
if( isset($this->xheaders["Reply-To"] ) )
$this->xheaders["Disposition-Notification-To"] = $this->xheaders["Reply-To"];
else
$this->xheaders["Disposition-Notification-To"] = $this->xheaders['From'];
}

if( $this->charset != "" ) {
$this->xheaders["Mime-Version"] = "1.0";
$this->xheaders["Content-Type"] = "text/plain; charset=$this->charset";
$this->xheaders["Content-Transfer-Encoding"] = $this->ctencoding;
}

$this->xheaders["X-Mailer"] = "TH0302 Website";

// include attached files
if( count( $this->aattach ) > 0 ) {
$this->_build_attachement();
} else {
$this->fullBody = $this->body;
}

reset($this->xheaders);
while( list( $hdr,$value ) = each( $this->xheaders ) ) {
if( $hdr != "Subject" )
$this->headers .= "$hdr: $value\n";
}


}

/*
fornat and send the mail
@access public

*/
function Send()
{
$this->BuildMail();

$this->strTo = implode( ", ", $this->sendto );

// envoie du mail
$res = @mail( $this->strTo, $this->xheaders['Subject'], $this->fullBody, $this->headers );

}



/*
* return the whole e-mail , headers + message
* can be used for displaying the message in plain text or logging it
*/

function Get()
{
$this->BuildMail();
$mail = "To: " . $this->strTo . "\n";
$mail .= $this->headers . "\n";
$mail .= $this->fullBody;
return $mail;
}


/*
check an email address validity
@access public
@param string $address : email address to check
@return true if email adress is ok
*/

function ValidEmail($address)
{
if( ereg( ".*<(.+)>", $address, $regs ) ) {
$address = $regs[1];
}
if(ereg( "^[^@ ]+@([a-zA-Z0-9\-]+\.)+([a-zA-Z0-9\-]{2}|net|com|gov|mil|org|edu|int)\$",$address) )
return true;
else
return false;
}


/*

check validity of email addresses
@param array $aad -
@return if unvalid, output an error message and exit, this may -should- be customized

*/

function CheckAdresses( $aad )
{
for($i=0;$i< count( $aad); $i++ ) {
if( ! $this->ValidEmail( $aad[$i]) ) {
echo "Class Mail, method Mail : invalid address $aad[$i]";
exit;
}
}
}


/*
check and encode attach file(s) . internal use only
@access private
*/

function _build_attachement()
{

$this->xheaders["Content-Type"] = "multipart/mixed;\n boundary=\"$this->boundary\"";

$this->fullBody = "This is a multi-part message in MIME format.\n--$this->boundary\n";
$this->fullBody .= "Content-Type: text/plain; charset=$this->charset\nContent-Transfer-Encoding: $this->ctencoding\n\n" . $this->body ."\n";

$sep= chr(13) . chr(10);

$ata= array();
$k=0;

// for each attached file, do...
for( $i=0; $i < count( $this->aattach); $i++ ) {

$filename = $this->aattach[$i];
$basename = basename($filename);
$ctype = $this->actype[$i]; // content-type
$disposition = $this->adispo[$i];

if( ! file_exists( $filename) ) {
echo "Class Mail, method attach : file $filename can't be found"; exit;
}
$subhdr= "--$this->boundary\nContent-type: $ctype;\n name=\"$basename\"\nContent-Transfer-Encoding: base64\nContent-Disposition: $disposition;\n filename=\"$basename\"\n";
$ata[$k++] = $subhdr;
// non encoded line length
$linesz= filesize( $filename)+1;
$fp= fopen( $filename, 'r' );
$ata[$k++] = chunk_split(base64_encode(fread( $fp, $linesz)));
fclose($fp);
}
$this->fullBody .= implode($sep, $ata);
}


} // class Mail
?>

sendmail.php

<?php
$SenderName = $HTTP_POST_VARS['SenderName'];
$SenderEmail = $HTTP_POST_VARS['SenderEmail'];
$Message = $HTTP_POST_VARS['Message'];

include ("libmail.php");

$m= new Mail; // create the mail
$m->From( $SenderEmail );
$m->To( "nguoinhan@yahoo.co.uk" );
$m->Subject( "Gop y tu trang TH0302" );

$msg = 'Nguoi gui: '.$SenderName.' ('.$SenderEmail.')\nNoi dung:\n'.$Message;
$m->Body( $msg); // set the body
// $m->Cc( "someone@somewhere.fr");
// $m->Bcc( "someoneelse@somewhere.fr");
$m->Priority(4); // set the priority to Low
// $m->Attach( "/home/leo/toto.gif", "image/gif" ); // attach a file of type image/gif
$m->Send(); // send the mail


ob_start();
header("Location: ../../contact.php?do=success");
ob_end_flush();
?>

Mong như vậy có thể giúp dc bạn
dungpt2003 viết 11:34 ngày 10/10/2018
Mình tưởng gửi thư có file đính kèm thì file đính kèm đi luôn theo email chứ?

-> Nếu là trên internet thì up lên host, xin tên miền(đã có domain) sau đó bạn up file attach mà bạn cần gửi lên mạng. như trang yousendit chẳng hạn sau đó là gán link vào body(vui lòng coi code mình đã post).
Thế cái file nó hết hạn thì làm thế nào?
Nhân Tâm viết 11:31 ngày 10/10/2018
Được gửi bởi dungpt2003
Mình tưởng gửi thư có file đính kèm thì file đính kèm đi luôn theo email chứ?

Thế cái file nó hết hạn thì làm thế nào?
- Mail & file attach thì tất nhiên là luôn đi với nhau rồi.
- Còn việc upload file lên free host, gửi link vào email, nó hết hạn thì hết download, vì free mà . Đó là upload file(free host) chứ không phải attach file trong email.
ovantin viết 11:37 ngày 10/10/2018
Được gửi bởi dungpt2003
Mình tưởng gửi thư có file đính kèm thì file đính kèm đi luôn theo email chứ?

-> Nếu là trên internet thì up lên host, xin tên miền(đã có domain) sau đó bạn up file attach mà bạn cần gửi lên mạng. như trang yousendit chẳng hạn sau đó là gán link vào body(vui lòng coi code mình đã post).
Thế cái file nó hết hạn thì làm thế nào?
--Mình đã nói là ví dụ đơn giản mà. mình là sinh viên làm sao có tiền mà thuê host dc. Ngoại trừ nếu có acc xịn hehe.
--Nếu muốn link ko bao giờ die ngoại trừ bạn xóa nó thì làm trên mạng LAN đi. Cái luận văn tốt nghiệp tôi cũng demo trên mạng LAN thôi (phần chứng thực mail)
jiSh@n viết 11:37 ngày 10/10/2018
Chi phí thuê host bây giờ rất rẻ, một ngày tính ra chỉ vài ngàn đồng. cái câu SV làm gì có tiền thuê host nghe mãi chán lắm rồi.
tegieng79 viết 11:41 ngày 10/10/2018
còn phần thiết kế database thì sao ạ ? nếu mình làm trên MySQL thì như thế nào ? Đòi hỏi tối thiểu bao nhiêu table ?

to ovantin : Đồng ý với bạn, mình muốn làm demo trên mạng Lan thôi. Tức là tạo mạng Lan kết nối 1 máy chủ chạy Win server 2003 với 1 máy khách chạy Win XP. User sẽ truy cập trên máy khách thực hiện thao tác gởi email + attached file (cái ni lưu trữ trên máy chủ giống như Yahoo hay Gmail ấy).
ovantin viết 11:41 ngày 10/10/2018
Về cơ bản tôi dùng 1 bản lưu thằng user trên trang Web là đủ rồi. Nhưng do thằng client nó có thể attach file nên tôi phải làm chức năng vừa send mail vừa upload file attach lên server sau đó lấy đường dẫn của file này trên server gắn vào body để send mail.
tegieng79 viết 11:34 ngày 10/10/2018
to ovantin : mình muốn hỏi về phần design database bằng MySQL ? Bạn có thể giúp mình đc ko ?
Bài liên quan
0