Postfix + Cyrus-IMAP + Cyrus-Sasl + MySQL + IMP Configuration Guide

xiaoxiao2021-03-06  14

CNGNU PostFix Mail System Series Guide

Postfix Cyrus-IMAP Cyrus-Sasl MySQL IMP Full Guide

Author: Wang Xingyu

Version: 0.71

Copyright: GPL

Release Date: 2003-02-04

table of Contents

1 Overview

1.1. Purpose

1.2. Update history

1.3. Todo

1.4.

2. System function

3. Basic premise of system

4. Install MySQL

4.1. Download

4.2. Compilation and installation

4.3. Run

4.4. Test

4.5. Creating a database

5. Install PAM_MYSQL

5.1. Download

5.2. Compilation and installation

5.3. Configuration

6. Configure Cyrus-SASL

6.1. Configuration

6.2. Run

7. Install Postfix

7.1. Download

7.2. Compilation and installation

7.3. Configuration

7.4. Run

7.5. Test

8. Install Cyrus-IMAP

8.1. Download

8.2. Compilation and installation

8.3. Configuration

8.4. Run

8.5. Test

9. Install IMP

9.1. Download

9.2. Configuring Apache / PHP

9.3. Configuring Horde

9.4. Configuring IMP

9.5. Configuring Turba

9.6. Test IMP

10. Others

10.1. Start the script

10.2. Overall test

1 Overview

1.1. Purpose

This article tries to describe how to install a fully functional mail system on a Linux platform. Here we do SMTP servers with Postfix, CYRUS-IMAP makes POP3 / IMAP4 servers, verify and authorize users stored in the MySQL database via Cyrus-SASL, and use IMP to provide a perfect webmail interface.

The design goal of this mail system is to provide an expandable and multi-functional mail system.

The latest version of this article can be found here: http://www.cngnu.org/technology/postfix_i.html. If you want to use Courier-IMAP to replace the Cyrus-IMAP to do an IMAP / POP3 server, you can see this article http://www.cngnu.org/technology/postfix_ii.html.

The technical issues related to this article, please go to http://www.anti-spam.org.cn/forums/, I will reply as soon as possible, please do not send me an email on the technical issue.

The copyright of this article follows the GPL, which can be arbitrarily spread without removing copyright information and indicating the modification.

1.2. Update history

2002-05-21 First release, version 0.20. 2002-08-13 Fix some errors, version 0.21. 2002-08-23 Fix some errors, version 0.22. 2002-09-12 Tests on Redhat Linux Advance Server V2.1, fixes some errors, version 0.30. 2002-12-12 Fixed some errors and added the contents of the IMP part, version 0.31. 2003-01-30 Fixed some errors, adding the contents of the non-text password, version 0.32. 2003-02-05 Fixed some errors, version 0.33 2003-03-26 Using SASL V2 and Cyrus-IMAP 2, support new Linux distributions using DB4, such as Redhat 8.0 and Mandrake 9.0, and Demon as Redhat 8.0 platform. Fixed some errors, version 0.40. 2003-03-28 Fixed some mistakes, especially bjchenxu, version 0.41. 2003-09-24 Added a virtual domain function, amended some incorrect, version 0.50. 2003-10-13 Fixed an error in the virtual domain, version 0.51. 2003-12-02 Fixed some errors, version 0.52. If there is no other input error problem, this article will not be updated. 2004-01-29 did a large change, version 0.70. Take AS3 as a demonstration platform. What is crazy is when I am about this modification, actually because of a script error in Dreamweaver caused me to have a clean job in the hard work of one night. I cried ~. This modification involves various parts of SASL, MySQL, and Cyrus-IMAP. Follow the principles of minimum modifications, all parts provided in AS3 are available, I will no longer recompile, which may have a larger for porting to other platforms or versions. difficult. 2004-02-04 Fixed some incorrectly. 1.3. Todo

Increase the message list function to add the content of the SSL section: I hope that the ability to have the ability can translate this article as English, so foreign friends can also see

1.4.

Thank you for your fingering of Lesson.ward, Yunping Zhu, Temp, Bjchenxu. Thanks to Chinaunix.Net and Anti-Spam.org.cn's attention and suggestions.

Reference document: http://www.delouw.ch/linux/postfix-cyrus-web-cyradm-howto/html/index.html. At the beginning of this article, refer to this article, this article is also constantly updating, you can also look at it.

2. System function

System logical structure:

----------------------------------- -

| | |

| 25/25 25/25 110/993 143/995 80/443 |

| Incoming outgoing pop3 IMAP web-mail |

| / / / / / / / /

| | || || || || || |

| / / / / / / / /

------------------------------------- -

Postfix | | IMP || | ---------------

| | CYRUS-IMAP |

| -------------------------------------------

| | CYRUS-SASL |

| -------------------------------------------

| | Saslauthd |

| -------------------------------------------

| | PAM |

| -------------------------------------------

| | PAM_MYSQL |

------- ----------------------------------------- -

| Mysql |

----------------------------------- -

The entire system-external interface consists of several parts, using SMTP, used to recruit POP3 and IMAP, as well as a web interface to use the system. There is no management tool for the web interface here, and you need to develop it according to actual needs. If a commercial application is required, you can purchase CEM products (http://cngnu.net/products/cers/car), including a complete management interface and an optimized mail server environment.

Mysql as the core of storing data in the system, which stores the user's information. This information is not only used for POP3 / IMAP and SMTP AUTH, but also provides list and forwarding functions of local recipients for Postfix.

  certified process is more cumbersome. The entire authentication is made through Cyrus-SASL, and the authentication needs are listened by running a daemon saslauthd. Saslauthd This uses a PAM authentication to find the mysql database through the PAM_MYSQL plugin.

System supports virtual domain users and non-virtual domain mailboxes.

Why choose these components to make this mail system?

Select Postfix as MTA because it is a very excellent MTA server, which is not only excellent in performance, but also has a compatibility of Sendmail, support and a variety of other software, and itself has strong anti-spam function. .

Select MySQL as part of the storage user information, because the on-one mysql itself is a lightweight database, very fast when processing a small amount of data, and more easily manages user information and provides more user characteristics ( If the basic per user is filtered), it also eliminates the security hazards due to the use of system users.

Select Cyrus-SASL as an authentication mechanism because it is a standard authentication layer, and most software supports its certification.

Choose Cyrus-IMAP as an IMAP / POP3 server because its IMAP / POP implementation is high, it is much higher than the implementation of Courier-IMAP, although it is therefore used by the MaildIr / format definition of the standard QMAIL. Different. There are several aspects of this system in the future: First, use a higher version of Cyrus-SASL to directly support the Query authentication of MySQL, avoid using Saslauthd => PAM => PAM_MYSQL, such as the Luo Wei; High versions of Cyrus-IMAP, more direct support for virtual domains, do not need to do aliasing forwarding now to be implemented.

3. Basic premise of system

This article focuses on Linux systems, supports most Linux platforms such as redhat 7.x / 8.x / 9.x / as2.1 / as3, mandrake 8.x / 9.x, etc., theoretically support Other Linux distributions, and even other UNIX systems.

Here is the description platform in Redhat Linux Advance Server Enterprise V 3.0 (hereinafter referred to as AS3). I use the most basic AS3 installation, only select "Web Server", "DNS Name Server", "MySQL Database Server", "Development Tools", "Core" and "Base" such as "Kernel Development". The group is a default necessary package).

