Nano Hash - криптовалюты, майнинг, программирование

отправить электронную почту с помощью gmail-api и google-api-php-client

Я использую https://github.com/google/google-api-php-client, и я хочу отправить тестовое электронное письмо с авторизованной учетной записью gmail пользователя.

Вот что у меня есть на данный момент:

$msg = new Google_Service_Gmail_Message();  
$msg->setRaw('gp1');  
$service->users_messages->send('me', $msg);  

Это приводит к отказу электронной почты, потому что я понятия не имею, как установить необработанное сообщение. Я вижу отказ во входящей почте моего аутентифицированного пользователя. Я хочу узнать, как установить значения для «Кому», «Копия», «Скрытая копия», «Тема» и «Тело» электронного письма. Я считаю, что мне также нужно будет выполнить кодировку 64 для этих необработанных данных. И, возможно, я захочу использовать HTML-код в теле письма.

Пожалуйста, помогите предоставить рабочий пример отправки электронной почты с помощью gmail-api и google-api-php-client.

Вот возвращенное письмо во входящем:

Bounce [email protected] 12:58 PM (7 минут назад)
мне
Произошла ошибка. Ваше сообщение не было отправлено.

‚Дата: Чт, 24 июля 2014 г., 10:58:30 -0700 Идентификатор сообщения: CABbXiyXhRBzzuaY82i9iODEiwxEJWO1 = jCcDM_TH-


Ответы:


1

Я задал более конкретный вопрос, который привел меня к отвечать. Теперь я использую PHPMailer для создания сообщения. Затем я извлекаю необработанное сообщение из объекта PHPMailer. Пример:

require_once 'class.phpmailer.php';
$mail = new PHPMailer();
$mail->CharSet = "UTF-8";
$subject = "my subject";
$msg = "hey there!";
$from = "[email protected]";
$fname = "my name";
$mail->From = $from;
$mail->FromName = $fname;
$mail->AddAddress("[email protected]");
$mail->AddReplyTo($from,$fname);
$mail->Subject = $subject;
$mail->Body    = $msg;
$mail->preSend();
$mime = $mail->getSentMIMEMessage();
$m = new Google_Service_Gmail_Message();
$data = base64_encode($mime);
$data = str_replace(array('+','/','='),array('-','_',''),$data); // url safe
$m->setRaw($data);
$service->users_messages->send('me', $m);
25.07.2014
  • Я также решил установить Sender, ReturnPath и From на пустые строки, потому что Return-Path в заголовке автоматически заполнялся на моем сервере, что приводило к недействительности моей байтовой строки. 29.07.2014
  • Только что обновил свой ответ с помощью stackoverflow.com/questions/ 25694923 / и php.net/manual/en/function.base64 -encode.php 03.10.2014

  • 2

    Я тоже использовал это решение, отлично работало с несколькими настройками:

    При создании объекта PHPMailer кодировка по умолчанию установлена ​​на «8 бит». Поэтому мне пришлось отменить это с помощью:

    $mail->Encoding = 'base64';
    

    Еще мне пришлось немного подправить MIME, чтобы он был готов POST для Google API. Я использовал решение от ewein:

    Недопустимое значение для ошибки ByteString, когда вызов API отправки gmail с кодировкой base64 ‹или›

    Во всяком случае, вот как я решил вашу проблему:

    //prepare the mail with PHPMailer
    $mail = new PHPMailer();
    $mail->CharSet = "UTF-8";
    $mail->Encoding = "base64";
    
    //supply with your header info, body etc...
    $mail->Subject = "You've got mail!";
    ...
    
    //create the MIME Message
    $mail->preSend();
    $mime = $mail->getSentMIMEMessage();
    $mime = rtrim(strtr(base64_encode($mime), '+/', '-_'), '=');
    
    //create the Gmail Message
    $message = new Google_Service_Gmail_Message();
    $message->setRaw($mime);
    $message = $service->users_messages->send('me',$message);
    
    31.07.2015

    3

    Создание почты с помощью phpmailer у меня отлично работает в локальной среде. При производстве я получаю эту ошибку:

    Invalid value for ByteString
    

    Чтобы решить эту проблему, удалите строку:

    $mail->Encoding = 'base64';
    

    потому что почта закодирована дважды.

    Кроме того, по другим вопросам / проблемам я обнаружил следующее:

    использовать

    strtr(base64_encode($val), '+/=', '-_*')
    

    вместо

    strtr(base64_encode($val), '+/=', '-_,')
    
    18.09.2014
  • Точная ошибка: Error calling POST https://www.googleapis.com/gmail/v1/users/me/messages/send: (400) Invalid value for ByteString 18.09.2014

  • 4

    Я использовал https://developers.google.com/gmail/api/v1/reference/users/messages/send

    и может успешно отправить электронное письмо.

    25.08.2019
  • Ставить ссылки вместо объяснений - плохой стиль. Опишите решение здесь. 25.08.2019

  • 5

    Возможно, это немного выходит за рамки исходного вопроса, но, по крайней мере, в моем случае тестовое электронное письмо прогрессировало до регулярной отправки автоматических приветственных писем из различных учетных записей. Хотя я нашел здесь много полезного, мне пришлось собрать все вместе из разных источников.

    В надежде помочь другим сориентироваться в этом процессе, вот дистиллированная версия того, что я придумал.

    Несколько замечаний по следующему коду:

    1. Предполагается, что вы преодолели все препятствия, чтобы создать и загрузить JSON для учетной записи службы Google (с учетными данными в панель разработчика, это нижний раздел.)
    2. Для наглядности я сгруппировал все биты, которые вам нужно установить, в разделе «Заменить это своими собственными данными».
    3. me в методе send() - ключевое слово, которое означает что-то вроде отправки этого электронного письма с текущей учетной записью.
    // This block is only needed if you're working outside the global namespace
    use \Google_Client as Google_Client;
    use \Google_Service_Gmail as Google_Service_Gmail;
    use \Google_Service_Gmail_Message as Google_Service_Gmail_Message;
    
    // Prep things for PHPMailer
    use PHPMailer\PHPMailer\Exception;
    use PHPMailer\PHPMailer\PHPMailer;
    
    // Grab the needed files
    require_once 'path/to/google-api/vendor/autoload.php';
    require_once 'path/to/php-mailer/Exception.php';
    require_once 'path/to/php-mailer/PHPMailer.php';
    
    // Replace this with your own data
    $pathToServiceAccountCredentialsJSON = "/path/to/service/account/credentials.json";
    $emailUser = "[email protected]"; // the user who is "sending" the email...
    $emailUserName = "Sending User's Name"; // ... and their name
    $emailSubjectLine = "My Email's Subject Line";
    $recipientEmail = "[email protected]";
    $recipientName = "Recipient's Name";
    $bodyHTML = "<p>Paragraph one.</p><p>Paragraph two!</p>";
    $bodyText = "Paragraph one.\n\nParagraph two!";
    
    // Set up credentials and client
    putenv("GOOGLE_APPLICATION_CREDENTIALS={$pathToServiceAccountCredentialsJSON}");
    $client = new Google_Client();
    $client->useApplicationDefaultCredentials();
    // We're only sending, so this works fine
    $client->addScope(Google_Service_Gmail::GMAIL_SEND);
    // Set the user we're going to pretend to be (Subject is confusing here as an email also has a "Subject"
    $client->setSubject($emailUser);
    
    // Set up the service
    $mailService = new Google_Service_Gmail($client);
    
    // We'll use PHPMailer to build the raw email (since Google's API doesn't do that) so prep it
    $mailBuilder = new PHPMailer();
    $mailBuilder->CharSet = "UTF-8";
    $mailBuilder->Encoding = "base64";
    
    // Not set up the email you want to send
    $mailBuilder->Subject = $emailSubjectLine;
    $mailBuilder->From = $emailUser;
    $mailBuilder->FromName = $emailUserName;
    try {
        $mailBuilder->addAddress($recipientEmail, $recipientName);
    } catch (Exception $e) {
        // Handle any problems adding the email address here
    }
    // Add additional recipients, CC, BCC, ReplyTo, if desired
    
    // Then add the main body of the email...
    $mailBuilder->isHTML(true);
    $mailBuilder->Body = $bodyHTML;
    $mailBuilder->AltBody = $bodyText;
    
    // Prep things so we have a nice, raw message ready to send via Google's API
    try {
        $mailBuilder->preSend();
        $rawMessage = base64_encode($mailBuilder->getSentMIMEMessage());
        $rawMessage = str_replace(['+', '/', '='], ['-', '_', ''], $rawMessage); // url safe
        $gMessage = new Google_Service_Gmail_Message();
        $gMessage->setRaw($rawMessage);
        // Send it!
        $result = $mailService->users_messages->send('me', $gMessage);
    } catch (Exception $e) {
        // Handle any problems building or sending the email here
    }
    
    if ($result->labelIds[0] == "SENT") echo "Message sent!";
    else echo "Something went wrong...";
    
    
    29.07.2020
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..