Python smtplib (utf-8)

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!

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

Erre azért googlizz rá elsőkörben, mert úgy látom volt ezzel már másnak is gondja: "python smtplib utf 8"

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.

print ( xyz ) # b'xc3x93ra'
Az xyz változóból, hogy tudnék Óra -t csinálni? Python 3.

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>

#!/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 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.

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 () )