6

Android の Kivy アプリで Python を使用してメールを送信する方法をいくつか試しました。最も近いのは Plyer のメール機能 ( https://plyer.readthedocs.org/en/latest/#plyer.facades.Email ) を使用することですが、添付ファイルをサポートしていないようです。

アプリで実行したいことは、ユーザーの電子メール クライアントを開き、受信者、件名、本文、および添付ファイルのフィールドにデータを入力することです。添付ファイルは、アプリによって生成された .csv ファイルになります。

これを行う方法について誰か提案がありますか?このコードを変更して添付ファイルを含めるにはどうすればよいですか?

from jnius import autoclass, cast
from plyer.facades import Email
from plyer.platforms.android import activity

Intent = autoclass('android.content.Intent')
AndroidString = autoclass('java.lang.String')


class AndroidEmail(Email):
    def _send(self, **kwargs):
    intent = Intent(Intent.ACTION_SEND)
    intent.setType('text/plain')

    recipient = kwargs.get('recipient')
    subject = kwargs.get('subject')
    text = kwargs.get('text')
    create_chooser = kwargs.get('create_chooser')

    if recipient:
        intent.putExtra(Intent.EXTRA_EMAIL, [recipient])
    if subject:
        android_subject = cast('java.lang.CharSequence',
                               AndroidString(subject))
        intent.putExtra(Intent.EXTRA_SUBJECT, android_subject)
    if text:
        android_text = cast('java.lang.CharSequence',
                            AndroidString(text))
        intent.putExtra(Intent.EXTRA_TEXT, android_text)

    if create_chooser:
        chooser_title = cast('java.lang.CharSequence',
                             AndroidString('Send message with:'))
        activity.startActivity(Intent.createChooser(intent,
                                                    chooser_title))
    else:
        activity.startActivity(intent)


def instance():
    return AndroidEmail()
4

2 に答える 2

2

これは古い質問であることは知っていますが、しばらくの間、この正確な問題を解決しようとしていて、解決策を思いつきました。これにより、将来誰かの時間を節約できることを願っています:

from jnius import autoclass, cast
from plyer.platforms.android import activity

def sendemail(self, **kwargs):
    Intent = autoclass('android.content.Intent')
    AndroidString = autoclass('java.lang.String')
    Uri = autoclass('android.net.Uri')
    File = autoclass('java.io.File')

    intent = Intent(Intent.ACTION_SEND)
    intent.setType('*/*')

    recipient = kwargs.get('recipient')
    subject = kwargs.get('subject')
    text = kwargs.get('text')
    create_chooser = kwargs.get('create_chooser')
    file_to_attach = kwargs.get('file_to_attach')

    if recipient:
        intent.putExtra(Intent.EXTRA_EMAIL, [recipient])
    if subject:
        android_subject = cast('java.lang.CharSequence',
                               AndroidString(subject))
        intent.putExtra(Intent.EXTRA_SUBJECT, android_subject)
    if text:
        android_text = cast('java.lang.CharSequence',
                            AndroidString(text))
        intent.putExtra(Intent.EXTRA_TEXT, android_text)

    if file_to_attach:
        attachment = File('path/to/your/file/' + file_to_attach)
        uri = Uri.fromFile(attachment)
        parcelable = cast('android.os.Parcelable', uri)
        intent.putExtra(Intent.EXTRA_STREAM, parcelable)

    if create_chooser:
        chooser_title = cast('java.lang.CharSequence',
                             AndroidString('Send message with:'))
        activity.startActivity(Intent.createChooser(intent,
                                                    chooser_title))

    else:
        activity.startActivity(intent)

そのため、Android共通インテント ガイドの電子メール セクションから、添付ファイルを送信する方法が示されていますIntent.EXTRA_STREAM。同様の質問のコードを参照した後、そのコードから Plyer 電子メール コードにさらにいくつか追加することで、必要な処理が行われました。アプリからメールに添付された添付ファイルを取得します。

注目すべき追加は次のとおりです。

Uri = autoclass('android.net.Uri') File = autoclass('java.io.File')

intent.setTypeto:を変更して、('*/*')テキストだけでなくファイルを受け入れるようにします。

file_to_attach = kwargs.get('file_to_attach')関数呼び出しからファイルを取得する行を追加し、

そして最後に:

if file_to_attach:
    attachment = File('path/to/your/file/' + file_to_attach)
    uri = Uri.fromFile(attachment)
    parcelable = cast('android.os.Parcelable', uri)
    intent.putExtra(Intent.EXTRA_STREAM, parcelable)

ファイルを電子メールに添付します。

次に、関数呼び出しに必ず file_to_attach 引数を含めてください。sendemail(recipient='somebody@email.com',subject='subject',text='some text',file_to_attach='a_file.csv',create_chooser=True)

于 2018-03-25T22:19:49.460 に答える
1

古いAndroid モジュールでは、ファイル名の受け渡しがサポートされています。これを直接使用するか、Android API の関連部分を呼び出して機能を plyer に追加することができます。私はあなたがそれをどのように行うか正確には覚えていません。

于 2014-11-05T11:14:33.910 に答える