Kódrészlet:
import smtplib
email = raw_input ( 'Email: ' )
from_name = raw_input ( 'Name: ' )
subject = raw_input ( 'Subject: ' )
smtpserver = smtplib . SMTP ( smtp_server, smtp_port )
smtpserver . ehlo ()
smtpserver . starttls ()
smtpserver . ehlo
smtpserver . login ( smtp_username, smtp_password )
content = open ( 'message.html' ) . read ()
header = 'To:' + email + '\n' + 'From: ' + from_name + ' <' + from_email + '>\nMIME-Version: 1.0\nContent-type: text/html\n' + 'Subject:' + subject + '\n'
message = header + content
smtpserver . sendmail ( from_email, email, message )
A program nem működik ha a from_name, subject változók vagy a message.html fájl ékezetes karaktereket tartalmaz. A message.html utf-8 karakterkódolású. Még csak most ismerkedem a Python nyelvvel. Segítsetek!
- 3953 megtekintés
Hozzászólások
Nem vagyok 100%-ban biztos, de talán próbáld meg így megnyitni a html-fájlt:
import sys
import codecs
.
.
fs = codecs.open( 'message.html', 'r', 'utf-8')
content = fs.read()
A változók kódolásának megváltoztatásához itt találsz segítséget: http://docs.python.org/howto/unicode.html
Esetleg ez is hasznos lehet: http://effbot.org/zone/unicode-objects.htm
--
Tertilla; Tisztelem a botladozó embert és nem rokonszenvezem a tökéletessel! Hagyd már abba!; DropBox
- A hozzászóláshoz be kell jelentkezni
Erre azért googlizz rá elsőkörben, mert úgy látom volt ezzel már másnak is gondja: "python smtplib utf 8"
- A hozzászóláshoz be kell jelentkezni
Esetleg ezt nézd meg: http://twistedmatrix.com/trac/wiki/TwistedMail
- A hozzászóláshoz be kell jelentkezni
Python 2 vagy 3?
A 3 nekem a legtöbb ilyen cseszekedést megspórolja, ezért ha nincs olyan könyvtár ami feltétlenül szükséges és csak 2.x-el kompatibilis, én tennék egy próbát azzal.
- A hozzászóláshoz be kell jelentkezni
Köszönöm a hozzászólásokat. Python 3 próba lesz.
- A hozzászóláshoz be kell jelentkezni
print ( xyz ) # b'xc3x93ra'
Az xyz változóból, hogy tudnék Óra -t csinálni? Python 3.
- A hozzászóláshoz be kell jelentkezni
xyz.decode('utf8')
De hogy jutottál bytes típushoz string helyett?
Itt egy jó leírás a sztringekről. (Persze az egész Dive Into Python 3 jó, meg a Python2-es változat is.)
- A hozzászóláshoz be kell jelentkezni
Python 3:
# -*- coding: utf-8 -*-
from_name = input ( 'Name: ' )
from_name = from_name . encode ( 'utf8' )
from_name = str ( from_name )
msg [ 'From' ] = str ( from_name + ' <' + from_email + '>' )
Nekem most ez lenne a fontos: Óra <from@utf8.com>
Ehelyett (a fenti kóddal) ezt kapom: b'\xc3\x93ra' <from@utf8.com>
- A hozzászóláshoz be kell jelentkezni
Az input() Python 3 alatt eleve utf-8 stringet olvas be, nem kell konvertálgatni. (Sőt, minden string utf8-as.)
- A hozzászóláshoz be kell jelentkezni
Már rájöttem, hogy a fenti hozzászólásom butaság.
print ( type ( from_name ) )
- A hozzászóláshoz be kell jelentkezni
Akkor az is stimmel, hogy a codecs-es megoldás az Python 2-re vonatkozott? Ez az, amit meg lehet spórolni a 3-assal.
Mellesleg stringet írni nekem kényelmesebb így:
valami = ('%s <%s>' % (nev, email))
Jobban látni hogy mi micsoda, meg nem kell pluszozni-aposztrófozni. :)
- A hozzászóláshoz be kell jelentkezni
Ez az, amit meg lehet spórolni a 3-assal.
Kipróbáltam. Tényleg működik codecs nélkül is.
Idegesít, hogy nem lehet megoldani ezt a problémát.
- A hozzászóláshoz be kell jelentkezni
% cat pelda.py
#!/usr/bin/env python3
#-*- coding: utf-8 -*-
valami = input('írj: ')
mail = 'v@v.v'
s = ('valami: %s <%s>' % (valami, mail))
print(s)
% ./pelda.py
írj: 無駄だ
valami: 無駄だ <v@v.v>
- A hozzászóláshoz be kell jelentkezni
Ezzel nincs probléma. Az smtplib-nek nem tetszik az utf-8.
- A hozzászóláshoz be kell jelentkezni
Sikerül e-mailt küldeni, ha:
- a feladó neve latin1, nem utf-8
- a tárgy latin1, nem utf-8
- a message.html fájl vagyis az üzenet tartalma lehet utf-8
- A hozzászóláshoz be kell jelentkezni
#!/usr/bin/env python3
#-*- coding: utf-8 -*-
import smtplib
from email.mime.text import MIMEText
fp = open('e.py', 'r')
msg = MIMEText(fp.read(),_charset='utf-8')
fp.close()
f = '名もなし <fiction@l.net>'
t = 'Kun Béla <valaki@valahol.com>'
msg['Subject'] = 'Ezen fájl tartalma'
msg['From'] = f
msg['To'] = t
s = smtplib.SMTP()
s.sendmail(f, [t], msg)
s.quit
Mivel smtp szerverem nincs kéznél, így 'smtplib.SMTPServerDisconnected: please run connect() first'-tel elszáll, de elvileg elfogadja a paramétereit a sendmail().
- A hozzászóláshoz be kell jelentkezni
A Subject-nél valamit trükközni kell (most jutott eszembe), ezt nézd meg (lehet, hogy vonatkozik más header mezőkre is):
http://bitprison.net/php_mail_utf-8_subject_and_message
Hogy ezt az smtplib megcsinálja-e azt nem tudom.
Legalábbis régen valami ilyesmi megoldást találtam, amikor szívtam vele.
Thunderbird még mindig nem jeleníti meg rendesen a "nyers" UTF-8 Subject-et.
Ez talán az a kódolás, amit minden szépen megeszik: http://en.wikipedia.org/wiki/Quoted-printable
Ha hülyeséget írtam javítsatok ki.
- A hozzászóláshoz be kell jelentkezni
Nem hülyeség! Sikerült. Hamarosan publikálom a forráskódot.
Köszönöm mindenkinek a segítséget!
- A hozzászóláshoz be kell jelentkezni
Rengeteg verziót próbáltam már. Szerintem Python-nal nem lehet megoldani azt, hogy a feladó és a tárgy ékezetes karaktereket tartalmazzon (vagy csak nekem nagyon bonyolult). Az üzenet tartalma ennyi volt:
fs = codecs . open ( 'message.html', 'r', 'utf-8' )
content = fs . read ()
content = str ( content )
content = '<html><body>' + content + '</body></html>'
msg = MIMEText ( content . encode ( 'utf-8' ), 'html', _charset = 'utf-8' )
sendmail ( msg . as_string () )
- A hozzászóláshoz be kell jelentkezni
Ha a sima smtplib-el nem megoldhato, esetleg tegyel egy probat a twisted framework-al...
Sic Transit Gloria Mundi
- A hozzászóláshoz be kell jelentkezni
Szerintem is.
- A hozzászóláshoz be kell jelentkezni
:)
- A hozzászóláshoz be kell jelentkezni
Bocs, nem vettem eszre, hogy mar javasoltad :}
Sic Transit Gloria Mundi
- A hozzászóláshoz be kell jelentkezni