![]() |
||
Major Member
![]() 加入日期: 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) 給的值就不對. 應該要怎麼處理呢?
__________________
![]() |
|||||||
![]() |
![]() |
*停權中*
加入日期: 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 編輯. |
||
![]() |
![]() |
Major Member
![]() 加入日期: May 2001 您的住址: 台北
文章: 130
|
引用:
謝謝, 這樣子試真的就正確了. 可否再請教一個問題呢? 也是Google 了一段時間了. smtp.sendmail(FROM,[TO],body) smtp.getreply() 這個是取得反回值, email 是否發送成功之類的. 但這樣子寫法, 似乎在 sendmail 後就自動關閉connect 了, 所以無法取得. 如果用smtp.docmd 去一步一步 可以使用 getreply() 但取回的值要怎麼判斷? h = smtp.getreply() ??? 另, 去看了一下 smtplib.cy 裡 sendmail 本身好像就有丟回錯誤碼的功能. 請教一下要怎麼取得呢?
__________________
![]() |
|
![]() |
![]() |
Basic Member
加入日期: Jan 2006
文章: 22
|
引用:
用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
__________________
開發中的落後地區 |
|
![]() |
![]() |
Major Member
![]() 加入日期: May 2001 您的住址: 台北
文章: 130
|
引用:
謝謝關鍵字, 套用後 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) 要嘛就是合併失敗, 要嘛就是忠實呈現(就是變純文字啦..) 跟您再請教一下.
__________________
![]() |
|
![]() |
![]() |
*停權中*
加入日期: Sep 2010
文章: 691
|
|
![]() |
![]() |
Major Member
![]() 加入日期: 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.
__________________
![]() |
![]() |
![]() |
Advance Member
![]() ![]() 加入日期: Jun 2003 您的住址: Taipei
文章: 442
|
TypeError: Type unicode connot be serialized.
應該是說你必須把要serialize的文字(我猜是要寄送的郵件內容)進行編碼,例如: unicodeMailBody.encode('utf8') 把文字內容以UTF-8方式編碼.
__________________
現今世道,自爆文當故事書,站長的話做成語錄,幾百年前的文章嘛沒事就挖出來考古... ![]() |
![]() |
![]() |
Major Member
![]() 加入日期: 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') 也不行, 再 再請教一下, 請問是哪地方需要再修正呢?
__________________
![]() |
![]() |
![]() |
Advance Member
![]() ![]() 加入日期: Jun 2003 您的住址: Taipei
文章: 442
|
讀進來時應該是先decode,要送出時encode.
你的信件內文是來自於資料庫查詢的結果嗎?如果你的信件內容在存入資料庫時是用big5編碼的字串,那麼你讀出來就要先解碼: content = content.decode('big5') 還原成unicode字串.然後在寄出前編碼成utf8(或者你希望的編碼方式).
__________________
現今世道,自爆文當故事書,站長的話做成語錄,幾百年前的文章嘛沒事就挖出來考古... ![]() 此文章於 2014-03-05 09:06 AM 被 harrisonlin 編輯. |
![]() |
![]() |