从网络主机发送电子邮件,无需使用用户名和密码

本文关键字:用户 密码 主机 网络 电子邮件 | 更新日期: 2023-09-27 18:26:19

我已经编写了一个C#程序来发送电子邮件,它非常有效。此外,我有一个发送电子邮件的PHP脚本,它也非常好用。

但我的问题是:是否可以像在PHP中那样使用C#发送电子邮件,在那里您不需要指定凭据、服务器、端口等。

我想用C#代替PHP,因为我正在创建一个ASP.Net web应用程序。

这是我当前的C#代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net.Mail;
using System.Net;
namespace $rootnamespace$
{
public partial class $safeitemname$ : Form
{
    public $safeitemname$()
    {
        InitializeComponent();
    }
    private void AttachB_Click(object sender, EventArgs e)
    {
        if (AttachDia.ShowDialog() == DialogResult.OK)
        {
            string AttachF1 = AttachDia.FileName.ToString();
            AttachTB.Text = AttachF1;
            AttachPB.Visible = true;
            AttachIIB.Visible = true;
            AttachB.Visible = false;
        }
    }
    private void AttachIIB_Click(object sender, EventArgs e)
    {
        if (AttachDia.ShowDialog() == DialogResult.OK)
        {
            string AttachF1 = AttachDia.FileName.ToString();
            AttachIITB.Text = AttachF1;
            AttachPB.Visible = true;
        }
    }


