使用imaplib时Bash vs CMD

时间:2019-05-24 00:40:37

标签: php python cmd git-bash imaplib

我正在尝试运行一个php脚本,该脚本将调用一个python脚本,该脚本调用imaplib从电子邮件中提取某些文件。当我在vscode(bash终端)中独立运行python脚本时,它按设计工作。当我运行调用python脚本的PHP脚本时,会产生以下错误。

Traceback (most recent call last):
  File "C:/xampp/htdocs/report/pythonfile/parse_script_og.py", line 43, in <module>
    mail = imaplib.IMAP4_SSL('imap.googlemail.com')
AttributeError: module 'imaplib' has no attribute 'IMAP4_SSL'

作为测试,我回显了该命令并将其粘贴到Git Bash中。文件被拉出并添加到指定的文件夹中。当我将命令粘贴到CMD中时,产生了上面的错误。我缺少什么设置?

我正在使用XAMPP,VSCode,PHP 7.3.4,Python 3.7.1

来自推荐,下面我在Python脚本中添加了“ import ssl”,收到以下错误:

"Traceback (most recent call last):"
"  File "C:/xampp/htdocs/report/pythonfile/parse_script_og.py", line 2, in <module>"
"    import ssl"
"  File "C:\Users\Garrett\Anaconda3\envs\snowflakes\lib\ssl.py", line 98, in <module>"
"    import _ssl             # if we can't import it, let the error propagate"
"ImportError: DLL load failed: The specified module could not be found."

所以然后我进入了python环境,并尝试“ pip install ssl”,但出现以下错误。

(snowflakes) C:\Users\Garrett>pip install ssl
Collecting ssl
  Using cached https://files.pythonhosted.org/packages/83/21/f469c9923235f8c36d5fd5334ed11e2681abad7e0032c5aba964dcaf9bbb/ssl-1.16.tar.gz
    ERROR: Complete output from command python setup.py egg_info:
    ERROR: Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "C:\Users\Garrett\AppData\Local\Temp\pip-install-abzxmk8x\ssl\setup.py", line 33
        print 'looking for', f
                          ^
    SyntaxError: Missing parentheses in call to 'print'. Did you mean print('looking for', f)?
    ----------------------------------------
ERROR: Command "python setup.py egg_info" failed with error code 1 in C:\Users\Garrett\AppData\Local\Temp\pip-install-abzxmk8x\ssl\

(snowflakes) C:\Users\Garrett>

另一个更新

以下命令是PHP(exec())中执行的命令。输入文件夹将包含从电子邮件中提取的文件。输出文件夹将包含一个从电子邮件中提取的文件创建的单个文件。如果我将此命令粘贴到GitBash中,那么一切都会按计划进行。如果将以下命令粘贴到CMD中,则会收到上面显示的错误。

C:/Users/Garrett/Anaconda3/python.exe C:/xampp/htdocs/report/pythonfile/parse_script_og.py C:/xampp/htdocs/report/input/ C:/xampp/htdocs/report/output/out.csv John Doe 06-Jan-2018 16-Jan-2019

1 个答案:

答案 0 :(得分:0)

IMAP4_SSL仅在Python的ssl模块可用时存在(您可以使用import ssl进行测试)。尝试升级服务器的python版本,和/或安装ssl模块。

https://docs.python.org/3/library/ssl.html

编辑1:

还有一个用于安全连接的子类:

imaplib.IMAP4_SSL类(host ='',port = IMAP4_SSL_PORT,keyfile = None,certfile = None,ssl_context = None)

这是从IMAP4派生的子类,该子类通过SSL加密套接字进行连接(要使用此类,您需要使用SSL支持编译的套接字模块)。  如果未指定host,则使用”(本地主机)。如果省略端口,则使用标准的IMAP4-over-SSL端口(993)。 ssl_context是ssl.SSLContext对象,该对象允许将SSL配置选项,证书和私钥绑定到单个(可能长期存在)的结构中。请阅读安全注意事项以获取最佳做法。

密钥文件和certfile是ssl_context的传统替代方案-它们可以指向PEM格式的私钥和证书链文件以进行SSL连接。请注意,密钥文件/证书文件参数与ssl_context互斥,如果将密钥文件/证书文件与ssl_context一起提供,则会引发ValueError。

在版本3.3中进行了更改:添加了ssl_context参数。

版本3.4中的更改:该类现在支持使用ssl.SSLContext.check_hostname和服务器名称指示(请参阅ssl.HAS_SNI)进行主机名检查。

自版本3.6起不推荐使用:不推荐使用keyfile和certfile,而推荐使用ssl_context。请改用ssl.SSLContext.load_cert_chain(),或让ssl.create_default_context()为您选择系统的受信任CA证书。

  

https://docs.python.org/3/library/imaplib.html

编辑2:

您必须为python和文件使用完整路径。您可以从which python命令中找到前者,最有可能输出'/ usr / bin / python'并且您应该已经知道了后者。因此您的命令应如下所示:

$mystring = exec('/usr/bin/python /home/user/testing.py');

并且您应该确保您的python脚本具有所有适当的权限,因为您的网络服务器很可能以其他用户身份运行,因此权限应为“ -rwxrwxr-x”或其他内容。

  

Python Script Failing to Execute from PHP exec()