整合營銷服務商

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

          免費咨詢熱線:

          前端工程師如何制作EDM 郵件頁面

          件制作不同于其他的頁面制作,所以有些規范您還是得考慮的。

          1.模板編碼語言選擇

          模板編碼設定與使用的發送軟件有關,一般來說,utf-8為較常用的選擇,錯誤 的編碼會造成用戶瀏覽的時候出現亂碼。

          2.對于HTML格式郵件的要求

          包括空格在內,郵件標題的字符最好控制在35個字符。 文件大小(HTML和圖片)最好控制在500KB以下。 電子郵件推薦寬度為850像素以內。鑒于現的瀏覽器普遍偏大,可根據設計的顯 示效果自定義寬度,建議不要超過750像素。 不推薦使用最新的HTML版本,因為目前常用的瀏覽器有些是不支持最新的HTML 標簽的,為了給用戶更好的瀏覽效果,采用“老版本”HTML3.2、HTML4.0即可。

          EDM table布局規范

          1.不要使用div,使用table定位

          Div+css是近幾年新興的web2.0定位方式,這種 方式不適合在郵件模板切割中使用,不同郵件客 戶端或在線瀏覽器對css模型解釋不盡相同,甚 至部分ISP會直接屏蔽部分css樣式,造成錯位或 布局混亂等問題。

          2.使用table布局時,不可重復多次colspan

          不要使用單一table重復多次colspan,可能會被 郵件客戶端判斷為結構過于復雜,歸類為垃圾郵 件;同時也容易被打亂布局而影響用戶瀏覽。

          <table> <tr>

          <td><table> <tr>

          <td> </td>

          <td> </td> </tr>

          </table></td> </tr>

          <tr>

          <td><table> <tr>

          <td> </td> <td> </td> <td> </td>

          </tr> </table></td>

          </tr> <tr>

          <td><table> <tr>

          <td> </td>

          <td> </td> </tr>

          </table></td> </tr>

          </table>

          EDM | 圖片樣式與背景圖片顏色使用規范

          1.模板盡量不要使用背景圖片

          背景圖片在某些郵件客戶端或web界面(如 Gmail、OutLook) 中默認不顯示,所以模板最好不要使用背景圖片,建議使用 背景顏色。但郵件中是可以使用背景顏色的,大部分的郵件 客戶端都是支持的。

          2.每張圖都要指定width寬度

          每張圖都要指定width寬度、height高度,在圖片被攔截的時 候,不會因圖片大小無法讀 取而被打亂布局。

          3.每張圖都要指定alt屬性

          每張圖都要指定alt屬性,可以在圖片被攔截的時候顯示圖片 的內容;這樣客戶打開郵件在沒有點擊下載圖片的時候先是 可以看到文字的表述,知道此封郵件大概的內容,而提升用 戶對此封郵件的體驗,從而提高郵件的點擊率并非像上圖中 ,顯示為空白,給用戶帶來不必要的困擾。

          圖片樣式與文本鏈接規范

          1. 圖片鏈接不要使用<map>標簽,因為部分郵件運營商 會屏蔽<map>標簽,而導致圖片無法點擊。

          2. 請使用英文字符對圖片名稱命名,不要使用中文、非法 字符來命名圖片,否則會導致圖片無法顯示。

          3. 在切割模板的時候,要注意限制圖片的大小和數量,不要為 了效果使圖片過大,會使郵件接收者打開過于緩慢,甚至直 接關閉郵件。

          4.純圖片郵件圖片于圖片之前出現斷行 ,目前很多公司的郵件都是使用大圖片切圖這種不規則的 ,經常出現下面的問題

          解決方法:

          <img src=http: // blog.54575.com/logo.gif” width=297′′ height=160′′ alt=”情人節特供” style="display:block;" />。

          在每張圖片后添加 style="display:block;" 此CSS即可。

          EDM | CSS樣式規范

          1.不要使用外部樣式表引用,將樣式表 寫入模板內部,因為大部分的ISP會 屏蔽css樣式表 如:

          2.padding和margin標簽

          table中,某些郵件客戶端或web界面 (如Gmail), 對浮動的標簽(padding 、margin等)支持很差,所以盡量不 要使用。

          3.盡量不要使用<h2>、<ul>、<li>、 <p>、<ol>等有默認樣式的標簽。 防止style不被ISP正確解析時頁面布 局混亂。

          EDM | 動畫與互動元素的規范

          1. 可以使用簡單的gif動畫來表達某些需要明顯突出的要素,但要控制gif文件的大 小,不要影響整封郵件的下載瀏覽速度; 但gif動畫在OutLook 里是失效的。

          2. 不要使用Flash、Java、Javascript、Frames,I-Frames、ActiveX、dynamic HTML等,前些年郵件病毒泛濫,大部分郵件運營商都已經屏蔽了這些元素

          1

          發送郵件

          發送郵件使用SMTP協議【Simple Mail Transfer Protocol簡單的郵件傳輸協議】,SMTP協議是SMTP客戶端與SMTP服務器之間的通信協議。

          python中發送郵件使用的模塊有smtplib和email:

          1.使用smtplib模塊進行發送郵件;

          2.使用email模塊來添加發送的郵件內容。

          1. smtplib模塊

          導入模塊:import smtplib

          1.1. 創建SMTP對象

          smtplib.SMTPsmtplib.SMTP_SSL:均可以用來創建SMTP對象;

          smtplib.SMTP_SSL:使用安全加密的SSL協議連接到SMTP服務器;

          smtplib.SMTP:沒有進行安全加密。

          故若待測試郵箱不允許使用非SSL和非TLS頻道通信時,則無法使用smtp.SMTP方式來創建客戶端對象。

          【查看郵箱的通信方式:郵箱設置菜單中,查看郵箱的接收服務器和發送服務器信息。】

          如:騰訊企業郵箱接收服務器:imap.exmail.qq.com(使用SSL,端口號993)發送服務器:smtp.exmail.qq.com(使用SSL,端口號465)
          • smtplib.SMTP(host,port,local_hostname,timeout,source_address)

          • smtplib.SMTP_SSL(host, port, local_hostname, keyfile, certfile, timeout, source_address, context)

            創建SMTP對象。

            host:SMTP發送服務器主機

            port:SMTP服務器端口號


          1.2. SMTP對象操作

          • login(user, password, *, initial_response_ok=True)

            SMTP對象登錄

            user:授權登錄的用戶名

            password:授權登錄的密碼

          • sendmail(from_addr, to_addrs, msg, mail_options=[], rcpt_options=[])

            SMTP對象發送郵件

            from_addr:發件人地址,字符串類型。

            to_addr:收件人地址,包括收件人和抄送人。

            多個收件人時to_addr參數為列表,單個收件人時to_addr參數可以為列表或字符串。

            msg:要發送的信息

          • quite終止SMTP會話

          2. 發送郵件的實例

          2.1. 添加郵件內容,包括收件人、抄送人、正文、附件

          from email.mime.multipart import MIMEMultipartfrom email.header import Headerfrom email.mime.text import MIMETextfrom email.mime.image import MIMEImageimport osclass EmailContent: def __init__(self, senderAdr, emailSubject, toReceivers, ccReceivers): # 郵件對象 self.msg = MIMEMultipart # 添加發件人頭 self.msg['From'] = Header("測試" + "<" + senderAdr + ">", 'utf-8') # 添加收件人 if isinstance(toReceivers, str): self.msg["To"] = toReceivers elif isinstance(toReceivers, list): self.msg['To'] = ";".join(toReceivers) # 添加抄送人 if isinstance(ccReceivers, str): self.msg["Cc"] = ccReceivers elif isinstance(ccReceivers, list): self.msg["Cc"] = ";".join(ccReceivers) # 添加郵件主題 self.msg['Subject'] = Header(emailSubject, "utf-8")
          def addBody(self, bodyType): """ 添加不同的郵件正文的實例 1. body為字符串:(如)"這是一個郵件正文內容" 2. body為html格式的字符串:(如)"<div><p>第一段</p><p>&nbsp;第二段</p></div>" 3. body正文中包含有圖片: """ if bodyType == "string": body = "這是一個郵件正文內容" mimeText = MIMEText(body, "plain", "utf-8") self.msg.attach(mimeText) elif bodyType == "html": body = "<div><p>第一段</p><p>&nbsp;第二段</p></div>" mimeText = MIMEText(body, "html", "utf-8") self.msg.attach(mimeText) elif "image" in bodyType: imageFile = "E://log//test.png" imageId = os.path.split(imageFile)[1] # 添加內容 body = ''' <p>測試圖片為:</p> <p><img src="cid:{imageId}"></p> '''.format(imageId=imageId) mimeText = MIMEText(body, "html", "utf-8") self.msg.attach(mimeText) # 讀取圖片,并設置圖片id用于郵件正文引用 with open(imageFile, "rb") as fp: mimeImage = MIMEImage(fp.read) mimeImage.add_header("Content-ID", imageId) self.msg.attach(mimeImage)
          def addAttachment(self, attachmentName): """ 添加附件 :return: """ file = "E://log//test.txt" # file = "E://log//test.zip" # file = "E://log//test.png" filePath, fileName = os.path.split(file) print("fileName =", fileName) enclosure = MIMEText(open(file, 'rb').read, 'base64', 'utf-8') enclosure['Content-Type'] = 'application/octet-stream' if attachmentName == "英文": enclosure['Content-Disposition'] = 'attachment; filename="%s"' % fileName elif attachmentName == "中文": enclosure.add_header("Content-Disposition", "attachment", filename=("gbk", "", fileName)) self.msg.attach(enclosure)

          2.2. 發送郵件

          import smtplibdef SendEmail: """發送郵件""" # SMTP的服務器信息 smtpHost = "smtp.exmail.qq.com" sslPort = 465 senderAdr = "xx@xx.cn" senderPwd = "XXXX" # 創建SMTP對象 smtpServer = smtplib.SMTP_SSL(smtpHost, sslPort) # # 設置debug模塊 # smtpServer.set_debuglevel(True) # 登錄 smtpServer.login(senderAdr, senderPwd) # 添加郵件內容 toReceivers = ["a@xx.cn", "b@xx.cn"] ccReceivers = ["d@xx.cn", "e@xx.cn"] toAddrs = toReceivers + ccReceivers emailSubject = "這是個編程技術圈自動發送的郵件" emailContent = EmailContent(senderAdr, emailSubject, toReceivers, ccReceivers) emailContent.addBody("html") emailContent.addAttachment("英文") message = emailContent.msg # 發送 smtpServer.sendmail(senderAdr, toAddrs, message.as_string) # 終止SMTP會話 smtpServer.quit
          SendEmail

          02

          讀取郵件

          收取郵件使用POP3協議;

          解析郵件:需要將收取的郵件轉化為email.message.Message對象,再使用email模塊解析內容。

          1. 讀取郵件的實例

          1.1. 獲取某封郵件的對象

          import poplibfrom email.parser import Parser"""POP的服務器信息"""popHost = "pop.exmail.qq.com"userAdr = "xx@xx.cn"userPwd = "xxxxx"
          """ 創建POP3對象,添加用戶名和密碼"""pop3Server = poplib.POP3(popHost)pop3Server.user(userAdr)pop3Server.pass_(userPwd)
          """獲取郵件數量和占用空間"""messageCount, mailboxSize = pop3Server.stat
          """獲取郵件請求返回狀態碼、每封郵件的字節大小(b'第幾封郵件 此郵件字節大小')、"""response, msgNumOctets, octets = pop3Server.list
          """ 獲取任意一封郵件的郵件對象【第一封郵件的編號為1,而不是0】"""msgIndex = random.randint(1,messageCount)print(msgIndex)# 獲取第msgIndex封郵件的信息response, msgLines, octets = pop3Server.retr(msgIndex)# msgLines中為該郵件的每行數據,先將內容連接成字符串,再轉化為email.message.Message對象msgLinesToStr = b"\r\n".join(msgLines).decode("utf8", "ignore")messageObject = Parser.parsestr(msgLinesToStr)print(messageObject)
          """ 終止POP3服務"""pop3Server.quit

          1.2. 解析郵件對象

          1.2.1. 獲取郵件日期

          msgDate = messageObject["date"]print(msgDate)

          1.2.2. 獲取郵件發件人實名、郵箱地址

          獲取郵件實名時,名稱一般是加密的,此時就需要對頭文件進行解碼才可獲取它的實際內容

          from email.header import decode_headerdef decodeMsgHeader(header): """ 解碼頭文件 :param header: 需解碼的內容 :return: """ value, charset = decode_header(header)[0] if charset: value = value.decode(charset) return value
          from email.utils import parseaddrsenderContent = messageObject["From"]# parseaddr函數返回的是一個元組(realname, emailAddress)senderRealName, senderAdr = parseaddr(senderContent) # 將加密的名稱進行解碼 senderRealName = decodeMsgHeader(senderRealName) print(senderRealName)print(senderAdr)

          1.2.3. 獲取郵件主題

          獲取的郵件的主題也是加密的,此時就需要對頭文件進行解碼才可獲取它的實際內容

          msgHeader = messageObject["Subject"]# 對頭文件進行解碼msgHeader = decodeMsgHeader(msgHeader )print(msgHeader)

          1.2.4. 獲取郵件正文

          一封郵件的正文內容,可能是由幾部分構成,每部分的格式不同。

          """獲取郵件正文內容"""msgBodyContents = if messageObject.is_multipart: # 判斷郵件是否由多個部分構成 messageParts = messageObject.get_payload # 獲取郵件附載部分 for messagePart in messageParts: bodyContent = decodeBody(messagePart) if bodyContent: msgBodyContents.append(bodyContent)else: bodyContent = decodeBody(messageObject) if bodyContent: messageBodyContents.append(bodyContent)print(msgBodyContents)
          def decodeBody(msgPart): """ 解碼內容 :param msgPart: 郵件某部分 """ contentType = msgPart.get_content_type # 判斷郵件內容的類型,text/html textContent = "" if contentType == 'text/plain' or contentType == 'text/html': content = msgPart.get_payload(decode=True) charset = msgPart.get_charset if charset is None: contentType = msgPart.get('Content-Type', '').lower position = contentType.find('charset=') if position >= 0: charset = contentType[position + 8:].strip if charset: textContent = content.decode(charset) return textContent

          1.2.5. 獲取郵件附件

          郵件附件名為中文時,需借助頭文件解碼方式進行解碼,否則會為亂碼。

          messageAttachments = if messageObject.is_multipart: # 判斷郵件是否由多個部分構成 messageParts = messageObject.get_payload # 獲取郵件附載部分 for messagePart in messageParts: name = messagePart.get_param("name") # 名字存在,則表示此部分為附件 if name: fileName = decodeMsgHeader(name) # 解碼 messageAttachments.append(fileName)else: name = messageObject.get_param("name") if name: fileName = decodeMsgHeader(name) # 解碼 messageAttachments.append(fileName)print(messageAttachments)

          2. 讀取郵件時遇到的問題

          2.1. 提示“poplib.error_proto: line too long”

          File "XXX/EmailInfo.py", line 22, in getMessageObject return parser.Parser.parsestr(b"\n".join(self.popServer.retr(i)[1]).decode("utf8", "ignore")) File "/usr/local/lib/python3.6/poplib.py", line 248, in retr return self._longcmd('RETR %s' % which) File "/usr/local/lib/python3.6/poplib.py", line 183, in _longcmd return self._getlongresp File "/usr/local/lib/python3.6/poplib.py", line 168, in _getlongresp line, o = self._getline File "/usr/local/lib/python3.6/poplib.py", line 130, in _getline raise error_proto('line too long')poplib.error_proto: line too long

          POP3對行長度做了限制,默認為_MAXLINE = 2048,故若是郵件超過此長度就會提示“poplib.error_proto: line too long”。

          解決方案:在讀取郵件代碼中重新定義最大行長度,即給poplib._MAXLINE設置新值。

          import poplibpoplib._MAXLINE=20480

          - end -

          文專家:馬國凱

          1987年9月14日21時07分,北京計算機應用技術研究所發出了我國第一封電子郵件,郵件是發往德國卡爾斯魯厄大學的,內容為“越過長城,走向世界”。那么電子郵件會不會失竊呢?

          今天就讓我們談談電子郵件會不會失竊呢?

          我們發紙質信件的時候,有時會擔心信件被別人偷走或信件內容被別人看到。通信是一件涉及隱私的事情,因此保密性很重要。那么瞬間就發到對方信箱的電子郵件也會被別人偷看嗎?

          電子郵件是在互聯網上傳輸的一小段信息,互聯網上傳輸的一切信息都存在被人偷看的可能,所以電子郵件并不是百分之百安全的。

          想偷看他人郵件有兩種方法,一是冒充他人的身份登錄郵件服務器,查看郵件內容;二是通過偵聽網絡的方式截獲傳輸中的電子郵件,得到電子郵件的副本。

          針對第一種方法,你只需要保護好用戶名和密碼,不要讓他人知道,就能避免別人冒充身份連接到郵件服務器,得到郵件內容。而第二種方法和郵件服務器的安全性有關,如果郵件服務器采取明文傳輸,竊聽者就能通過監聽服務器傳輸數據的方法破譯出郵件內容;而如果郵件服務器采取密文傳輸,竊聽者就無法通過破譯得到郵件內容。

          傳輸郵件的安全性就只有通過郵件服務器來保證了嗎?

          并非如此。你可以將要說的話保存在文件里,再通過加密軟件將郵件內容加密,將加密后的郵件內容作為附件郵寄給收件人。只要通過其他方式告訴收件人密碼,就可以保證郵件的安全性了,其他人無論用什么方法得到你的郵件,都只能看到一堆亂碼,什么有效信息也得不到。


          主站蜘蛛池模板: 亚洲一区二区三区自拍公司| 在线观看一区二区三区av| 中文字幕视频一区| 91国在线啪精品一区| 亚洲欧洲专线一区| 久久精品无码一区二区WWW| 日本精品高清一区二区| 日韩AV在线不卡一区二区三区 | 亚洲精品一区二区三区四区乱码| 国产精品一区在线观看你懂的| 日韩在线视频一区二区三区| 国产美女在线一区二区三区| 亚洲av日韩综合一区在线观看| 国产精品无码一区二区三级| 日本精品高清一区二区| 精品免费久久久久国产一区| 亚洲国产欧美国产综合一区| 亚洲天堂一区二区| 秋霞无码一区二区| 中文字幕一区二区三区人妻少妇| 精品欧洲AV无码一区二区男男| 日韩内射美女人妻一区二区三区| 久久精品道一区二区三区| 午夜福利av无码一区二区| 在线播放国产一区二区三区| 日本激情一区二区三区| 人妻精品无码一区二区三区 | 一本AV高清一区二区三区| 国产亚洲福利精品一区| 久久精品一区二区东京热| 色窝窝无码一区二区三区| 国产成人精品久久一区二区三区| 亚洲一区二区三区国产精华液| 国产香蕉一区二区三区在线视频| 国产精品成人一区无码| 国产成人精品无人区一区| 奇米精品一区二区三区在线观看| 亚洲av无码一区二区三区天堂古代| 国产精品高清一区二区三区不卡| 无码丰满熟妇浪潮一区二区AV| 福利一区在线视频|