    private void SendB_Click(object sender, EventArgs e)
    {
        try
        {
            SmtpClient client = new SmtpClient(EmailSmtpAdresTB.Text);
            client.EnableSsl = true;
            client.Timeout = 20000;
            client.DeliveryMethod = SmtpDeliveryMethod.Network;
            client.UseDefaultCredentials = false;
            client.Credentials = new NetworkCredential(EmailUserNameTB.Text, EmailUserPasswordTB.Text);
            MailMessage Msg = new MailMessage();
            Msg.To.Add(SendToTB.Text);
            Msg.From = new MailAddress(SendFromTB.Text);
            Msg.Subject = SubjectTB.Text;
            Msg.Body = EmailTB.Text;
            /// Add Attachments to mail or Not
            if (AttachTB.Text == "")
            {
                if (EmailSmtpPortTB.Text != null)
                    client.Port = System.Convert.ToInt32(EmailSmtpPortTB.Text);
                client.Send(Msg);
                MessageBox.Show("Successfuly Send Message !");
            }
            else 
            {
                Msg.Attachments.Add(new Attachment(AttachTB.Text));
                Msg.Attachments.Add(new Attachment(AttachIITB.Text));
                if (EmailSmtpPortTB.Text != null)
                client.Port = System.Convert.ToInt32(EmailSmtpPortTB.Text);
                client.Send(Msg);
                MessageBox.Show("Successfuly Send Message !");
            }

        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
    private void settingsBindingNavigatorSaveItem_Click(object sender, EventArgs e)
    {
        this.Validate();
        this.settingsBindingSource.EndEdit();
        this.tableAdapterManager.UpdateAll(this.awDushiHomesDBDataSet);
    }
    private void awDushiHomesEmail_Load(object sender, EventArgs e)
    {
        // TODO: This line of code loads data into the 'awDushiHomesDBDataSet.Settings' table. You can move, or remove it, as needed.
        this.settingsTableAdapter.Fill(this.awDushiHomesDBDataSet.Settings);
    }
  }
}

这是在PHP中完成的方式:

<?php
//define the receiver of the email
$to = 'test@hotmail.com';
//define the subject of the email
$subject = 'Test email with attachment';
//create a boundary string. It must be unique
//so we use the MD5 algorithm to generate a random hash
$random_hash = md5(date('r', time()));
//define the headers we want passed. Note that they are separated with 'r'n
$headers = "From: webmaster@example.com'r'nReply-To: webmaster@example.com";
//add boundary string and mime type specification
$headers .= "'r'nContent-Type: multipart/mixed; boundary='"PHP-mixed-".$random_hash."'"";
//read the atachment file contents into a string,
//encode it with MIME base64,
//and split it into smaller chunks
$attachment = chunk_split(base64_encode(file_get_contents('PDFs'Doc1.pdf')));
//define the body of the message.
ob_start(); //Turn on output buffering
?>
--PHP-mixed-<?php echo $random_hash; ?> 
Content-Type: multipart/alternative; boundary="PHP-alt-<?php echo $random_hash; ?>"
--PHP-alt-<?php echo $random_hash; ?> 
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: 7bit
Hello World!!!
This is simple text email message.
--PHP-alt-<?php echo $random_hash; ?> 
Content-Type: text/html; charset="iso-8859-1"
Content-Transfer-Encoding: 7bit
<h2>Hello World!</h2>
<p>This is something with <b>HTML</b> formatting.</p>
--PHP-alt-<?php echo $random_hash; ?>--
--PHP-mixed-<?php echo $random_hash; ?> 
Content-Type: application/zip; name="Doc1.pdf" 
Content-Transfer-Encoding: base64 
Content-Disposition: attachment 
<?php echo $attachment; ?>
--PHP-mixed-<?php echo $random_hash; ?>--
<?php
//copy current buffer contents into $message variable and delete current output buffer
$message = ob_get_clean();
//send the email
$mail_sent = @mail( $to, $subject, $message, $headers );
//if the message is sent successfully print "Mail sent". Otherwise print "Mail failed"
echo $mail_sent ? "Mail sent" : "Mail failed";
?> 

我不是要求你写我的代码,但也许你可以提供一些信息,或者让我知道是否可能。

编辑:

我的问题不是不使用smtp服务器,而是如何在不输入用户名和密码的情况下发送电子邮件。我知道,只有当发送电子邮件的请求来自我的服务器时,它才会起作用。

从网络主机发送电子邮件,无需使用用户名和密码

在PHP中,您可以在不指定SMTP凭据的情况下发送邮件的原因是其他人已经为您配置了PHP.ini或sendmail.ini(PHP解释器用于获取某些值的文件)。

托管托管通常是这种情况(或者如果你在开发PC上使用PHP和AMPPS等工具,这可以让你通过UI轻松编辑SMTP设置,然后忘记它)。

在ASP.NET/C#中,有app.configweb.config文件,您可以在其中注入SMTP设置(在<mailSettings>标记中),从而获得与PHP相同的结果(SmtpClient将自动使用存储在其中的凭据)。

查看以下问题作为示例:

SmtpClient和app.config system.net配置

使用配置文件';进行SMTP身份验证;s邮件设置

在这些帖子中,你会发现如何使用ASP.NET发送电子邮件的几种方法。

  • 如何在ASP.NET C中发送电子邮件#
  • 在不安装SMTP服务器的情况下发送邮件

注意:如果没有smtp服务器,你就无法发送电子邮件,但如果其他人允许你使用他们的服务器,你不需要自己的服务器。

如果您的服务器中安装了php,您可以简单地通过php主函数发送电子邮件。您不需要凭据。

php内置的电子邮件发送功能是

mail($to,$subject,$message,$header);

您可以使用此代码详细了解

// recipients
  $to  = "hello@hellosofts.com"; // note the comma
  // subject
  $subject = 'Testing Email';
  // message
    $message = " Hello, I am sending email";
  // To send HTML mail, the Content-type header must be set
  $headers  = 'MIME-Version: 1.0' . "'r'n";
  $headers .= 'Content-type: text/html; charset=iso-8859-1' . "'r'n";
  // Additional headers
  $headers .= 'To: 'Zahir' <'zahir@hellosofts.com'>' . "'r'n";
  $headers .= 'From: Admin | Hello Softs <do-not-reply@Hellosofts.com>' . "'r'n";

  // Mail it
  mail($to, $subject, $message, $headers);
Host : localhost
OS : Ubuntu 12.04 +
Language : PHP

在操作系统中安装sendmail

sudo apt-get install sendmail

创建一个文件test-mail.php
在里面写代码:

<?php
$to      = 'test_to@abc.com';
$subject = 'Test Mail';
$message = 'hello how are you ?';
$headers = 'From: test_from@abc.com' . "'r'n" .
    'Reply-To: test_from@abc.com' . "'r'n" .
    'X-Mailer: PHP/' . phpversion();
if(mail($to, $subject, $message, $headers)){
    echo "Mail send";
}else{
    echo "Not send";
}
echo "Now here";
?>

邮件将发送到test_to@abc.com

注意:您没有;不需要写用户名/密码。

您可以在web应用程序的web.config文件中配置邮件设置部分,如下所示。如果您的网站由第三方托管公司托管,您可以向他们询问smtp的详细信息(smtp用户名、smtp密码、服务器名称或IP以及端口号)。如果您在web.config中有此配置,并且(在服务器上)启用了smtp,那么您应该能够发送电子邮件,而无需在c#代码中指定凭据。

<system.net>
    <mailSettings>
      <smtp from="you@yoursite.com">
        <network password="password01" userName="smtpUsername" host="smtp.server.com" port="25"/>
      </smtp>
    </mailSettings>
</system.net>

是否可以在没有SMTP或"没有"凭据的情况下发送邮件:否。。

如果您不想在php文件中写入凭据(在开发阶段),可以使用.env

https://github.com/vlucas/phpdotenv

示例.env文件:

DB_HOST='example'
DB_PORT='example'
DB_USER='postgres'
DB_PASS='example'
SMTP_HOST='example'
SMTP_PORT='example'
SMTP_USER='example'
SMTP_PASS='example'
HOST='example'

然后您可以在php文件中使用这些env变量:

getenv('SMTP_USER') 

你也可以对.env文件进行加密或不设置公共访问权限。但这些并不是人们应该关心的最重要的安全问题。。如果有人闯入你的服务器,你就已经有麻烦了。。

我不是.NET MVC开发人员,但你也可以设置环境变量(在开发阶段)

不管怎样,你需要把它们写在某个地方,否则它们已经写好了。。除非你在github等地方发布代码,否则这并不是一个大的安全问题。

注意:有环境变量可能会导致生产中的性能问题,尤其是使用php