mysql export import

如果要備分或是還原資料庫,遇到資料庫超過一定的大小,例如20MB之後,許多php版本的自動匯出/匯入程式都會出問題。因為php程式會受到 max_upload_size, max_execution_time等參數的限制。甚至連phpmyadmin也會有不管用的時候。

遇到這種時候,如果追求速度(不計難度),最有效率的方法,自然是透過ssh登入,直接下mysqldump指令來解決問題。

匯出: mysqldump -u 使用者名稱 -p –opt  -h localhost  資料庫名稱 > 檔案名.sql
匯入: mysql -u 使用者名稱 -p 資料庫名稱 < 檔案名.sql

然而,上述的方法,牽扯到使用ssh。這對很多只會用ftp的使用者是一大門檻。當然,也是有不需要ssh的解法。
(*) 匯出   backup your mysql database using php 

程式在這邊,使用方法:
(1) 修改這一行
backup_tables(‘localhost’,”使用者名”,”密碼”,”資料庫名”);
(2) 透過網頁來啟動這個php檔。
(3) 執行完後,這個php檔會自動生成一個mysql database的匯出檔。再用ftp下載即可。

這個程式看起來還滿複雜的,有些人心裡應該會有疑惑,明明php也可以直接呼叫 linux的指令吧? php可以做這件事,但是,在虛擬主機的環境中,為了安全性,這個直接呼叫 linux指令功能一向是被關閉的。所以才需要寫得這麼麻煩。

(*) 匯入  BigDump

使用方法如下:
(1) 在bigdump的官網上,下載bigdump.php這個檔案的壓縮檔。並且解壓縮。
(2) 修改bigdump.php的內容

$db_server = '主機名稱';(一般為localhost)
$db_name = '資料庫名稱';
$db_username = '使用者帳號';
>$db_password = '使用者密碼'

(3)  修改bigdump.php的內容

$filename = '檔案名稱.sql';
$ajax = true;
$linespersession = 3000; (設定每次還原幾筆資料)
$delaypersession = 5000; (每次間隔休息時間,設定5000為休息5秒鐘。)

(4) 將「bigdump.php」與「檔案名稱.sql」放入同一個資料夾,並上傳至伺服器。
最後打開瀏覽器輸入bigdump.php 所在網址,如: http://domain.tw/dump/bigdump.php

(5)當藍bar全滿後,出現「Congratulations: End of file reached, assuming OK」的訊息後,表示資料庫匯入完成。

如何安裝trellis help desk

(1) 下載 http://www.accord5.com/trellis/download
選擇 version 1.0.4

(2) 解壓縮之後,會有一個upload資料夾。
把這個upload資料夾的內容,上傳到public_html下

(3) 開啟 http://your-domain-name/install/
Introduction -> 點 Let’s begin
System Check -> 點 Continue
Installation Type -> 點 Continue with Guided

(4) Database Setup
填入必要的資料庫資訊,這個用cpanel來新增

(5) Create Admin Account
填入用戶名/密碼/Email 為…
TimeZone選GMT +8:00
DST Active 選 No ( 不啟用日光節約時間 )
其它不修改

(6) Configure General Settings
設定 Outgoing Email 為 support@your-domain-name

(7) Write Skin Files
按continue即可

(8) Finish Installation
按Complete installation

(9) 基於安全考慮,刪除install這個資料夾。

(10) 設定Email piping
參考
http://docs.accord5.com/Email_Piping
(a) 先設定好需要的email, 以這個case 是support@your-domain-name
(b) 在cpanel點Email Forwarders
點Add Forwarder
(c) Address的地方,填入 support
Destination地方,選 Pipe to a Program
然後填入 public_html/help/sources/pipe.php
(d) 點 Add Forwarder按鈕
// 如此設定之後,寄送到 support@your-domain-name的email會被送到helpdesk去處理。

(11) 設定語言
在 public_html/help/language/ 下,可以找到一個en,這就是它的英文的語言檔。
要翻譯的話,就是把這個檔中文化即可。

