设置EmailMessage的属性——更新

目录

背景

解决方案


背景

解决方案使用C#.NET Framework 4.7.2EWS 2.2NUnitFluentAssertions

解决方案

解决方案包含一个控制台应用程序EWSMailMessage和一个测试库EWSMailMessage.TestsEmailMethods类进行了一些修改,以允许对提到的每个属性进行单独更新:

public class EmailMethods : IEmailMethods
{
	public EmailMessage CreateEmailMessage(ExchangeService service,
			string subject,
			string body,
			string address)
	{
		if (service == null ||
			string.IsNullOrWhiteSpace(subject) ||
			string.IsNullOrWhiteSpace(address))
			return null;

		var emailMessage = new EmailMessage(service)
		{
			Subject = subject,
			Body = body,
			ItemClass = "IPM.Note",
			From = address
		};

		return emailMessage;
	}

	public void SetReceivedBy(EmailMessage emailMessage, string address)
	{
		if (emailMessage == null ||
			string.IsNullOrWhiteSpace(address))
			return;
		SetProperty(emailMessage, EmailMessageSchema.ReceivedBy, new EmailAddress(address));
		return;
	}

	public void SetDateTimeCreated(EmailMessage emailMessage, DateTime dateTime)
	{
		if (emailMessage == null)
			return;
		SetProperty(emailMessage, ItemSchema.DateTimeCreated, dateTime);
		return;
	}

	public void SetDateTimeSent(EmailMessage emailMessage, DateTime dateTime)
	{
		if (emailMessage == null)
			return;
		SetProperty(emailMessage, ItemSchema.DateTimeSent, dateTime);
		return;
	}

	public void SetDateTimeReceived(EmailMessage emailMessage, DateTime dateTime)
	{
		if (emailMessage == null)
			return;
		SetProperty(emailMessage, ItemSchema.DateTimeReceived, dateTime);
		return;
	}

	#region Set property

	private bool SetProperty(EmailMessage message,
			PropertyDefinition propertyDefinition,
			object value)
	{
		if (message == null)
			return false;

		// get value of PropertyBag property – that is wrapper
		// over dictionary of inner message’s properties
		var members = message.GetType().FindMembers(
			MemberTypes.Property,
			BindingFlags.NonPublic | BindingFlags.Instance,
			PartialName,
			"PropertyBag");
		if (members.Length < 1)
			return false;

		var propertyInfo = members[0] as PropertyInfo;
		if (propertyInfo == null)
			return false;

		var bag = propertyInfo.GetValue(message, null);
		members = bag.GetType().FindMembers(
			MemberTypes.Property,
			BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance,
			PartialName,
			"Properties");
		if (members.Length < 1)
			return false;

		// get dictionary of properties values
		var properties = ((PropertyInfo)members[0]).GetMethod.Invoke(bag, null);
		var dictionary = properties as Dictionary<PropertyDefinition, object>;
		if (dictionary == null)
			return false;

		dictionary[propertyDefinition] = value;
		return true;
	}

	private bool PartialName(MemberInfo info, Object part)
	{
		// Test whether the name of the candidate member contains the
		// specified partial name.
		return info.Name.Contains(part.ToString());
	}

	#endregion
}

Program.cs演示了如何调用方法:

var emailMethods = new EmailMethods();
var exchangeServer = new ExchangeService();
var emailMessage = emailMethods.CreateEmailMessage(
	exchangeServer, "New Subject", "Interesting text", "illya@ireznykov.com");

emailMethods.SetReceivedBy(emailMessage, "ews@example.com");
emailMethods.SetDateTimeCreated(emailMessage, DateTime.Now.AddDays(-1));
emailMethods.SetDateTimeSent(emailMessage, DateTime.Now.AddHours(-22));
emailMethods.SetDateTimeReceived(emailMessage, DateTime.Now.AddHours(-20));


1. 所有使用的IP地址、服务器名称、工作站、域都是虚构的,仅用作演示。
2. 信息按原样提供。

