smtp发邮件_smtp发邮件带附加 - CSDN
精华内容
参与话题
  • 配置Mail使用SMTP发送邮件

    万次阅读 2018-06-13 20:14:29
    今天分享在Linux上使用mail命令通过SMTP对外发邮件。 mail、mailx和sendmail 先看一下三者的关系:mail是mailx的别名,最初叫nail(与arch linux目前用的S nail基因相同);mail是Heirloom的一个子项目,sendmail...
    今天分享在Linux上使用mail命令通过SMTP对外发邮件。
      mail、mailx和sendmail
      先看一下三者的关系:mail是mailx的别名,最初叫nail(与arch linux目前用的S nail基因相同);mail是Heirloom的一个子项目,sendmail是Eric Allman的作品,都是开源项目;mail是用户代理(客户端),sendmail是邮件传输代理(服务器);mail默认使用sendmail对外发送邮件。
      总结:mail和mailx是同一个东西,大约类似于发信用的foxmail、outlook等工具,sendmail大约相当于163/qq邮箱的服务器软件。
      SSL、TLS和STARTTLS
      由前文我们知道云服务器基本上不允许25端口对外通信,要对外发邮件只能考虑465和587端口。那么465和587端口有什么区别?这要先从SSL、TLS和STARTTLS的区别开始说。
      SSL(Secure Socket Layer)是加密传输层,TLS(Transport Layer Security)是SSL的继承者和升级版,提供更好的安全性和性能。SSL有SSL v2、SSL v3两个版本,目前都不建议使用。TLS有TSL v1.0-v1.3,建议至少使用TLS v1.2。
      TLS和STARTTLS两者关系不大,但更让人容易产生误解,原因是名字中都带有TLS。STARTTLS是升级非安全连接为安全连接的协议,并没有强制使用加密。当服务端支持时,客户端和服务端才协商将已经建立的连接升级到SSL或者TLS加密。
      接着看465端口和587端口。我们知道25端口刚被设计出来时是用于转发邮件的,没有考虑认证、加密等问题。随着垃圾邮件泛滥、网络安全问题严重,MSA、ESMTP/SMTPS等概念和协议被设计出来。1997年465端口被注册用于加密方式(SMTPS)提交邮件,那时STARTTLS还没有捣腾出来。1998年STARTLS标准出炉,规定用587端口以STARTTLS方式提交邮件,465端口被吊销。然而许多客户端不支持STARTTLS,加上非常多邮件服务提供商都在使用465端口作为加密提交端口,于是465就一直这么被用到今天。
      简单来说,465端口只支持加密传输,不符合互联网号码分配结构(The Internet Assigned Numbers Authority,IANA)的标准,但一直被使用和支持;587端口专门被设计用来提交邮件,传输可以加密也可以不加密。
      配置mail
      明白了基本概念,接下来配置mail使用SMTP对外发送邮件。mail命令的系统级配置文件是/etc/mail.rc,用户级别的默认配置文件是~/.mailrc,也可以通过MAILRC环境变量设置配置文件路径。作为普通用户,我们在本地的~/.mailrc文件进行配置,SMTP的主要配置如下:
    set smtp=smtps://smtp.xxx.com:465   # 这里填入smtp地址
    set smtp-auth=login                 # 认证方式
    set smtp-auth-user=user@xxx.com     # 这里输入邮箱账号
    set smtp-auth-password=password     # 这里填入密码
    set ssl-verify=ignore               # 忽略证书警告
    set nss-config-dir=/etc/pki/nssdb   # 证书所在目录
    set from=user@xxx.com               # 设置发信人邮箱和昵称
    #set smtp-use-starttls=yes          # STARTTLS时使用
      几个注意点:
      如果是465端口,需要加上smtps://协议;如果是587端口,不需要加smtps://或者写smtp://;
      如果使用587端口通讯,应当显示设置smtp-use-starttls;
      邮件的来源应当与邮箱相同,或者将发信人姓名写在邮箱后的括号中。例如:set from=user@xxxx.com或set from=user@xxx.com(nickname);如果邮箱与认证的不一致,将出现“smtp-server: 553 Mail from must equal authorized user”的错误;
      有些邮件服务器的587端口不是使用STARTTLS而是SMTPS,此时仍需加上smtps://协议,例如126邮箱。
      配置好后,使用mail命令发送邮件:
      echo '邮件内容' | mail -s '邮件标题' 收件人邮箱
      #或者:
      cat 邮件内容.txt | mail -s '邮件标题' 收件人邮箱
      #或者
      mail -s '邮件标题' 收件人邮箱 < 邮件内容.txt
      mail命令的选项非常丰富,具体可查看其文档或这篇文章
      多账户
      如果想切换发送邮箱怎么办?答案是利用配置文件的account指令或在命令行中指定配置。先看配置文件中指定,在~/.mailrc中将配置改成如下:
    # 126不支持STARTTLS,使用465端口
    account 126 {
    set smtp=smtps://smtp.126.com:465
    set smtp-auth=login
    set smtp-auth-user=user@126.com
    set smtp-auth-password=password
    set ssl-verify=ignore
    set nss-config-dir=/etc/pki/nssdb
    set from=password@126.com
    }
    # QQ邮箱支持STARTTLS,使用587端口
    account qq {
    set smtp=smtp://smtp.qq.com:587
    set smtp-auth=login
    set smtp-auth-user=user@qq.com
    set smtp-auth-password=password
    set ssl-verify=ignore
    set nss-config-dir=/etc/pki/nssdb
    set from="user@qq.com(nickname)"
    set smtp-use-starttls=yes
    }
      配置文件中定义了两个账户,发送邮件时可用-A参数指定发信账户:
      echo 'mail test for 126' | mail -A 126 -s 'mail test' user@xxx.com
      echo 'mail test for qq' | mail -A qq -s 'mail test' user@xxx.com
      除了配置文件,也可以在命令行中用-S参数进行设置。例如:
      echo 'mail test for command line option' | mail -s 'mail test' -S smtp=smtp://smtp.qq.com:587 -S smtp-auth=login -S smtp-auth-user=user@qq.com -S smtp-auth-password=password -S ssl-verify=ignore -S nss-config-dir=/etc/pki/nssdb -S from="user@qq.com(nickname)" -S smtp-use-starttls=yes user@xxx.com
      这种方法比较繁琐,就是将配置文件的每一行都作为选项写在命令中。在程序中调用mail命令发送邮件时可以采取这种方法。
      解决警告
      虽然邮件能顺利发送,但每次运行都会出现一行警告:“Error in certificate: Peer's certificate issuer is not recognized.”。这是由于使用加密通信,但客户端不能确认证书是否真实。如果我们将配置中的set ssl-verify=ignore改成set ssl-verify=strict,连接将直接中断而不会继续发邮件。
      要解决这个警告,需要将邮件服务器的证书加入到信任列表。操作步骤如下:
      获取邮件服务器证书:
      # 465端口
      echo -n "" | openssl s_client -connect smtp.xxx.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > xxx.crt
      # 587端口
      echo -n | openssl s_client -starttls smtp -connect smtp.xxx.com:587 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > xxx.crt
      # 也可以直接在浏览器上打开网页版,保存证书为PEM(base64格式)格式然后上传到服务器
      将证书添加到受信任列表:
      certutil -A -n 'xxxx' -t "P,P,P" -d . -i ./xxx.crt
      上述命令中-A表示添加,-n是nickname,可以随意取,例如126或qq;-t表示受信任的标签,可取值是t/c/p三种或者其组合;-d表示证书所在目录,-i指示证书文件的位置。
      在配置文件中更改证书目录:
      # 指向证书文件目录
      set nss-config-dir=/path/to/cert-dir
      网上许多教程的-t标签都是"C,,",实践中发现使用该标签仍会报错(gmail的证书是google自己签发的,用C标签没问题,许多博主估计没试就直接抄来)。通过查阅certutil的用法,使用P标签顺利解决问题。
      配置完成后,再使用mail命令发送邮件,烦人的警告消失不见。
      其他
      "Unexpected EOF on SMTP connection",基本上是由于端口只支持SMTPS导致,将协议改成smtps://即可。

    上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。

    转自:http://www.51testing.com/html/53/n-3727153.html 侵删

    bash: mail: command not found的解决方法

    yum -y install mailx


    Linux发邮件之mail命令

    一、mail命令

    1.配置 

    vim /etc/mail.rc

    文件尾增加以下内容 

    set from=1968089885@qq.com smtp="smtp.qq.com"
    set smtp-auth-user="1968089885@qq.com" smtp-auth-password="123456"
    set smtp-auth=login

    说明:
    from: 对方收到邮件时显示的发件人
    smtp: 指定第三方发送邮件的smtp服务器地址
    smtp-auth: SMTP的认证方式。默认是LOGIN,也可改为CRAM-MD5或PLAIN方式
    smtp-auth-user: 第三方发邮件的用户名
    smtp-auth-password: 用户名对应密码

    2.Mail命令

    % mail --h
    mail: illegal option -- -
    Usage: mail -eiIUdEFntBDNHRV~ -T FILE -u USER -h hops -r address -s SUBJECT -a FILE -q FILE -f FILE -A ACCOUNT -b USERS -c USERS -S OPTION users

    注:部分系统参数稍有差异,最好看帮助

     

    1)  无邮件正文
    •   mail -s "主题"  收件地址
    % mail -s "测试"  1968089885@foxmail.com

     

    2) 有邮件正文

    •  mail -s "主题"  收件地址< 文件(邮件正文.txt)
    % mail -s "邮件主题"  1968089885@foxmail.com < /data/findyou.txt
    •  echo "邮件正文" | mail -s 邮件主题  收件地址
    echo "邮件正文内容" | mail -s "邮件主题"  1968089885@foxmail.com
    •  cat 邮件正文.txt | mail -s 邮件主题  收件地址 
    cat  /data/findyou.txt | mail -s "邮件主题"  1968089885@foxmail.com

     

    3)  带附件
    •  mail -s "主题"  收件地址  -a 附件 < 文件(邮件正文.txt) 
    % mail -s "邮件主题"  1968089885@foxmail.com -a /data/findyou.tar.gz < /data/findyou.txt

    3.脚本

    sendmail.sh

    复制代码
    #!/bin/bash
    #author:findyou
    help(){
       echo "eg: $0 [Subject] [address] [content_file] [file]"
       echo ""
       exit 1
    }

    if [ ! -n "$1" ] ; then
        help
    fi

    cDate=`date +%Y%m%d`

    if [ ! -n "$2" ] ; then
        help
    else
        mail_to=$2
        echo "      Send Mail to ${mail_to}"
    fi

    if [ ! -n "$4" ] ; then
        mail -s $1 ${mail_to}<$3
    else
        mail -s $1 -a $4 ${mail_to}<$3
    fi
    复制代码

     

    使用

    [root@123]$ ./sendmail.sh  test  1968089885@qq.com  abc.txt
          Send Mail to 1968089885@qq.com
    [root@123]$

     

    说明:建议直接使用命令 ,有脚本只是为了在打印显示相关信息,多此一举。

    转自:https://www.cnblogs.com/findyou/p/5760970.html

    展开全文
  • SMTP发送邮件

    2019-02-28 22:28:02
    # 1 发送文本邮件 #!/usr/bin/env python3 # -*- coding: utf-8 -*- from email import encoders from email.header import Header from email.mime.text import MIMEText from email.utils import parseaddr, ...
    # 1 发送文本邮件
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    from email import encoders
    from email.header import Header
    from email.mime.text import MIMEText
    from email.utils import parseaddr, formataddr
    import smtplib
    
    def _format_addr(s):
        name, addr = parseaddr(s)
        return formataddr((Header(name, 'utf-8').encode(), addr))
    
    from_addr = input('From: ')
    password = input('Password: ')
    to_addr = input('To: ')
    smtp_server = input('SMTP server: ')
    
    msg = MIMEText('hello, send by Python...', 'plain', 'utf-8')
    msg['From'] = _format_addr('Python爱好者 <%s>' % from_addr)
    msg['To'] = _format_addr('管理员 <%s>' % to_addr)
    msg['Subject'] = Header('来自SMTP的问候……', 'utf-8').encode()
    
    server = smtplib.SMTP(smtp_server, 25)
    server.set_debuglevel(1)
    server.login(from_addr, password)
    server.sendmail(from_addr, [to_addr], msg.as_string())
    server.quit()
    
    # 2 发送HTML邮件
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    from email import encoders
    from email.header import Header
    from email.mime.text import MIMEText
    from email.utils import parseaddr, formataddr
    import smtplib
    
    def _format_addr(s):
        name, addr = parseaddr(s)
        return formataddr((Header(name, 'utf-8').encode(), addr))
    
    from_addr = input('From: ')
    password = input('Password: ')
    to_addr = input('To: ')
    smtp_server = input('SMTP server: ')
    
    msg = MIMEText('<html><body><h1>Hello</h1>' +
        '<p>send by <a href="http://www.python.org">Python</a>...</p>' +
        '</body></html>', 'html', 'utf-8')
    msg['From'] = _format_addr('Python爱好者 <%s>' % from_addr)
    msg['To'] = _format_addr('管理员 <%s>' % to_addr)
    msg['Subject'] = Header('来自SMTP的问候……', 'utf-8').encode()
    
    server = smtplib.SMTP(smtp_server, 25)
    server.set_debuglevel(1)
    server.login(from_addr, password)
    server.sendmail(from_addr, [to_addr], msg.as_string())
    server.quit()
    
    # 3 发送附件
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    from email import encoders
    from email.header import Header
    from email.mime.text import MIMEText
    from email.utils import parseaddr, formataddr
    from email.mime.base import MIMEBase
    from email.mime.multipart import MIMEMultipart
    import smtplib
    
    def _format_addr(s):
        name, addr = parseaddr(s)
        return formataddr((Header(name, 'utf-8').encode(), addr))
    
    from_addr = input('From: ')
    password = input('Password: ')
    to_addr = input('To: ')
    smtp_server = input('SMTP server: ')
    
    msg = MIMEMultipart()
    msg['From'] = _format_addr('Python爱好者 <%s>' % from_addr)
    msg['To'] = _format_addr('管理员 <%s>' % to_addr)
    msg['Subject'] = Header('来自SMTP的问候……', 'utf-8').encode()
    
    # 邮件正文是MIMEText:
    msg.attach(MIMEText('send with file...', 'plain', 'utf-8'))
    
    # 添加附件就是加上一个MIMEBase,从本地读取一个图片:
    with open('D:\\桌面壁纸\\86044.jpg', 'rb') as f:
        # 设置附件的MIME和文件名,这里是png类型:
        mime = MIMEBase('image', 'jpg', filename='test.jpg')
        # 加上必要的头信息:
        mime.add_header('Content-Disposition', 'attachment', filename='test.jpg')
        mime.add_header('Content-ID', '<0>')
        mime.add_header('X-Attachment-Id', '0')
        # 把附件的内容读进来:
        mime.set_payload(f.read())
        # 用Base64编码:
        encoders.encode_base64(mime)
        # 添加到MIMEMultipart:
        msg.attach(mime)
    
    server = smtplib.SMTP(smtp_server, 25)
    server.set_debuglevel(1)
    server.login(from_addr, password)
    server.sendmail(from_addr, [to_addr], msg.as_string())
    server.quit()
    
    # 4 发送图片
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    from email import encoders
    from email.header import Header
    from email.mime.text import MIMEText
    from email.utils import parseaddr, formataddr
    from email.mime.base import MIMEBase
    from email.mime.multipart import MIMEMultipart
    import smtplib
    
    def _format_addr(s):
        name, addr = parseaddr(s)
        return formataddr((Header(name, 'utf-8').encode(), addr))
    
    from_addr = input('From: ')
    password = input('Password: ')
    to_addr = input('To: ')
    smtp_server = input('SMTP server: ')
    
    msg = MIMEMultipart()
    msg['From'] = _format_addr('Python爱好者 <%s>' % from_addr)
    msg['To'] = _format_addr('管理员 <%s>' % to_addr)
    msg['Subject'] = Header('来自SMTP的问候……', 'utf-8').encode()
    
    # 邮件正文是MIMEText:
    msg.attach(MIMEText('<html><body><h1>Hello</h1>' +
        '<p><img src="cid:0"></p>' +
        '</body></html>', 'html', 'utf-8'))
    
    # 添加附件就是加上一个MIMEBase,从本地读取一个图片:
    with open('D:\\桌面壁纸\\86044.jpg', 'rb') as f:
        # 设置附件的MIME和文件名,这里是png类型:
        mime = MIMEBase('image', 'jpg', filename='test.jpg')
        # 加上必要的头信息:
        mime.add_header('Content-Disposition', 'attachment', filename='test.jpg')
        mime.add_header('Content-ID', '<0>')
        mime.add_header('X-Attachment-Id', '0')
        # 把附件的内容读进来:
        mime.set_payload(f.read())
        # 用Base64编码:
        encoders.encode_base64(mime)
        # 添加到MIMEMultipart:
        msg.attach(mime)
    
    server = smtplib.SMTP(smtp_server, 25)
    server.set_debuglevel(1)
    server.login(from_addr, password)
    server.sendmail(from_addr, [to_addr], msg.as_string())
    server.quit()
    
    # 5 同时支持HTML和Plain格式
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    from email import encoders
    from email.header import Header
    from email.mime.text import MIMEText
    from email.utils import parseaddr, formataddr
    from email.mime.base import MIMEBase
    from email.mime.multipart import MIMEMultipart
    import smtplib
    
    def _format_addr(s):
        name, addr = parseaddr(s)
        return formataddr((Header(name, 'utf-8').encode(), addr))
    
    from_addr = input('From: ')
    password = input('Password: ')
    to_addr = input('To: ')
    smtp_server = input('SMTP server: ')
    
    msg = MIMEMultipart('alternative')
    msg['From'] = _format_addr('Python爱好者 <%s>' % from_addr)
    msg['To'] = _format_addr('管理员 <%s>' % to_addr)
    msg['Subject'] = Header('来自SMTP的问候……', 'utf-8').encode()
    
    # 邮件正文是MIMEText:
    msg.attach(MIMEText('hello', 'plain', 'utf-8'))
    msg.attach(MIMEText('<html><body><h1>Hello</h1></body></html>', 'html', 'utf-8'))
    
    # 添加附件就是加上一个MIMEBase,从本地读取一个图片:
    with open('D:\\桌面壁纸\\86044.jpg', 'rb') as f:
        # 设置附件的MIME和文件名,这里是png类型:
        mime = MIMEBase('image', 'jpg', filename='test.jpg')
        # 加上必要的头信息:
        mime.add_header('Content-Disposition', 'attachment', filename='test.jpg')
        mime.add_header('Content-ID', '<0>')
        mime.add_header('X-Attachment-Id', '0')
        # 把附件的内容读进来:
        mime.set_payload(f.read())
        # 用Base64编码:
        encoders.encode_base64(mime)
        # 添加到MIMEMultipart:
        msg.attach(mime)
    
    server = smtplib.SMTP(smtp_server, 25)
    server.set_debuglevel(1)
    server.login(from_addr, password)
    server.sendmail(from_addr, [to_addr], msg.as_string())
    server.quit()
    
    # 6 利用MIMEImage发送图片
    #!/usr/bin/python3
    # -*-coding:UTF-8-*-
    import smtplib
    from email.mime.text import MIMEText
    from email.mime.multipart import MIMEMultipart
    from email.mime.image import MIMEImage
    from email.header import Header
    from email.utils import parseaddr, formataddr
    # 先定义署名格式化函数
    
    def _format_addr(s):
        name, addr = parseaddr(s)
        return formataddr((Header(name, 'utf-8').encode(), addr))
    
    # 发送人,接收人
    sender = 'xxxxxxxxxx@qq.com'
    pwd = 'xxxxxxxxxxxxxxxxx'  # 请自行登陆邮箱打开SMTP服务,会自动生成第三方授权码,不是登陆密码!
    receiver = 'xxxxxxxxxx@163.com'
    
    # 格式化的署名和接收人信息
    message = MIMEMultipart()
    message['From'] = _format_addr('Python爱好者 <%s>' % sender)
    message['To'] = _format_addr('管理员 <%s>' % receiver)
    message['Subject'] = Header('来自SMTP的问候……', 'utf-8').encode()
    
    message.attach(MIMEText('<html><body>'
                            + '<h1>Hello</h1>'
                            + '<p>礼物<img src="cid:Imgid">'
                            + '</body></html>', 'html', 'utf-8'))
    
    # MIMEImage,只要打开相应图片,再用read()方法读入数据,指明src中的代号是多少,如这里是'Imgid’,在HTML格式里就对应输入。
    with open('D:\\桌面壁纸\\86044.jpg', 'rb') as f:
        mime = MIMEImage(f.read())
        mime.add_header('Content-ID', 'Imgid')
        message.attach(mime)
    
    # 发送邮件!
    try:
        smtpobj = smtplib.SMTP_SSL('smtp.qq.com', 465)
        smtpobj.login(sender, pwd)
        smtpobj.sendmail(sender, [receiver], message.as_string())
        print('邮件发送成功')
        smtpobj.quit()
    except smtplib.SMTPException as e:
        print('邮件发送失败,Case:%s' % e)
    

    注:

    如果遇到相关问题,可以进行如下改动:
    
    1. qq邮箱密码换成它提供的16位授权码
    2. 端口号改为465
    3. smtplib.SMTP改为smtplib.SMTP_SSL
    4. SMTP服务器(端口465或587):smtp.qq.com
    5. msg的From、To、Subject不填99%可能被判定为垃圾邮件,注意msg的From、To不会自动填的
    6. 例如可以加上:	msg['From'] = sender, msg['To'] = receiver, msg['Subject'] = '来自SMTP的问候……'

     

    展开全文
  • SMTP邮件发送

    2019-08-09 16:36:15
    简单邮件传输协议 (Simple Mail Transfer Protocol, SMTP)是在Internet传输email的事实标准。 SMTP是一个相对简单的基于文本的协议。在其之上指定了一条消息的一个或多个接收者(在大多数情况下被确认是存在的),...

    SMTP简介

    简单邮件传输协议 (Simple Mail Transfer Protocol, SMTP)是在Internet传输email事实标准

           SMTP是一个相对简单的基于文本协议。在其之上指定了一条消息的一个或多个接收者(在大多数情况下被确认是存在的),然后消息文本会被传输。可以很简单地通过telnet程序来测试一个SMTP服务器。SMTP使用TCP端口25。要为一个给定的域名决定一个SMTP服务器,需要使用MX (Mail eXchange)

           在八十年代早期SMTP开始被广泛地使用。当时,它只是作为UUCP的补充,UUCP更适合于处理在间歇连接的机器间传送邮件。相反,SMTP在发送和接收的机器在持续连线的网络情况下工作得最好。

           Sendmail是最早使用SMTP的邮件传输代理之一。到2001年至少有50个程序将SMTP实现为一个客户端(消息的发送者)或一个服务器(消息的接收者)。一些其他的流行的SMTP服务器程序包括了Philip Hazel的exim,IBM的Postfix,D. J. Bernstein的Qmail,以及Microsoft Exchange Server

           由于这个协议开始是基于纯ASCII文本的,它在二进制文件上处理得并不好。诸如MIME的标准被开发来编码二进制文件以使其通过SMTP来传输。今天,大多数SMTP服务器都支持8位MIME扩展,它使二进制文件的传输变得几乎和纯文本一样简单。

         SMTP是一个“推”的协议,它不允许根据需要从远程服务器上“拉”来消息。要做到这点,邮件客户端必须使用POP3IMAP。另一个SMTP服务器可以使用ETRN在SMTP上触发一个发送。

          SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP 服务器就是遵循 SMTP 协议的发送邮件服务器。

     SMTP 认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录 SMTP 服务器,这就使得那些垃圾邮件的散播者无可乘之机。 增加 SMTP 认证的目的是为了使用户避免受到垃圾邮件的侵扰。

    SMTP 发信方法

    使用 SMTP 协议的邮件服务器分为两种:

    • 一种为邮件发送服务器,通常叫做 smtpd,需要发件人进行认证。
    • 一种为邮件接收服务器,通常叫做 mx,接收外部运营商用户投递给本地用户的邮件。

    通过 SMTP 协议发送邮件的整体过程如下:

    1. 客户端使用 telnet 命令连接到SMTP服务器,建立会话。
    2. 客户端发送一个 HELO 或 EHLO 命令。
    3. 客户端发送一个 AUTH 认证命令进行用户登录(使用 smtpd 方式)。
    4. 客户端发送一个 MAIL 命令指定发件人。
    5. 客户端发送一个 RCPT 命令指定收件人。
    6. 客户端发送一个 DATA 命令准备输入邮件正文。
    7. 客户端发送一个 . 命令(点命令)表示 DATA 命令结束。
    8. 客户端发送一个 QUIT 命令结束会话。

    示例图:

    手工发送邮件:telnet smtp.qq.com 587 (qq是587,163是25)

    手工发送邮件参照链接:

        作者:YSOcean  出处:http://www.cnblogs.com/ysocean/

    SMTP常用的响应

    501——参数格式错误

    502——命令不可实现

    503——错误的命令序列

    504——命令参数不可实现

    211——系统状态或系统帮助响应

    214——帮助信息

    220<domain>——服务器就绪

    221<domain>——服务关闭

    421<domain>——服务器未就绪,关闭传输信道

    250——要求的邮件操作完成

    251——用户非本地,将转发向<forward-path>

    450——要求的邮件操作未完成,邮箱不可用

    550——要求的邮件操作未完成,邮箱不可用

    451——放弃要求的操作,处理过程中出错

    551——用户非本地,请尝试<forward-path>

    452——系统存储不足,要求的操作未执行

    552——过量的存储分配,要求的操作未执行

    553——邮箱名不可用,要求的操作未执行

    354——开始邮件输入,以“.”结束

    554——操作失败

    POP3协议

          允许电子邮件客户端下载服务器上的邮件,但是在客户端的操作(如移动邮件、标记已读等),不会反馈到服务器上,比如通过客户端收取了邮箱中的3封邮件并移动到其他文件夹,邮箱服务器上的这些邮件是没有同时被移动的 。

    IMAP

    IMAP全称是Internet Mail Access Protocol,即交互式邮件存取协议,它是跟POP3类似邮件访问标准协议之一。不同的是,开启了IMAP后,您在电子邮件客户端收取的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上,如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作。所以无论从浏览器登录邮箱或者客户端软件登录邮箱,看到的邮件以及状态都是一致的。

    STMP,POP3和IMAP端口详情

        一般采用SSL协议端口号。目前比较倾向于imap邮件发送

    126åè´¹é®å®¢æ·ç«¯è®¾ç½®POP3åSMTPå°å

           IMAP像POP3那样提供了方便的邮件下载服务,让用户能进行离线阅读。IMAP提供的摘要浏览功能可以让你在阅读完所有的邮件到达时间、主题、发件人、大小等信息后才作出是否下载的决定。此外,IMAP 更好地支持了从多个不同设备中随时访问新邮件。

    IMAPåPOP3æä»ä¹åºå«?

           总之,IMAP 整体上为用户带来更为便捷和可靠的体验。POP3 更易丢失邮件或多次下载相同的邮件,但 IMAP 通过邮件客户端与webmail 之间的双向同步功能很好地避免了这些问题。

    STMP部分代码:

    实现:

       public Tuple<bool, string> Send(bool isAsync = true)
            {
                //使用指定的邮件地址初始化MailAddress实例
                MailAddress maddr = new MailAddress(mailFrom);
                //初始化MailMessage实例
                MailMessage myMail = new MailMessage();


                //向收件人地址集合添加邮件地址
                if (mailToArray != null)
                {
                    for (int i = 0; i < mailToArray.Length; i++)
                    {
                        myMail.To.Add(mailToArray[i].ToString());
                    }
                }

                //向抄送收件人地址集合添加邮件地址
                if (mailCcArray != null)
                {
                    for (int i = 0; i < mailCcArray.Length; i++)
                    {
                        myMail.CC.Add(mailCcArray[i].ToString());
                    }
                }
                //发件人地址
                myMail.From = maddr;

                //电子邮件的标题
                myMail.Subject = mailSubject;

                //电子邮件的主题内容使用的编码
                myMail.SubjectEncoding = Encoding.UTF8;

                //电子邮件正文
                myMail.Body = mailBody;

                //电子邮件正文的编码
                myMail.BodyEncoding = Encoding.UTF8;

                //myMail.Priority = MailPriority.High;

                myMail.IsBodyHtml = isbodyHtml;

                //在有附件的情况下添加附件
                try
                {
                    if (attachmentsPath != null && attachmentsPath.Length > 0)
                    {
                        Attachment attachFile = null;
                        foreach (string path in attachmentsPath)
                        {
                            attachFile = new Attachment(path);
                            myMail.Attachments.Add(attachFile);
                        }
                    }
                }
                catch (Exception err)
                {
                    return new Tuple<bool, string>(false, err.ToString());
                }

                SmtpClient smtp = new SmtpClient();
                //指定发件人的邮件地址和密码以验证发件人身份
                smtp.Host = host;
                smtp.EnableSsl = true;
                smtp.UseDefaultCredentials = false;
                smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
                smtp.Credentials = new System.Net.NetworkCredential(mailFrom, mailPwd);
                //smtp.Port = 465;
                try
                {
                    ServicePointManager.ServerCertificateValidationCallback = delegate (Object obj, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { return true; };

                    //将邮件发送到SMTP邮件服务器
                    if (isAsync)
                    {
                        smtp.SendAsync(myMail, DateTime.Now);
                    }
                    else
                    {
                        smtp.Send(myMail);
                    }

                    return new Tuple<bool, string>(true, string.Empty);

                }
                catch (System.Net.Mail.SmtpException ex)
                {
                    return new Tuple<bool, string>(false, ex.ToString());
                }
                finally
                {
                    smtp.Dispose();
                    myMail.Dispose();
                }

            }

    发送:

        public static Tuple<bool, string> Send(string subject, string body, string email)
            {
                EmailProxy proxy = new EmailProxy();

                proxy.mailFrom = "登陆用户";
                proxy.mailPwd = "密码";(授权密码)
                proxy.mailSubject = subject;
                proxy.mailBody = body ;
                proxy.isbodyHtml = true;

                //使用smtp
                proxy.host = "smtp.qq.com";
                proxy.mailToArray = email.Split(',');

                //图片或者文件
                proxy.attachmentsPath = new string[] { };

                return proxy.Send(false);
            }

    展开全文
  • JAVA实现SMTP邮件发送

    万次阅读 2018-02-11 20:27:27
    该博客主要是JAVA实现SMTP发送邮件,主要做到以下几点 1、打开talent客户端 2、掌握在cmd下邮件的发送 3、发送者邮箱开启客户端授权码 4、掌握Base64编码 5、当然还有你会敲代码的双手^_^ 一、...

    该博客偏于实战,以代码为主。不过笔者加了许多注释,方便阅读。

    好了说说该博客内容。该博客主要是JAVA实现SMTP发送邮件,主要做到以下几点

    1、打开talent客户端
    2、掌握在cmd下邮件的发送
    3、发送者邮箱开启客户端授权码
    4、掌握Base64编码
    5、当然还有你会敲代码的双手^_^

    一、掌握在cmd下实现邮件发送

    1、首先你的开启Telnet客户端(控制面板/程序/打开或关闭windows功能/选择Telnet客户端)
    • 这个可能会遇到一系列问题,百度都有许多解决办法

    这里写图片描述

    2、掌握cmd下邮件发送过程
    telnet smtp.163.com 25
    220
    helo myxulinjie
    250 ok
    auth login
    334 dXNlcm5hbWU6
    ***(这里输入发送者邮箱的Base64码)
    334 UGFzc3dvcmQ6
    ***(这里输入发送者授权码的密码,注意不是邮箱密码)
    235 Authentication successful
    mail from: <发送者邮箱@163.com>
    250 Mail Ok
    rcpt to: <接收者邮箱@163.com>
    250 Mail Ok
    data
    354 End data with <CR><LF>.<CR><LF>
    to: 接收者邮箱@163.com
    from: 发送者邮箱@163.com
    subject:test telnet smtp mail
    what is your name?
    .
    250 Mail OK.........
    rset
    250 OK
    quit
    221 Bye
    

    二、发送者邮箱开启客户端授权码

    这里以163为例

    这里写图片描述


    三、JAVA实现SMTP发送邮件

    基于CC的Base64编解码工具类

    package Base64Demo;
    
    import org.apache.commons.codec.binary.Base64;
    /*
     *基于commons-codec-1.11 
     */
    
    public class Base64Utile_cc {
        /*
         *加密过程 
         */
        public static String EncodeBase64(byte[] data)
        {
            Base64 en=new Base64();
            String str=en.encodeBase64String(data);
            return str;
        }
    
        /*
         *解密过程 
         */
        public static String DecodeBase64(String str) {
            Base64 de=new Base64();
            byte[] ResultBase=de.decodeBase64(str);
            String str2=new String(ResultBase);
            return str2;
        }
    
    
    }
    

    实现SMTP发送邮件类

    package Base64Demo;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.io.PrintWriter;
    import java.net.Socket;
    
    public class SMTPDEMO {
    
        public static void main(String[] args) {
            /*
             *用户名和密码 
             */
            String SendUser="ash_ali@163.com";
            String SendPassword="xlj932834897";
            String ReceiveUser="ash_ali01@163.com";
    
            /*
             *对用户名和密码进行Base64编码 
             */
            String UserBase64=Base64Utile_cc.EncodeBase64(SendUser.getBytes());
            String PasswordBase64=Base64Utile_cc.EncodeBase64(SendPassword.getBytes());
    
            try {
                /*
                 *远程连接smtp.163.com服务器的25号端口
                 *并定义输入流和输出流(输入流读取服务器返回的信息、输出流向服务器发送相应的信息) 
                 */
                Socket socket=new Socket("smtp.163.com", 25);
                InputStream inputStream=socket.getInputStream();//读取服务器返回信息的流
                InputStreamReader isr=new InputStreamReader(inputStream);//字节解码为字符
                BufferedReader br=new BufferedReader(isr);//字符缓冲
    
                OutputStream outputStream=socket.getOutputStream();//向服务器发送相应信息
                PrintWriter pw=new PrintWriter(outputStream, true);//true代表自带flush
                System.out.println(br.readLine());
    
                /*
                 *向服务器发送信息以及返回其相应结果 
                 */
    
                //helo
                pw.println("helo myxulinjie");
                System.out.println(br.readLine());
    
                //auth login
                pw.println("auth login");
                System.out.println(br.readLine());
                pw.println(UserBase64);
                System.out.println(br.readLine());
                pw.println(PasswordBase64);
                System.out.println(br.readLine());
    
                //Set "mail from" and  "rect to"
                pw.println("mail from:<"+SendUser+">");
                System.out.println(br.readLine());
                pw.println("rcpt to:<"+ReceiveUser+">");
                System.out.println(br.readLine());
    
                //Set "data"
                pw.println("data");
                System.out.println(br.readLine());
    
                //正文主体(包括标题,发送方,接收方,内容,点)
                pw.println("subject:myxulinjie");
                pw.println("from:"+SendUser);
                pw.println("to:"+ReceiveUser);
                pw.println("Content-Type: text/plain;charset=\"gb2312\"");//设置编码格式可发送中文内容
                pw.println();
                pw.println("大家好,欢迎来到林杰的专栏");
                pw.println(".");
                pw.print("");
                System.out.println(br.readLine());
    
                /*
                 *发送完毕,中断与服务器连接 
                 */
                pw.println("rset");
                System.out.println(br.readLine());
                pw.println("quit");
                System.out.println(br.readLine());
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
        }
    
    }
    

    这里写图片描述

    成功收到邮件。该实现也是基于了解Base64编码基础上,如果对Base64不是很熟悉的小伙伴可以转战以下这篇博客了解以下哦
    http://blog.csdn.net/w_linux/article/details/79307024

    展开全文
  • 通过SMTP发邮件

    2015-04-25 20:42:24
    通过SMTP发邮件
  • 使用SMTP协议发送邮件

    千次阅读 2018-03-25 15:34:00
    在学习email邮件发送协议时,学到了一个叫SMTP的协议,该协议是为了发送email邮件而涉及的一个协议,普通window用户,利用系统已经安装好的telnet,然后在cmd中使用telnet命令和SMTP协议命令即可实现发送邮件的基本...
  • 电子邮件发送协议主要是SMTP,收件协议主要是POP3和IMAP; SMTP 的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。...
  • 很多网友程序中都要配置邮箱的,可以让系统自动发送...邮件自动群发通内部已经内置了很多常用的SMTP地址,会根据你录入的账户邮件地址自动选择,如果没有将为你推荐一个。 一般的SMTP服务器地址是【www.qdcysm.com石
  • private string sendmail() { using (MailMessage Mailmessage = new MailMessage()) { AppSettingsReader Appsettingreader = new AppSettingsReader(); Mailmessage.From
  • linux下设置smtp发送163邮件

    万次阅读 2016-03-16 16:30:43
    之前公司每日报告是通过qq邮箱发送的,最近每天晚上发送邮件时,smtp.qq.com总出问题,决定换到126上 1.126邮箱默认不开启smtp服务,需要在网页端开启,期间有个手机验证 注意等下SMTP配置的密码为客户端授权密码 ...
  • 如何配置wordpress使用SMTP进行发邮件?

    万次阅读 2016-10-28 16:33:00
    需要使用一个SMTP插件.(为什么要用插件?因为看下面) WORDPRESS网站其实自带发送邮件的功能,但是其使用的是PHP的mail()函数的方式,用这种方式发送邮件,要么邮件根本就不出去,虚拟主机不支持,禁止使用...
  • 首先介绍下smtp协议——简单邮件传输协议 (Simple Mail Transfer Protocol, SMTP) 是事实上的在Internet传输email的标准。 SMTP使用命令在客户端和服务器之间传输报文,即客户端发出一个命令,服务器返回一个应答...
  • 一般地 邮箱 POP3 服务器(端口110) SMTP 服务器(端口25)微软邮件系统的设定参数如下:接收邮件服务器 (POP3):pop3.live.com 端口: 995 要求安全连接 (SSL)发送邮件服务器 (SMTP):smtp.live.com 端口:587或...
  • POP3、SMTP和IMAP之间的区别和联系

    万次阅读 多人点赞 2017-05-06 11:16:32
    POP3、SMTP和IMAP之间的区别和联系 ...这时你的mail client会消息给邮件服务器上的SMTP service。这时有两种情况: 1. 如果邮件的收信人也是处于同一个domain,比如从http://163.com发送给163的邮箱,S
  • python使用163邮箱发送邮件

    万次阅读 2019-01-26 22:20:09
    开启163的smtp服务器(绑定自己的手机) 163邮箱地址:https://mail.163.com/ 记住自己的SMTP服务器    Smtp服务器地址 和 端口 Ssl: smtp.163.com:465 非ssl : smtp.163.com:25 #coding:utf -8...
  • Linux搭建SMTP发送邮件服务器

    万次阅读 2017-11-12 00:13:02
    该例子使用的是Centos6系统作为SMTP邮件服务器其他的发行版配置基本一样,只是命令会有些不同
  • 彻底解决 163邮箱转发邮件提示报错554 DT:SPM smtp12

    万次阅读 多人点赞 2018-07-26 08:11:38
    原来还好好的,不知道为啥今天早上在群发邮件的时候,显示失败!出现的错误是下图 原来这时因为网易将我邮件当成了垃圾邮件!这时候你只要在发邮件的时候抄送上自己,就再也不会报这个错误了!...
  • Python中发邮件(明文/SSL/TLS三种方式)

    万次阅读 2014-11-11 12:55:44
    #!/usr/bin/python # coding:utf-8  import smtplib from email.MIMEText import MIMEText from email.Utils import formatdate ...from email.Header import Header ...#设置默认字符集为UTF8 不然有些时候转码会出...
  • Python3实现163邮箱SMTP发送邮件

    万次阅读 2017-12-02 10:49:08
    SMTP协议 首先了解SMTP(简单邮件传输协议),邮件传送代理程序使用SMTP协议来发送电邮到接收者的邮件...上面说了是使用SMTP协议发送的邮件,所以需要先查看你的件人邮箱是否有开启SMTP协议,如没有,则需要开启,我测
  • 新浪sina gitlab邮件收不到

    万次阅读 2017-03-17 15:23:45
    用新浪sina.cn的邮箱,新加入用户后gitlab不了邮件,希望gitlab服务器能给新加入的用户的邮箱发邮件,把smtp_address和smtp_port和smtp_domain改成下面 gitlab_rails['smtp_address'] = 'smtp.sina.cn' gitlab_...
1 2 3 4 5 ... 20
收藏数 125,147
精华内容 50,058
关键字:

smtp发邮件