質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.92%

PythonでCSVファイルから取得したデータを使ったメールの送信ができない

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,168

score 13

前提・実現したいこと

CSVファイルからGmailのアカウント情報(メールアドレス・パスワード・メールサーバ・ポート番号)を読み込み、そのGMAILアカウントからメールを送信するプログラムを作成しようとしています。
リテラルでアカウント情報を入力した場合には問題なくメールを送信できるのですが、CSVから情報を読み込み辞書コンテナに格納・その値を関数内で利用しようとしたところエラーが発生し送信できませんでした。
なぜこの変更でエラーが発生するようになったのかわからなかったため、原因・解決方法を教えていただければ幸いです。よろしくお願いします。
(送信用メールアドレス、受信用メールアドレスは公開のため適当な名前を充てがっています)

発生している問題・エラーメッセージ

  File "C:\Users\user\Anaconda3\lib\socket.py", line 748, in getaddrinfo
    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):

gaierror: [Errno 11001] getaddrinfo failed

該当のソースコード(Python 3.7)

import csv
import smtplib

with open('mail_profile.csv', newline='') as csvfile:
    reader = csv.DictReader(csvfile)
    for row in reader:
        prof = row

GMAIL_USER = prof['GMAIL_USER']
GMAIL_PASS = prof['GMAIL_PASS']
SMTP_SERVER = prof['SMTP_SERVER']
SMTP_PORT = int(prof['SMTP_PORT'])

def send_email(recipient, subject, text):
    smtpserver = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
    smtpserver.ehlo()
    smtpserver.starttls()
    smtpserver.ehlo
    smtpserver.login(GMAIL_USER, GMAIL_PASS)
    header = 'To: ' + recipient + '\n' + 'From: ' + GMAIL_USER
    header = header + '\n' + 'Subject: ' + subject + '\n'
    msg = header + '\n' + text + ' \n\n'
    smtpserver.sendmail(GMAIL_USER, recipient, msg)
    smtpserver.close()

send_email('receiver@gmail.com', 'sub', 'this is text')

読み込み用CSV(mail_profile.csv)

GMAIL_USER,GMAIL_PASS,SMTP_SERVER,SMTP_PORT
sender@gmail.com,password,stmp.gmail.com,587

試したこと

・printで入力値とデータ型に問題がないことを確認(正常に送信でできたリテラル版と比較)
・送信失敗後にリテラル版に変更し送信できることを確認、CSV読込に変えるとまた失敗することを確認
・Spyder、IDLEでそれぞれ実行して同様のエラーで実行できないことを確認

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

gaierror: [Errno 11001] getaddrinfo failed

getaddrinfoはホスト名をIPアドレスに変換する為に使う関数で、
Errno 11001 は指定されたホスト名が見つからなかった時等に返されるエラーコードです。

メールサーバのホスト名は正しいですか? 例えば

GMAIL_USER,GMAIL_PASS,SMTP_SERVER,SMTP_PORT
sender@gmail.com,password,stmp.gmail.com,587

メールサーバ名が stmp.gmail.com となっていますが、これは smtp.gmail.com ではないですか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/21 21:12

    指摘の通りメールサーバ名が誤っていました。
    CSVにて名前を「smtp.gmail.com」とすることで解決しました!ありがとうございます!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る