In addition, you also need to install the following RPM:

1, PHP-MySQL-4.3.2-8.Ent.i386.rpm (in CD3)

4. Install MySQL

4.1. Download

The AS3 default is to include only the part of the server program except the server program, so you need to download MySQL from RPMFind (preferably using the source package, using the RPM and BIN packs provided by mysql.com) may compile some other parts of other use mysql An error occurs).

[root @mail root] # CD / usr / src [root @ mail src] # wget ftp://rpmfind.net/linux/redhat/enterprise/3/EN/OS/i386/srpms/mysql-3.23.58- Zrc.rpm

4.2. Compilation and installation

[root @mail src] # rpmbuild --rebuild mysql-3.23.58-1.src.rpm [root @ mail src] # cd redhat / rpms / i386 [root @ mail i386] # rpm -ivh mysql-server-3.23 .58-1.i386.rpm

In order to improve the security of MySQL, let it listen to the local ring port, modify /etc/my.cnf:

[root @ Mail i386] # cd [root @ mail root] # vi /etc/my.cnf

Add: in the [MySQLD] section:

Bind-address = 127.0.0.1

And set it automatically when it is turned on:

[root @mail root] # chkconfig --level 0123456 mysqld on

4.3. Run

The start command is as follows:

[root @ Mail i386] # /etc/init.d/mysqld start

4.4. Test

After starting mySQL, first check the log / var / log / messages has error messages, then check the process, there should be the following process:

[root @mail root] # pstree | grep mysqld | -safe_mysqld --- mysqld  then check the port, there should be the following ports to open:

[Root @ mail root] # netstat -an | grep LISTEN tcp00 127.0.0.1:33060.0.0.0:*LISTEN

4.5. Creating a database

After the Mysql installation is configured, create the following SQL script mail.sql:

