PCDVD數位科技討論區
PCDVD數位科技討論區   註冊 常見問題 標記討論區為已讀

回到   PCDVD數位科技討論區 > 其他群組 > 疑難雜症區
帳戶
密碼
 

回應
 
主題工具
barboo0412
Major Member
 
barboo0412的大頭照
 

加入日期: May 2001
您的住址: 台北
文章: 130
版上有沒有python的高手呢?

最近在學習python , 萬事起頭難..

#! /usr/bin/env Python
#!coding=utf-8
import smtplib
import random
import dns.resolver
answers = dns.resolver.query('yahoo.com.tw', 'MX')
host = "0"
newhost = "0"
port = "25"
for rdata in answers:
host = (rdata.exchange)
print host
if host != "0":
break
#print host
#print 'Host', rdata.exchange, 'has preference', rdata.preference
smtp=smtplib.SMTP()
smtp.connect(host, port)

這個是取得domain mx 的一段, print host 是正確的, (mx-tw.mail.gm0.yahoodns.net.)
但在 len(host)時得到的是 6, 似乎變成陣列了.

所以在smtp.connect(host, port) 給的值就不對.
應該要怎麼處理呢?
     
      
__________________
舊 2014-02-28, 03:12 PM #1
回應時引用此文章
barboo0412離線中  
avan
*停權中*
 
avan的大頭照
 

加入日期: Mar 2006
文章: 106
剛試了一下

host = (rdata.exchange) 取回來的值本身就是陣列
host[0] = mx-tw
host[1] = mail
host[2] = gm0
host[3] = yahoodns
host[4] = net
host[5] =
所以len(host) = 6 是正確的

print host 時, 能正常顯示,
大概是因為print會自動隱式轉換為文字型態

若直接取得host的值
你可以這樣用
host.to_text() 或 str(host)
 

此文章於 2014-03-01 10:05 PM 被 avan 編輯.
舊 2014-03-01, 10:03 PM #2
回應時引用此文章
avan離線中  
barboo0412
Major Member
 
barboo0412的大頭照
 

加入日期: May 2001
您的住址: 台北
文章: 130
引用:
作者avan
剛試了一下

host = (rdata.exchange) 取回來的值本身就是陣列
host[0] = mx-tw
host[1] = mail
host[2] = gm0
host[3] = yahoodns
host[4] = net
host[5] =
所以len(host) = 6 是正確的

print host 時, 能正常顯示,
大概是因為print會自動隱式轉換為文字型態

若直接取得host的值
你可以這樣用
host.to_text() 或 str(host)


謝謝, 這樣子試真的就正確了. 可否再請教一個問題呢? 也是Google 了一段時間了.
smtp.sendmail(FROM,[TO],body)
smtp.getreply()
這個是取得反回值, email 是否發送成功之類的.
但這樣子寫法, 似乎在 sendmail 後就自動關閉connect 了, 所以無法取得.
如果用smtp.docmd 去一步一步 可以使用 getreply() 但取回的值要怎麼判斷?
h = smtp.getreply() ???

另, 去看了一下 smtplib.cy 裡 sendmail 本身好像就有丟回錯誤碼的功能.
請教一下要怎麼取得呢?
__________________
舊 2014-03-02, 08:49 AM #3
回應時引用此文章
barboo0412離線中  
erai
Basic Member
 

加入日期: Jan 2006
文章: 22
引用:
作者barboo0412
謝謝, 這樣子試真的就正確了. 可否再請教一個問題呢? 也是Google 了一段時間了.
smtp.sendmail(FROM,[TO],body)
smtp.getreply()
這個是取得反回值, email 是否發送成功之類的.
但這樣子寫法, 似乎在 sendmail 後就自動關閉connect 了, 所以無法取得.
如果用smtp.docmd 去一步一步 可以使用 getreply() 但取回的值要怎麼判斷?
h = smtp.getreply() ???

另, 去看了一下 smtplib.cy 裡 sendmail 本身好像就有丟回錯誤碼的功能.
請教一下要怎麼取得呢?

用try
我之前學的時候,從某處抄來的

try:
Mail=smtplib.SMTP()
Mail.connect(mail_host)
Mail.login(mail_user,mail_pw)
Mail.sendmail(FROM,[TO],body)
Mail.close()
return True
except Exception, e:
print str(e)
return False
__________________
開發中的落後地區
舊 2014-03-03, 11:59 PM #4
回應時引用此文章
erai離線中  
barboo0412
Major Member
 
barboo0412的大頭照
 

