![]() |
PCDVD數位科技討論區
(https://www.pcdvd.com.tw/index.php)
- 疑難雜症區
(https://www.pcdvd.com.tw/forumdisplay.php?f=34)
- - 版上有沒有python的高手呢?
(https://www.pcdvd.com.tw/showthread.php?t=1040941)
|
---|
版上有沒有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) 給的值就不對. 應該要怎麼處理呢? |
剛試了一下
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 本身好像就有丟回錯誤碼的功能. 請教一下要怎麼取得呢? |
引用:
用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 |
引用:
謝謝關鍵字, 套用後 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) 要嘛就是合併失敗, 要嘛就是忠實呈現(就是變純文字啦..) 跟您再請教一下. |
|
還是在重覆的地方打轉..快暈頭了 .. 我把程式碼貼上來好了 請高手看一下 謝謝
#! /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. |
TypeError: Type unicode connot be serialized.
應該是說你必須把要serialize的文字(我猜是要寄送的郵件內容)進行編碼,例如: unicodeMailBody.encode('utf8') 把文字內容以UTF-8方式編碼. |
#! /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') 也不行, 再 再請教一下, 請問是哪地方需要再修正呢? |
讀進來時應該是先decode,要送出時encode.
你的信件內文是來自於資料庫查詢的結果嗎?如果你的信件內容在存入資料庫時是用big5編碼的字串,那麼你讀出來就要先解碼: content = content.decode('big5') 還原成unicode字串.然後在寄出前編碼成utf8(或者你希望的編碼方式). |
所有的時間均為GMT +8。 現在的時間是09:18 AM. |
vBulletin Version 3.0.1
powered_by_vbulletin 2025。