python 發送郵件

1郵件發送過程html

一般咱們經過一個郵箱程序填好郵件信息(如163郵箱等),點擊發送按鈕就將該電子郵件發送出去了。這個郵箱程序被稱爲郵件用戶代理(Mail User Agent,MUA),它的功能就是用於收發郵件。python

Email從MUA發出後,不是直接到達對方電腦,而是發送到郵件傳輸代理(Mail Transfer Agent,MTA),就是郵件服務提供商,如網易、阿里雲等。數據庫

假設本身的郵箱是me@163.com,對方的是friend@qq.com。因爲本身的郵箱是163.com,Email首先投遞到網易提供的MTA,再由網易提供的MTA發送到對方的服務商(也就是騰訊提供的MTA)。在這個過程當中也許會通過別的MTA,可是對用戶透明,咱們不用去管。安全

Email到達騰訊的MTA以後,由於對方使用的是qq郵箱,所以騰訊的MTA會將Email投遞到最終的目的地郵件投遞代理(Mail Delivery Agent,MDA)。服務器

Email到達MDA後,會存放在騰訊服務器的某個文件或者數據庫裏,咱們將長期保存電子郵件的地方稱之爲電子郵箱。對放要到取郵件,必須經過MUA從MDA上得到。app

簡單的說一封電子郵件的旅程是:發件人->MUA->MTA->...->MTA->MDA->MUA->收件人函數

 

2郵件的協議測試

發郵件時,MUA和MTA使用的協議是SMTP(Simple Mail Transfer Protocol),從一個MTA到另外一個MTA也是使用SMTP協議。阿里雲

收郵件時,MUA和MDA使用的協議有兩種:一種是POP(Post Office Protocol),目前是版本3,俗稱POP3;加密

另外一種是IMAP(Internet Message Access Protocol),該協議的優勢是不但能取郵件,還能夠直接操做MDA上存儲的郵件,如刪除等操做。

 

3 SMTP發送郵件

python對SMTP的支持有smtplib和email兩個模塊,email負責構造郵件,smtplib負責發送郵件。

下面是簡單郵件發送的demo

#!/usr/bin/python
#!coding:utf-8
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

mail_host = 'smtp.163.com'
mail_port = 465
sender = 'me@163.com' # 填寫你的郵件和密碼(受權碼)
pwd = '******'
receivers = ['friend1@qq.com','friend2@qq.com']

subject = 'python smtp test'
content = '這是一個測試郵件,被ouym建立。'
html_content = """
<p>歡迎進入ouym的博客</p>
<p><a href="http://www.ouym.top">點擊www.ouym.top</a></p>
"""


# send函數封裝鏈接登錄,以及實際的發送操做
def send(message):
    try:
        smtpObj = smtplib.SMTP_SSL(mail_host,mail_port)
        smtpObj.login(sender,pwd)
        smtpObj.sendmail(sender,receivers,message.as_string())
        print("success!")
    except smtplib.SMTPException as e:
        print('郵件發送失敗,緣由爲:%s'%e)


# 簡單發送文本郵件
def send_text_mail():

    message = MIMEText(content,'plain','utf-8')
    message['From'] = "{}".format(sender)
    message['To'] = ",".join(receivers)
    message['Subject'] = subject

    send(message)


# 簡單發送html格式郵件
def send_html_mail():

    message = MIMEText(html_content,'html','utf-8')
    message['From'] = "{}".format(sender)
    message['To'] = ",".join(receivers)
    message['Subject'] = subject

    send(message)


# 簡單發送帶附件的郵件
def send_image_mail():

    message = MIMEMultipart()
    message['From'] = "{}".format(sender)
    message['To'] = ",".join(receivers)
    message['Subject'] = subject
    message.attach(MIMEText(html_content, 'html', 'utf-8'))

# txt附件 att1
= MIMEText(open('test1.txt', 'rb').read(), 'base64', 'utf-8') att1['Content-Type'] = 'application/octet-stream' att1['Content-Disposition'] = 'attachment;filename="ouym.txt"' message.attach(att1)
# 文檔附件 att2
= MIMEText(open('test2.doc', 'rb').read(), 'base64', 'utf-8') att2['Content-Type'] = 'application/octet-stream' att2['Content-Disposition'] = 'attachment;filename="ouym.doc"' message.attach(att2)
# 圖片附件 att3
= MIMEText(open('test3.png', 'rb').read(), 'base64', 'utf-8') att3['Content-Type'] = 'application/octet-stream' att3['Content-Disposition'] = 'attachment;filename="ouym.png"' message.attach(att3) send(message) def main(): send_text_mail() if __name__ == '__main__': main()

注意這裏SMTP不是使用的25端口,而是使用的465端口,這兩個端口都是用來發送郵件的。

465端口是爲SMTPS(SMTP-over-SSL)協議服務開放的,這是SMTP協議基於SSL安全協議之上的一種變種協議,它繼承了SSL安全協議的非對稱加密的高度安全可靠性,可防止郵件泄露。SMTPS和SMTP協議同樣,也是用來發送郵件的,只是更安全些,防止郵件被黑客截取泄露,還可實現郵件發送者抗抵賴功能。防止發送者發送以後刪除已發郵件,拒不認可發送過這樣一份郵件。

完~

相關文章
相關標籤/搜索