本文最初发布于Set up properties of EmailMessage – Updated – I.Reznykov's blog

https://www.codeproject.com/Articles/5325720/Set-Up-Properties-of-EmailMessage-Updated

### Django 中实现电子邮件验证 #### 设置邮件服务器信息 为了能够通过Django发送激活邮件,需先在`settings.py`文件中配置邮件服务器的相关参数。这些参数通常包括邮箱主机地址、端口号、发件箱用户名以及密码等必要信息[^1]。 ```python EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST = 'smtp.example.com' EMAIL_PORT = 587 EMAIL_USE_TLS = True EMAIL_HOST_USER = 'your-email@example.com' EMAIL_HOST_PASSWORD = 'yourpassword' DEFAULT_FROM_EMAIL = EMAIL_HOST_USER ``` #### 创建视图函数用于处理注册流程中的邮件发送请求 当新用户完成表单提交并成功创建账户之后,应该立即触发一封含有唯一链接的确认信被送往用户的收件箱内。此过程可以在相应的view里编写逻辑来达成目的[^3]。 ```python from django.contrib.sites.shortcuts import get_current_site from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode from django.template.loader import render_to_string from django.core.mail import EmailMessage import threading class EmailThread(threading.Thread): def __init__(self, email_message): self.email_message = email_message threading.Thread.__init__(self) def run(self): self.email_message.send() def send_activation_email(user, request): current_site = get_current_site(request).domain mail_subject = "Activate your account." message = render_to_string('acc_active_email.html', { 'user': user, 'domain': current_site, 'uid': urlsafe_base64_encode(force_bytes(user.pk)), 'token': default_token_generator.make_token(user), }) to_email = user.email email = EmailMessage(mail_subject, message, to=[to_email]) EmailThread(email).start() ``` 上述代码片段展示了如何构建异步线程类`EmailThread`以便于后台执行实际的邮件投递操作;而`send_activation_email()`则是具体负责组装HTML模板内容并向指定目标发出邀请函式的激活通知。 #### 设计URL路由映射规则匹配来自客户端浏览器访问路径模式 为了让接收者可以顺利点击邮件内的超链接回到网站前端页面继续后续动作,则需要定义好对应的urlconf项以供解析使用: ```python urlpatterns = [ path('activate/<str:uidb64>/<str:token>/', views.activate_account, name='activate'), ] ``` 这里假设有一个名为`activate_account`的方法存在于views模块之中等待着捕获由GET方式传入的数据包进而判断令牌的有效性和合法性。 #### 编写视图方法检验Token有效性并更新User状态字段值 最后一步就是落实到具体的业务层面上面去了——即依据接收到的信息去查询数据库看是否存在相吻合记录的同时还要校验时间戳防止恶意篡改行为的发生。一旦核实无误则允许修改该条目下的is_active属性为True从而正式开启其权限范围。 ```python from django.utils.encoding import force_str from django.contrib.auth.tokens import default_token_generator from django.contrib.auth.models import User from django.shortcuts import redirect from django.urls import reverse_lazy from django.views.generic.base import TemplateView from django.utils.http import urlsafe_base64_decode class ActivateAccount(TemplateView): @staticmethod def get(request, uidb64=None, token=None): try: uid = force_str(urlsafe_base64_decode(uidb64)) user = User.objects.get(pk=uid) except (TypeError, ValueError, OverflowError, User.DoesNotExist): user = None if user is not None and default_token_generator.check_token(user, token): user.is_active = True user.save() login(request, user) messages.success( request, ('Your account have been confirmed.') ) return redirect(reverse_lazy('home')) else: messages.warning( request, ('The confirmation link was invalid, possibly because it has already been used.') ) return redirect(reverse_lazy('login')) ``` 这段Python脚本实现了对于给定UID和Token字符串进行解码还原成原始对象的过程,并进一步利用内置工具函数完成了身份验证工作。如果一切正常的话将会把当前实例标记为已激活状态并且重定向至首页显示欢迎消息;反之亦然给出提示告知对方尝试失败的原因所在。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值