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

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

ただいまの
回答率

87.48%

python cgiでtext areaの文章が途中で切られたメールになってしまう。

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 231

score 31

pythonでcgiとして単純なメールフォームを作っているのですが、下記のソース(html)と(py)

<form name="form" method = "post" action = "contact.py">
   相談内容 :<br><textarea name="cont" rows="4" cols="40">
   ここに相談内容を記入してください。ここに相談内容を記入してください。
   ここに相談内容を記入してください。ここに相談内容を記入してください。
       </textarea><br>
   <input type="submit" value="送信"><br>
</form>


このテキストエリアに入力していただき送信してcontact.pyにpostします。
contact.py

#!/usr/bin/python3.4
# -*- coding: utf-8 -*-
from email import message
import smtplib
import ssl

import cgi
import sys
import io

smtp_mode = 'normal'
smtp_host = '〇×△.xserver.jp'
smtp_account_id = 'info@〇×△〇×△.com'
smtp_account_pass = '〇×△〇×△'

from_mail = 'info@〇×△〇×△.com'
to_mail = '〇×△〇×△@gmail.com'

sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
form = cgi.FieldStorage()
cont = form.getvalue('cont')
msg = message.EmailMessage()
msg.set_content(cont);

msg['Subject'] = 'メールフォーム'
msg['From'] = from_mail
msg['To'] = to_mail


if smtp_mode == 'starttls':
    server = smtplib.SMTP(smtp_host, 587, timeout=10)
    server.ehlo()
    server.starttls()
    server.ehlo()

elif smtp_mode == 'ssl':
    context = ssl.create_default_context()
    server = smtplib.SMTP_SSL(smtp_host, 465, timeout=10, context=context)

else:
    server = smtplib.SMTP(smtp_host, 25, timeout=10)

server.login(smtp_account_id, smtp_account_pass)
server.send_message(msg)
server.quit()


print('Content-Type: text/html; charset=utf-8')
print()

print('<h1>メール送信完了</h1>')

print("<pre>")
print(cont)
print("</pre>")

コード


これでサーバー上にアップロードしcontact.pyのパーミッションを755にします。
実際行ってみると送信されてきたメールの文章が途中で切られてこんな感じになってしまいます。

ここに相談内容を記入してください。ここã

イメージ説明

2週間くらいあれやこれややったり調べたりしたのですがわからずじまいです。
大変申し訳ございませんがご教授願えれば幸いです。
またpython cgiのデバッグのいい方法があったら教えてください。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

0

おはようございます。

問題文読ませていただきました。

まず、formのPOSTに関して問題ないことは確かめていますか?多分大丈夫だと思いますが再度ご確認のほど、お願いいたします。(contact.pyにてprint(cont)の値へ、正しくtextareaで入力したデータが格納されているのか?)

次にこちらの記事のサンプルを試してみて、問題解決しそうかご確認いただけますか?🙇‍♂️
Pythonでメール送信~Gmail編~
Pythonでメールを送信

よろしくお願いいたします。🙇‍♂️

<追記>
以下のコードを利用できる新しいpythonファイルを作成して、必要箇所を変更し、メール送信ができることをご確認いただけますか?🙇‍♂️

# https://qiita.com/kawa-Kotaro/items/460977f050bf0e2828f2
import smtplib
from email.mime.text import MIMEText
from email.utils import formatdate

# emailを送るfrom。
# ※要変更
fromAddr = 'from email address'
# emailを送るto。
# ※要変更
toAddr = 'to email address'
# emailを送る際のログインパスワード
# ※要変更
password = 'password'

# メッセージを作成する関数
def createMessage(fromAddr, toAddr, subject, body):
    msg = MIMEText(body)
    msg['Subject'] = subject
    msg['From'] = fromAddr
    msg['To'] = toAddr
    msg['Date'] = formatdate()
    return msg

# メッセージを送信する関数
def sendMail(fromAddr, toAddr, bodyMsg):
    smtpobj = smtplib.SMTP('smtp.gmail.com', 587)
    smtpobj.ehlo()
    smtpobj.starttls()
    smtpobj.ehlo()
    # ログインする。
    smtpobj.login(fromAddr, password)

    # メッセージを送信する。
    smtpobj.sendmail(fromAddr, toAddr, bodyMsg.as_string())
    smtpobj.close()

# ※要変更
sendMail(fromAddr, toAddr, createMessage(
    fromAddr, toAddr, '題名を入力してください', 'メール送信内容を入力してください。formで格納されるデータ内容'))

自分の方ではこちらでうまくいきました。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2021/05/27 17:44

    返答誠にありがとうございます。
    しかし「formのPOSTに関して問題ないこと」はcontact.pyの最後のほうでprintしていますのでformからpostして(もしくはcontという関数に文字列が入っている)状態にはなっていました。
    また、「Pythonでメールを送信」をじっくり見直してみますが解決できそうではありません

    キャンセル

  • 2021/05/28 08:02 編集

    > 「Pythonでメールを送信」をじっくり見直してみますが解決できそうではありません
    実際にどのようなことを試されましたでしょうか?追記いただけると助かります。。

    回答の追記箇所へコメントしましたので、ご確認ください。🙇‍♂️

    キャンセル

  • 2021/06/09 10:39

    返答遅くなって申し訳ないです。
    pythonで行いたいことは、python版のメールフォームを作るということなんですが、
    流れとしては、html上のformからpythonのソースの中の変数に代入しそれを特定のメールに送信することなんですが、短いテキストしか送れなくて困ってます。
    例えば、テキストエリアに入力していただいた長文をそのまま送ると文章の途中で切れてなくなってしまう現象が起こります。メールで送信するはずのテキストエリアに書かれている内容の変数をプリントするとちゃんと出てきます。これはpythonのメールに対してのデコードの問題かな?と調べてみましたが・・・はっきりわからず・・・しかも本当にこの問題か?も疑問です。

    キャンセル

  • 2021/06/09 12:59

    > pythonで行いたいことは、python版のメールフォームを作るということなんですが、
    流れとしては、html上のformからpythonのソースの中の変数に代入しそれを特定のメールに送信することなんですが、短いテキストしか送れなくて困ってます。

    説明足らずですみません。🙇‍♂️

    上記のことを早く満たしたい気持ちはわかるのですが、まずは問題を切り分けて小さく改善しないといけないと思っております。

    メール送信部分に問題があるのか確認してもらうために追記コードを書かせていただきました。(このコードが正しく動かない場合、そもそものパソコンの環境依存とかそのレベルで問題を考えないといけないと思っているため。)

    ですので、追記コード文で動くか検証いただけるとすごく助かります🙇‍♂️

    キャンセル

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

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

関連した質問

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