(12) 其它說明文件
http://docs.accord5.com/Main_Page

如何安裝drupal 6及中文化

(1) 下載drupal的安裝程式,解壓縮後,ftp上傳至public_html目錄下

(2) 下載中文檔http://drupaltaiwan.org/forum/20080504/2060

選 drupal-6.2-zh-hant-package.zip
下載後,把它解壓縮。可以得到三個資料夾
modules
profiles
themes
把這三個資料夾,上傳到public_html這個資料夾下。

(3) 開啟網頁,開始安裝, 就先英文安裝吧。

(4) 這時候,畫面會冒一些錯誤訊息。
只要在 public_html/sites/default/ 這個資料夾下,
複製 default.settings.php 為 settings.php

錯誤訊息按F5就會消失。

(5) 填入資料庫的訊息。
資料庫可以透過cpanel的功能來新增
然後,save and continue

(6) 最後會要你填入email,及admin的資料。
Default time zone 選 +0800
Clean URLs 選enabled
update notifications 要打勾

(7) 安裝完畢後,先來啟動中文化。
Administer > site configuration > languages 之後,
點選 Add language

然後,Language name:選 「Chinese 繁體中文」
按下 add language之後,就會啟動import

(8) 在 Administer > site configuration > languages
點選中文,為default ,並且save configuration

如何提升minecraft server的效能?

可以透過ramdisk來解決I/O的問題。具體的方法如下:

1  #yum install java-1.7.0-openjdk
2  https://minecraft.net/download
#wget https://s3.amazonaws.com/MinecraftDownload/launcher/minecraft_server.jar

Ramdisk
http://www.minecraftwiki.net/wiki/Tutorials/Ramdisk_enabled_server
(1)建新的user
#useradd mine

修改mine這個user的密碼
#passwd  mine

(2) 在/home/mine下,建下列的資料夾 minecraft  minecraft_backups  minecraft_ramdisk
#cd /home/mine
#mkdir minecraft
#mkdir minecraft_backups
#mkdir minecraft_ramdisk

然後用把ownership 改回給mine這個使用者
#chown -R mine.mine /home/mine/*

(3) 由附加檔案minecraft的內容
新增/etc/init.d/minecraft
#vim /etc/init.d/minecraft   ( 複製, 貼上 )
#chmod +x /etc/init.d/minecraft

(4) 修改 /etc/init.d/minecraft的內容,username改成mine。( 修正路徑 ) ( 下方的檔案內容中已經做此修改。)

(5) #vim /etc/fstab
增加一行:
tmpfs  /home/mine/minecraft_ramdisk tmpfs  defaults,size=512m      0       0

(6) 直接掛上ramdisk
#mount -t tmpfs none /home/mine/minecraft_ramdisk -o size=512m
下 df -h指令來檢查有沒有變化。
#df -h

(7) 修改 cronjobs
#crontab -e

*/5 * * * * /etc/init.d/minecraft disksaverun
20 */6 * * * /etc/init.d/minecraft backup

(9)加入 system V style的啟動script
#chkconfig –list
#chkconfig –add minecraft
#service minecraft start

(10) 第一次啟動minecraft server 之後,client是無法連上的。
這個原因是因為/home/mine/minecraft_ramdisk/server.properties 這個檔案裡,
online-mode=true , 這樣子的話,只有正版才可以玩。
要改成
online-mode=false,這樣子,破解版才可以玩。

(11) #service minecraft restart

 ////////////////// 下方是minecraft server 的system V init script //////////////
#!/bin/bash

# /etc/init.d/minecraft
# version 0.5 2011-09-24 (YYYY-MM-DD)

### BEGIN INIT INFO
# Provides: minecraft
# Required-Start: $local_fs $remote_fs
# Required-Stop: $local_fs $remote_fs
# Should-Start: $network
# Should-Stop: $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Minecraft server
# Description: Starts the minecraft server
### END INIT INFO

