整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          進階Python郵件發(fā)送(三)-HTML郵件與附件

          親愛的讀者,我們已經成功地發(fā)送了簡單的文本郵件。但在實際應用中,我們可能還需要發(fā)送格式更加豐富的HTML郵件,或者包含附件的郵件。今天,我們就來探索如何使用Python來構建并發(fā)送這樣的郵件。

          一、發(fā)送HTML郵件

          HTML郵件可以讓你的郵件內容更加豐富多彩,包含圖片、鏈接、樣式等。在Python中,我們同樣可以使用email模塊來構建HTML郵件。

          from email.mime.multipart import MIMEMultipart
          from email.mime.text import MIMEText
          
          # HTML郵件正文內容
          html_content = """
          <html>
          <head></head>
          <body>
              <h1>Hello, this is an HTML email from Python!</h1>
              <p>Here's a <a href="https://www.python.org">link to Python's website</a>.</p>
              <img src="cid:image1">  <!-- 注意:這里使用了cid引用,稍后我們將添加圖片附件 -->
          </body>
          </html>
          """
          
          # 創(chuàng)建一個多部分郵件對象
          msg = MIMEMultipart('related')
          msg['From'] = 'your_email@gmail.com'
          msg['To'] = 'receiver_email@example.com'
          msg['Subject'] = 'HTML Email with Python'
          
          # 添加HTML郵件正文
          msg_alternative = MIMEMultipart('alternative')
          msg.attach(msg_alternative)
          html_part = MIMEText(html_content, 'html', 'utf-8')
          msg_alternative.attach(html_part)
          
          # (可選)添加圖片附件(這里僅為示例,實際發(fā)送時請確保圖片文件存在)
          # 注意:由于示例中HTML中引用了圖片,我們需要在郵件中添加這個圖片作為附件,并使用cid引用
          # 這里為了簡化,我們略過實際文件讀取和添加的過程,僅展示邏輯
          # ... 添加圖片附件的代碼會涉及到打開文件、讀取內容、創(chuàng)建MIMEImage對象,并設置Content-ID為"image1"
          
          # 發(fā)送郵件(假設SMTP連接和登錄已經完成)
          # ... 使用smtplib發(fā)送msg對象,與之前的示例類似

          注意:上面的代碼示例中,關于添加圖片附件的部分被省略了,因為它涉及到文件I/O操作和MIMEImage對象的使用,這可能會讓示例變得復雜。在實際應用中,你需要讀取圖片文件,創(chuàng)建MIMEImage對象,并將其附加到郵件中,同時確保HTML中的<img>標簽通過cid屬性正確引用該圖片。

          二、發(fā)送帶附件的郵件

          發(fā)送帶附件的郵件與發(fā)送HTML郵件類似,但你需要創(chuàng)建一個多部分郵件(MIMEMultipart),并為每個部分(文本、HTML、附件等)設置不同的MIME類型。

          from email.mime.base import MIMEBase
          from email import encoders
          
          # 假設我們要發(fā)送一個名為"example.txt"的文本文件作為附件
          filename = 'example.txt'
          
          # 讀取文件內容并編碼為base64
          with open(filename, 'rb') as attachment:
              part = MIMEBase('application', 'octet-stream')
              part.set_payload((attachment).read())
          encoders.encode_base64(part)
          
          # 添加文件頭信息
          part.add_header('Content-Disposition', "attachment; filename= %s" % filename)
          
          # 將附件添加到郵件中
          msg.attach(part)
          
          # 現在,msg對象包含了文本(或HTML)和附件,你可以使用smtplib發(fā)送它
          # ... 發(fā)送郵件的代碼與之前相同

          結語

          恭喜你,現在你已經掌握了使用Python發(fā)送文本郵件、HTML郵件以及帶附件郵件的技能!這些技能將幫助你在自動化任務、通知系統或任何需要郵件通信的應用程序中大展拳腳。記得在實踐中不斷探索和嘗試,你會發(fā)現Python在郵件處理方面的更多可能性。

          作一封郵件和制作web頁面還是有很大不同的。當不同的瀏覽器都在不斷向標準靠近的同時,大多數郵件客戶端卻止步不前,甚至有一些是在退步的。在2007年,Microsoft 將 Outlook 的渲染引擎從 IE 轉換成 Word的渲染方式,而一些基于web的郵件客戶端,像Gmail和Hotmail,則增加了一些怪異的模式,還有Lotus Notes的一些技巧。

          根據我的經驗來看,我們解決這些問題的關鍵是要關注下面三件事情。首先,保持簡單,你的郵件設計的越復雜,你的郵件在某個受歡迎的、不支持標準的客戶端上“抽風”的可能性就越大。其次,你需要將你的編碼技巧退步十年,這通常意味著我們要使用嵌套的表格,將CSS寫成內聯的形式等。最后,你需要對你的設計進行規(guī)律性的測試。

          使用表格布局

          因為諸如Gmail和Outlook 2007 無法支持浮動(float)、外邊距(margin)、內填充(padding),你需要使用表格來作為你的郵件的框架。雖然表格嵌套的方法被廣泛支持,但是在對單元格的寬度、外邊距和內填充的處理方法并不一致。為了達到最優(yōu)的效果,當制作表格結構時,請記住下面的技巧。

          1、為每個單元格設置寬度,而不是表格

          當你把表格寬度、td 寬度、td的填充和CSS的填充寫到一封郵件時,你看到的結果可能是每個郵件客戶端它們看上去都不一樣。最可靠的方法是我們將為表格的每個單元格(th,td)設置寬度,而不是表格(table)本身。如下:

          永遠別指望郵件客戶端能夠計算出你沒有指定寬度的單元格的寬度。它絕對不會。同時也要避免使用基于百分比的寬度,像 Outlook 2007 這樣的客戶端從來不考慮這種寬度方式,特別是這些嵌套的表格。像素級視覺,如果你想對每個單元格做填充,可以使用表單的單元格填屬性或者用CSS的內填充,但是不要這兩種一起使用。

          2、嵌套迷思

          表格的嵌套相對于設置左右浮動和外邊距(margin)或者表單單元格填充的方法更加穩(wěn)固。如果你能使用這種表格嵌套的方法達到相同的效果,這將會給你在那些蹩腳的(buggier)郵件終端上面獲得最好的結果。

          3、使用一個容器表單來設置 body 背景色彩

          很多郵件客戶端會忽略掉在CSS中或者<body>標簽中設置的背景色。針對這種情況,將你的整封郵件用一個寬度為100%的表單包起來,并且為其設置背景色。如下:

          你可以使用同樣的方案在背景圖片的設置上,需要記住的是某些郵件客戶端是不支持背景圖片的,這樣你就需要設置一個背景顏色作為備份方案。

          4、在單元格中避免使用多余的空格(whitespace)

          盡最大可能,避免<td>標簽中出現空格。某些郵件客戶端(Yahoo!或者Hotmail)可能會在某些場景下,對單元格的上面或者下面增加額外的填充,把你的設計破壞掉。

          CSS 和基本的文字格式

          當某些郵件設計師盡他們最大的努力去避免使用CSS時,他們又會去依賴夢魘般的<font>標簽,但實際情況是很多的CSS屬性是被大部分郵件客戶端支持的。請查看下面的跨郵件終端的綜合CSS支持列表list of CSS support,從中你也能發(fā)現一些安全的屬性和一些應該被避免使用的屬性。

          1、將css寫成內聯(inline)的樣式

          Gmail就是這方面的罪魁禍首。CSS被從<head>和<body>中剝離,我們別無選擇的會將樣式寫成內聯的形式。一個好消息是你可以完全自動化的完成轉化。像Premailer提供意見點擊的方式完成這一過程。我強烈建議你將此步驟作為你構建活動的最后一步,你就能感受到這個CSS的所有益處。

          2、避免使用字體的簡寫和十六進制計數法

          一部分郵箱客戶端會放棄對簡寫的css字體屬性的解析。比如,絕對不要將你的字體樣式設置成下面的樣子。如下:

          相反,我們應該寫成下面的形式:

          談到字體這個話題,我最近也在不同的郵件客戶端測試引用字體(@font-face)。結果是凄涼的,這些瀏覽器安全的字體在郵件中使用還是遙遙無期。

          當我們用CSS來聲明顏色屬性時,有些郵件客戶端并不支持簡寫的16進制的顏色值,比如 color:#f60; 我們需要將其補充完整 color:#ff6600;。為了達到最優(yōu)的效果,我們需要使用常規(guī)寫法。

          段落

          像前面提到的單元格的間距,段落的間距也無法做到所有客戶端的一致。我看到過設計師使用兩個<br>或者用DIV寫上內聯(inline)的外邊距(margin)樣式彌補這個短板,但是我最近的測試顯示大多數情況下對段落的支持都還是比充足的(有一段時間 Yahoo! 根本不支持段落標簽)。

          最好的實踐方法是對每個段落通過內聯(inline)的方法設置外邊距(margin),像下面這樣:

          再次提示,在你構建郵件的時候通過在head標簽中增加樣式,然后通過Premailer將他們轉化成每個段落的內聯樣式。

          如果你的設計對高度是很敏感的或者需要像素級別的完美,我強烈建議你不要將所有的段落寫到一起,而是將文本的格式化工作放到表單的單元格中來做。你可能會需要使用到表單的嵌套或者單元格填充(cellpadding)/CSS 來達到期望的樣子。下面就是一個例子:

          鏈接

          某些郵件客戶端將會用他們的默認樣式覆蓋你的鏈接色,你可以通過兩部來防止其發(fā)生。第一,針對每一個鏈接設置一個內聯的(inline)的顏色:

          接下來,增加一個冗余的 span 標簽在 a 標簽中。

          也許這些方案看上去比較過激,如果這個顏色對你的設計很重要,這個多余的 span 標簽是你達到一致表現的最好解決方案。

          HTML郵件中的圖片

          很重要的一件需要牢記在心中的關于圖片的事情是你的訂閱者可能看不到你的圖片。如果你有這方面的準備,你就會保持你的內容簡單,并且重要的內容不通過圖片的形式來展示。

          在這個思想的指導下,在使用HTML郵件的過程中,下面有一些基本的要領需要牢記:

          1、避免占位圖片

          雖然使用占位圖片和嵌套表格的方式在10年前很流行,許多郵件客戶端已經將其排除作為一種可靠的技術。很多客戶端會使用一個相同尺寸的空占位來替換圖片,另外一些會將所有的圖片移除。大多數郵件客戶端會給圖片賦予默認的圖片區(qū)塊,這將導致訂閱者的第一感覺很差。堅持將單元格賦予固定的寬度,讓其在沒有圖片的時候版式不會亂掉。

          2、將圖片定義尺寸

          如果你沒有給每個圖片設置尺寸,當圖片沒有被下載時,有些客戶端會自己發(fā)明一個他們自己的尺寸,你的版式就亂掉了。同時,確保你的所有圖片在被用到郵件中前,都被賦予了正確的尺寸。某些客戶端會忽略你代碼中設置的尺寸,而去使用真實的圖片尺寸。

          3、避免使用 PNG 圖片

          Lotus Notes 6 和 7 并不支持 8位(8-bit)和24位(24-bit)的 PNG 圖片,所以需要使用GIF或者JPG格式的圖片,即使這會增加而外的圖片大小。

          4、為背景圖片提供備份的顏色

          Outlook 2007 不支持背景圖片(aside from this hack to get full page background images working)。如果你想在你的設計中使用背景圖像,提供一個背景色作為備份支持方案。這樣就能同時解決圖片被屏蔽和Outlook 2007的問題。

          5、不要忘記標注替代文本(alt text)

          缺少標準的支持意味著郵件客戶端對語義化和訪問性良好的HTML郵件的破壞性是很大的。即使這樣,從圖片可能被屏蔽角度看,提供替代文本也是很重要的。這樣即使圖片在默認狀態(tài)下被限制,大多數郵件客戶端也能顯示提供的文本來替代。另外還需要技術的是某些客戶端,比如 Outlook 2007, Hotmail 和 Apple Mail 在圖片被屏蔽的時候,并不提供替代文本(alt text).

          6、針對 Hotmail 使用顯示hack

          令人費解的是,Windows Live Hotmail 對每個圖片增加了幾個像素的填充。一個變通的方案就是使用下面的顯示屬性來解決這個問題。

          這樣就能移除掉Hotmail的填充值,但是你也可能會給其它客戶端埋下隱患。

          7、避免使用浮動屬性(float)

          Outlook 2007 和早期版本的 Notes 并不支持浮動屬性(float)。在郵件中我們可以使用對齊屬性在針對圖像標簽做到浮動圖片的目的。

          如果你在 Yahoo!的郵件中發(fā)現圖片的怪異表現,增加 align="top" 可能能夠解決你遇到的問題。

          視頻郵件

          由于缺少 Javascript 或者其他對象標簽(object tag)的支持,視頻郵件最大的程度就是gif動畫(如果你認為那是視頻的話)。盡管如此,我最近做的一些關于用html5 videio 標簽的測試結果,還是讓人感覺不錯。

          HTML 5的標簽目前在一部分郵件終端是無法運行的,包括 Apple Mail,Entourage 2008, MobileMe 和 iPhone.作為如果視頻不被支持的補救方法,你可以提供穩(wěn)定的備選內容,比如gif 動畫或者一個可以點擊到瀏覽器播放視頻的圖片。

          當然,你是否需要將視頻添加到你的郵件里面,那就是另外一個議題了,如果你的答案是肯定的,你可以使用這些代碼案例。

          關于移動端郵件的那些事

          移動端有機胺的情況近期顯得比較雜亂了,隨著iPhone,Android的發(fā)明和Palm和RIM的改進,認為移動端電子郵件終端不重要的年代一去不復返了。

          為了給移動端訂閱用戶良好的體現,我們在編碼的過程中也有幾個關鍵點需要牢記心中。

          1、保持寬度小于600像素

          受限于郵件客戶端的視窗,這條規(guī)則來移動視窗到來之前的年代就很重要。事實上,iphone 的視窗是320像素,Droid是480像素,Blackberry大概360像素。堅持最大600像素寬的設計,能夠讓你的郵件縮小到上面提到的設備上面依然可讀。這個尺寸在桌面端和web端的預覽效果也很好。

          2、注意文本尺寸的自動調整

          作為一個好的特性,基于webkit郵件客戶端(比如 iPhone, Pre 和 Android) 能夠自動調整文本的大小來提高閱讀性。如果你的測試結果表明這項特點給你帶來的好處是破外了你的設計,你可以通過下面的屬性禁用:

          不要忘記去測試

          雖然近幾年郵件客戶端對標準的支持并沒有取得長足的進步,但是某些郵件客戶端的改變卻從未停止(有好有壞),基于 web 的客戶端,如 Yahoo!、hotmail 和 Gmail 在這方面乏善可陳。我看到過無數次可行的設計方案被停止支持,沒有任何解釋。

          基于這個原因,你也要對你的郵件設計保持規(guī)律的測試。我發(fā)現每個月進行一些快速的測試的小技巧,特別基于web的客戶端。好的消息是經過幾次設計和測試,你將會從這些雜亂無章中找到規(guī)律。一些潛在的陷阱將變的可以預計,一個對郵箱友好的設計模型也會在你心中成型。


          本文參考“新浪UED”:創(chuàng)建堅如磐石的HTML郵件

          php中提供了一個發(fā)送郵件的函數mail函數,它可以在程序中直接發(fā)送電子郵件,不過它要求服務器支持sendmail

          或者必須設置一臺不需要中繼的郵件發(fā)送服務器,但現在要找到一臺不需要身份驗證的郵件發(fā)送中繼幾乎不可能。

          所以使用mail函數往往無法成功發(fā)送email.

          自己如果熟悉SMTP協議,結合socket功能就可以編寫高效穩(wěn)定的郵件發(fā)送程序,但對一般用戶來說太困難。好在互聯網上已經有很多別人編寫好的郵件發(fā)送模塊,我們只需要下載后簡單調用即可,十分方便。

          在此我們給用戶推薦一個php下功能十分強大,易用且免費的SMTP類模塊-PHPMailer,

          PHPMailer是一個用于發(fā)送電子郵件的PHP函數包。它提供的功能包括:

          *.在發(fā)送郵時指定多個收件人,抄送地址,暗送地址和回復地址

          *.支持多種郵件編碼包括:8bit,base64,binary和quoted-printable

          *.支持SMTP驗證

          *.支持冗余SMTP服務器

          *.支持帶附件的郵件和Html格式的郵件

          *.自定義郵件頭

          *.支持在郵件中嵌入圖片

          *.調試靈活

          *.經測試兼容的SMTP服務器包括:Sendmail,qmail,Postfix,Imail,Exchange等

          *.可運行在任何平臺之上

          下載該組件后,按如下示例編寫代碼即可實現php在線發(fā)送郵件。

          一:html程序

          <html>

          <body>

          <h3>phpmailer Unit Test</h3>

          請你輸入<font color="#FF6666">收信</font>的郵箱地址:

          <form name="phpmailer" action="send.php" method="post">

          <input type="hidden" name="submitted" value="1"/>

          郵箱地址: <input type="text" size="50" name="address" />

          <br/>

          <input type="submit" value="發(fā)送"/>

          </form>

          </body>

          </html>

          二:PHP程序

          <?php

          require("class.phpmailer.php"); //下載的文件必須放在該文件所在目錄

          $mail = new PHPMailer(); //建立郵件發(fā)送類

          $address = $_POST['address'];

          $mail->IsSMTP(); // 使用SMTP方式發(fā)送

          $mail->Host = "mail.xxxxx.com"; // 您的企業(yè)郵局域名

          $mail->SMTPAuth = true; // 啟用SMTP驗證功能

          $mail->Username = "user@xxxx.com"; // 郵局用戶名(請?zhí)顚懲暾膃mail地址)

          $mail->Password = "******"; // 郵局密碼

          $mail->From = "user@xxxx.com"; //郵件發(fā)送者email地址

          $mail->FromName = "您的名稱";

          $mail->AddAddress("$address", "");//收件人地址,可以替換成任何想要接收郵件的email信箱,格式是AddAddress("收件人email","收件人姓名")

          //$mail->AddReplyTo("", "");

          //$mail->AddAttachment("/var/tmp/file.tar.gz"); // 添加附件

          //$mail->IsHTML(true); // set email format to HTML //是否使用HTML格式

          $mail->Subject = "PHPMailer測試郵件"; //郵件標題

          $mail->Body = "Hello,這是測試郵件"; //郵件內容

          $mail->AltBody = "This is the body in plain text for non-HTML mail clients"; //附加信息,可以省略 (PS:^_^不錯的php開發(fā)交流群304224365,驗證:ttf,謝謝!)

          if(!$mail->Send())

          {

          echo "郵件發(fā)送失敗。 <p>";

          echo "錯誤原因: " . $mail->ErrorInfo;

          exit;

          }

          echo "郵件發(fā)送成功"


          主站蜘蛛池模板: 日美欧韩一区二去三区| 精品国产一区二区三区色欲| 中文字幕一区二区三匹| 黑人一区二区三区中文字幕| 精品一区二区三区东京热| 日韩十八禁一区二区久久| 国产Av一区二区精品久久| 少妇激情av一区二区| 99精品国产高清一区二区三区| 无码一区二区三区亚洲人妻| 亚洲国产成人精品无码一区二区| 免费萌白酱国产一区二区三区 | 国产一区二区三区无码免费| 亚洲一区二区在线视频| 91国在线啪精品一区| 性色AV 一区二区三区| 国产成人一区二区三区电影网站| 无码人妻精品一区二区三18禁| 中文字幕亚洲一区二区va在线| 日本在线视频一区| 国产精品亚洲一区二区三区在线观看 | 日韩一区二区三区射精| 国产成人精品一区二区秒拍| 国产一区二区高清在线播放| 国产伦精品一区二区免费| 亚洲国产成人久久综合一区77| 精品一区二区三区AV天堂| 综合激情区视频一区视频二区| 后入内射国产一区二区| 国产精品亚洲不卡一区二区三区 | 中文字幕一区二区三区精彩视频 | 成人区精品一区二区不卡亚洲 | 日韩国产一区二区| 国产剧情一区二区| 视频在线一区二区三区| 国产av福利一区二区三巨| 国产一区二区三区免费观看在线 | 天码av无码一区二区三区四区| 日韩精品一区二区三区视频| 狠狠综合久久AV一区二区三区 | 亚洲综合一区二区|