Как отправить сообщение нескольким получателям?

У меня возникли проблемы с отправкой сообщения на несколько адресов с помощью Gmail API. Я успешно отправил сообщение только на один адрес, но получаю следующую ошибку, когда включаю несколько адресов, разделенных запятыми, в поле 'To':

Произошла ошибка: https://www.googleapis.com/gmail/v1/users/me/messages/send?alt=json вернул "Недопустимый заголовок">

Я использую методы CreateMessage и SendMessage из этого руководства по API Gmail: https://developers.google.com/gmail/api/guides/sending

В этом руководстве говорится, что для API Gmail требуются сообщения, соответствующие RFC-2822. Мне снова не очень повезло с некоторыми из этих примеров адресации в руководстве RFC-2822: https://tools.ietf.org/html/rfc2822#appendix-A

У меня сложилось впечатление, что «[email protected], [email protected], [email protected]» должна быть допустимой строкой для передачи в параметр «to» CreateMessage, но ошибка, которую я получил от SendMessage заставляет меня думать иначе.

Пожалуйста, дайте мне знать, если вы можете воссоздать эту проблему, или если у вас есть какие-либо советы о том, где я могу сделать ошибку. Благодарю вас!

Изменить: вот фактический код, который приводит к ошибке...

def CreateMessage(sender, to, subject, message_text):
    message = MIMEText(message_text)
    message['to'] = to
    message['from'] = sender
    message['subject'] = subject
    return {'raw': base64.urlsafe_b64encode(message.as_string())}

def SendMessage(service, user_id, message):
    try:
        message = (service.users().messages().send(userId=user_id, body=message)
           .execute())
        print 'Message Id: %s' % message['id']
        return message
    except errors.HttpError, error:
        print 'An error occurred: %s' % error

def ComposeEmail():
    # build gmail_service object using oauth credentials...
    to_addr = 'Mary Smith <[email protected]>, [email protected], Who? <[email protected]>'
    from_addr = '[email protected]'
    message = CreateMessage(from_addr,to_addr,'subject text','message body')
    message = SendMessage(gmail_service,'me',message)

person Jordan Hawkins    schedule 22.08.2014    source источник
comment
Вы пробовали передавать адреса в виде списка? Можете ли вы привести пример вашего кода, который работает для одного получателя?   -  person mnjeremiah    schedule 22.08.2014
comment
Да, пробовал передавать адреса списком, но результат тот же. Я отредактировал свой пост и включил свой код. Пожалуйста, дайте мне знать, если вы хотите, чтобы я предоставил больше контекста.   -  person Jordan Hawkins    schedule 22.08.2014
comment
Сегодня я немного возился с этим, так как я также создаю приложение, которое должно будет отправлять электронные письма. Я не смог найти ничего в документах, которые касались этого. Это заставило меня задуматься, так ли это вообще должно быть сделано, или я должен прокручивать получателей и отправлять электронные письма по одному за раз. Если разберетесь, мне тоже будет интересно узнать ответ. Удачи. :)   -  person mnjeremiah    schedule 22.08.2014
comment
API просто сломан. Это в бета-версии. Я провел весь день, пытаясь понять, что не так с моим полем to, прочитал документацию rfc2822, и все было в порядке. В итоге переключился обратно на SMTP, и с миром снова все в порядке. Облом однако.   -  person James    schedule 23.08.2014


Ответы (3)


Получение сообщения «Неверный заголовок» при отправке нескольким получателям (с разделителями-запятыми) в одном заголовке было регрессией, которая была исправлена ​​25 августа 2014 г.

person Eric D    schedule 23.08.2014
comment
Спасибо, Эрик. Я только что снова проверил свой код и успешно отправил его на несколько адресов. - person Jordan Hawkins; 25.08.2014

Как говорит Джеймс в своем комментарии, вам не следует тратить время на попытки использовать API Gmail, когда Python имеет отличную документированную поддержку использования SMTP: email модуль может составлять сообщения, включая вложения, и smtplib отправляет их. ИМХО, вы можете использовать Gmail API для того, что работает из коробки, но следует использовать надежные модули из стандартной библиотеки Python, когда что-то пойдет не так.

Похоже, вы хотите отправить только текстовое сообщение: вот решение, адаптированное из документации модуля email и Как отправить электронную почту в Python через SMTPLIB с Mkyong.com:

# Import smtplib for the actual sending function
import smtplib

# Import the email modules we'll need
from email.mime.text import MIMEText

msg = MIMEText('message body')
msg['Subject'] = 'subject text'
msg['From'] = '[email protected]'
msg['To'] = 'Mary Smith <[email protected]>, [email protected], "Who?" <[email protected]>'

# Send the message via Gmail SMTP server.
gmail_user = '[email protected]'
gmail_pwd = 'yourpassword'smtpserver = smtplib.SMTP("smtp.gmail.com",587)
smtpserver = smtplib.SMTP('smtp.gmail.com')smtpserver.ehlo()
smtpserver.starttls()
smtpserver.ehlo
smtpserver.login(gmail_user, gmail_pwd)
smtpserver.send_message(msg)
smtpserver.quit()
person Serge Ballesta    schedule 24.08.2014
comment
Спасибо за полезную информацию! Мое приложение не получает пароль пользователя, но в противном случае этот ответ был бы полезным обходным путем, если бы API Gmail не был исправлен. Я проголосовал за ваш ответ, чтобы другие знали, что делать, если/когда готовые функции Gmail API не соответствуют их потребностям. - person Jordan Hawkins; 25.08.2014
comment
Модуль электронной почты Python великолепен, и я определенно рекомендую его использовать. smtplib также может работать для некоторых пользователей (если вы можете устанавливать SMTP-соединения в вашей среде), но не для других. Для скрипта на сервере может подойти, для браузерного расширения может и нет... - person Eric D; 25.08.2014
comment
@EricDeFriez Я действительно не могу понять ваш комментарий: я использую модуль электронной почты для того, что он может делать, составляя сообщение электронной почты. И я использую smtplib для того, что он может сделать, а модуль электронной почты не может: отправить сообщение. - person Serge Ballesta; 26.08.2014
comment
Модуль электронной почты великолепен, он отлично подходит для составления электронных писем (создания строки в формате RFC822) и их анализа. smtplib хорош, если вы можете устанавливать необработанные TCP-соединения с smtp-сервером, многие среды не позволяют этого, например: браузеры, облачные платформы и домашние/хостинговые провайдеры, которые блокируют исходящий порт 25 из-за проблем со спамом. - person Eric D; 26.08.2014
comment
Вот почему в моем примере я использую порт 587, который зарезервирован для SMTP с проверкой подлинности клиента с безопасностью, обеспечиваемой через starttls. Этот порт обычно не блокируется провайдерами и является правильным способом настройки SMTP-клиентов (Thunderbird и т. д.), когда вы используете их в общедоступных сетях. Что бы вы предложили в качестве альтернативы отправке почты? - person Serge Ballesta; 26.08.2014

См. также ссылка на User.drafts - errorInvalid to header

Судя по всему, эта ошибка была недавно введена в Gmail API.

person Haoyang Wang    schedule 22.08.2014