#Settings
SERVICE='minecraft_server.jar'
USERNAME="mine"
MCSTORE="/home/$USERNAME/minecraft"
MCPATH="/home/$USERNAME/minecraft_ramdisk"
CPU_COUNT=1
INVOCATION="java -Xmx2048M -Xms2048M -server -jar $SERVICE nogui"
BACKUPPATH="/home/$USERNAME/minecraft_backups/"
ME=`whoami`
as_user() {
if [ "$ME" == "$USERNAME" ] ; then
bash -c "$1"
else
su - $USERNAME -c "$1"
fi
}

mc_start() {
if ps ax | grep -v grep | grep -v -i SCREEN | grep $SERVICE > /dev/null
then
echo "Tried to start but $SERVICE was already running!"
else
echo "$SERVICE was not running... starting."
cd $MCPATH
if [ ! -f "$MCPATH/minecraft_server.jar" ]
then
echo "Ram drive empty... prepping."
as_user "cp -R $MCSTORE/* $MCPATH/"
fi
as_user "cd $MCPATH && screen -dmS minecraft $INVOCATION"
sleep 7
if ps ax | grep -v grep | grep -v -i SCREEN | grep $SERVICE > /dev/null
then
echo "$SERVICE is now running."
else
echo "Could not start $SERVICE."
fi
fi
}

mc_saveoff() {
if ps ax | grep -v grep | grep -v -i SCREEN | grep $SERVICE > /dev/null
then
echo "$SERVICE is running... suspending saves"
as_user "screen -p 0 -S minecraft -X eval 'stuff \"say SERVER BACKUP STARTING. Server going readonly...\"\015'"
as_user "screen -p 0 -S minecraft -X eval 'stuff \"save-off\"\015'"
as_user "screen -p 0 -S minecraft -X eval 'stuff \"save-all\"\015'"
sync
sleep 10
else
echo "$SERVICE was not running. Not suspending saves."
fi
}

mc_saveon() {
if ps ax | grep -v grep | grep -v -i SCREEN | grep $SERVICE > /dev/null
then
echo "$SERVICE is running... re-enabling saves"
as_user "screen -p 0 -S minecraft -X eval 'stuff \"save-on\"\015'"
as_user "screen -p 0 -S minecraft -X eval 'stuff \"say SERVER BACKUP ENDED. Server going read-write...\"\015'"
else
echo "$SERVICE was not running. Not resuming saves."
fi
}

mc_stop() {
if ps ax | grep -v grep | grep -v -i SCREEN | grep $SERVICE > /dev/null
then
echo "$SERVICE is running... stopping."
as_user "screen -p 0 -S minecraft -X eval 'stuff \"say SERVER SHUTTING DOWN IN 5 SECONDS. Saving map...\"\015'"
as_user "screen -p 0 -S minecraft -X eval 'stuff \"save-all\"\015'"
sleep 5
as_user "screen -p 0 -S minecraft -X eval 'stuff \"stop\"\015'"
sleep 5
else
echo "$SERVICE was not running."
fi
if ps ax | grep -v grep | grep -v -i SCREEN | grep $SERVICE > /dev/null
then
echo "$SERVICE could not be shut down... still running."
else
echo "$SERVICE is shut down."
fi
}
mc_update() {
if ps ax | grep -v grep | grep -v -i SCREEN | grep $SERVICE > /dev/null
then
echo "$SERVICE is running! Will not start update."
else
MC_SERVER_URL=http://minecraft.net/`wget -q -O - http://www.minecraft.net/download.jsp | grep minecraft_server.jar\ | cut -d \" -f 2`
as_user "cd $MCPATH && wget -q -O $MCPATH/minecraft_server.jar.update $MC_SERVER_URL"
if [ -f $MCPATH/minecraft_server.jar.update ]
then
if `diff $MCPATH/minecraft_server.jar $MCPATH/minecraft_server.jar.update >/dev/null`
then
echo "You are already running the latest version of $SERVICE."
else
as_user "mv $MCPATH/minecraft_server.jar.update $MCPATH/minecraft_server.jar"
echo "Minecraft successfully updated."
fi
else
echo "Minecraft update could not be downloaded."
fi
fi
}