CREATE DATABASE mail;. GRANT ALL ON mail * TO mail @ localhostIDENTIFIED BY "secret"; FLUSH PRIVILEGES; USE mail; CREATE TABLE USER (ID int (10) unsigned NOT NULL auto_increment, USERNAME varchar (128) NOT NULL default '', Password varchault ', forward varchar (128) Not null default', Domain varchar (64) Not null default ', mail varchault', filter varchault ', filter varchar (64) Not, FILTER VARCHAR (64) NOT Null Default 'OK', Partition Varchar (32) Not Null Default 'Default', Quota Int (11) Not Null Default '10485760', Status Tinyint (4) Not Null Default '1', Primary Key (ID), Unique Key USERNAME (USERNAME), UNIQUE KEY MAIL (MAIL)) TYPE = MyISAM; INSERT INTO USER (USERNAME, PASSWORD, FORWARD, DOMAIN, MAIL) VALUES ( 'trueuser', '$ 1 $ pi.WVgBx $ a3dUCzBnbY76jnZlqWQCQ /', 'trueuser' , 'CNGNU.ORG', 'TRUEUSER@cngnu.org'), ('VirtualUser@cngnu.org', '$ 1 $ PI.WVGBX $ A3duczbnby76jnzlqwqcq /', 'VirtualUser ~ CNGNU.ORG', 'CNGNU.org', 'VirtualUser@cngnu.org');

[root @mail root] # mysql

Create a mail user database in MySQL and add two test mailbox:

Non-virtual domain mailbox "Trueuser", password is "TestPW" virtual domain mailbox "VirtualUser@cngnu.org", password is "testpw"

The USER table of the above Mail database is used to save user information:

UserName and Password fields are user names and MD5-Crypt passwords. Username is not only authenticated, but also local mailbox lookup conditions (see Postfix's Virtual.mysql). The encrypted password is used here for better security. for

Non-virtual domain mailbox: username field is the local part of the message ("@" front section) Virtual domain mailbox: username field is the password of the mail address is "TestPW", encrypted (MD5-Crypt) ciphertext is " $ 1 $ PI.WVGBX $ A3duczbnby76jnzlqwqcq / "(You can add a user through the system's passwd command, generate a password, then copy from / etc / shadow.) The Forward field defaults to the user's" storage mailbox "name (Cyrus- The mailbox name managed by IMAP is local delivery; if the Forward field is another username or mail address, the message is forwarded to other users or other email addresses. For non-virtual domain mailbox: The same virtual domain mailbox with the user name: In order to support multiple domains, considering that different domains may have the same username (local part), so using the message is fully named as the user's login (POP) / IMAP's login name and SMTP authentication login name), but because Cyrus-IMAP does not directly support virtual domain (although you can create mailbox with "@", you support virtual domains in Cyrus-IMAP 2.2.x, but current version Or test version), you cannot contain "@" in the local part of the message, so the actual storage mail box name replaces "@" to "~". (See the Cyrus-IMAP section below) In addition, because Postfix is ​​surprisingly distinguished by the mailbox, the difference in case can be eliminated by this forwarding. The Domain field is used to quickly find the mailbox existing in a certain domain, only for management. The MAIL field is a full name of the email address. For non-virtual domain mailboxes, it contains domains outside the local part; for virtual domain mailboxes, it is the same as the UserName field. On the one hand, it is for easy use, and this field is also used to perform global filtering control Filter's lookup condition (see Filter field and filter filter. Mysql). The FILTER field is used to control whether the mailbox accepts the server's global mail filtering. This value is set to "OK" or empty indicates that the mailbox is not filtered; set to "dunno" means a global filtering of the mailbox for postfix. This value can be any legal POSTFIX ACCESS filtering rule. Partition fields are used to indicate the Cyrus-IMAP partition stored in the mailbox. Multiple different mail partitions can be created. For convenient use only. The quota field specifies the disk limit of the mailbox. For convenient use only. The STATUS field is used to indicate whether the user is valid, and a user can be disabled by modifying the value of 0.

5. Install PAM_MYSQL

5.1. Download

  http://sourceforge.net/projects/pam-mysql/

[root @mail root] # CD / usr / src [root @ mail src] # wget http://telia.dl.sourceforge.net/sourceforge/pam-mysql/pam_mysql-0.5.tar.gz

  Note: If you cannot access the website to get PAM_MYSQL, please use the proxy server to access itself.

5.2. Compilation and installation

Compile PAM_MYSQL:

[root @mail src] # tar -zxf pam_mysql-0.5.tar.gz [root @ mail src] # CD PAM_MYSQL

Modify the source code of PAM_MYSQL.C and remove the debug message:

[root @ Mail Pam_Mysql] # vi 54 pam_mysql.c  will be as follows:

#define debug

Modifications to:

/ * #define debug * /

Then compile:

[root @ mail pam_mysql] # make [root @ mail pam_mysql] # CP PAM_MYSQL.SO / LIB / SECURITY

In some cases, this compilation will report an error, but if compiled can generate the PAM_MYSQL.SO module, it is still possible.

5.3. Configuration

Create /etc/pam.d/mail, which is used to support Cyrus-IMAP IMAP authentication, POP authentication and postfix SMTP authentication:

[Root @ mail pam_mysql] # cd /etc/pam.d[root@mail pam.d] # echo auth sufficient pam_mysql.so user = mail passwd = secret /> host = localhost db = mail table = USER usercolumn = USERNAME passwdcolumn = Password /> CRYPT = 1 SQLLOG = 0> /etc/pam.d/mail[Root@mail pam.d] # echo account required PAM_MYSQL.SO user = mail passwd = secret /> host = localhost db = mail table = User UserColumn = Username PasswdColumn = password /> CRYPT = 1 SQLLOG = 0 >> /etc/pam.d/mail[Root@mail pam.d] # echo auth sufficient pam_unix_auth.so >> /etc/pam.d/mail [root @ Mail Pam.d] # echo account sufficient pam_unix_acct.so >> /etc/pam.d/mail

Here, the front two lines refer to authentication users through the MySQL database, and the back two lines refer to the basic way of UNIX (ie system users). Here we keep UNIX system authentication mode because we should manage the Cyrus-IMAP mailbox by system user Cyrus. However, you can also choose to put this administrative account Cyrus in the MySQL authentication database, just add a Cyrus user in the database.

By giving different values ​​to the above Crypt, you can use a variety of password storage:

Crypt = 0: Indicates the use of clear text to store the password. The benefits of such storage are simple, but not safe enough. Crypt = 1: Represents the DES encryption method using the UNIX system to store. That is, the typical UNIX / etc / passwd (old system encryption port is stored here) or / etc / shadow stored in the encryption password stored in this here. There are two kinds of encryption, one is ordinary DES encryption, also called crypt (), this password is 13 long, the front two characters are encrypted seeds; there is a use of the MD5 algorithm to enhance, also Called MD5 CRYPT (), the encrypted seed of this password is 12 characters starting with $ 1, the password is uncertain. Crypt = 2: Indicates the use of MySQL's SQL function password () encryption mode to store. Crypt = 3: Indicates the use of MD5's hash method to store. This approach is not the same as MD5 CRYPT (). Generally, if you use the Crypt = 1 mode if you migrate a virtual user using the database, you can use the Crypt = 1 mode, and the system automatically distinguishes two encryption passwords. If you need to develop a user to modify the password, the CRYPT function in C and Perl cannot support the MD5 CRYPT () password, and you need to use additional programming or modules to support.

Make a symbolic link /etc/pam.d/imap, which is used to support the IMAP authentication of Cyrus-IMAP:

[root @mail pam.d] # [-f imap] && mv imap IMAP.ORIG [root @ mail pam.d] # ln -s mail ivap

Create /etc/pam.d/pop, which is used to support Cyrus-IMAP POP3 authentication:

[root @ mail pam.d] # [-f pop] && mv pop pop.orig [root @ mail pam.d] # ln mail POP

Create /etc/pam.d/smtp, which is used to support Postfix's SMTP Auth certification:

[root @ mail pam.d] # [-f smtp] && mv smtp.orig [root @mail pam.d] # ln -s mail smtp

These files may already exist on the system, and the original rename is backed up or deleted.

6. Configure Cyrus-SASL

6.1. Configuration

  3 default installation Cyrus-SASL can meet the needs of this mail system, generally do not have to recompile.

Set Postfix Use SASL's SaslauthD certification daemon to support SMTP Auth certification, and only opens the Plain and Login authentication modules:

[root @mail pam.d] # cd [root @ mail root] # echo pwcheck_method: saslauthd> /usr/lib/sasl2/smtpd.conf[Root@mail root] # echo mech_list: plain login >> / usr / lib /ssl2/smtpd.conf

RUS-IMAP SASL Configuration Does Not Using Standard SASL syntax, its configuration file is placed in /etc/imapd.conf, which is described in detail in the Cyrus-IMAP section.

Configure SaslauthD to use the PAM authentication scheme:

[root @mail root] # vi / etc / sysconfig / saslautd

The content is as follows:

Mech = PAM

Modify / etc / sysconfig / saslauthd and set Saslauthd to Automatically run [root @ mail root] # chkconfig --level 0123456 Saslauthd on

6.2. Run

Run the SaslauthD daemon and make it use PAM authentication mode to provide authentication information:

[root @mail root] # /etc/rc.d/init.d/saslauthd start

The authentication mechanism used throughout the system is more complicated. All applications (SMTP, IMAP, POP3, etc.) are authenticated by SASL2 SASLAUTHD; SASLATHD is certified by user information stored in the mysql database with the PAM_MYSQL interface with the PAM mode supported by it. See the system structure above to understand the authentication process.

7. Install Postfix

7.1. Download

  http://www.postfix.org/ftp-sites.html

[root @mail root] # CD / usr / src [root @ mail src] # wget http://postfix.nergyBeam.com/source/official/postfix-2.0.16.tar.gz

7.2. Compilation and installation

If you have sendmail on your system, stop it and rename it files:

[root @ mail src] # /etc/init.d/sendmail stop [root @ mail src] # chkconfig --level 0123456 sendmail off [root @ mail src] # mv / usr / bin / newaliases / usr / bin / newaliases .orig [root @mail src] # mv / usr / bin / mailq /usr/bin/mailq.orig[Root@mail src] # mv / usr / sbin / sendmail /usr/sbin/sendmail.orig

Then add two groups: Postfix and Maildrop and a user: postfix

[root @ mail src] # groupadd -g 400 postfix [root @ mail src] # groupadd -g 401 postdrop [root @ mail src] # @ UserAddd -u 400 -g 400 -c postfix -m -d / no / where - S / no / shell postfix

The group and the user's ID here is the ID unused in the system.

Compile Postfix and support MySQL and SASL:

[root @ mail src] # tar -xvzf postfix-2.0.16.tar.gz [root @ mail src] # cd postfix-2.0.16 [root @ mail postfix-2.0.16] # Make -f makefile.init makefiles /> 'Ccargs = -duse_sasl_auth -dhas_mysql -i / usr / include / mysql -i / usr / include / sasl' /> 'auxlibs = -l / usr / lib / mysql -l / usr / lib / sasl2 -lmysqlclient - Lsasl2 -lz -lm '[root @ mail postfix-2.0.16] # make install

When installing, the installer will ask questions, you can use the default value directly to press the carriage return.

Here, remember to specify the correct SASL2 of the include and lib locations. Since there are still SASLs on a lot of Linux releases, if not specified, different versions of header files and libraries are likely to use, in which case SMTPD will fatally errors each time it is connected. "Fatal: SASL PER-Connection Server Init ..." crashes. Make a system alias for Postfix users and forward superuser mailboxes to an ordinary user. Use the / etc / postfix / aliases alias database:

[root @mail postfix-2.0.16] # cd / etc / postfix [root @ mail postfix] # echo 'root: virtualuser@cngnu.org' >> / etc / postfix / aliases

Generate / etc / postfix / aliases alias database:

[root @mail postfix] # Postalias / etc / postfix / aliases

Generate / etc / postfix / virtual DB library:

[root @mail postfix] # Postmap Virtual

The Virtual library that retains the DB format is for the convenience of temporary increase in the system.

7.3. Configuration

Modify /etc/postfix/master.cf About Cyrus configuration, (Cyrus's command line and where you are not compatible, make sure your Cyrus parameters use -r $ {sender} parameters):

[root @mail postfix] # vi master.cf

Will be as follows:

Cyrus UNIX - N N - - PIPE  = cyrus argv = / cyrus / bin / deliver -e -r $ {sender} -m $ {extension} $ {user}

Modifications to:

CYRUS UNIX - N N - PIPE = / usr = cyrus argv = / usr / cyrus / bin / deliver -e -r $ {sender} -m $ {extension} $ {user}

Here you must modify the path of Cyrus to your Cyrus actual installation path (we will install Cyrus-IMAP to / usr / cyrus below). Remember User = ... The front is contraced in space (the continuation of the last line).

[root @mail postfix] # vi main.cf

Modify /etc/postfix/main.cf configuration:

myhostname = mail.cngnu.orgmydomain = cngnu.orgmyorigin = $ mydomainmydestination = $ mydomain, $ myhostnamemynetworks_style = host alias_maps = hash: / etc / postfix / aliasesalias_database = hash: / etc / postfix / aliases home_mailbox = Maildir / mailbox_transport = cyrusfallback_transport = cyrus virtual_maps = hash: / etc / postfix / virtual, mysql: /etc/postfix/virtual.mysql smtpd_sasl_auth_enable = yesbroken_sasl_auth_clients = yessmtpd_sasl_security_options = noanonymous smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, check_recipient_access mysql: /etc/postfix/filter.mysql, reject_invalid_hostname, reject_non_fqdn_hostname, reject_unknown_sender_domain, reject_non_fqdn_sender, reject_non_fqdn_recipient, reject_unknown_recipient_domain, reject_unauth_pipelining, reject_unauth_destination, permit if you want to support more virtual domain, you can add the domain to be supported later in mydestination parameters.

The mailbox local query table is provided for the system via Virtual and Virtual.mysql.

Use SASL to perform SMTP letter authentication.

The basic anti-spam function is provided via SMTPD_Recipient_RESTRISTRICTIONS. First allow the local network (here this is this unit) and users authenticated by SASL can use this server to send information; then check if the global email filtering of each user is open, and if the shutdown does not perform the back anti-spam check; It is some basic anti-spam feature supported by Postfix.

Create /etc/postfix/virtual.mysql, which provides local users and email forwarding features. The Forward field defaults to the user's storage mailbox name (the mailbox name managed by the Cyrus-IMAP), which is local delivery; if the Forward field is another username or email address, the message is forwarded to other users or others. Email address. for

Non-virtual domain mailbox: It stores the same virtual domain mailbox with the username: In order to support multiple domains, considering that different domains may have the same username (local part), so using the message is fully named as the user's login name (POP / IMAP's login name and SMTP authentication login name), but because Cyrus-IMAP does not directly support virtual domains, the local part of the message cannot contain "@", so the actual storage mail box name will "@" replace "~".

[root @mail postfix] # vi virtual.mysql

## mysql config file for alias lookups on postfix # # the user name and password to log into the mysql serverhosts = localhostuser = mailpassword = secret # the database name on the serversdbname = mail # the table nametable = USER select_field = FORWARDwhere_field = USERNAMEadditional_conditions = And status = 1 limit 1 [root @mail postfix] # vi filter.mysql

## mysql config file for filter flag on postfix # # the user name and password to log into the mysql serverhosts = localhostuser = mailpassword = secret # the database name on the serversdbname = mail # the table nametable = USER select_field = FILTER # OK: Ignore Filter # dunno: filter where_field = mail additional_conditions = and status = 1 limit 1

7.4. Run

The start command is as follows:

[root @mail postfix] # / usr / sbin / postfix start

7.5. Test Postfix

After starting Postfix, first check the log / var / log / messages, there is no error message, then check the process, there should be the following process: check the port and process:

[root @mail postfix] # pstree | grep master | -master - - Pickup

Then check the port, there should be the following ports to open:

[root @mail postfix] # netstat -an | grep listen tcp                                                                        

  No SMTP service is normal:

[root @mail postfix] # telnet localhost 25trying 127.0.0.1 ... connection character is '^]'. 220 mail.cngnu.org esmtp postfixquit221 byeconnection closed by foreiign host.

Use the following command to test the SMTP authentication of Postfix ("VirtualUser@cngnu.org" here, "Trueuser" is tested, "

PLAIN authentication method:

[Root @ mail postfix] # perl -MMIME :: Base64 -e /> 'print encode_base64 ( "virtualuser / @ cngnu.org / 000virtualuser / @ cngnu.org / 000testpw");' dmlydHVhbHVzZXJAY25nbnUub3JnAHZpcnR1YWx1c2VyQGNuZ251Lm9yZwB0ZXN0cHc = [root @ mail postfix] # telnet localhost 25Trying 127.0.0.1 ... Connected to localhost.Escape character is '^]'. 220 mail.cngnu.org ESMTP PostfixEHLO cngnu250-mail.cngnu.org250-PIPELINING250-SIZE 10240000250-VRFY250-ETRN250-AUTH LOGIN PLAIN250- AUTH = LOGIN PLAIN250-XVERP250 8BITMIMEAUTH PLAIN dmlydHVhbHVzZXJAY25nbnUub3JnAHZpcnR1YWx1c2VyQGNuZ251Lm9yZwB0ZXN0cHc == 235 Authentication successfulQUIT221 ByeConnection closed by foreign host [root @ mail postfix] # perl -MMIME :: Base64 -e /> 'print encode_base64 ( "trueuser / 000trueuser / 000testpw").; 'DHJ1zXVZXIADHJ1ZXVZZXIADGVZDHB3Login authentication method:

[root @mail postfix] # perl -mmime :: base64 -E /> 'print encode_base64 ("Virtualuser/@cngnu.org");' DMLYDHVHBHVZXJAY25NBNUB3JN [root @ mail postfix] # perl -mmime :: base64-E /> 'print encode_base64 ( "testpw");' dGVzdHB3 [root @ mail postfix] # telnet localhost 25Trying 127.0.0.1 ... Connected to localhost.Escape character is '^]' 220 mail.cngnu.org ESMTP PostfixEHLO cngnu250-mail. .cngnu.org250-PIPELINING250-SIZE 10240000250-VRFY250-ETRN250-AUTH LOGIN PLAIN250-AUTH = LOGIN PLAIN250-XVERP250 8BITMIMEAUTH LOGIN334 VXNlcm5hbWU6dmlydHVhbHVzZXJAY25nbnUub3Jn334 UGFzc3dvcmQ6dGVzdHB3235 Authentication successfulQUIT221 ByeConnection closed by foreign host [root @ mail postfix] # perl -MMIME :: Base64. - E /> 'Print Encode_base64 ("Trueuser");' DHJ1ZXVZZXI = [Root @ Mail Postfix] # perl -mmime :: Base64 -E /> 'Print Encode_base64 ("TestPW");' DGVZDHB3 At this time, due to still No Cyrus-IMAP is installed and create an email, so you can't submit the message, please continue next.

Use the mime :: base64 module inside in Perl (if you need to install: perl -mcpan -e 'install mime :: base64;') to get this verification string: perl -mmime :: base64 -e 'print base64_encode (" User Name / 000 User Name / 000 Password "); 'to get the MIME-BASE64 encoded verification string (" / 000 "is an octal ASCII (0) character). In addition, you can also use MMencode to generate, MMencode can be found in the Metamail this package.

8. Install Cyrus-IMAP

8.1. Download

  http://asg.web.cmu.edu/cyrus/download/

[root @mail postfix] # CD / usr / src [root @ mail src] # wget ftp://ftp.andrew.cmu.edu/pub/cyrus-mail/cyrus-imapd-2.1.16.tar.gz

8.2. Compilation and installation

In the Redhat series Linux, its Kerberos's header file is not in the standard, so you need to specify the ENV command before compiling configuration. In addition, the support for UCDSNMP:

[root @mail src] # tar -zxf cyrus-imapd-2.1.16.tar.gz [root @ mail src] # cd cyrus-imapd-iMAPD-2.1.16] # ENV CPPFLAGS = -i / usr / kerberos / include-cyrus-prefix = / usr / cyrus /> --with-sasl = / usr / lib / sasl2 --with-auth = unix /> --without-ucdsnmp --with-kRB = / usr / kerberos [root @ mail cyrus-imapd-2.1.16] # make depend [root @ mail cyrus-imapd-2.1.16] # Make All cflags = -O [ Root @ mail cyrus-imapd-2.1.16] # make install  If the prompt does not find com_err.h, please copy the COM_ERR.H to / usr / include:

[root @ mail cyrus-imapd-2.1.16] # cp et / com_err.h / usr / include

            (now using Perl version, the original TCL version is no longer supported) The required Perl module is installed in some directory that is not in the standard @inc in Perl, requires manual installation .

[root @ mail cyrus-imapd-2.1.16] # cd perl / imap [root @ mail imap] # perl makefile.pl [root @ mail imap] # make install

8.3. Configuration

Create a master profile /etc/cyrus.conf:

[root @ Mail IMAP] # cd ../..[Root@mail cyrus-imapd-2.1.16] # cp master / conf / small.conf /etc/cyrus.conf

Add CYRUS-IMAP management account Cyrus, and set the password to "cyrus" (can use more complex passwords in the actual application), but do not specify a valid shell to prevent usage from being logged in:

[root @ mail cyrus-imapd-2.1.16] # ueradd -g mail -m -s / no / shell -d / var / imap Cyrus [root @ mail cyrus-imapd-2.1.16] # Passwd CyrusChanging Password for User CyrusNew Password: Cyrusbad Password: IT It Too ShortRetype New Password: Cyruspasswd: All Authentication Tokens Updated SuccessFully

Create an IMAP profile /etc/imapd.conf, the administrator is Cyrus:

[root @ Mail cyrus-imapd-2.1.16] # vi /etc/imapd.conf

CONFIGDIRECTORY: / IMAPPArtition-default: / var / spool / imapadmins: cyrussasl_pwcheck_method: saslauthdsasl_mech_list: plainixhierarchysep: YESALTNAMESPACE: YES

In /etc/imapd.conf used UNIXHIERASEP: YES configuration to create a mailbox with ".". Mail storage partitions in / var / spool / IMAP, multiple partitions or other locations can be set for requirements. About IMAPD.conf can refer to the Cyrus-IMAP document to configure other available parameters. Establish a directory structure of a Cyrus-IMAP server:

[root @ mail cyrus-imapd-2.1.16] # mkdir -p / var / imap / sieve [root @ mail cyrus-imapd-2.1.16] # mkdir / var / spool / imap [root @ mail cyrus-iMapd- 2.1.16] # chown -r cyrus: mail / var / imap [root @ Mail cyrus-imapd-2.1.16] # chown -r cyrus: mail / var / spool / imap [root @ mail cyrus-imapd-2.1. 16] # su -s / bin / Bash Cyrusbash-2.05 $ TOOLS / MKIMAPBSH-2.05 $ EXIT

This tools / mkimap this utility inside the source of Cyrus-IMAP.

Create a log:

[root @ mail cyrus-imapd-2.1.16] # echo local6.debug / var/log/imapd.log >> /etc/syslog.conf[Root@mail cyrus-imapd-2.1.16] # echo auth.debug /var/log/auth.log >> /etc/syslog.conf [root @mail cyrus-imapd-2.1.16] # /etc/rc.d/init.d/syslog restart

Setting the email limit:

[root @ Mail cyrus-imapd-2.1.16] # chattr -r s / var / IMAP / User [root @ mail cyrus-imapd-2.1.16] # chattr -r s / var / imap / quota [root @mail cyrus-imapd-2.1.16] # chattr -r s / var / spool / iMap

Since the Cyrus-IMAP's master process and Postfix's master process name, it is easy to confuse and it is inconvenient to control, so the main control process of the Cyrus-IMAP server is used to connect: Cyrusd.

[root @ mail cyrus-imapd-2.1.16] # CD / usr / cyrus / bin [root @ mail bin] # ln -s master cyrusd

8.4. Run

The start command is as follows:

[root @mail bin] # / usr / cyrus / bin / cyrusd &

8.5. Test Cyrus-IMAP

After starting CYRUS-IMAP, first check the log /var/log/messages ,/var/log/Auth.log and /var/log/auth.log There is no error message, then check the process, there should be the following process:

[root @ mail bin] # PStree | grep cyrusd | -cyrusd

Then check the port, there should be the following ports to open:

[Root @ mail bin] # netstat -an | grep LISTEN tcp00 0.0.0.0:1100.0.0.0:*LISTENtcp00 0.0.0.0:1430.0. 0.0: *   LLISTEN

  now create an email.

Use Cyradm to create and delete the mailbox, which is the interactive management interface of Cyrus-IMAP yourself. The current version is written with Perl. You can also call the Cyrus :: iMap :: admin module directly to create your own CGI or script to do mailbox management, you can refer to the program of the Cyrus :: IMAP :: Shell module. For non-virtual domain mailboxes, you only need to create mailboxes with the same user name (local part of the message).

For virtual domain mailboxes, in order to distinguish the virtual domain user, we want to use the user's mail full name to do its mailbox name (its POP3 / IMAP's login name and mailbox name is the same), but although Cyrus-IMAP allows you to create A mailbox with "@", but Cyrus-IMAP's Deliver does not support the local part of the message with "@" mailbox, so that it is not possible to submit it. We use the following steps to solve this problem:

First, create two mailboxes in Cyradm, one is the email address is full of mailbox name, we call it "address mailbox"; a mailbox is replaced by "@" in the email address, we call It is "Storage Mailbox". Then, exit Cyradm and find the mailbox that is just created in the User directory of the mail partition (here is / var / us / us). Remove the "address mailbox" in the file system, and make "store mailbox", the name is the "address mailbox" just deleted. Finally, set the Forward field in the database to deliver messages to "Storage Mailbox".

The reason why the reason why this is to create a "address mailbox" in the Cyrus-IMAP system in CyRus-IMAP system, delete the address mailbox, and use it as "storage mailbox" alias. I hope to access it. To the actual storage of the mail mailbox. (Also note that the point in the mailbox name is actually represented by "^" in the file system)

[Root @ mail bin] # cyradm --user cyrus localhostIMAP Password: mail.cngnu.org> cm user / cyrusmail.cngnu.org> sq user / cyrus STORAGE 10485760 mail.cngnu.org> cm user / trueusermail.cngnu.org > sq user / trueuser STORAGE 10485760mail.cngnu.org> cm user / virtualuser ~ cngnu.orgmail.cngnu.org> cm user/virtualuser@cngnu.orgmail.cngnu.org> sq user / virtualuser ~ cngnu.org STORAGE 10485760mail.cngnu .org> lmuser / INBOX (/ HasNoChildren) user / trueuser (/HasNoChildren)user/virtualuser~cngnu.org (/HasNoChildren)user/virtualuser@cngnu.org (/ HasNoChildren) mail.cngnu.org> quit [root @ mail Bin] # cd / var / spool / imap / user [root @ mail user] # lscyrus                    @ Mail User ^ ^   \ RM -RF Tester / @ cngnu / ^ org [root @ mail user] # ln -s tester ~ cngnu ^ org tester @ cngnu ^  If you want to delete an IMAP mailbox, you need to grant Cyrus to the administrator CYRUS. And D (Delete) permission can be deleted.

[Root @ mail user] # cyradm --user cyrus localhostIMAP Password: mail.cngnu.org> cm user / testdelmail.cngnu.org> lmuser / INBOX (/ HasNoChildren) user / testdel (/ HasNoChildren) user / trueuser (/ HasNoChildren ) user / virtualuser ~ cngnu.org (/HasNoChildren)user/virtualuser@cngnu.org (/ HasNoChildren) mail.cngnu.org> sam user / testdel cyrus cdmail.cngnu.org> dm user / testdelmail.cngnu.org> lmuser / INBOX (/ HasNoChildren) user / testdel (/ HasNoChildren) user / trueuser (/HasNoChildren)user/virtualuser~cngnu.org (/HasNoChildren)user/virtualuser@cngnu.org (/ HasNoChildren) mail.cngnu.org> quit [ Root @mail user] # rm -rf testdel

Repeat POP3 and IMAP services:

[Root @ mail user] # telnet localhost 110 OK mail.cngnu.org Cyrus POP3 v2.1.16 server readyUSER virtualuser@cngnu.org OK Name is a valid mailboxPASS testpw OK Maildrop locked and readyQUIT OK [root @ mail bin ] # imtest -m login -a virtualuser@cngnu.org localhost C: C01 CAPABILITYS: * OK mail.cngnu.org Cyrus IMAP4 v2.1.16 server readyS: * CAPABILITY IMAP4 IMAP4rev1 ACL QUOTA LITERAL NAMESPACE UIDPLUS ID NO_ATOMIC_RENAME UNSELECT MULTIAPPEND SORT THREAD = ORDEREDSUBJECT THREAD = REFERENCES iDLES: C01 OK CompletedPassword: testpw C: L01 LOGIN virtualuser@cngnu.org {6} go aheadC: L01 OK User logged inAuthenticated.Security strength factor:. 0. logout * BYE LOGOUT received OK Completed9 Install IMP

9.1. Download

  ahttp://www.horde.org/horde/

  http://www.horde.org/imp/3.2.2/

  http://www.horde.org/turba/

[root @mail user] # CD / usr / src [root @ mail src] # wget ftp://ftp.horde.org/pub/horte/horte-2.2.4.tar.gz[root@mail src] # Wget ftp://ftp.horde.org/pub/pear/pear-1.1.tar.gz[Root@mail src] # wget ftp://ftp.horde.org/pub/imp/imp-3.2.2. Tar.gz [root @ mail src] # wget ftp://ftp.horde.org/pub/Turba/turba-1.2.1.tar.gz

9.2. Configuring Apache and PHP

IMP is high for PHP environment. So usually need to upgrade the PHP package and install the PEAR package customized by Horde.

Modify /etc/php.ini and open the Register_Global function.

Register_globals = on

Install the PEAR package, in AS3, it is under / usr / share / pear:

[root @ mail src] # TAR zxf /usr/src/pear-1.1.tar.gz[Root@mail lib] # CD / usr / share [root @ mail lib] # / bin / cp -rf / usr / src / pear / * pear

Finally restart Apache:

[root @mail lib] # /etc/rc.d/init.d/httpd restart

9.3. Configuring Horde

Install Horde:

[root @ mail lib] # cd / var / www / html [root @ mail html] # tar zxf /usr/src/horte-2.2.4.tar.gz[Root@mail html] # mv horde-2.2.4 Horde [root @mail html] # cd horde / scripts / db [root @ mail db] # mysql

[root @mail config] # vi horde.php

Modify 162 lines:

$ conf ['prefs'] ['driver'] = 'none';

 

$ conf ['prefs'] ['driver'] = 'sql';

Modify 171 lines to 176 lines, annotate the passwords of the Horde database:

// $ conf ['prefs'] ['params'] ['phpoType'] = 'mysql'; // $ conf ['prefs'] ['params'] ['HostSpec'] = 'localhost'; // $ conf ['prefs'] ['params'] ['username'] = 'horde'; // $ conf ['prefs'] ['params'] ['password'] = '****'; // $ conf ['prefs'] ['params'] ['Database'] = 'horde'; // $ conf ['prefs'] ['params'] ['Table'] = 'HORDE_PREFS'

 

$ conf ['prefs'] [' params'] ['phpType'] = 'mysql'; $ conf ['prefs'] [' params'] ['Hostspec'] = 'localhost'; $ conf ['prefs " ] ['params'] ['username'] = 'horde'; $ conf ['prefs'] ['params'] ['password'] = 'horde'; $ conf ['prefs'] ['params'] ['Database'] = 'horde'; $ conf ['prefs'] ['params'] ['Table'] = 'horde_prefs';

Here we do not modify the default database settings for the Horde database. If in actual use, at least one complicated password should be taken.

Let's modify the registry.php below the config directory. [root @mail config] # vi registry.php

Modify 23 lines to 24 lines, remove it:

// $ this-> registry ['auth'] ['login'] = 'Imp'; // $ this-> registry ['auth'] ['logout'] = 'Imp';

 

$ this-> registry ['auth'] ['login'] = 'Imp'; $ this-> registry ['auth'] ['logout'] = 'IMP';

Then modify 119,138 line activation IMP and Turba:

'status' => 'inactive'

 

'status' => 'Active'

Last in the browser to access whether the URL test HORDE needs to be satisfied:

http: // Your mail server IP / Horde / Test.php

If you find a red tip, you may need to modify your PHP installation and configuration (see the previous section), then retest.

9.4. Configuring IMP

Install IMP:

[root @mail config] # cd .. [root @ mail horde] # tar zxf /usr/src/imp-3.2.2.tar.gz[Root@mail horde] # mv IMP-3.2.2 IMP [root @ Mail horde] # cd @ mail config】 # for foo in * .dist; do cp $ foo `basename $ foo .dist`; DONE

Then modify the conf.php in the config directory:

[root @mail config] # vi conf.php

Modify 37 lines:

$ conf ['menu'] ['apps'] = array ();

 

$ conf ['menu'] ['Apps'] = Array ('Turba');

Modify 57 lines:

$ conf ['user'] ['allow_resume_all'] = false;

 

$ conf ['user'] ['allow_resume_all'] = true;

Modify 63 lines:

$ conf ['user'] ['allow_resume_all_in_drafts'] = false;

 

$ conf ['user'] ['allow_resume_all_in_drafts'] = TRUE;

Then modify prefs.php:

[root @mail config] # vi prefs.php

The automatic maintenance function is turned off, modified 426, 427 lines:

'Value' => 1, 'Locked' => false,

 

'value' => 0, 'locked' => True,   Review 773 lines:

'Value' => '',

 

// 'Value' => '',

Cancel Notes 774 lines:

// 'Value' => 'Localsql',

 

'Value' => 'Localsql',

Finally modify servers.php:

[root @mail config] # vi servers.php

  Note All server configurations outside the "Cyrus" server, then modify the configuration of the "Cyrus" server:

$ Servers ['Cyrus'] = Array (' Name '=>' Cyrus IMAP Server ',' Server '=>' LocalHost ',' Protocol '=>' IMAP / NOTLS ',' Port '=> 143,' Folders '=>' ',' Namespace '=>' Inbox. ',' maildomain '=>' cngnu.org ',' Realm '=>' cngnu.org ',' preferred '=>');

9.5. Configuring Turba

Install Turba:

[root @ mail config] # cd ../..[Root@mail horde] # tar zxf /usr/src/turba-1.2.1.tar.gz[root@mail horde] # mv Turba-1.2.1 Turba [root @mail horde] # cd turba / config [root @ mail config] # for foo in * .dist; do cp $ foo `basename $ foo .dist`;

Then modify the conf.php in the config directory:

[root @mail config] # vi conf.php

Modify 32 lines:

$ conf ['menu'] ['apps'] = array ();

 

$ conf ['menu'] ['Apps'] = Array ('IMP');

Then modify the Sources.php in the config directory:

[root @mail config] # vi sources.php

Modify 146 lines:

'Password' => '*****';

 

'password' => 'horde';

Finally, add Turba database tables:

[root @mail config] # cd ../scripts/drivers[Root@mail config] # mysql horde

9.6. Test IMP

Last in the browser accesses the following URL: http: // Your mail server IP / HORDE /

Enter your username VirtualUser@cngnu.org and password TestPW login (or trueuser).

10. Others

10.1. Start the script

You can write a startup script /etc/rc.d/init.d/mailsys to launch these processes so you don't need to start Postfix and CyrusD separately:

#! / bin / bash

#

# mailsys this shell script takes Care of Starting and Stopping

# Postfix and cyrus-iMap.

# Author: xingyu.wang 2004/1/18

#

# chkconfig: 2345 80 30

# Description: Postfix is ​​a mail transport agent, Which is the program

# That Moves Mail from One Machine to Another.Cyrus-IMAP IS A MAIL

# Deliver Agent, Which Provide Pop3 and Imap4 Services for User and

# Deliver Mail to Local Mailbox.

#

# processname: mailsys

# pidfile: /var/run/mailsys.pid

# Source Function Library.

. /etc/rc.d/init.d/functions

# Source NetWorking Configuration.

. / etc / sysconfig / network

# Check That Networking is Up.

[$ {NetWorking} = "no"] && exit 0

[-f / usr / sbin / postfix] || EXIT 0

[-f / usr / cyrus / bin / cyrusd] || EXIT 0

Retval = 0

PROG = "mail system"

START () {

# Start daemons.

echo -n $ "Starting $ PROG:"

Echo -n $ "smtp"

/ usr / sbin / postfix start> / dev / null 2> & 1

Echo -n $ "POP3 IMAP4"

/ usr / cyrus / bin / cyrusd> / dev / null 2> & 1

RetVal = $?

IF [$ RETVAL-EQ 0]; THEN

Touch / Var / Lock / Subsys / Mailsys

SUCCESS $ "$ prog start"

Else

Failure $ "$ PROG START FAILURE"

Fi

echo

Return $ RetVal

}

STOP () {

# Stop daemons.

echo -n $ "Shutting down $ PROG:"

Echo -n $ "smtp"

/ usr / sbin / postfix stop> / dev / null 2> & 1

Echo -n $ "POP3 IMAP4"

KillProc Cyrusd

RetVal = $?

IF [$ RETVAL-EQ 0]; THEN

RM -F / VAR / LOCK / SUBSYS / MAILSYSSUCCESS $ "$ pROG STOP"

Else

Failure $ "$ prog stop failure"

Fi

echo

Return $ RetVal

}

# See how wee wee caled.

Case "$ 1" in

START)

Start

;

STOP)

STOP

;

Restart | Reload)

STOP

Start

RetVal = $?

;

*)

Echo $ "Usage: $ 0 {start | stop | restart}"

EXIT 1

ESAC

EXIT $ RETVAL

[root @mail root] # chmod 755 /etc/rc.d/init.d/mailsys[Root@mail root] # chkconfig --level 0123456 mailsys on [root @ mail root] # chkconfig --level 0123456 sendmail off

10.2. Overall test

After creating an email address, the test message is:

[root @mail root] # mail virtualuser@cngnu.orgsubject: test by Methis is a test..c: [root @mail root] # mailqmail queue is empty [root @ mail root] # Tail / var / log / maillog

  Use Mailq to see if the mail queue has an error, and checks / var / log / mail / * whether there is an error message. If everything is normal, the letters have been sent to Tester.

Testing, first test POP3:

[Root @ mail root] # telnet localhost 110 OK mail.cngnu.org Cyrus POP3 v2.1.16 server readyUSER virtualuser@cngnu.org OK Name is a valid mailboxPASS testpw OK Maildrop locked and readyLIST1 400TOP 1 10Return-Path: < Root@cngnu.org> X-SIEVE: CMU Sieve 2.2 Return-path: Received: by mail. (postfix, from userid 0) ID 5f1ef90005; SAT, 18 Jan 2004 02:16:43 0800 (CST) to: TESTER@cngnu.orgsubject: Test by MeMessage-ID: <20040118021643.5f1ef90005@mail.cngnu.org> Date: SAT, 18 Jan 2004 02:16:43 0800 (CST) from: root @ cngnu .org (root) this is a test..quit ok

Test IMAP again:

[Root @ mail root] # imtest -m login -a virtualuser@cngnu.org localhost C: C01 CAPABILITYS: * OK mail.cngnu.org Cyrus IMAP4 v2.1.16 server readyS: * CAPABILITY IMAP4 IMAP4rev1 ACL QUOTA LITERAL NAMESPACE UIDPLUS ID NO_ATOMIC_RENAME UNSELECT MULTIAPPEND SORT THREAD = ORDEREDSUBJECT THREAD = REFERENCES iDLES: C01 OK CompletedPassword: C: L01 LOGIN virtualuser {6} go aheadC: L01 OK User logged inAuthenticated.Security strength factor: 0. select inbox * FLAGS (/ Answered / Flagged / Draft / Deleted / Seeen * OK [PermanentFlags (/ Answered / Flagged / Draft / Deleted / Seen / *)] * 1 EXISTS * 1 Recent * OK [UidValidity 1021736432] * OK [UidNext 3]. OK [Read- Write] Completed. Fetch 1: 1 (Flags Body [Header.fields (Date from)]) * 1 fetch (Flags (/ seen) {68} Date: Mon, 20 May 2002 09:26:09 0800 (CST) from: wxy@cngnu.org). Ok Completed. Logout * bye logout receific. OK Completed  Last test IMP, access the URL as follows:

http: // Your mail server IP / Horde /

Enter the user name virtualUser@cngnu.org and password TestPW login.

You can also test any other mail client program, such as Kmail, Outlook Express, and more.

                                                       ? If you have any questions, please discuss it at http://www.anti-spam.org.cn/forums/.

转载请注明原文地址:https://www.9cbs.com/read-48065.html

New Post(0)