ホームページ  >  記事  >  バックエンド開発  >  Pythonで各種メールを送信する主な方法を詳しく解説

Pythonで各種メールを送信する主な方法を詳しく解説

高洛峰
高洛峰オリジナル
2017-02-23 16:38:341666ブラウズ

Pythonのメールモジュールを使うとメールの処理が簡単になります この記事では主にPythonで様々な種類のメールを送信する方法を紹介しますので、興味のある方はご覧ください。

Python のメール モジュールを使用すると、メールの処理が簡単になります。今日は、メールを送信する具体的な方法を学ぶことに焦点を当てて、私自身の経験をここに書き留め、専門家にアドバイスを求めます。

1. 関連モジュールの紹介

メールの送信には主に smtplib と email の 2 つのモジュールを使用します。 2 つのモジュールについて簡単に説明します。

1. smtplib モジュール

smtplib.SMTP( [host [, port[, local_hostname[, timeout]]]])

SMTP サーバーとの接続を表す SMTP クラス コンストラクター。この接続を通じて、SMTP サーバーに指示を送信し、関連する操作 (ログインなど) を実行できます。 、 メールを送る)。すべてのパラメータはオプションです。

host: SMTP サーバーのホスト名

port: SMTP サービス ポート、デフォルトは 25; SMTP オブジェクトの作成時にこれら 2 つのパラメーターが指定された場合、サーバーに接続するための初期化中に connect メソッドが自動的に呼び出されます。

smtplibモジュールにはSMTP_SSLクラスとLMTPクラスも提供されており、それらの動作は基本的にSMTPと同じです。

smtplib.SMTPが提供するメソッド:

SMTP.set_debuglevel(level): デバッグモードかどうかを設定します。デフォルトは False で、非デバッグ モードです。これは、デバッグ情報が出力されないことを意味します。

SMTP.connect([host[, port]]): 指定された SMTP サーバーに接続します。パラメータはそれぞれ smpt ホストとポートを表します。注: ホスト パラメータでポート番号を指定することもできるため (例: smpt.yeah.net:25)、ポート パラメータを指定する必要はありません。

SMTP.docmd(cmd[, argstring]): SMTP サーバーに指示を送信します。オプションのパラメータ argstring は、命令のパラメータを表します。

SMTP.helo([ホスト名]): 「helo」コマンドを使用して、サーバーに対して ID を確認します。これは、SMTP サーバーに「私が誰であるか」を伝えることと同じです。

SMTP.has_extn(name): 指定された名前がサーバーのメーリング リストに存在するかどうかを確認します。セキュリティ上の理由から、SMTP サーバーはこのコマンドをブロックすることがよくあります。

SMTP.verify(address): 指定された電子メール アドレスがサーバーに存在するかどうかを判断します。セキュリティ上の理由から、SMTP サーバーはこのコマンドをブロックすることがよくあります。

SMTP.login(ユーザー、パスワード): SMTP サーバーにログインします。現在、ほぼすべての SMTP サーバーは、電子メールの送信を許可する前にユーザー情報が正当であることを検証する必要があります。

SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options]): メールを送信します。ここで、3 番目のパラメータ msg が電子メールを表す文字列であることに注意してください。一般に、メールはタイトル、送信者、受信者、メールの内容、添付ファイルなどで構成されていることがわかります。メールを送信するときは、メッセージの形式に注意してください。この形式は、smtp プロトコルで定義されている形式です。

SMTP.quit(): SMTP サーバーから切断します。これは、「quit」コマンドを送信するのと同じです。 (smtp.close() は多くのプログラムで使用されています。quit と quit の違いについてグーグルで調べましたが、答えが見つかりませんでした。)

2. Email モジュール