mc_backup() {
echo "Backing up minecraft files"
if [ -f $BACKUPPATH/MCBKUP_`date "+%Y.%m.%d"`.tar.gz ]
then
for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
do
if [ -f $BACKUPPATH/MCBKUP_`date "+%Y.%m.%d"`-$i.tar.gz ]
then
continue
else
as_user "cd $MCSTORE && tar zcf $BACKUPPATH/MCBKUP_`date "+%Y.%m.%d"`-$i.tar.gz ."
break
fi
done
else
as_user "cd $MCSTORE && tar zcf $BACKUPPATH/MCBKUP_`date "+%Y.%m.%d"`.tar.gz ."
fi
echo "Backup complete"
}

mc_disksaverun() {

if ps ax | grep -v grep | grep -v -i SCREEN | grep $SERVICE > /dev/null
then
echo "Saving ramdrive to disk."
if [ ! -f $MCPATH/$SERVICE ]
then
echo "Error.. Minecraft not in ram"
else
if [ -d $MCSTORE/world2 ]
then
as_user "rm -r $MCSTORE/world2"
fi
if [ -d $MCSTORE/world ]
then
as_user "mv $MCSTORE/world $MCSTORE/world2"
fi

as_user "screen -p 0 -S minecraft -X eval 'stuff \"save-off\"\015'"
as_user "screen -p 0 -S minecraft -X eval 'stuff \"save-all\"\015'"
as_user "cp -R $MCPATH/* $MCSTORE/"
as_user "screen -p 0 -S minecraft -X eval 'stuff \"save-on\"\015'"

if [ -d $MCSTORE/world2 ]
then
as_user "rm -r $MCSTORE/world2"
fi
fi
else
echo "Service is not running"
fi

}

mc_disksavehalt() {
echo "Saving ramdrive to disk."
if [ ! -f $MCPATH/minecraft_server.jar ]
then
echo "Error.. Minecraft not in ram"
else
if [ -d $MCSTORE/world2 ]
then
as_user "rm -r $MCSTORE/world2"
fi
if [ -d $MCSTORE/world ]
then
as_user "mv $MCSTORE/world $MCSTORE/world2"
fi

echo "Saving, screen session closed"
as_user "cp -R $MCPATH/* $MCSTORE/"

if [ -d $MCSTORE/world2 ]
then
as_user "rm -r $MCSTORE/world2"
fi
fi
}
#Start-Stop here
case "$1" in
start)
mc_start
;;
stop)
mc_stop
mc_disksavehalt
;;
restart)
mc_stop
mc_disksavehalt
mc_start
;;
update)
mc_stop
mc_backup
mc_update
mc_start
;;
backup)
mc_disksaverun
mc_saveoff
mc_backup
mc_saveon
;;
disksavehalt)
mc_disksavehalt
;;
disksaverun)
mc_disksaverun
;;
status)
if ps ax | grep -v grep | grep -v -i SCREEN | grep $SERVICE > /dev/null
then
echo "$SERVICE is running."
else
echo "$SERVICE is not running."
fi
;;

*)
echo "Usage: /etc/init.d/minecraft {start|stop|update|backup|status|restart|disksaverun}"
exit 1
;;
esac

exit 0

如何在同一台機器執行兩個mysql資料庫的程式?

這個需求是這樣子產生的:某一個客戶需要客製化my.cnf檔。但是my.cnf檔的設定又會一次套用到所有的客戶上。

我查詢的關鍵字是 running multiple mysql instances on one server

參考資料 ( 這個參考資料只能當參考,我實測之後,有許多細節不同。)

修改的步驟:
(1) mkdir /var/lib/mysql2
chown mysql.mysql /var/lib/mysql2

