Python 3.5.1 & fdb 1.5.1 - fdb.fbcore.Cursor object at 0x00175BB0

0

Witam,

Próbuję napisać skrypt w Pythonie, który:

  • łączy się do bazy Firebird i wykonuje SELECT, otrzymuje np. 5 rekordów i wysyła 5 emaili, pierwszy e-mail z pierwszym rekordem, drugi e-mail z drugim rekordem itd.

Używam: Windows Vista x64 SP2, Python 3.5.1, firebird driver fdb 1.5.1.

Gdy wykonuję poniższy skrypt, otrzymuję e-mail z treścią: fdb.fbcore.Cursor object at 0x00175BB0

Proszę o sugestie.

# -*- coding:utf-8 -*-

import smtplib
from email.mime.text import MIMEText

import fdb 
con = fdb.connect(host='127.0.0.1', database='test', user='SYSDBA', password='masterkey', charset='WIN1250')

to = ['xxxxxx@xxxxxx']
cc = ['xxxxxx@xxxxxx']
bcc = ['xxxxxx@xxxxxx']
from_addr = 'xxxxxx@xxxxxx'
message_subject = "Say Hello"

cur = con.cursor()
select = cur.execute("select telephone from person")
#message_text = "%a" % (select)
message_text = (select)

message = "From: %s\r\n" % from_addr \
        + "To: %s\r\n" % ",".join(to) \
        + "CC: %s\r\n" % ",".join(cc) \
        + "BCC: %s\r\n" % ",".join(bcc) \
        + "Subject: %s\r\n" % message_subject \
        + str(message_text)
to_addrs = to + cc + bcc
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login('xxxxxx','xxxxxx')
#server.set_debuglevel(1)

#for message_text in cur.fetchall():
#   print(message_text)

for message_text in cur.fetchall():
    server.sendmail(from_addr, to_addrs, message)

server.quit()
con.close()
0

message_text = (select) co to ma robić Twoim zdaniem?

0

Wg mnie przypisywać wartość SELECTa dla message_text, które jest wykorzystywane jako treść maila.
Jeśli zmienię linijkę:

select = cur.execute("select telephone from person")

na:

message_text = cur.execute("select telkom from osoba")

i zakomentuję:

message_text = (select)

to w dalszym ciągu otrzymuję e-mail z treścią: fdb.fbcore.Cursor object at 0x00CB5BB0. Pytanie co zrobić, aby skrypt działał zgodnie z założeniem?

0

Wykonujesz zapytanie i próbujesz odczytać rezultat tego zapytania - a rezultatem zapytania jest kursor (obiekt opakowujący kursor, tutaj specyficznie).
Musisz użyć np. fetchAll, aby uzyskać wynikowe rekordy - zerknij sobie do dokumentacji :P

0

Ale w princie to działa.

for message_text in cur.fetchall():
	print(message_text)

Dlaczego nie działa gdy chodzi o wysłanie maila?

0

Ach, teraz widzę - masz literówkę:

for message_text in cur.fetchall():
    server.sendmail(from_addr, to_addrs, message)

Iterujesz względem message_text, a przesyłasz do sendmail zmienną message.

0

To też nie działa, bo mam przekazywaną zmienną message - która mówi, na jaki adres wysłać i jaką treść.

0

Zadziałało:

cur = con.cursor()
cur.execute("select telkom from osoba")
message_text = cur.fetchall()

for m1 in [message_text]:
	server.sendmail(from_addr, to_addrs, message)

Ale jest jeden problem, który będę musiał rozwiązać. Otóż przychodzi wiadomość email o treści:

[('1111111',), ('22222222222',), ('333333',)]

a chodziłoby o to, aby przyszły w tym wypadku 3 wiadomości (ilość rekordów), jeden o treści 1111..., drugi o treści 22222..., trzeci o treści 33333...

0

Czy ktoś próbował usunąć z listy "tupli" znaki nawiasu, apostrofu i przecinka?
Chodzi o to, że w następującym kodzie:

for m1 in (message_text):
	print(m1)

otrzymuję wartości:

('wartosc',)

a chciałbym otrzymać po prostu

wartosc
0
print m1[0]

Przeczytaj jakiś tutorial, a nie ośmieszaj się, zawracaj 4 litery pierdołami.

0

Poradziłem już sobie.
Odnośnie Twojego komentarza. Sporo czasu spędziłem na forach internetowych, zawsze chciałem pomóc drugiej osobie. Jednak ilekroć sam napiszę na forum, mam wrażenie, że ludzie na forach piszę na siłę, albo żeby odreagować sobie nieudany dzień, ale nie po to, żeby pomóc drugiej osobie. Powodzenia.

1 użytkowników online, w tym zalogowanych: 0, gości: 1