【问题标题】:Wrong variable data type?变量数据类型错误?
【发布时间】:2015-07-24 09:41:42
【问题描述】:

我有课,打算从 Git 提交中获取用户名和他的电子邮件:

class BitbucketData(object):

    def get_user_name(self):

        proc = subprocess.Popen("git --no-pager show -s --format='%an'", stdout=subprocess.PIPE)
        committer_name = proc.stdout.read()

        if committer_name:
            return committer_name

    def get_user_email(self):

        proc = subprocess.Popen("git --no-pager show -s --format='%aE'", stdout=subprocess.PIPE)
        committer_email = proc.stdout.read()

        if committer_email:
            return committer_email

然后它用于向用户发送通知(底部是工作版本 - 没有变量 - 所有 senderreceiver 数据集明确,而不是变量 - 他们在这里评论):

class Services(object):


    def sendmail(self, event):

        repo = BitbucketData()

        #to_address = repo.get_user_email()
        #to_address = 'user@domain.com'
        #to_name = repo.get_user_name()
        #to_name = 'Test user'

        subject = 'Bamboo build and deploy ready'
        sender = 'Bamboo agent <user@domain.com>'

        text_subtype = 'plain'
        message = """
        Hello, {}.

        Your build ready.
        Link to scenario: URL
        Link to build and deploy results: {})

        """.format('Test user', os.environ['bamboo_resultsUrl'])

        msg = MIMEText(message, text_subtype)
        msg['Subject'] = subject
        msg['From'] = sender
        msg['To'] = 'Test user <user@domain.com>'

        smtpconnect = smtplib.SMTP('outlook.office365.com', 587)
        smtpconnect.set_debuglevel(1)
        smtpconnect.starttls()
        smtpconnect.login('user@domain.com', 'password')
        smtpconnect.sendmail('user@domain.com', 'user@domain.com', msg.as_string())
        smtpconnect.quit()

        print('Mail sent')

        print(repo.get_user_email())

问题是 - 如果我使用来自变量的数据(例如 to_address = 'user@domain.com' 或使用带有 to_address = repo.get_user_email()BitbucketData() 类 - 我从 Office365 服务器收到错误:

...
reply: '250 2.1.0 Sender OK\r\n'
reply: retcode (250); Msg: 2.1.0 Sender OK
send: "rcpt TO:<'user@domain.com'>\r\n"
reply: '501 5.1.3 Invalid address\r\n'
reply: retcode (501); Msg: 5.1.3 Invalid address
...
  File "C:\Python27\lib\smtplib.py", line 742, in sendmail
    raise SMTPRecipientsRefused(senderrs)
smtplib.SMTPRecipientsRefused: {"'user@domain.com'\n": (501, '5.1.3 Invalid address')}

当使用变量时,代码如下所示:

class Services(object):


    def sendmail(self, event):

        repo = BitbucketData()

        to_address = repo.get_user_email()
        #to_address = 'user@domain.com'
        to_name = repo.get_user_name()
        #to_name = 'Test user'
        from_address = 'user@domain.com'

        subject = 'Bamboo build and deploy ready'
        sender = 'Bamboo agent <user@domain.com>'

        text_subtype = 'plain'
        message = """
        Hello, {}.

        Your build ready.
        Link to scenario: URL
        Link to build and deploy results: {})

        """.format(to_name, os.environ['bamboo_resultsUrl'])

        msg = MIMEText(message, text_subtype)
        msg['Subject'] = subject
        msg['From'] = sender
        msg['To'] = to_name

        smtpconnect = smtplib.SMTP('outlook.office365.com', 587)
        smtpconnect.set_debuglevel(1)
        smtpconnect.starttls()
        smtpconnect.login('user@domain.com', 'password')
        smtpconnect.sendmail(from_address, to_address, msg.as_string())
        smtpconnect.quit()

        print('Mail sent')

        print(repo.get_user_email())

我(或 Microsoft SMTP...)在这里做错了什么?

更新

def sendmail(self, event):

    repo = BitbucketData()
    print(repr(repo.get_user_email()))
    ...

给我:

...
Creating new AutoEnv config
"'user@domain.com'\n"
send: 'ehlo pc-user.kyiv.domain.net\r\n'
...

【问题讨论】:

  • 能否打印并更新问题中的print(repr(repo.get_user_email()))
  • 您是否注意到错误代码中的"'user@domain.com'\n" 是一个双重包装的字符串?该值实际上包含引号和换行符,因此它可能不是有效地址(除非错误代码添加了额外字符)。
  • @SuperBiasedMan 是的,我看到了——但无法理解“”出现的位置:-|
  • @AnandSKumar 谢谢,问题已更新。是的 - 又是" "
  • 您是否尝试在将其作为参数传递时删除引号并剥离换行符?就像这个theEmail.replace('"','').strip(),你可以看看它是否有效。它不会解决问题的根源,但它会让你知道这是否是确切的问题。

标签: python python-2.7 variables office365 smp


【解决方案1】:

您似乎收到以下 git 命令的输出 -

"'user@domain.com'\n"

您直接将其传递给 smtpconnect,这是导致问题的原因,因为这不是有效的电子邮件地址。您可能需要从中获取实际的字符串。获得它的一种方法是为此使用ast.literal_eval() 函数。示例 -

>>> import ast
>>> e = ast.literal_eval("'user@domain.com'\n")
>>> print(e)
user@domain.com

get_user_email() 函数返回电子邮件时,您需要这样做。很可能committer_name 也有这个问题,所以你可能也想这样做。


来自ast.literal_eval()的文档-

ast.literal_eval(node_or_string)

安全地评估包含 Python 文字或容器显示的表达式节点或 Unicode 或 Latin-1 编码字符串。提供的字符串或节点只能由以下 Python 文字结构组成:字符串、数字、元组、列表、字典、布尔值和无。

【讨论】:

  • 谢谢,这行得通。但是 - 可以用re.sub 完成吗?我现在正在玩它。
  • 我猜可以,但我不是正则表达式专家:)。我猜这将是一个复杂的正则表达式。
猜你喜欢
  • 1970-01-01
  • 2018-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-23
  • 2013-11-22
  • 1970-01-01
相关资源
最近更新 更多