通過(guò) Amazon SES 發(fā)送郵件

使用Amazon SES發(fā)送郵件蛤迎,首先需要做如下兩步準(zhǔn)備工作:

  • 注冊(cè)AWS賬戶
  • 驗(yàn)證郵箱地址或domain

下面分別是兩種通過(guò)Amazon SES發(fā)送郵件的方式:使用SMTP,使用SWS SDK

使用SMTP

  1. 登錄AWS控制臺(tái)主頁(yè)废登。進(jìn)入控制臺(tái)主頁(yè)后,選擇 Simple Email Service 進(jìn)入
  2. 進(jìn)入SES主頁(yè)后舀患,選擇SMTP Settings進(jìn)入滴劲,將看到如下界面:


    該頁(yè)面可以看到Server Name和Port的信息底扳。

  3. 點(diǎn)擊Create My SMTP Credentials, 進(jìn)入下面的界面:


    這一步會(huì)創(chuàng)建一個(gè)用于SMTP認(rèn)證的IAM的用戶,可以設(shè)置自己的IAM 用戶名遏暴。然后點(diǎn)擊Create

  4. SMTP的安全憑證(用戶名侄刽,密碼)將會(huì)生成。該用戶名朋凉,密碼將在smtp login時(shí)使用州丹。
    安全憑證只在生成時(shí)可見(jiàn)和可下載,最好是記下或下載下來(lái)杂彭,并妥善保管


    3-copy.png
  5. Server Name, Port, SMTP用戶名墓毒,密碼都準(zhǔn)備好了,現(xiàn)在可以通過(guò)Amazon SES SMTP Interface來(lái)發(fā)送郵件了亲怠。
    下面是官網(wǎng)的Python例子(https://docs.aws.amazon.com/ses/latest/DeveloperGuide/examples-send-using-smtp.html)
import smtplib  
import email.utils
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

# Replace sender@example.com with your "From" address. 
# This address must be verified.
SENDER = 'sender@example.com'  
SENDERNAME = 'Sender Name'

# Replace recipient@example.com with a "To" address. If your account 
# is still in the sandbox, this address must be verified.
RECIPIENT  = 'recipient@example.com'

# Replace smtp_username with your Amazon SES SMTP user name.
USERNAME_SMTP = "smtp_username"

# Replace smtp_password with your Amazon SES SMTP password.
PASSWORD_SMTP = "smtp_password"

# (Optional) the name of a configuration set to use for this message.
# If you comment out this line, you also need to remove or comment out
# the "X-SES-CONFIGURATION-SET:" header below.
CONFIGURATION_SET = "ConfigSet"

# If you're using Amazon SES in an AWS Region other than US West (Oregon), 
# replace email-smtp.us-west-2.amazonaws.com with the Amazon SES SMTP  
# endpoint in the appropriate region.
HOST = "email-smtp.us-west-2.amazonaws.com"
PORT = 587

# The subject line of the email.
SUBJECT = 'Amazon SES Test (Python smtplib)'

# The email body for recipients with non-HTML email clients.
BODY_TEXT = ("Amazon SES Test\r\n"
             "This email was sent through the Amazon SES SMTP "
             "Interface using the Python smtplib package."
            )

# The HTML body of the email.
BODY_HTML = """<html>
<head></head>
<body>
  <h1>Amazon SES SMTP Email Test</h1>
  <p>This email was sent with Amazon SES using the
    <a >Python</a>
    <a >
    smtplib</a> library.</p>
</body>
</html>
            """

# Create message container - the correct MIME type is multipart/alternative.
msg = MIMEMultipart('alternative')
msg['Subject'] = SUBJECT
msg['From'] = email.utils.formataddr((SENDERNAME, SENDER))
msg['To'] = RECIPIENT
# Comment or delete the next line if you are not using a configuration set
msg.add_header('X-SES-CONFIGURATION-SET',CONFIGURATION_SET)

# Record the MIME types of both parts - text/plain and text/html.
part1 = MIMEText(BODY_TEXT, 'plain')
part2 = MIMEText(BODY_HTML, 'html')

# Attach parts into message container.
# According to RFC 2046, the last part of a multipart message, in this case
# the HTML message, is best and preferred.
msg.attach(part1)
msg.attach(part2)

# Try to send the message.
try:  
    server = smtplib.SMTP(HOST, PORT)
    server.ehlo()
    server.starttls()
    #stmplib docs recommend calling ehlo() before & after starttls()
    server.ehlo()
    server.login(USERNAME_SMTP, PASSWORD_SMTP)
    server.sendmail(SENDER, RECIPIENT, msg.as_string())
    server.close()
# Display an error message if something goes wrong.
except Exception as e:
    print ("Error: ", e)
else:
    print ("Email sent!")

使用AWS SDK (for python)

  1. 安裝 AWS SDK for python(Boto)

pip install boto3

  1. 獲取AWS Access Key
    要通過(guò)Amazon SES API來(lái)訪問(wèn)Amazon SES所计, 需要AWS Access Key(Access Key Id & Secret Access Key)。我們可以通過(guò)創(chuàng)建IAM用戶來(lái)產(chǎn)生一個(gè)該IAM用戶對(duì)應(yīng)的Access Key团秽。
  • 從控制臺(tái)主頁(yè)進(jìn)入IAM


  • 進(jìn)入“用戶”主胧, 然后點(diǎn)擊“添加用戶”



  • 設(shè)置用戶名,勾上編程訪問(wèn)习勤, 然后點(diǎn)擊“下一步:權(quán)限”


  • 點(diǎn)擊 直接附加現(xiàn)有策略


  • 搜索 ses


  • 選擇 AmazonSESFullAccess, 然后點(diǎn)擊下一步:審核


  • 點(diǎn)擊創(chuàng)建用戶



    用戶創(chuàng)建成功踪栋,這里將會(huì)生成訪問(wèn)秘鑰ID和私有訪問(wèn)秘鑰。該秘鑰對(duì)只有現(xiàn)在可以查看和下載图毕,需要記下并妥善保管夷都。
    關(guān)閉該頁(yè)面后就會(huì)在IAM 用戶主頁(yè)面看到剛剛創(chuàng)建成功的新用戶。


  • 點(diǎn)擊進(jìn)入可以看到該用戶更多的詳情



    現(xiàn)在我們就獲取了AWS該用戶的credential,并且該用戶擁有SES的訪問(wèn)權(quán)限吴旋。

  1. 創(chuàng)建credential file
    創(chuàng)建下面的credential file. YOUR_AWS_ACCESS_KEY_ID,YOUR_AWS_SECRET_ACCESS_KEY就是剛剛獲取的credential

[default]
aws_access_key_id = YOUR_AWS_ACCESS_KEY_ID
aws_secret_access_key = YOUR_AWS_SECRET_ACCESS_KEY

保存該文件到下面的路徑:

If you're using... Save the file as...
Windows C:\Users<yourUserName>.aws\credentials
Linux, macOS or Unix ~/.aws/credentials

注意不要帶擴(kuò)展文件名损肛。

  1. 接下來(lái)就可以通過(guò)AWS SDK發(fā)送郵件了。
    下面是AWS官網(wǎng)的例子(https://docs.aws.amazon.com/ses/latest/DeveloperGuide/send-using-sdk-python.html)荣瑟。
import boto3
from botocore.exceptions import ClientError

# Replace sender@example.com with your "From" address.
# This address must be verified with Amazon SES.
SENDER = "Sender Name <sender@example.com>"

# Replace recipient@example.com with a "To" address. If your account 
# is still in the sandbox, this address must be verified.
RECIPIENT = "recipient@example.com"

# Specify a configuration set. If you do not want to use a configuration
# set, comment the following variable, and the 
# ConfigurationSetName=CONFIGURATION_SET argument below.
CONFIGURATION_SET = "ConfigSet"

# If necessary, replace us-west-2 with the AWS Region you're using for Amazon SES.
AWS_REGION = "us-west-2"

# The subject line for the email.
SUBJECT = "Amazon SES Test (SDK for Python)"

# The email body for recipients with non-HTML email clients.
BODY_TEXT = ("Amazon SES Test (Python)\r\n"
             "This email was sent with Amazon SES using the "
             "AWS SDK for Python (Boto)."
            )
            
# The HTML body of the email.
BODY_HTML = """<html>
<head></head>
<body>
  <h1>Amazon SES Test (SDK for Python)</h1>
  <p>This email was sent with
    <a >Amazon SES</a> using the
    <a >
      AWS SDK for Python (Boto)</a>.</p>
</body>
</html>
            """            

# The character encoding for the email.
CHARSET = "UTF-8"

# Create a new SES resource and specify a region.
client = boto3.client('ses',region_name=AWS_REGION)

# Try to send the email.
try:
    #Provide the contents of the email.
    response = client.send_email(
        Destination={
            'ToAddresses': [
                RECIPIENT,
            ],
        },
        Message={
            'Body': {
                'Html': {
                    'Charset': CHARSET,
                    'Data': BODY_HTML,
                },
                'Text': {
                    'Charset': CHARSET,
                    'Data': BODY_TEXT,
                },
            },
            'Subject': {
                'Charset': CHARSET,
                'Data': SUBJECT,
            },
        },
        Source=SENDER,
        # If you are not using a configuration set, comment or delete the
        # following line
        ConfigurationSetName=CONFIGURATION_SET,
    )
# Display an error if something goes wrong. 
except ClientError as e:
    print(e.response['Error']['Message'])
else:
    print("Email sent! Message ID:"),
    print(response['MessageId'])

注意事項(xiàng):

在使用SMTP方式創(chuàng)建SMTP安全憑證時(shí),也會(huì)創(chuàng)建一個(gè)IAM用戶摩泪。如下圖所示:

  • SMTP安全憑證
  • 對(duì)應(yīng)的IAM用戶



    但是SMTP安全憑證并不是IAM用戶的Access Key. 所以不能將SMTP的安全憑證用作訪問(wèn)AWS SES API的credentials笆焰。
    如果想用該IAM來(lái)訪問(wèn)SES SDK, 可以在該IAM下面重新創(chuàng)建一個(gè)訪問(wèn)秘鑰(一個(gè)用戶可以最多創(chuàng)建兩個(gè)訪問(wèn)秘鑰),用新生成的訪問(wèn)秘鑰作為SES SDK Credential.
    除了訪問(wèn)秘鑰见坑,SMTP 創(chuàng)建的IAM用戶的訪問(wèn)權(quán)限是AmazonSesSendingAccess

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ses:SendRawEmail",
            "Resource": "*"
        }
    ]
}