加入日期: May 2001
您的住址: 台北
文章: 130
引用:
作者erai
用try
我之前學的時候,從某處抄來的

try:.....


謝謝關鍵字, 套用後

try:
smtp.ehlo()
smtp.sendmail(From_Email,To_Email,body)
MailReplyDesc="Successfully sent email!!"
Err_Type = "0"
except smtplib.socket.gaierror:
MailReplyDesc="Couldn't contact the host!!"
Err_Type = "1"
except smtplib.SMTPAuthenticationError:
MailReplyDesc="Login failed!!"
Err_Type = "2"
這樣子就順利處理許多錯誤了..

程式整個套起來了. 包含從SQL 拉相關資料, 兜字串, 送出, 回寫SQL 值.

但發生個問題.. 在
NOWBODY = MIMEText((row.ePaper_Content), _subtype='html', _charset='UTF-8')
....
body=string.join((
"From:%s <%s>" % (From_Name,From_Email),
"To:%s" % To_Email,
"Subject: %s" % Subject,
"",NOWBODY),
"\r\n")
NOWBODY 從資料庫撈出來時是 html語法
會無法成功把字串合併, 試過許多不同方法.
body.replace(body,"") 去替換, 或是使用 body.attech(NOWBODY)
要嘛就是合併失敗, 要嘛就是忠實呈現(就是變純文字啦..)

跟您再請教一下.
__________________
舊 2014-03-04, 01:25 PM #5
回應時引用此文章
barboo0412離線中  
T磨人
*停權中*
 

加入日期: Sep 2010
文章: 691
http://stackoverflow.com/questions/...file-via-python

參考上面, 應該有你要的答案.
舊 2014-03-04, 01:38 PM #6
回應時引用此文章
T磨人離線中  
barboo0412
Major Member
 
barboo0412的大頭照
 

加入日期: May 2001
您的住址: 台北
文章: 130
還是在重覆的地方打轉..快暈頭了 .. 我把程式碼貼上來好了 請高手看一下 謝謝

#! /usr/bin/env Python
#!coding=utf-8
import smtplib
from email.mime.text import MIMEText
from email.Header import Header
import random
import lxml.html
import dns.resolver
import string
import pyodbc
import sys
cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=XXX;DATABASE=XXX;UID=sa;PWD=XXXXXXX')
cursor = cnxn.cursor()
cursor.execute("select Top 10 Ser_no,From_Name,From_Email,To_Email,Mail_Subject,ePaper_Content from SendMail_MailList Where State_Check='N'")
rows = cursor.fetchall()
for row in rows:
#print row.Ser_no, row.From_Email, row.To_Email
t = (row.Ser_no)
From_Name = Header((row.From_Name), charset='UTF-8')
From_Email = (row.From_Email)
To_Email = (row.To_Email)
Subject = Header((row.Mail_Subject), charset='UTF-8')
NOWBODY = lxml.html.tostring((row.ePaper_Content.encode('utf-8')),method='html', encoding='utf-8')
host = To_Email.split("@")
answers = dns.resolver.query(host[1], 'MX')
host = "0"
newhost = "0"
port = "25"
for rdata in answers:
host = (rdata.exchange.to_text())
if host != "0":
break
smtp=smtplib.SMTP()
smtp.connect(host, port)
smtp.set_debuglevel(1)
smtp.noop()
body="""
From:%s <%s>
To:%s
MIME_Version: 1.0
Content-type: text/html
Subject:%s

%s""" % (From_Name,From_Email,To_Email,Subject,NOWBODY)
try:
smtp.ehlo()
smtp.sendmail(From_Email,To_Email,body)
MailReplyDesc="Successfully sent email!!"
Err_Type = "0"
except smtplib.socket.gaierror:
MailReplyDesc="Couldn't contact the host!!"
Err_Type = "1"
except smtplib.SMTPAuthenticationError:
MailReplyDesc="Login failed!!"
Err_Type = "2"
except smtplib.SMTPConnectError:
MailReplyDesc="Connect the Host error!!"
Err_Type = "3"
except smtplib.SMTPServerDisconnected:
MailReplyDesc="Disconnected!!"
Err_Type = "4"
except smtplib.SMTPDataError:
MailReplyDesc="DataError!!"
Err_Type = "5"
except smtplib.SMTPRecipientsRefused:
MailReplyDesc="unknown User Account!!"
Err_Type = "6"
smtp.quit()#退出