(2) cp /etc/my.cnf /etc/my2.cnf
修改/etc/my2.cnf 的內容:
datadir=/var/lib/mysql2
port=3307

(3) cp /etc/init.d/mysql /etc/init.d/mysql2
修改/etc/init.d/mysql2 的內容:

  • 有mysqld_safe的這一行必須特別修改:       $bindir/mysqld_safe –datadir=”$datadir” –socket=”/var/lib/mysql2/mysql.sock” –pid-file=”$mysqld_pid_file_path” –port=”3307″ $other_args >/dev/null 2>&1 &
  • 修改所有的my.cnf 這個字串成為 my2.cnf
  • 修改 datadir=/var/lib/mysql 為 datadir=/var/lib/mysql2
  • 修改 lock_file_path=”$lockdir/mysql” 為 lock_file_path=”$lockdir/mysql2″

(4) chkconfig –add mysql2

(5) 理論上,要用mysql_install_db的指令來安裝新的default mysql database
mysql_install_db –datadir=/var/lib/mysql2 –defaults-file=/etc/my2.cnf –user=mysql
但是,實際上,我這樣子做之後,還是有問題,所以我後來沒使用這個指令。我把/var/lib/mysql2 這個資料夾清空之後,

cp -a /var/lib/mysql/performance_schema /var/lib/mysql2
cp -a /var/lib/mysql/mysql /var/lib/mysql2

(6) service mysql2 start

(7) mysql -h127.0.0.1 -P3307
如果可以順利登入的話,
mysql> show databases;

理論上,如果是只出現
mysql
information_schema
performance_schema

三個資料庫的話,這樣子就代表設置成功了!

mysql忘記root password

遇到這種不幸的情況,最簡單的方式,當然是使用WHM的功能,就可以簡單地重新設定。

然而,有時候,因為成本的因素,我們把cpanel/WHM的成本省下來的時候,就得用比較複雜的技巧來處理這個問題:

1  service mysql stop

2 修改 /etc/init.d/mysql
找到 mysqld_safe 這一行,加上 –skip-grant-tables

3 service mysql start

4  現在可以不用密碼登入了。
mysql  -u root
use mysql;
update user set password=password(‘yournewpasswordhere’) where user=’root’;
flush privileges;
exit;

5 service mysql restart

主機負載太高造成死當的解法

#!/bin/sh
# Bash script that checks apache:
# – If server load is higher than 20, kill web server
#
# Script to be ran as cronjob (every 5 minutes)
# */2 * * * * /path/to/httpd_check >> /path/to/httpd_check.log

echo “httpd checker running at ” `date`
check=`uptime | sed ‘s/\./ /g’ | awk ‘{print $10}’`
if [ $check -gt 20 ]
then
echo “Server load too high ($check), kill all the following program: httpd, php, mysqld”
killall httpd
killall php
killall mysqld
else
echo “Server load OK ($check)”
fi

echo “—————-“

如何設定cpanel單一帳戶的遠端自動備份?

cpanel有提供可以從外部呼叫的API,如果活用這些API,就可以做到:定時將帳戶的內容備分到遠端的ftp主機中。

實作方法:

(1) 準備好用來作遠端備分的ftp,並且在ftp的登入目錄裡,加上 /backup/AAA這個目錄,建議AAA的部分,取有意義一點的名稱,最好和網站的名稱相關。

(2)  在cpbackup.php 這個檔案之中,要先做對應的修改,總共需要改九行

