나는 workaround.org(2.9 Wheezy 버전)의 ISPMail 튜토리얼을 따르고 있으며 지금까지 모든 것이 잘 작동하고 있습니다. "이메일 전달 테스트" 단계에 도달했을 때 /var/log/mail.log의 출력 로그에서 쿼리에 대한 오류를 발견했습니다.
May 14 06:48:59 mail postfix/pickup[17704]: EA4AD240A98: uid=0 from=<root>
May 14 06:48:59 mail postfix/cleanup[17776]: EA4AD240A98: message-id=<[email protected]>
May 14 06:48:59 mail postfix/qmgr[17706]: EA4AD240A98: from=<[email protected]>, size=429, nrcpt=1 (queue active)
May 14 06:49:00 mail dovecot: auth-worker(17782): mysql(127.0.0.1): Connected to database mailserver
May 14 06:49:00 mail dovecot: auth-worker(17782): Warning: mysql: Query failed, retrying: Table 'mailserver.users' doesn't exist
May 14 06:49:00 mail dovecot: auth-worker(17782): Error: sql([email protected]): User query failed: Table 'mailserver.users' doesn't exist (using built-in default user_query: SELECT home, uid, gid FROM users WHERE username = '%n' AND domain = '%d')
May 14 06:49:00 mail dovecot: lda([email protected]): msgid=<[email protected]>: saved mail to INBOX
May 14 06:49:00 mail postfix/pipe[17780]: EA4AD240A98: to=<[email protected]>, relay=dovecot, delay=0.09, delays=0.03/0.01/0/0.06, dsn=2.0.0, status=sent (delivered via dovecot service)
May 14 06:49:00 mail postfix/qmgr[17706]: EA4AD240A98: removed
DB를 찾을 수 없다는 점이 다소 흥미로웠기 때문에 DB와 관련된 모든 파일(postfix cf 파일 포함)을 다시 살펴보고 확인했고 모든 것이 정확하여 이 시점에서는 당황했지만 이상하게도 충분히 이메일이 /var/vmail/domain.com/의 올바른 목적지로 전달된 것처럼 보일 것입니다.
이것에 대해 걱정해야 합니까, 아니면 여기서 뭔가를 놓치고 있습니까? 이것은 dovecot에서 보낸 메시지이므로 여기에 포함하고 있는 dovecot-sql.conf.ext의 쿼리가 됩니다.
driver = mysql
connect = host=127.0.0.1 dbname=mailserver user=blocked password=***REMOVED***
default_pass_scheme = PLAIN-MD5
password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';
답변1
mail.log에 명시된 대로 user_query 값은 정의되지 않습니다. 이것이 바로 Dovecot이 기본 쿼리로 돌아가는 이유입니다.
구성 파일 /etc/dovecot/dovecot-sql.conf.ext를 열면 user_query 값이 주석 처리되거나 비어 있을 것입니다. 적절한 쿼리로 채워보세요.
나처럼 모든 메일 계정(예: 5000)에 동일한 UID와 GID를 사용하는 경우 다음과 같이 간단한 작업을 수행할 수 있습니다.
user_query = SELECT ('5000') as 'uid',('5000') as 'gid'
구성 파일에서 제가 발견한 또 다른 사항입니다. default_pass_scheme으로 PLAIN-MD5를 사용하지 않는 것이 좋습니다. SHA512와 같은 더 강력한 것으로 전환하는 것이 좋습니다.
제 답변이 도움이 되셨기를 바랍니다. 건배!
답변2
nano 또는 vi 사용(나노 저장 = ctrl+o, 종료 = ctrl+x) vi 저장 = 버튼 삽입 및 esc 버튼 후 :wq! enter 저장하고 종료합니다.
/etc/dovecot/conf.d/auth-sql.conf.ext
...
passdb {
driver = sql
args = /etc/dovecot/dovecot-sql.conf.ext
}
...
userdb {
driver = static
args = uid=vmail gid=vmail home=/home/vmail/%d/%n/Maildir
}
SQL 드라이버를 사용하여 userdb 섹션을 주석 처리합니다.
#userdb {
#driver = sql
#args = /etc/dovecot/dovecot-sql.conf.ext
#}
systemctl restart dovecot
그리고 그것은 작동해야합니다.
문제는 userdb 드라이버가 사용 중이고 데이터베이스에서 sql
테이블을 찾고 있지만 이 테이블이 존재하지 않는다는 것입니다.users
이것은 인기 있는 튜토리얼의 문제인데, 인터넷에서 많은 변형이 돌아다니는 것을 발견했습니다(원본인지는 모르겠습니다). 이 튜토리얼에서는 userdb 행을 주석 처리해야 한다는 점을 설명하지 않으며 구성 파일에서 행을 추가하거나 수정하는 방법에 대한 지침만 포함합니다. 이 자습서에서는 가상 사용자 테이블에 MariaDB 또는 MySQL을 사용합니다. 이 경우 비밀번호에 대한 데이터베이스에 대한 적절한 쿼리와 homedir을 얻는 정적 방법이 포함된 driver = sql
passdb 만 필요합니다.dovecot-sql.conf.ext
나는 내가 찾은 튜토리얼을 읽은 후(당신이 동일한 튜토리얼을 사용한 것 같습니다) 비슷한 문제가 발생했다고 생각하는 설정으로 내 서버에서 이것을 테스트했습니다. 내 서버에서 postfix 및 dovecot 설정을 세 번 확인하거나 심지어 네 번까지 확인했는데 이 솔루션으로 문제가 해결되었습니다. clamav, spamassassin 및 postgrey와 함께 dovecot 및 postfix를 구성했습니다. 모든 것이 매우 훌륭하게 작동하지만 나는 dovecot 및 postfix 구성 파일의 모든 라인을 단계별로 확인하는 데 40시간 이상을 소비했습니다.
2019년 3월 22일에 수정됨
나는 팸 드라이버에 대한 또 다른 설명이 있는 책을 읽었습니다.
/etc/dovecot/conf.d/10-auth.conf 파일 끝에는 한 줄이 있습니다.
!include auth-system.conf.ext
/etc/dovecot/conf.d/auth-system.conf.ext 파일에는 다음과 같은 기본 주석 처리된 섹션이 있습니다.
#passdb {
#driver = pam
# [session=yes] [setcred=yes] [failure_show_msg=yes] [max_requests=<n>]
# [cache_key=<key>] [<service name>]
#args = dovecot
#}
#userdb {
# <doc/wiki/AuthDatabase.Passwd.txt>
#driver = passwd
# [blocking=no]
#args =
#override_fields = home=/home/virtual/%u
#}
데이터베이스에 수동으로 생성된 계정 대신 정적 로컬 계정을 사용하려면(대량 이메일 계정을 MariaDB에 넣는 자동화 방법을 찾지 못했습니다) 코드는 /etc/dovecot/conf.d/auth-system에 있습니다. conf.ext를 다음으로 변경해야 합니다.
passdb {
driver = pam
# [session=yes] [setcred=yes] [failure_show_msg=yes] [max_requests=<n>]
# [cache_key=<key>] [<service name>]
#args = dovecot
}
userdb {
# <doc/wiki/AuthDatabase.Passwd.txt>
driver = passwd
# [blocking=no]
#args =
#override_fields = home=/home/virtual/%u
}
정말 짧은 설명이네요. Dovecot은 사용자를 생성하는 SQL 데이터베이스를 사용하거나 PAM을 사용하여 시스템에서 로컬 사용자 계정을 인증할 수 있습니다. 어떤 방법을 선택할지는 관리자에게만 달려 있습니다. 제 생각에는 SQL이 PAM 및 /etc/shadow보다 훨씬 더 안전합니다. 왜냐하면 MySQL/MariaDB에서 사용자를 생성하려는 경우 아래 예와 같이 SHA를 선택할 수 있기 때문입니다.
INSERT INTO Users_tbl (DomainId, password, Email) VALUES (1, ENCRYPT('yourdifficultpasswordphrase', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), '[email protected]');
그런 다음:
nano /etc/dovecot/dovecot-sql.conf.ext
driver = mysql
connect = host=localhost dbname=yourdbname user=dbuser
password=yourdifficultpassword
default_pass_scheme = SHA512-CRYPT
password_query = SELECT Email as User, password FROM Users_tbl WHERE
Email='%u';
SHA-512가 작업을 수행합니다. 물론 이것은 매우 짧은 설명이지만 차이점과 SQL이 더 나은 선택인 이유를 설명할 수 있기를 바랍니다.
답변3
Dovecot은 테이블 users
에 데이터가 있는 것처럼 보이는 동안 호출된 테이블을 찾고 있습니다 .virtual_users
Query failed, retrying: Table 'mailserver.users' doesn't exist
테이블 이름을 바꾸거나 virtual_users
테이블을 사용하도록 비둘기장을 구성하십시오.
답변4
이는 정확한 답변은 아니지만 새로운 방문자가 문제를 해결할 수 있도록 귀하의 문제와 관련이 있을 수 있습니다. 아래 링크를 참조하세요