0

LDAP データベースに保存されているすべての電子メール アドレスのリストをカンマで区切って取得しようとしています。

このスクリプトを単純化すると、次のようになります。

#!/usr/bin/env python
# encoding: utf-8

# Author:   Zhang Huangbin <zhb _at_ iredmail.org>
# Purpose:  Add enabledService=lib-storage for all mail users.
#           Required by IMAP folder sharing in Dovecot-2.0.
# Date:     2012-05-18

import sys
import ldap

# Note:
#   * bind_dn must have write privilege on LDAP server.
uri = 'ldap://127.0.0.1:389'
basedn = 'o=domains,dc=example,dc=com'
bind_dn = 'cn=Manager,dc=example,dc=com'
bind_pw = 'password'

# Initialize LDAP connection.
print >> sys.stderr, "* Connecting to LDAP server: %s" % uri
conn = ldap.initialize(uri=uri, trace_level=0,)
conn.bind_s(bind_dn, bind_pw)

# Get all mail users.
print >> sys.stderr, "* Get all mail accounts..."
allUsers = conn.search_s(
        basedn,
        ldap.SCOPE_SUBTREE,
        "(objectClass=mailUser)",
        ['mail', 'enabledService'],
        )

total = len(allUsers)
print >> sys.stderr, "* Total %d user(s)." % (total)

# Counter.
count = 1

for user in allUsers:
    (dn, entry) = user
    mail = entry['mail'][0]

    print >> "%s, " % (mail)

    count += 1

# Unbind connection.
conn.unbind()

これを実行すると、エラーが発生します:

  • LDAP サーバーへの接続: ldap://127.0.0.1:389
  • すべてのメール アカウントを取得...
  • 合計 64 ユーザー。トレースバック (最新の呼び出しが最後): ファイル "list_mail_users.py"、43 行目、印刷中 >> "%s, " % (メール) AttributeError: 'str' オブジェクトに属性 'write' がありません

サポート フォーラムでこの質問をしたところ、代わりに ldapsearch を使用するよう提案されました。

4

1 に答える 1

1

これがあなたの問題です

for user in allUsers:
  (dn, entry) = user
  mail = entry['mail'][0]

  print >> "%s, " % (mail)

  count += 1

文字列である "%s, " に印刷しようとしています。印刷は、書き込み属性を持つオブジェクトのみを受け入れることができます。あなたがそれで何をしようとしているのか正確にはわかりませんが、次のようなことを期待していprint >> sys.stdout, "%s, " %(mail)ますprint >> File "%s, "%mail

于 2013-01-02T10:50:25.803 に答える