// Credentials for cPanel account ( 這邊填原始,要被備分的cpanel account相關資訊 )
$source_server_ip = “”; // Server IP or domain name eg: 212.122.3.77 or cpanel.domain.tld
$cpanel_account = “”; // cPanel username
$cpanel_password = “”; // cPanel password
// Credentials for FTP remote site ( 這邊填遠端的ftp資訊 )
$ftphost = “”; // FTP host IP or domain name
$ftpacct = “”; // FTP account
$ftppass = “”; // FTP password
$email_notify = “”; // Email address for backup notification
//
// Delete any other backup before create new backup
$conn_id = ftp_connect($ftphost);
$login_result = ftp_login($conn_id, $ftpacct, $ftppass);
$logs_dir = “/backup/AAA“;
ftp_chdir($conn_id, $logs_dir);
$files = ftp_nlist($conn_id, “.”);
foreach ($files as $file){
    ftp_delete($conn_id, $file);
}
ftp_close($conn_id);
$api_args = array(
                           ‘passiveftp’,
                           $ftphost,
                           $ftpacct,
                           $ftppass,
                           $email_notify,
                            21,
                            /backup/AAA
                         );

(3) 用ftp 上傳檔案
在account的public_html  下,放上這兩個檔案,( 檔案在此可以下載,選cpbackup script )
xmlapi.php
cpbackup.php

在這邊要特別注意一點:
backup這個功能,因為相對消耗資源,放在public_html下,是說可以透過browser來啟動,很方便。但是,如果是很容易被攻擊的網址。就最好不要放在這麼明顯的地方。

(4) 此處,有兩種方法可以執行這個php來做檔案的備分:
(a)  在browser上, http://你的域名/cpbackup.php
(b)  用該account的id/pw ( 不要用root的 )   ssh 登入這個account, 然後下指令     php -q /home/你的帳戶名稱/public_html/cpbackup.php 

理論上,出現的message應該是長成這樣子:

