顯示文章

這裡允許您檢視這個會員的所有文章。請注意, 您只能看見您有權限閱讀的文章。


文章 - hoyo

頁: [1] 2 3 ... 128
1
Linux 討論版 / Re: 請問最簡單的webmail
« 於: 2018-11-13 09:52 »
https://github.com/php-mime-mail-parser/php-mime-mail-parser 也許可用

目前流通的 PHP email parse 都有多多少少的問題,例如附件解析不出來或是該 base64 decode 卻沒有 decode

所以還是要自己拿 Mailparse  libary 自己寫遇到問題才比較容易解決

http://php.net/manual/en/book.mailparse.php

只是問題出在最開始說的,Gmail 流行了,自己搞 Mail Server 的人少了,所以相關資訊及文件相對就少了

2
Linux 討論版 / Re: 請問最簡單的webmail
« 於: 2018-11-13 09:48 »
代碼: [選擇]
<?php
ini_set
('display_errors',true);
ini_set('error_reporting',E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED);

mb_internal_encoding('UTF-8');

const 
path '/var/spool/mail';

$userArray scandir(path);
$users =array();

foreach( 
$userArray as $k=>$user ){
    if ( 
$user !='.' && $user !='..' ){
        
$users[] = $user;
    }
}

// 選取了使用者信箱
if ( $_GET['a'] =='user' ) {

    
$mail = array();
    
$m '';

    
$f path .'/'$_POST['user'];
    
$handle = @fopen($f"r");
    
$mail $body = array();
    
$i = -1;
    if (
$handle) {
        
$header true;
        while ((
$line fgets($handle4096)) != false) {
            if ( 
preg_match('/^From /'$line) ){
                
$header true;
                ++
$i;
                
$mail[$i] .= $line;
            }
            else{
                if ( 
$header == true ) {
                    
$mail[$i] .= $line;
                }
                else{
                    
$body[$i] .= $line;
                }
            }

            if ( 
preg_match('/^\n$/'$line) ) {
                
$header false;
            }
        }
        
fclose($handle);
    }
    
    
// 讀取單一信件
    
$m = array();
    foreach( 
$mail as $k=>$v ){
        
// 將信件內容丟進 mailparse 進行解析
        
$mime mailparse_msg_create();
        
mailparse_msg_parse($mime$v);

        
// 讀取信件結構 -> header & body
        
$structure mailparse_msg_get_structure($mime);
        
$parts = array();
        foreach(
$structure as $part_id) {
            
$part mailparse_msg_get_part($mime$part_id);
            
$parts[$part_id] = mailparse_msg_get_part_data($part);

            
// 將信件結構存入陣列
            
$m[$k] = $parts[$part_id];
        }
        
//print_r($m);
    
}

    
$mail = array();
    foreach( 
$m as $k=>$v ){
        
$mail[$k]['subject'] = mb_decode_mimeheader($v['headers']['subject']);
    }

    if ( 
count($m) >=){
        
$Return = array( 'Result'=>true'Data'=>$mail );
    }
    else {
        
$Return = array( 'Result'=>false );
    }
    echo 
json_encode($Return);
    exit;
}

//
if ( $_GET['a'] =='mail' ) {
    
$mail = array();
    
$m '';

    
$f path .'/'$_POST['user'];
    
$handle = @fopen($f"r");
    
$mail $body = array();
    
$i = -1;
    if (
$handle) {
        
$header true;
        while ((
$line fgets($handle4096)) != false) {
            if ( 
preg_match('/^From /'$line) ){
                
$header true;
                ++
$i;
                
$mail[$i] .= $line;
            }
            else{
                if ( 
$header == true ) {
                    
$mail[$i] .= $line;
                }
                else{
                    
$body[$i] .= $line;
                }
            }

            if ( 
preg_match('/^\n$/'$line) ) {
                
$header false;
            }
        }
        
fclose($handle);
    }
    
    if ( 
count($m) >=){
        
$Return = array( 'Result'=>true'Data'=>$body[$_POST['mail']] );
    }
    else {
        
$Return = array( 'Result'=>false );
    }
    echo 
json_encode($Return);
    exit;
}
?>

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width"/>
    <title></title>
    <style>
        *{
            font-size: 16px;
        }
        pre{
            background-color: #eee;
            border: 1px solid #aaa;
            border-radius: 8px;
            padding: 16px;
            margin: 16px;
        }
        .box{
            margin: 16px;
            padding: 16px;
            border-radius: 8px;
            border: 1px solid #ddd;
        }
    </style>
</head>
<body>

