我在尝试从 Arduino 和 Ethernet shield 发送电子邮件时收到来自 gmail 服务器的错误 530 5.7.0

I got an error 530 5.7.0 from gmail server while trying to send an email from Arduino and Ethernet shield

我在尝试从 Arduino 和 Ethernet shield 发送电子邮件时收到来自 gmail 服务器的错误 530 5.7.0。

我想从我的 arduino uno 板发送一封电子邮件。 我为它买了一个以太网屏蔽。 我在下面找到了使用以太网屏蔽发送电子邮件的代码,但我失败了。 Gmail 服务器显示“530 5.7.0”错误代码,但我不知道这是什么意思。 我做错了什么?

/*
   Email client sketch for IDE v1.0.1 and w5100/w5200
   Posted December 2012 by SurferTim
*/

#include <SPI.h>
#include <Ethernet.h>

// this must be unique
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x59, 0x67 };  
// change network settings to yours
IPAddress ip( 10, 6, 0, 248 );    
IPAddress gateway( 10, 6, 0, 1 );
IPAddress subnet( 255, 255, 255, 0 );

// change server to your email server ip or domain
// IPAddress server( 1, 2, 3, 4 );
char server[] = "smtp.gmail.com";

EthernetClient client;

void setup()
{
  Serial.begin(9600);
  pinMode(4,OUTPUT);
  digitalWrite(4,HIGH);
  Ethernet.begin(mac, ip, gateway, gateway, subnet);
  delay(2000);
  Serial.println(F("Ready. Press 'e' to send."));
}

void loop()
{
  byte inChar;

  inChar = Serial.read();

  if(inChar == 'e')
  {
      if(sendEmail()) Serial.println(F("Email sent"));
      else Serial.println(F("Email failed"));
  }
}

byte sendEmail()
{
  byte thisByte = 0;
  byte respCode;

  if(client.connect(server,25) == 1) {
    Serial.println(F("connected"));
  } else {
    Serial.println(F("connection failed"));
    return 0;
  }

  if(!eRcv()) return 0;
  Serial.println(F("Sending helo"));

// change to your public ip
  client.println(F("helo 1.2.3.4"));

  if(!eRcv()) return 0;
  Serial.println(F("Sending From"));

// change to your email address (sender)
  client.println(F("MAIL From: <me@mydomain.com>"));

  if(!eRcv()) return 0;

// change to recipient address
  Serial.println(F("Sending To"));
  client.println(F("RCPT To: <receiver@gmail.com>"));

  if(!eRcv()) return 0;

  Serial.println(F("Sending DATA"));
  client.println(F("DATA"));

  if(!eRcv()) return 0;

  Serial.println(F("Sending email"));

// change to recipient address
  client.println(F("To: You <receiver@gmail.com>"));

// change to your address
  client.println(F("From: Me <me@mydomain.com>"));

  client.println(F("Subject: Arduino email test\r\n"));

  client.println(F("This is from my Arduino!"));

  client.println(F("."));

  if(!eRcv()) return 0;

  Serial.println(F("Sending QUIT"));
  client.println(F("QUIT"));

  if(!eRcv()) return 0;

  client.stop();

  Serial.println(F("disconnected"));

  return 1;
}

byte eRcv()
{
  byte respCode;
  byte thisByte;
  int loopCount = 0;

  while(!client.available()) {
    delay(1);
    loopCount++;

    // if nothing received for 10 seconds, timeout
    if(loopCount > 10000) {
      client.stop();
      Serial.println(F("\r\nTimeout"));
      return 0;
    }
  }

  respCode = client.peek();

  while(client.available())
  {  
    thisByte = client.read();    
    Serial.write(thisByte);
  }

  if(respCode >= '4')
  {
    efail();
    return 0;  
  }

  return 1;
}


void efail()
{
  byte thisByte = 0;
  int loopCount = 0;

  client.println(F("QUIT"));

  while(!client.available()) {
    delay(1);
    loopCount++;

    // if nothing received for 10 seconds, timeout
    if(loopCount > 10000) {
      client.stop();
      Serial.println(F("\r\nTimeout"));
      return;
    }
  }

  while(client.available())
  {  
    thisByte = client.read();    
    Serial.write(thisByte);
  }

  client.stop();

  Serial.println(F("disconnected"));
}

有一些方法可以使用arduino等嵌入式系统发送电子邮件。您的草图显示了如何将电子邮件直接发送到具有目标地址帐户的邮件服务器。

如您所知,错误代码为 "Must issue a STARTTLS command first"。 这意味着需要 SSL 连接。当然,这是来自 Google 的限制之一。不幸的是,"Arduino Ethernet Shield" 支持 SSL。所以你可能想检查另一个支持 SSL 的盾牌。

"PHPoC Shield for Arduino" can be an alternative. To use this shield, "Arduino Library for PHPoC" 是必需的。该库提供了一些示例。而“EmailClient”示例可以满足您的需求。

/* arduino email client - send email to server directly */

#include "SPI.h"
#include "Phpoc.h"

PhpocEmail email;

void setup() {
  Serial.begin(9600);
  while(!Serial)
    ;

Phpoc.begin(PF_LOG_SPI | PF_LOG_NET | PF_LOG_APP);
//Phpoc.begin();

Serial.println("Sending email to server directly");

// setup From/To/Subject
email.setFrom("from_email_address", "from_user_name");
email.setTo("to_email_address", "to_user_name");  
email.setSubject("Mail from PHPoC Shield for Arduino");

// write email message
email.beginMessage();
email.println("Hello, world!");
email.println("I am PHPoC Shield for Arduino");
email.println("Good bye");
email.endMessage();

// send email
if(email.send() > 0)
  Serial.println("Email send ok");
else
  Serial.println("Email send failed");
}

void loop() {
}

本人运行此草图供大家参考。当然,我更改了一些参数,例如from_email_address、from_user_name、to_email_address和to_user_name。

但是发送邮件失败,错误代码为421-4.7.0。

根据错误消息,由于 google 邮件服务器上的垃圾邮件政策,这封电子邮件可能被拒绝。无论如何,您的问题 - 从 gmail 服务器收到错误 530 5.7.0 - 可以通过 Arduino 的 PHPoC Shield 解决。

如果您仍想向 google 发送电子邮件,以下参考资料会对您有所帮助。