Warning: ftp_delete(): Could not delete .: Invalid argument in /home/blog66rr/public_html/cpbackup.php on line 28
Warning: ftp_delete(): Could not delete ..: Invalid argument in /home/blog66rr/public_html/cpbackup.php on line 28
{“apiversion”:”1″,”type”:”event”,”module”:”Fileman”,”func”:”fullbackup”,”source”:”module”,”data”:{“result”:””},”evenls -l /home/blog66rr/public_html/cpbakcup.php

這樣子,資料應該就會備分到你的ftp了。

另外,週期性執行不一定需要。如果說只做一次的話,就不用這麼麻煩。用這個方式,因為是透過ftp的關系,比較不會受到browser 斷線的問題。ftp比較適合處理這種大型的backup檔。

(5) 用該account的id/pw ( 不要用root的 )   ssh 登入這個account
下指令:
crontab -e

這樣子是設定每天備分:
0 0 * * *   php -q /home/你的帳戶名稱/public_html/cpbackup.php
這是每週備分
@weekly    php -q /home/你的帳戶名稱/public_html/cpbackup.php
這是每月備分
@monthly  php -q /home/你的帳戶名稱/public_html/cpbackup.php

(6) 最後還有一個但書。在用來backup的ftp這邊,會有一個問題:檔案愈積愈多。所以在用來backup的ftp主機這邊。最好也設置工作排程 ( cronjob )

find /path/to/files* -mtime +5 -exec rm {} \;

這個指令的意思是:到 /path/to/files* 這邊,找出超過5天沒有使用的檔案,將它刪除。

 

(備註:unethost.com虛擬主機,已有每日自動異地備份)

主機商選購指南

本篇文章是一篇帶有強烈置入性行銷的文章。請大家多多包涵。

作為一個主機商,由於客戶中有許多常常三天兩頭有被DDoS, 被放木馬之類的問題,本公司在累積了無數的經驗(?客訴)之後, 對於安全性的議題有著異常的執著與重視。要提高安全性,確保php程式碼沒有漏洞的部分,是客戶端在管的。但是,要確保php的版本沒有漏洞的部分,則是主機商的事。

升級php, 升級mysql, 升級apache, 更換ip,這一類的事,由於會影響到客戶的程式,對於主機商而言算是苦差事。但是,不升級也不行。不升級的話,漏洞就會一直存在。是否應該升級?何時最好一定要升級,其實這個問題,也是有客觀的參考。

以美國的五大主機商為例子,hostgatorwebhostingpad都已經升級PHP 5.3了。( 這些資訊,我是直接用官網去查的 )

而台灣地區,搜尋「虛擬主機」這個關鍵字,google出來第一頁的主機商之中,大間的5、6家裡,幾乎都還是使用PHP 5.2.17版。(台灣的同胞怎麼這麼不重視資訊安全啊? 這不是已經應該要升級很久了嗎? )只有一家有升級PHP 5.3。這一家,呃,當然不是敝公司,因為unethost.com的google rank在很多頁之後。但是,本公司升級PHP 5.3是老早以前的事。官網的主機已經升級到 PHP 5.3.22版了。

最後要在這邊順便講解一下,如何看php的版本。如果是用chrome來當browser 的話,先按Ctrl + shift + i,選Network,按F5,之後,點選一個php網頁。看到最下方,應該會有一串字串 X-Powered-By:,例如:

X-Powered-By: PHP/5.3.22

這就是了!

用Madmimi來發電子報

之前就有聽人介紹Madmimi的EDM服務,最近公司也來用一下吧。想收到電子報的請按這邊註冊。

本來以為一切會順利無比,想不到,到了電子報要發出去的前一刻,才收到Madmimi官方的關切信函。一開始的信函內容是這樣子的:

Hi Laurence,

Macdara here 🙂 I see you’re ready to send your promotion off, sweet!

I just need a little info before I can get you verified. Let me know how your contacts signed up and agreed to hear from you when you get the chance. This way we can be sure to get you overall awesome sending!

Cheers,

Macdara

非常客氣地問我,我發電子報的連絡人是從哪裡來的? 於是我回信,這是從官網的whmcs系統中匯出的。想不到,Madmimi的官方還是不讓我過關,又來了一封信問得更詳細了:

Hi Laurence,
Thanks for getting back to us! I’m happy to get you sending shortly. Will you let me know how you gathered the contacts you didn’t collect from http://unethost.com/whmcs? It’s important that all the contacts you’re sending to gave you their permission to send to them.

Also, did the registration or opt-in process on the Unethost.com site specify these contacts were agreeing to hear from you via email?

I’m not trying to give you a hard time – we ask these questions of all our users to make sure you’ll inbox successfully 🙂

Best,

Kate

像這樣子這麼嚴格的問法,實在讓人心生放棄的念頭。在上頭的信函裡,Madmimi問我,「這些註冊的email,他們有沒有同意我寫信給他們?」 還問我,「在註冊的過程中,有沒有問人家,我可以寄信給你嗎?」

像我這麼含蓄內向的人,我怎麼好意思沒事亂發email給人家呢!所以我最後回信給對方的理由,我就寫得理直氣壯,大意是說『雖然我沒有問過可否發信的事,但是全部都是我的客戶』,  順便附上我從官網匯出的連絡名單原始檔。

I create two list: One name is whmcs, the other is firend. Just as the name
goes, one contact list is from whmcs system, and the other contact consists of my firends. As for the friend contact, I am sure that I have asked them. The registration process on Unethost.com does not ask this kind of email question. This is limited
by software system.

However, I am sure that my clients they permit my sending email to them.
WHMCS is a helpdesk system. If my client has problems, he will submit tickets
to my help desk system. At the meanwhile of submitting ticket, he will receive
his ticket from email too. Therefore, he can then just send and receive
tickets by email. If you take a look of my website, all the articles in
knowledge base, and files in download area, we do not require client login.
Given that anyone can get most of the free resources from our website, why
they choose to login? I believe the answer is obvious, because they are my
clients.

I provide objective information for you to justify my saying. The attachment
is the original file that I exported from WHMCS system.

最後,Madmimi官方回給我的信,還是讓我滿感動的 –> 他們終於相信我不是在亂發垃圾信了!

I really appreciate the detail. Thanks for taking the time to explain it so
well 🙂

It’s all I needed to hear, so I’ve verified your account and have sent your
email on its way now.