<div class="box">
    <label>選擇使用者帳號:
        <select name="user" onchange="selectUser(this)">
            <option value="">- 選擇信箱 -</option>
            <?php foreach($users as $k=>$v){ ?>
                <option value="<?php echo $v;?>"><?php echo $v;?></option>
            <?php ?>
        </select>
    </label>
</div>

<?php echo $_POST['user'];?>

<div class="box">
    <label>選取信件:
        <select name="mail" onchange="readMail(this)"></select>
    </label>
</div>

<div>信件內容:</div>
<pre id="MailBody"></pre>

<script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
<script>
    var user = '';

    function selectUser(obj){
        var $this = $(obj);
        user = $this.val();

        $.ajax({
            url: '?a=user',
            type: 'post',
            data: {
                user: $this.val()
            },
            dataType: 'json',
            success: function(json){

                var h = '<option value="">- 選擇信件 -</option>';
                if ( json['Result'] ==true ){
                    $.each( json['Data'], function(k,v){
                        h += '<option value="'+ k +'">'+ v['subject'] +'</option>';
                    } );
                }

                $('[name="mail"]').html(h);
            }
        });
    }

    function readMail(obj){
        var $this = $(obj);

        $.ajax({
            url: '?a=mail',
            type: 'post',
            data: {
                user: user,
                mail: $('[name="mail"]').val()
            },
            dataType: 'json',
            success: function(json){

                var h = '';
                if ( json['Result'] ==true ){
                    h += json['Data'];
                }

                $('#MailBody').html(h);
            }
        });
    }
</script>
</body>
</html>

獻上 hoyo 版本, MIME 格式郵件還沒繼續處理,需要的人把 mail 區段 $body 繼續解析即可

3
Linux 討論版 / Re: 請問最簡單的webmail
« 於: 2018-11-09 18:00 »
不過 maildir 對於程式的記憶體處理並沒有帶來優勢,還是需要把所有的檔案讀入才可以進行解析

解析後才可以讀出信件主旨,如此才可正確選到想讀取的信件

4
Linux 討論版 / Re: 請問最簡單的webmail
« 於: 2018-11-09 17:27 »
如果要直接解讀 /var/spool/mail 內檔案可能會有點困難

因為那是一個單大容量文字檔,信件都放在一起,讀入檔案再進行切割解讀信件應該是一件很耗硬體資源的事情

我無聊的時候寫個 php 測試看看

換成 maildir 會不會好些?

如果已經是 maildir 架構, dark 兄就不會有這個問題了

郵件已經分成一對一檔案,要讀取相對容易些

5
Linux 討論版 / Re: 請問最簡單的webmail
« 於: 2018-11-09 14:13 »
才發現 win7 後不支援 outlook 之類的讀郵件程式 ...

1. Mozilla Thunderbird
2. windows live mail 2012 (https://www.mobile01.com/topicdetail.php?f=511&t=5083767)

6
Linux 討論版 / Re: 請問最簡單的webmail
« 於: 2018-11-08 14:26 »
代碼: [選擇]
<?php
ini_set
('display_errors',true);
ini_set('error_reporting',E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED);

const 
path '/var/spool/mail';

$users scandir(path);

foreach( 
$users as $k=>$user ){
    if ( 
$user !='.' && $user !='..' ){
        echo 
$user;

        
$mime mailparse_msg_parse_file(path .'/'$user);
        
$structure mailparse_msg_get_structure($mime);
        
$parts = array();
        foreach(
$structure as $part_id) {
            
$part mailparse_msg_get_part($mime$part_id);
            
$parts[$part_id] = mailparse_msg_get_part_data($part);
            
print_r($parts[$part_id]);
        }
    }
}

把這個程式碼丟在網站內讀讀看  可以的話就是可以使用了

7
Linux 討論版 / Re: 請問最簡單的webmail
« 於: 2018-11-08 14:17 »
https://github.com/pugong/phabricator/tree/master/externals/mimemailparser

使用 php parse mail Google 就可以找到已經寫好的套件了

不過問題一樣,要先自己打開檔案讀取權限

8
Linux 討論版 / Re: 請問最簡單的webmail
« 於: 2018-11-08 13:58 »
藉由網頁透過 php 讀取 /var/spool/mail 是不可行的,除非把檔案權限設定成開放讀取

預設應該是 660 的 mail 權限, apache 並無法讀取檔案

不過如果撇開權限決心硬幹的話  那有進一步的成果再分享

9
Linux 討論版 / Re: 請問最簡單的webmail
« 於: 2018-11-08 13:45 »
如果要直接解讀 /var/spool/mail 內檔案可能會有點困難

因為那是一個單大容量文字檔,信件都放在一起,讀入檔案再進行切割解讀信件應該是一件很耗硬體資源的事情

我無聊的時候寫個 php 測試看看

10
Linux 討論版 / Re: 請問最簡單的webmail
« 於: 2018-11-08 13:24 »
我自己做了一個 webmail , 本來的用途是免費限時收信的 webmail ,後來自己寫著寫著忽然覺得發現了什麼就往正式的 mail 系統開發

https://hoyo.idv.tw/wm/

使用 PHP MySQL ,帳號、信件全部存在資料庫,收信直接使用網頁,不支援 imap 和 pop3 (哈哈哈)

---

正式的資料還沒整理完全

https://blog.hoyo.idv.tw/?p=4774

可以使用 postfix mysql Google 或是先參考下面幾個網址

https://wiki.gentoo.org/wiki/Complete_Virtual_Mail_Server/Postfix_to_Database
https://serverfault.com/questions/722137/how-to-specify-target-directory-in-postfix-with-mysql

---

有興趣的人如果多就找時間說一場,如果還是小眾就等小弟的資料或努力 Google 吧  = =a

11
sqlite3 目前只用在 APP 內

因為使用在 APP 所以資料的增減以及使用頻率就不會太頻繁  幫不上忙  sorry

而且 sqlite3 也只用過一次  也算是還沒出新手村的超新手了

12
BSD 討論版 / Re: FreeBSD IFF_RUNNING??
« 於: 2018-05-29 15:40 »

----

直接題外話

現在 storage 的主題這幾天都在搞 hadoop 可惜電腦還不夠多,還在想辦法生電腦中

初步測試起來是類似 amazon s3 的東西,不過因為找不到後續應用的場合所以已經有點懶了

13
資料庫的主題現在只想知道那些超大的大陸網路公司是怎麼使用上萬台 MySQL 的?

可惜搜尋了一堆網路資料,看了 N 個網頁、N 個 PPT 和演講影片 ,都沒有搔到癢處 ....

還是打開的姿勢不對!?

14
如果具有 「解決問題的能力」 那無論何時都還是吃的開的,而解決問題的能力也是現在企業所看重的,畢竟詐騙的人太多了

不過解決問題通常牽扯的範圍非常大,以資訊相關的話通常都要具備

1. 平台:也就是作業系統
2. 操作界面 (網站、APP)
  2.1 網站程式
  2.2 APP 嘗試
3. 資料庫

為了解決問題當然在工具的選擇上使用 OpenSource 是較佳或唯一選擇,例如要架構 WebRTC 就只有 OpenSource 可以選擇 (當然你硬要在 Windows 上裝 Nodejs, Python 然後說這是 Windows 解決方案我也無話可說了)

想要當網管自己架設網站我覺得是必要的,當然世界上的網管有 99% 都是沒有自己架設的網站,直接拿公司的主機來當白老鼠試驗的

自己架設的網站撐下來了,在公司就有底器說話可以「很大聲」

我自己架站 17 年,之前被入侵的不要不要的,後來知道眉角之後就可以把主機丟在角落不管他了

--

至於區域網路的防護及工作職責問題,你是想多了  這個時候網管只是拿來當砲灰的

如果不想當砲灰就拿出「解決問題的能力」把有資安風險的軟體及作法改進吧

15
Linux 以及 Windows 的啟動區都必須在硬碟前面

根據版本不同可以「容忍」的極限也不同,可能有些可以跨過 512G 有些就不行

16
雜七雜八 / Re: 二手的硬體能買嗎 ?
« 於: 2017-10-11 19:56 »
1. 不知道
2. 不知道

3. 會買二手的資訊硬體,例如之前買數據機就只有二手可以買
4. 二手硬碟應該是一種賭運氣的裝置
5. 應該就是大公司淘汰的 (猜的)
6. 家裡不會放 Server 只放 PC,話說,現在的 MIS 還是都沒有自己架站的經驗就直接拿公司的主機當白老鼠嗎?

-----

如果今天開公司,有另外的辦公場所,主機就有可能買二手的

不過最大的可能應該還是買 Server 機殼之後,自己組 = =a

17
時代果然進步了

現在都有 youtube 直播了

可惜現在忙、而且已經不玩音響了,沒參加真可惜

18
WD 5 年保固,只是 S.M.A.R.T 出現警告,直接丟代理商換一顆新的回來

硬碟我是決定數量才是重點,家裡一堆硬碟總和才超過 50T

現在 5 顆 10T 硬碟就有了,而且相較之下又更省電,時代很進步了

---

不是 5 年保固的硬碟都不在購買考慮內

19
Linux 討論版 / Re: linux搭建WEB服务器问题!
« 於: 2016-11-01 20:51 »
MySQL 安裝時會有假想的使用環境設定參考檔

例如以 FreeBSD 為例,路徑在 :/usr/local/share/mysql

my-*.cnf 就是不同營運環境的參考設定檔,一般懶的人都是複製一份相近的環境,或是從內複製來使用

20
到論壇問一個自己還「PS 備註」做不到的事情,問該怎麼作到?

還有兩位大大回應,我也是很醉 .... = ="

21
現在時代很進步了

拿一台 Android 手機,用 adb 指令就可以發了

23
如果不能直接 「串」 在須監控的程式動作之下

使用 「旁敲側擊」  一定有所謂的 「反應時間」 的問題

如果 Log 可以支援 RSysLog 塞進資料庫,說不定可以找到比較即時的方法

24
只用過 4T ,所以也投 4T 一票

至於品質什麼的那不是重點,備份、備援才是王道

26
肉腳版 / Re: 連內部機器的網頁
« 於: 2015-09-16 11:53 »
應該是使用類似 UPnP 的方式

27
不要放在 crontab 內執行

放在 init 內,也就是讓它開機時跟著執行

-----

無法掌握 bash shell 那迴圈就放在 pl 內

28
既然都已經 「自體」 無限迴圈執行了

那就不要在 crontab 執行了

crontab 每分鐘執行一次,當然會越累積越多

29
然後測試 sleep 起不起作用

30
先檢查一下,執行一次 myscript.pl 要多久?

頁: [1] 2 3 ... 128