錯在 smtp.sendmail(From_Email,To_Email,body) 這一段.
NOWBODY 內容是標準的HTML語法.簡單的TEST 錯誤訊息是
TypeError: Type unicode connot be serialized.
__________________
舊 2014-03-04, 02:58 PM #7
回應時引用此文章
barboo0412離線中  
harrisonlin
Advance Member
 
harrisonlin的大頭照
 

加入日期: Jun 2003
您的住址: Taipei
文章: 442
TypeError: Type unicode connot be serialized.

應該是說你必須把要serialize的文字(我猜是要寄送的郵件內容)進行編碼,例如:

unicodeMailBody.encode('utf8')

把文字內容以UTF-8方式編碼.
__________________
現今世道,自爆文當故事書,站長的話做成語錄,幾百年前的文章嘛沒事就挖出來考古...
舊 2014-03-04, 04:17 PM #8
回應時引用此文章
harrisonlin離線中  
barboo0412
Major Member
 
barboo0412的大頭照
 

加入日期: May 2001
您的住址: 台北
文章: 130
#! /usr/bin/env Python
#coding=utf-8
import smtplib
from email.mime.text import MIMEText
from email.Header import Header
import random
import dns.resolver
import string
import pyodbc
import sys
cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=XXXX;DATABASE=XXXX;UID=sa;PWD=XXXXX')
cursor = cnxn.cursor()
cursor.execute("select Top 10 Ser_no,From_Name,From_Email,To_Email,Mail_Subject,ePaper_Content from SendMail_MailList Where State_Check='N'")
rows = cursor.fetchall()
for row in rows:
#print row.Ser_no, row.From_Email, row.To_Email
t = (row.Ser_no)
From_Name = Header((row.From_Name), charset='UTF-8')
From_Email = (row.From_Email)
To_Email = (row.To_Email)
Subject = Header((row.Mail_Subject), charset='UTF-8')
#NOWBODY = MIMEText((row.ePaper_Content), _subtype='html', _charset='UTF-8')
NOWBODY = (row.ePaper_Content)
print NOWBODY
host = To_Email.split("@")
answers = dns.resolver.query(host[1], 'MX')
host = "0"
newhost = "0"
port = "25"
for rdata in answers:
host = (rdata.exchange.to_text())
if host != "0":
break
smtp=smtplib.SMTP()
smtp.connect(host, port)
smtp.set_debuglevel(1)
smtp.noop()
body=string.join((
"From:%s <%s>" % (From_Name,From_Email),
"To:%s" % To_Email,
"MIME_Version: 1.0",
"Content-type: text/html",
"Subject: %s" % Subject,
"",NOWBODY),
"\r\n")

try:
smtp.ehlo()
smtp.sendmail(From_Email,To_Email,body)
MailReplyDesc="Successfully sent email!!"
Err_Type = "0"
except smtplib.socket.gaierror:
MailReplyDesc="Couldn't contact the host!!"
Err_Type = "1"

smtp.quit()#退出

現在的情況是, 可以正常寄送html Email , 但中文會有問題.
會出現.UnicodeEncodeError : ascii code can't encode charactrt u \u6211
google 是編碼問題. 但在嘗試 NOWBODY 讀進來時 .encode('utf8') 不行
或是在body 兜字串時.encode('utf8') 也不行, 再
再請教一下, 請問是哪地方需要再修正呢?
__________________
舊 2014-03-04, 08:24 PM #9
回應時引用此文章
barboo0412離線中  
harrisonlin
Advance Member
 
harrisonlin的大頭照
 

加入日期: Jun 2003
您的住址: Taipei
文章: 442
讀進來時應該是先decode,要送出時encode.

你的信件內文是來自於資料庫查詢的結果嗎?如果你的信件內容在存入資料庫時是用big5編碼的字串,那麼你讀出來就要先解碼:

content = content.decode('big5')

還原成unicode字串.然後在寄出前編碼成utf8(或者你希望的編碼方式).
__________________
現今世道,自爆文當故事書,站長的話做成語錄,幾百年前的文章嘛沒事就挖出來考古...

此文章於 2014-03-05 09:06 AM 被 harrisonlin 編輯.
舊 2014-03-05, 09:02 AM #10
回應時引用此文章
harrisonlin離線中  


回應


POPIN
主題工具

發表文章規則
不可以發起新主題
不可以回應主題
不可以上傳附加檔案
不可以編輯您的文章

vB 代碼打開
[IMG]代碼打開
HTML代碼關閉



所有的時間均為GMT +8。 現在的時間是07:29 AM.


vBulletin Version 3.0.1
powered_by_vbulletin 2025。