【问题标题】:Using curl to send email使用 curl 发送电子邮件
【发布时间】:2013-01-21 06:24:03
【问题描述】:

如何使用 curl 命令行程序从 gmail 帐户发送电子邮件?

我尝试了以下方法:

curl -n --ssl-reqd --mail-from "<sender@gmail.com>" --mail-rcpt "<receiver@server.tld>" --url smtps://smtp.gmail.com:465 -T file.txt

使用 file.txt 作为电子邮件的内容,但是,当我运行此命令时,我收到以下错误:

curl: (67) Access denied: 530

是否可以从个人服务器托管的帐户发送电子邮件,但仍使用 curl?这会使身份验证过程更容易吗?

【问题讨论】:

  • 您不能通过本地(或附近)SMTP 服务器发送电子邮件吗?
  • 确实可以,但这不是问题所在。
  • Google 禁止将其 SMTP 服务器用作垃圾邮件代理并不让我感到惊讶...
  • 我认为有可能我只是认为我的语法不正确。我尝试对我发布的内容进行细微的修改,并得到了不同的反馈,例如提示我输入密码,但电子邮件仍然失败......
  • 我相信 Gmail 会要求您使用 Oauth 进行身份验证。这对 curl 来说并不容易。您可以在developers.google.com/google-apps/gmail/xoauth2_protocol 上查看 Google 的 Oauth 文档。

标签: linux email curl command-line gmail


【解决方案1】:

请注意,mail.txt 的格式似乎很重要 / CRLF 用于 win,LF 用于 Linux,特殊字符等。

终于在挣扎了 2 个小时之后,它对我来说适用于 GMX(他们告诉他们的 SMPT 端口是 587 - 进一步用小写字母提示:“465 也可以与 SSL 一起使用”):

在 Linux 下(安装了 curl.tcz 的 Raspberry 3B+ 上的 TinyCore Linux):

curl --ssl-reqd --url 'smtps://mail.gmx.net:465' --user 'mymail@gmx.at:mymailPassword' --mail-from 'mymail@gmx.at' --mail-rcpt 'mymail@gmx.at' --upload-file mail.txt

在窗户下:

curl --ssl-reqd --url "smtps://mail.gmx.net:465" --user "mymail@gmx.at:mymailPassword" --mail-from "mymail@gmx.at" --mail-rcpt "mymail@gmx.at" --upload-file mail_win.txt

带有mail.txt:

From: "User Name" <mymail@gmx.at>
To: "John Smith" <mymail@gmx.at>
Subject: This is a test

Hi John,
Im sending this mail with curl thru my gmx account.
Bye!

【讨论】:

    【解决方案2】:

    像这样创建一个简单的email.conf 文件

    Username:   hi@example.com
    Password:   OKbNGRcjiV
    POP/IMAP Server:    mail.example.com
    

    然后简单地运行sendmail.sh,就像这样在使其可执行后(sudo chmod +x sendmail.sh)

    ./sendmail.sh
    

    代码

    #!/bin/bash
    
    ARGS=$(xargs echo  $(perl -anle 's/^[^:]+//g && s/:\s+//g && print' email.conf) < /dev/null)
    set -- $ARGS "$@";  
    
    declare -A email;
    email['user']=$1
    email['pass']=$2
    email['smtp']=$3
    email['port']='587';
    email['rcpt']='your-email-address@gmail.com';
    
    
    email_content='From: "The title" <'"${email['user']}"'>
    To: "Gmail" <'"${email['rcpt']}"'>
    Subject: from '"${email['user']}"' to Gmail
    Date: '"$(date)"'
    
    Hi Gmail,
    '"${email['user']}"' is sending email to you and it should work.
    Regards
    ';
    
    
    echo "$email_content" | curl -s \
        --url "smtp://${email['smtp']}:${email['port']}" \
        --user "${email['user']}:${email['pass']}" \
        --mail-from "${email['user']}" \
        --mail-rcpt "${email['rcpt']}" \
        --upload-file - # email.txt
    
    
    if [[ $? == 0 ]]; then
        echo;
        echo 'okay';
    else
        echo "curl error code $?";
        man curl | grep "^ \+$? \+"
    fi
    

    more

    【讨论】:

      【解决方案3】:
      curl --ssl-reqd \
        --url 'smtps://smtp.gmail.com:465' \
        --user 'username@gmail.com:password' \
        --mail-from 'username@gmail.com' \
        --mail-rcpt 'john@example.com' \
        --upload-file mail.txt
      

      mail.txt 文件内容:

      From: "User Name" <username@gmail.com>
      To: "John Smith" <john@example.com>
      Subject: This is a test
      
      Hi John,
      I’m sending this mail with curl thru my gmail account.
      Bye!
      

      附加信息:

      1. 我正在使用支持 SSL 的 curl 版本 7.21.6。

      2. 您不需要使用--insecure 开关,它会阻止curl 执行 SSL 连接验证。详情请见this online resource

      3. 通过传递帐户凭据被认为是一种不好的安全做法 命令行参数。使用--netrc-file。见the documentation

      4. 您必须 turn on access 获取不太安全的应用程序或更新的 App passwords

      【讨论】:

      • 谢谢伙计。这完全成功了。有关更安全地执行此操作的任何建议。我想在我的服务器上运行一个 cron 作业,运行一个脚本,该脚本将在特定时间发送电子邮件。我认为 curl 命令将是最简单但不是最安全的。我对 smtp 服务器等不是很熟悉,因此非常感谢任何建议。
      • 如果我想使用类似的东西从 bash 脚本发送自动邮件,同时避免在命令行中输入密码?我注意到,如果您省略密码部分,您会收到提示,所以我可以使用 expect 来处理它,但是有没有更简单的方法可以让 curl 从重定向中读取?甚至是环境变量?
      • 哦……我明白了……你可以把凭据放在.netrc中
      • 命令执行成功,但是邮件到达是空的,没有内容。
      • @louigi600,我不会使用 .netrc 文件。但是,您可以使用--netrc-file 参数,然后使用bash 子shell 重定向。例如。 curl --netrc-file &lt;(printf '%s' "${MY_CREDENTIALS}" ... bash 将创建一个文件描述符来提供凭据数据,并且(我认为)数据甚至不会触及磁盘。
      【解决方案4】:

      如果想以抄送或密送的形式发送邮件:

      curl --url 'smtps://smtp.gmail.com:465' --ssl-reqd \
        --mail-from 'username@gmail.com' --mail-rcpt 'john@example.com' \
        --mail-rcpt 'mary@gmail.com' --mail-rcpt 'eli@example.com' \
        --upload-file mail.txt --user 'username@gmail.com:password' --insecure
      
      From: "User Name" <username@gmail.com>
      To: "John Smith" <john@example.com>
      Cc: "Mary Smith" <mary@example.com>
      Subject: This is a test
      
      a BCC recipient eli is not specified in the data, just in the RCPT list.
      
      

      【讨论】:

      • 不,这是不正确的,或者至少是可疑的;电子邮件不需要包含显式 Bcc: 标头。就 SMTP 而言,邮件头只是数据,而 实际 收件人是通过其他方式指定的(在这种情况下,如果要发送给多个收件人,则通过多次指定 --mail-rcpt )。
      • 是的。这是不正确的谢谢指出!我正在纠正答案。也可以在这里查看:stackoverflow.com/questions/2750211/….
      猜你喜欢
      • 2015-08-10
      • 2018-12-05
      • 1970-01-01
      • 1970-01-01
      • 2021-09-20
      • 2016-04-17
      • 2017-12-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多