可以根據(jù)需要進(jìn)行配置嚷掠。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末捏检,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子不皆,更是在濱河造成了極大的恐慌贯城,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件霹娄,死亡現(xiàn)場(chǎng)離奇詭異能犯,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)犬耻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)踩晶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人枕磁,你說(shuō)我怎么就攤上這事渡蜻。” “怎么了计济?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵茸苇,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我沦寂,道長(zhǎng)学密,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任凑队,我火速辦了婚禮则果,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘漩氨。我一直安慰自己西壮,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布叫惊。 她就那樣靜靜地躺著款青,像睡著了一般。 火紅的嫁衣襯著肌膚如雪霍狰。 梳的紋絲不亂的頭發(fā)上抡草,一...
    開(kāi)封第一講書(shū)人閱讀 52,475評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音蔗坯,去河邊找鬼康震。 笑死,一個(gè)胖子當(dāng)著我的面吹牛宾濒,可吹牛的內(nèi)容都是我干的腿短。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼橘忱!你這毒婦竟也來(lái)了赴魁?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤钝诚,失蹤者是張志新(化名)和其女友劉穎颖御,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體凝颇,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡潘拱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了祈噪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泽铛。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖辑鲤,靈堂內(nèi)的尸體忽然破棺而出盔腔,到底是詐尸還是另有隱情,我是刑警寧澤月褥,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布弛随,位于F島的核電站,受9級(jí)特大地震影響宁赤,放射性物質(zhì)發(fā)生泄漏舀透。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一决左、第九天 我趴在偏房一處隱蔽的房頂上張望愕够。 院中可真熱鬧,春花似錦佛猛、人聲如沸惑芭。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)遂跟。三九已至,卻和暖如春婴渡,著一層夾襖步出監(jiān)牢的瞬間幻锁,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工边臼, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留哄尔,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓柠并,卻偏偏與公主長(zhǎng)得像究飞,于是被迫代替她去往敵國(guó)和親置谦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子堂鲤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容