emial モジュールは電子メール メッセージを処理するために使用されます。これには、RFC 2822 に基づく MIME およびその他のメッセージ ドキュメントが含まれます。これらのモジュールを使用して電子メールのコンテンツを定義するのは非常に簡単です。これに含まれるクラスは次のとおりです (詳細な紹介は http://www.php.cn/ でご覧いただけます):

class email.mime.base.MIMEBase(_maintype, _subtype, **_params): これはベースですMIME の種類。通常、使用するときにインスタンスを作成する必要はありません。ここで、_maintype はテキストや画像などのコンテンツ タイプです。 _subtype は、プレーンや gif などのコンテンツのマイナー タイプです。 **_params は、Message.add_header() に直接渡される辞書です。

class email.mime.multipart.MIMEMultipart([_subtype[, border[, _subparts[, _params]]]]: MIMEBase のサブクラス、複数の MIME オブジェクトのコレクション。_subtype のデフォルト値は混合です。境界は MIMEMultipart境界、デフォルトの境界は数えられます。

class email.mime.application.MIMEApplication(_data[, _subtype[, _encoder[, **_params]]]): MIMEMultipart

class audio.MIMEAudio のサブクラス。 (_audiodata[, _subtype[, _encoder[, **_params]]]): MIME オーディオ オブジェクト

class email.mime.image.MIMEImage(_imagedata[, _subtype[, _encoder[, **_params]]] ): MIMEバイナリ ファイル オブジェクト。

class email.mime.message.MIMEMessage(_msg[, _subtype]): 特定のメッセージ インスタンス。使用方法は次のとおりです:

msg=mail.Message.Message()  #一个实例 
msg['to']='XXX@XXX.com'   #发送到哪里 
msg['from']='YYY@YYYY.com'    #自己的邮件地址 
msg['date']='2012-3-16'      #时间日期 
msg['subject']='hello world'  #邮件主题

class email.mime.text.MIMEText ( _text[, _subtype[, _charset]]): MIME テキスト オブジェクト。_text は電子メールのコンテンツ、_subtype 電子メール タイプは text/plain (通常のテキスト電子メール)、html/plain (HTML 電子メール)、_charset エンコーディングです。 gb2312 などです

2. いくつかのタイプのメールの具体的な実装コード

1. 通常のテキストメール

を実装するには、まず MIMEText の _subtype を plain に設定することが重要です。 smtplib と mimetext。smtplib.smtp インスタンスを作成し、電子メール smtp サーバーに接続し、ログイン後に送信します。具体的なコードは次のとおりです: (python2.6 で実装)

# -*- coding: UTF-8 -*-
'''
发送txt文本邮件
'''
import smtplib 
from email.mime.text import MIMEText 
mailto_list=[YYY@YYY.com] 
mail_host="smtp.XXX.com" #设置服务器
mail_user="XXXX"  #用户名
mail_pass="XXXXXX"  #口令 
mail_postfix="XXX.com" #发件箱的后缀
 
def send_mail(to_list,sub,content): 
  me="hello"+"<"+mail_user+"@"+mail_postfix+">" 
  msg = MIMEText(content,_subtype=&#39;plain&#39;,_charset=&#39;gb2312&#39;) 
  msg[&#39;Subject&#39;] = sub 
  msg[&#39;From&#39;] = me 
  msg[&#39;To&#39;] = ";".join(to_list) 
  try: 
    server = smtplib.SMTP() 
    server.connect(mail_host) 
    server.login(mail_user,mail_pass) 
    server.sendmail(me, to_list, msg.as_string()) 
    server.close() 
    return True 
  except Exception, e: 
    print str(e) 
    return False 
if __name__ == &#39;__main__&#39;: 
  if send_mail(mailto_list,"hello","hello world!"): 
    print "发送成功" 
  else: 
    print "发送失败"

2. HTMLメール

与text邮件不同之处就是将将MIMEText中_subtype设置为html。具体代码如下:(python2.6下实现)

# -*- coding: utf-8 -*-
&#39;&#39;&#39;
发送html文本邮件
&#39;&#39;&#39;
import smtplib 
from email.mime.text import MIMEText 
mailto_list=["YYY@YYY.com"] 
mail_host="smtp.XXX.com" #设置服务器
mail_user="XXX"  #用户名
mail_pass="XXXX"  #口令 
mail_postfix="XXX.com" #发件箱的后缀
 
def send_mail(to_list,sub,content): #to_list:收件人;sub:主题;content:邮件内容
  me="hello"+"<"+mail_user+"@"+mail_postfix+">"  #这里的hello可以任意设置,收到信后,将按照设置显示
  msg = MIMEText(content,_subtype=&#39;html&#39;,_charset=&#39;gb2312&#39;)  #创建一个实例,这里设置为html格式邮件
  msg[&#39;Subject&#39;] = sub  #设置主题
  msg[&#39;From&#39;] = me 
  msg[&#39;To&#39;] = ";".join(to_list) 
  try: 
    s = smtplib.SMTP() 
    s.connect(mail_host) #连接smtp服务器
    s.login(mail_user,mail_pass) #登陆服务器
    s.sendmail(me, to_list, msg.as_string()) #发送邮件
    s.close() 
    return True 
  except Exception, e: 
    print str(e) 
    return False 
if __name__ == &#39;__main__&#39;: 
  if send_mail(mailto_list,"hello","<a href=&#39;http://www.cnblogs.com/xiaowuyi&#39;>小五义</a>"): 
    print "发送成功" 
  else: 
    print "发送失败"

3、发送带附件的邮件

发送带附件的邮件,首先要创建MIMEMultipart()实例,然后构造附件,如果有多个附件,可依次构造,最后利用smtplib.smtp发送。 

# -*- coding: cp936 -*-
&#39;&#39;&#39;
发送带附件邮件
&#39;&#39;&#39;

from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import smtplib

#创建一个带附件的实例
msg = MIMEMultipart()

#构造附件1
att1 = MIMEText(open(&#39;d:\\123.rar&#39;, &#39;rb&#39;).read(), &#39;base64&#39;, &#39;gb2312&#39;)
att1["Content-Type"] = &#39;application/octet-stream&#39;
att1["Content-Disposition"] = &#39;attachment; filename="123.doc"&#39;#这里的filename可以任意写,写什么名字,邮件中显示什么名字
msg.attach(att1)

#构造附件2
att2 = MIMEText(open(&#39;d:\\123.txt&#39;, &#39;rb&#39;).read(), &#39;base64&#39;, &#39;gb2312&#39;)
att2["Content-Type"] = &#39;application/octet-stream&#39;
att2["Content-Disposition"] = &#39;attachment; filename="123.txt"&#39;
msg.attach(att2)

#加邮件头
msg[&#39;to&#39;] = &#39;YYY@YYY.com&#39;
msg[&#39;from&#39;] = &#39;XXX@XXX.com&#39;
msg[&#39;subject&#39;] = &#39;hello world&#39;
#发送邮件
try:
  server = smtplib.SMTP()
  server.connect(&#39;smtp.XXX.com&#39;)
  server.login(&#39;XXX&#39;,&#39;XXXXX&#39;)#XXX为用户名,XXXXX为密码
  server.sendmail(msg[&#39;from&#39;], msg[&#39;to&#39;],msg.as_string())
  server.quit()
  print &#39;发送成功&#39;
except Exception, e: 
  print str(e)

 4、利用MIMEimage发送图片

# -*- coding: cp936 -*-
import smtplib
import mimetypes
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage

def AutoSendMail():
  msg = MIMEMultipart()
  msg[&#39;From&#39;] = "XXX@XXX.com"
  msg[&#39;To&#39;] = "YYY@YYY.com"
  msg[&#39;Subject&#39;] = "hello world"


  txt = MIMEText("这是中文的邮件内容哦",&#39;plain&#39;,&#39;gb2312&#39;)   
  msg.attach(txt)
  

  file1 = "C:\\hello.jpg"
  image = MIMEImage(open(file1,&#39;rb&#39;).read())
  image.add_header(&#39;Content-ID&#39;,&#39;<image1>&#39;)
  msg.attach(image)
  
  
  server = smtplib.SMTP()
  server.connect(&#39;smtp.XXX.com&#39;)
  server.login(&#39;XXX&#39;,&#39;XXXXXX&#39;)
  server.sendmail(msg[&#39;From&#39;],msg[&#39;To&#39;],msg.as_string())
  server.quit()
  
if __name__ == "__main__":
  AutoSendMail()

利用MIMEimage发送图片,原本是想图片能够在正文中显示,可是代码运行后发现,依然是以附件形式发送的,希望有高手能够指点一下,如何可以发送在正文中显示的图片的邮件,就是图片是附件中存在,但同时能显示在正文中,具体形式如下图。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持PHP中文网。

更多详解python发送各类邮件的主要方法相关文章请关注PHP中文网!


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。